From 27e468cba5f7c1992c4424eb6380648553d98f71 Mon Sep 17 00:00:00 2001
From: libai <libai@yazhai.co>
Date: Wed, 13 Jul 2022 12:06:50 +0800
Subject: [PATCH] 测试

---
 index.html                                            |     5 +++--
 mobile/GraphicPage.html                               |   273 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/Graphics.html                                  |   446 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/css/base.css                                   |    65 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/css/daily.css                                  |   136 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/css/index.css                                  |   754 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/css/index.less                                 |   769 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/css/layer.css                                  |     1 +
 mobile/css/liMarquee.css                              |    54 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/css/neck.css                                   |   245 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/css/neck.less                                  |   252 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/css/swiper.min.css                             |    12 ++++++++++++
 mobile/download/css/index.css                         |   106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/download/css/index.less                        |   108 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/download/down1.html                            |    57 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/download/down2.html                            |    56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/download/down3.html                            |    56 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/download/download.html                         |    99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/download/download2.html                        |   105 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/download/download3.html                        |   106 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/download/download4.html                        |    97 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/download/downloadPc.html                       |    99 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/download/images/bg-En.png                      | Bin 0 -> 250331 bytes
 mobile/download/images/bg-new2-En.png                 | Bin 0 -> 242895 bytes
 mobile/download/images/bg-new2.png                    | Bin 0 -> 244614 bytes
 mobile/download/images/bg-new3-En.png                 | Bin 0 -> 246967 bytes
 mobile/download/images/bg-new3.png                    | Bin 0 -> 239520 bytes
 mobile/download/images/bg.png                         | Bin 0 -> 244957 bytes
 mobile/download/images/bg1.png                        | Bin 0 -> 276981 bytes
 mobile/download/images/bg2.png                        | Bin 0 -> 289730 bytes
 mobile/download/images/bg3.png                        | Bin 0 -> 257217 bytes
 mobile/download/images/bottom-bg.png                  | Bin 0 -> 3451 bytes
 mobile/download/images/down.webp                      | Bin 0 -> 10163882 bytes
 mobile/download/images/down1.png                      | Bin 0 -> 11543629 bytes
 mobile/download/images/down1.webp                     | Bin 0 -> 10163882 bytes
 mobile/download/images/down2.png                      | Bin 0 -> 11573459 bytes
 mobile/download/images/down2.webp                     | Bin 0 -> 4412746 bytes
 mobile/download/images/down3.png                      | Bin 0 -> 12471338 bytes
 mobile/download/images/down3.webp                     | Bin 0 -> 8663232 bytes
 mobile/download/images/down4.png                      | Bin 0 -> 8465723 bytes
 mobile/download/images/down4.webp                     | Bin 0 -> 7423104 bytes
 mobile/download/images/down5.png                      | Bin 0 -> 9748137 bytes
 mobile/download/images/down5.webp                     | Bin 0 -> 5952672 bytes
 mobile/download/images/down6.png                      | Bin 0 -> 16831595 bytes
 mobile/download/images/down6.webp                     | Bin 0 -> 8229060 bytes
 mobile/download/images/down7.webp                     | Bin 0 -> 10652978 bytes
 mobile/download/images/downBtn.png                    | Bin 0 -> 8290 bytes
 mobile/download/images/downBtn2-En.png                | Bin 0 -> 11611 bytes
 mobile/download/images/downBtn2.png                   | Bin 0 -> 11177 bytes
 mobile/download/images/text1.png                      | Bin 0 -> 1840 bytes
 mobile/download/images/text2.png                      | Bin 0 -> 2460 bytes
 mobile/download/images/top1.png                       | Bin 0 -> 13277 bytes
 mobile/download/images/top2.png                       | Bin 0 -> 14849 bytes
 mobile/download/images/top3.png                       | Bin 0 -> 14987 bytes
 mobile/download/images/video-bg.png                   | Bin 0 -> 12947 bytes
 mobile/download/iosDown.html                          |    55 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/images/add-img.png                             | Bin 0 -> 394690 bytes
 mobile/images/back.png                                | Bin 0 -> 164 bytes
 mobile/images/bottom-nav-En.png                       | Bin 0 -> 6288 bytes
 mobile/images/bottom-nav.png                          | Bin 0 -> 6076 bytes
 mobile/images/click.png                               | Bin 0 -> 425 bytes
 mobile/images/good.png                                | Bin 0 -> 345 bytes
 mobile/images/good2.png                               | Bin 0 -> 482 bytes
 mobile/images/icon@2x.png                             | Bin 0 -> 1961 bytes
 mobile/images/like.png                                | Bin 0 -> 1588 bytes
 mobile/images/logo.png                                | Bin 0 -> 1965 bytes
 mobile/images/message.png                             | Bin 0 -> 498 bytes
 mobile/images/message2.png                            | Bin 0 -> 467 bytes
 mobile/images/more.png                                | Bin 0 -> 246 bytes
 mobile/images/nav-img.png                             | Bin 0 -> 114690 bytes
 mobile/images/play-icon.png                           | Bin 0 -> 1268 bytes
 mobile/images/rule.png                                | Bin 0 -> 245 bytes
 mobile/images/top-bg.png                              | Bin 0 -> 7078 bytes
 mobile/images/video-bg.png                            | Bin 0 -> 278205 bytes
 mobile/index.html                                     |   451 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/layer-v3.1.0/layer.css                         |     1 +
 mobile/layer-v3.1.0/layer/layer.js                    |     2 ++
 mobile/layer-v3.1.0/layer/mobile/layer.js             |     2 ++
 mobile/layer-v3.1.0/layer/mobile/need/layer.css       |     1 +
 mobile/layer-v3.1.0/layer/theme/default/icon-ext.png  | Bin 0 -> 5911 bytes
 mobile/layer-v3.1.0/layer/theme/default/icon.png      | Bin 0 -> 11493 bytes
 mobile/layer-v3.1.0/layer/theme/default/layer.css     |     1 +
 mobile/layer-v3.1.0/layer/theme/default/loading-0.gif | Bin 0 -> 5793 bytes
 mobile/layer-v3.1.0/layer/theme/default/loading-1.gif | Bin 0 -> 701 bytes
 mobile/layer-v3.1.0/layer/theme/default/loading-2.gif | Bin 0 -> 1787 bytes
 mobile/lib/default.js                                 |   305 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/lib/flv.js                                     | 12056 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/lib/fsize.js                                   |    13 +++++++++++++
 mobile/lib/jquery-3.1.1.min.js                        |     4 ++++
 mobile/lib/liMarquee.js                               |  1309 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/lib/lottie-player.js                           |   238 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/lib/snowfall.jquery.js                         |   317 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 mobile/lib/swiper.min.js                              |    13 +++++++++++++
 mobile/video.html                                     |   436 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 94 files changed, 19103 insertions(+), 2 deletions(-)
 create mode 100644 mobile/GraphicPage.html
 create mode 100644 mobile/Graphics.html
 create mode 100644 mobile/css/base.css
 create mode 100644 mobile/css/daily.css
 create mode 100644 mobile/css/index.css
 create mode 100644 mobile/css/index.less
 create mode 100644 mobile/css/layer.css
 create mode 100644 mobile/css/liMarquee.css
 create mode 100644 mobile/css/neck.css
 create mode 100644 mobile/css/neck.less
 create mode 100644 mobile/css/swiper.min.css
 create mode 100644 mobile/download/css/index.css
 create mode 100644 mobile/download/css/index.less
 create mode 100644 mobile/download/down1.html
 create mode 100644 mobile/download/down2.html
 create mode 100644 mobile/download/down3.html
 create mode 100644 mobile/download/download.html
 create mode 100644 mobile/download/download2.html
 create mode 100644 mobile/download/download3.html
 create mode 100644 mobile/download/download4.html
 create mode 100644 mobile/download/downloadPc.html
 create mode 100644 mobile/download/images/bg-En.png
 create mode 100644 mobile/download/images/bg-new2-En.png
 create mode 100644 mobile/download/images/bg-new2.png
 create mode 100644 mobile/download/images/bg-new3-En.png
 create mode 100644 mobile/download/images/bg-new3.png
 create mode 100644 mobile/download/images/bg.png
 create mode 100644 mobile/download/images/bg1.png
 create mode 100644 mobile/download/images/bg2.png
 create mode 100644 mobile/download/images/bg3.png
 create mode 100644 mobile/download/images/bottom-bg.png
 create mode 100644 mobile/download/images/down.webp
 create mode 100644 mobile/download/images/down1.png
 create mode 100644 mobile/download/images/down1.webp
 create mode 100644 mobile/download/images/down2.png
 create mode 100644 mobile/download/images/down2.webp
 create mode 100644 mobile/download/images/down3.png
 create mode 100644 mobile/download/images/down3.webp
 create mode 100644 mobile/download/images/down4.png
 create mode 100644 mobile/download/images/down4.webp
 create mode 100644 mobile/download/images/down5.png
 create mode 100644 mobile/download/images/down5.webp
 create mode 100644 mobile/download/images/down6.png
 create mode 100644 mobile/download/images/down6.webp
 create mode 100644 mobile/download/images/down7.webp
 create mode 100644 mobile/download/images/downBtn.png
 create mode 100644 mobile/download/images/downBtn2-En.png
 create mode 100644 mobile/download/images/downBtn2.png
 create mode 100644 mobile/download/images/text1.png
 create mode 100644 mobile/download/images/text2.png
 create mode 100644 mobile/download/images/top1.png
 create mode 100644 mobile/download/images/top2.png
 create mode 100644 mobile/download/images/top3.png
 create mode 100644 mobile/download/images/video-bg.png
 create mode 100644 mobile/download/iosDown.html
 create mode 100644 mobile/images/add-img.png
 create mode 100644 mobile/images/back.png
 create mode 100644 mobile/images/bottom-nav-En.png
 create mode 100644 mobile/images/bottom-nav.png
 create mode 100644 mobile/images/click.png
 create mode 100644 mobile/images/good.png
 create mode 100644 mobile/images/good2.png
 create mode 100644 mobile/images/icon@2x.png
 create mode 100644 mobile/images/like.png
 create mode 100644 mobile/images/logo.png
 create mode 100644 mobile/images/message.png
 create mode 100644 mobile/images/message2.png
 create mode 100644 mobile/images/more.png
 create mode 100644 mobile/images/nav-img.png
 create mode 100644 mobile/images/play-icon.png
 create mode 100644 mobile/images/rule.png
 create mode 100644 mobile/images/top-bg.png
 create mode 100644 mobile/images/video-bg.png
 create mode 100644 mobile/index.html
 create mode 100644 mobile/layer-v3.1.0/layer.css
 create mode 100644 mobile/layer-v3.1.0/layer/layer.js
 create mode 100644 mobile/layer-v3.1.0/layer/mobile/layer.js
 create mode 100644 mobile/layer-v3.1.0/layer/mobile/need/layer.css
 create mode 100644 mobile/layer-v3.1.0/layer/theme/default/icon-ext.png
 create mode 100644 mobile/layer-v3.1.0/layer/theme/default/icon.png
 create mode 100644 mobile/layer-v3.1.0/layer/theme/default/layer.css
 create mode 100644 mobile/layer-v3.1.0/layer/theme/default/loading-0.gif
 create mode 100644 mobile/layer-v3.1.0/layer/theme/default/loading-1.gif
 create mode 100644 mobile/layer-v3.1.0/layer/theme/default/loading-2.gif
 create mode 100644 mobile/lib/default.js
 create mode 100644 mobile/lib/flv.js
 create mode 100644 mobile/lib/fsize.js
 create mode 100644 mobile/lib/jquery-3.1.1.min.js
 create mode 100644 mobile/lib/liMarquee.js
 create mode 100644 mobile/lib/lottie-player.js
 create mode 100644 mobile/lib/snowfall.jquery.js
 create mode 100644 mobile/lib/swiper.min.js
 create mode 100644 mobile/video.html

diff --git a/index.html b/index.html
index c5de8d6..0b2e9be 100644
--- a/index.html
+++ b/index.html
@@ -4,9 +4,9 @@
  var ua = window.navigator.userAgent.toLowerCase();
  try {
      if (/iphone|ipad|ipod/.test(ua)) {
-         window.location.href="phone/index.html"
+         window.location.href="https://www.footseen.xyz/mobile/index.html"
      } else if (/android/.test(ua)) {
-        window.location.href="phone/index.html"
+        window.location.href="https://www.footseen.xyz/mobile/index.html"
      }
  } catch (e) {
  }
@@ -44,6 +44,7 @@
 <body style="background: #F4F5F8">
 
 <div class="neck-nav">
+    
     <div class="neck-nav-content">
         <ul class="neck-nav-ul">
             <li data-type="1" class="neck-nav-li-click"><span>首頁</span> <img src="images/front/nack-icon.png" alt=""></li>
diff --git a/mobile/GraphicPage.html b/mobile/GraphicPage.html
new file mode 100644
index 0000000..978ed84
--- /dev/null
+++ b/mobile/GraphicPage.html
@@ -0,0 +1,273 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <!-- Global site tag (gtag.js) - Google Analytics -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3V6KZGW418"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-3V6KZGW418');
+    </script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片</title>
+    <meta name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="lib/fsize.js"></script>
+    <link rel="stylesheet" href="css/base.css">
+    <link rel="stylesheet" href="css/layer.css">
+    <link rel="stylesheet" href="css/daily.css">
+    <link rel="stylesheet" href="css/swiper.min.css">
+    <link rel="stylesheet" href="css/index.css?v=22020119">
+
+    <style>
+        .layui-layer-shade {
+            opacity: 0.7 !important;
+        }
+
+        .yourclass5 {
+            border-radius: 0rem !important;
+            background: rgba(0, 0, 0, 0) !important;
+        } 
+        .yourclass5 .layui-layer-content {
+            border-radius: 0rem !important;
+        }
+        .yourclass6{
+            border-radius: 0rem !important;
+            background: rgba(0, 0, 0, 0) !important;
+            position: relative;
+            left: 1.4rem !important;
+        }
+        .yourclass6 .layui-layer-content {
+            border-radius: 0rem !important;
+        }
+    </style>
+</head>
+<body style="background: #F3F3F3">
+<div class="layer-shadow">
+
+</div>
+<div class="layer-tag-box">
+    <div class="layer-tag-title">選擇分類</div>
+    <ul class="layer-tag-ul">
+        <li class="tag-click">#全部</li>
+        <li>#黑絲</li>
+        <li>#黑絲</li>
+        <li>#黑絲</li>
+        <li>#黑絲</li>
+    </ul>
+</div>
+<div class="m-content">
+    <div class="nav-box">
+        <div class="top-bg">
+            <div class="nav-btn">
+                <div><a style="color: #FFABEE;" href="index.html"><span class="txt1">影片</span><img class="click-img" src="images/click.png" alt=""></a></div>
+                <div class="nav-click"><span class="txt2">圖文</span><img class="click-img" src="images/click.png" alt=""></div>
+            </div>
+        </div>
+        <div class="title-nav">
+            <div style="width: 9rem;" class="title-nav-box">
+                <div class="title-nav-content">
+                    <h2 data-type="9">絲襪</h2>
+                    <h2 data-type="28">秀腿</h2>
+                    <h2 data-type="45">裸足</h2>
+                    <h2 data-type="271">腳趾</h2>
+                    <h2 data-type="109">美腿</h2>
+                    <h2 data-type="11">黑絲</h2>
+                    <h2 data-type="38">高跟</h2>
+                    <h2 data-type="100">長腿</h2>
+                    <h2 data-type="55">肉絲</h2>
+                    <h2 data-type="273">粉嫩</h2>
+                </div>
+            </div>
+            <!-- <img class="more-btn" src="images/more.png" alt=""> -->
+        </div>
+    
+    </div>
+
+    <div style="height: 2.5rem;"></div>
+
+    <div class="detailed-box">
+
+    </div>
+    <div class="bottom-nav">
+        <h1 class="bottom-nav-h1">美腿、美足、絲襪直播</h1>
+        <div class="bottom-nav-btn"></div>
+        <div class="bottom-close-btn"></div>
+    </div>
+    <div style="height: 2.5rem;"></div>
+</div>
+</body>
+<script src="lib/jquery-3.1.1.min.js"></script>
+<script src="lib/swiper.min.js"></script>
+<script src="layer-v3.1.0/layer/layer.js"></script>
+<script src="lib/liMarquee.js"></script>
+<script src="lib/swiper.min.js"></script>
+<script src="lib/default.js?v='20220418'"></script>
+<script>
+$(function(){
+    var browserLang = navigator.language
+    if(browserLang.indexOf("zh")==-1){
+        $(".bottom-nav").css("background","url(images/bottom-nav-En.png) no-repeat")
+        $(".bottom-nav").css("background-size","100% 100%")
+        $(".txt1").text("video")
+        $(".txt2").text("Graphics")
+        $(".bottom-nav-h1").text('Legs/Feet/Stockings Live')
+    }
+    var tagStr=''
+    var pageNumber=1
+    var typeNumber=2
+    var scrollOk=true;
+    var scrollTopNum=0
+    $(".title-nav-content h2").on("click",function(){
+        var _self=$(this)
+        if($(this).hasClass("tag-go")){
+            $(".title-nav-content h2").removeClass("tag-go")
+            tagStr=''
+            pageNumber=1
+            listAdd(pageNumber,typeNumber,tagStr)
+        }else{
+            $(".title-nav-content h2").removeClass("tag-go")
+            pageNumber=1
+            tagStr=$(this).attr("data-type")
+            $(this).addClass("tag-go")
+            listAdd(pageNumber,typeNumber,tagStr)
+        } 
+    })
+    $(".bottom-close-btn").on("click",function(){
+        $(".bottom-nav").fadeOut(350)
+    })
+    $(".bottom-nav-btn").on("click",function(){
+        var downNum=Math.ceil(Math.random()*3)
+        window.location.href='download/download3.html?qd=ftsBH5TW'
+    })
+    listAdd(pageNumber,typeNumber,tagStr)
+    $(".more-btn").on("click",function(){
+        $(".layer-tag-box").css("top","0rem")
+        $(".layer-shadow").show()
+    })
+    $(".layer-shadow").on("click",function(){
+        $(".layer-tag-box").css("top","-12rem")
+        $(".layer-shadow").hide()
+    })
+    $(window).on("scroll",function(){
+        if(scrollTopNum<$(document).scrollTop()){
+            if($(document).scrollTop()>200){
+                $(".nav-box").hide()
+                $(".nav-box").addClass("nav-box-show").css("transform","translateY(-3.5rem)")
+            } 
+       
+        }else{
+            $(".nav-box").show()
+            $(".nav-box").css("transform","translateY(0rem)")
+        
+        }
+        scrollTopNum=$(document).scrollTop()
+        if($(document).height()-$(document).scrollTop()-$(window).height()<=10){
+            if($(document).scrollTop()==0)return;
+            if(scrollOk==false)return;
+            scrollOk=false
+            pageNumber+=1
+            listAdd(pageNumber,typeNumber,tagStr)
+        }
+    })
+    function listAdd(pageNum,typeNum,tagNum){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryTopics',
+            data:{
+                page:pageNum,
+                size:10,
+                type:typeNum,
+                tag:tagNum,
+            },
+            success:function(data){
+                // //console.log('獲取貼文列表',data)
+                var html=[];
+                for(var i=0;i<data.dataList.length;i++){
+                    if(data.dataList[i]==undefined)continue
+                    if(data.dataList[i].type!=2)continue
+                    var list=data.dataList[i]
+                    var videoList=JSON.parse(list.content)
+                    html+='<a href="Graphics.html?topicId='+list.topicId+'&tag='+tagNum+'"><div data-type="'+list.topicId+'" class="add-video-box">';
+                    html+='<div class="add-shadow"></div>';
+                    html+='<div class="add-face-name">';
+                    html+='<img src="https://zhibocdn.yabolive.net/comm'+list.face+'?x-oss-process=image/resize,w_80" alt="">';
+                    html+='<p>'+list.nickname+'</p>';
+                    html+='</div>';
+                    html+='<div style="background: url(https://zhibocdn.yabolive.net/comm'+videoList.images[0].url+'?x-oss-process=image/resize,w_505)no-repeat;background-size: cover;" class="add-video-img">';
+                    html+='</div>';
+                    html+='<div class="add-video-text-box">';
+                    html+='<p>'+videoList.title+'</p>';
+                    html+='<div class="tag-content clearfix">';
+                    for(var j=0;j<list.tags.length;j++){
+                        html+='<div data-type="'+list.tags[j].tagId+'" class="tag">#'+list.tags[j].tagName+'</div>';
+                    }
+                    html+='</div>';
+                    html+='</div>';
+                    html+='</div></a>';
+                }
+                if(pageNum==1){
+                    $(".detailed-box").html(html)
+                }
+                else{
+                    $(".detailed-box").append(html)
+                }
+                setTimeout(function(){
+                    scrollOk=true;
+                }, 500);
+                // $(".add-video-box").unbind("click").on("click",function(){
+                //     var _self=$(this).attr("data-type")
+                //     window.location.href="Graphics.html?topicId="+_self+"&tag="+tagNum+"";
+                // })
+            }
+        })
+
+    }
+
+    function tagGet(){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryTagList',
+            success:function(data){
+                // //console.log('获取标签列表',data)
+                var html=[];
+                html+='<li data-type="" class="tag-click">#全部</li>'
+                for(var i=0;i<data.tagList.length;i++){
+                    var list=data.tagList[i];
+                    html+='<li data-type="'+list.tagId+'" >'+list.tagName+'</li>'
+                }
+                $(".layer-tag-ul").html(html);
+                $(".layer-tag-ul li").on("click",function(){
+                    var _self=$(this);
+                    $(".layer-tag-ul li").removeClass("tag-click")
+                    _self.addClass("tag-click")
+                    if(_self.attr("data-type")==''){
+                        tagStr=''
+                        pageNumber=1
+                        getList(pageNumber,typeNumber,tagStr)
+                        $(".detailed-box").html('').hide()
+                        $(".all-box").show()
+                        $(".layer-tag-box").css("top","-12rem")
+                        $(".layer-shadow").hide()
+                    }else{
+                        tagStr=_self.attr("data-type")
+                        pageNumber=1
+                        $(".all-box").hide()
+                        $(".detailed-box").html('').show()
+                        listAdd(pageNumber,typeNumber,tagStr)
+                        $(".layer-tag-box").css("top","-12rem")
+                        $(".layer-shadow").hide()
+                     
+                    }
+                })
+            }
+        })
+    }
+})
+</script>
+</html>
\ No newline at end of file
diff --git a/mobile/Graphics.html b/mobile/Graphics.html
new file mode 100644
index 0000000..072517d
--- /dev/null
+++ b/mobile/Graphics.html
@@ -0,0 +1,446 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <!-- Global site tag (gtag.js) - Google Analytics -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3V6KZGW418"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-3V6KZGW418');
+    </script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片</title>
+    <meta class="top-keywords" name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="lib/fsize.js"></script>
+    <link rel="stylesheet" href="css/base.css">
+    <link rel="stylesheet" href="css/layer.css">
+    <link rel="stylesheet" href="css/daily.css">
+    <link rel="stylesheet" href="css/swiper.min.css">
+    <link rel="stylesheet" href="css/index.css?v=22020119">
+    <link rel="stylesheet" href="css/liMarquee.css">
+    <style>
+        .recommend-swiper{
+            border-radius: 0.2rem;
+        }
+        .recommend-swiper .swiper-slide{
+            width: 9.35rem;
+            height: 5.05rem;
+            overflow: hidden;
+        }
+    </style>
+</head>
+<body style="background: #F3F3F3">
+
+<div style="display: none;" class="big-img-box">
+
+    <div class="swiper shadowSwiper">
+      <div class="swiper-wrapper">
+        <div class="swiper-slide"><img src="https://zhibocdn.yabolive.net/comm/theme/2022-04-06/2f7e369b351c41afb49777951e73aabd.png" alt=""></div>
+        <div class="swiper-slide"><img src="https://zhibocdn.yabolive.net/comm/theme/2022-04-06/2f7e369b351c41afb49777951e73aabd.png" alt=""></div>
+        <div class="swiper-slide"><img src="https://zhibocdn.yabolive.net/comm/theme/2022-04-06/2f7e369b351c41afb49777951e73aabd.png" alt=""></div>
+        <div class="swiper-slide"><img src="https://zhibocdn.yabolive.net/comm/theme/2022-04-06/2f7e369b351c41afb49777951e73aabd.png" alt=""></div>
+        <div class="swiper-slide"><img src="https://zhibocdn.yabolive.net/comm/theme/2022-04-06/2f7e369b351c41afb49777951e73aabd.png" alt=""></div>
+        <div class="swiper-slide"><img src="https://zhibocdn.yabolive.net/comm/theme/2022-04-06/2f7e369b351c41afb49777951e73aabd.png" alt=""></div>
+        <div class="swiper-slide"><img src="https://zhibocdn.yabolive.net/comm/theme/2022-04-06/2f7e369b351c41afb49777951e73aabd.png" alt=""></div>
+        <div class="swiper-slide"><img src="https://zhibocdn.yabolive.net/comm/theme/2022-04-06/2f7e369b351c41afb49777951e73aabd.png" alt=""></div>
+        <div class="swiper-slide"><img src="https://zhibocdn.yabolive.net/comm/theme/2022-04-06/2f7e369b351c41afb49777951e73aabd.png" alt=""></div>
+      </div>
+      <div class="swiper-pagination"></div>
+    </div>
+</div>
+<div class="m-content">
+    <a href="GraphicPage.html"><img class="back" src="images/back.png" alt=""></a>
+    <div class="grap-swiper-box">
+            
+        <div class="recommend-swiper">
+            <!-- <div style="background: url(https://zhibocdn.yabolive.net/comm/theme/2022-04-02/253898d006be4ad1be5bf5acde410add.mp4?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0,m_fast,f_jpg)no-repeat;background-size: cover;" class="swiper-img"><div class="top-img-shadow"></div></div>
+            <p class="swiper-name">今天吃什么呢,打算吃什么呢</p>
+            <div class="swiper-face-name">
+                <img src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+                <p>糖醋榴莲</p>
+            </div>
+            <div class="swiper-more">
+                <div class="swiper-more1"><img src="images/message.png" alt=""> 25</div>
+            </div> -->
+        </div>
+    </div>
+    <div class="grap-name-box">
+        <!-- <img class="grap-user-face" src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+        <p class="grap-name-p1">糖醋里脊</p>
+        <p class="grap-name-p2">2022年03月14日 22:22</p>
+        <div class="grap-like">追蹤</div> -->
+    </div>
+    <div class="grap-content">
+        <!-- <h1 class="grap-title">標題預留啊預留很多個字</h1>
+        <div class="grap-more">
+            <div class="grap-more1"><img src="images/message2.png" alt=""> 25</div>
+            <div class="grap-more2"><img src="images/good2.png" alt=""> 50</div>
+        </div>
+        <div class="tag-content">
+            <div class="tag">#丝袜</div>
+            <div class="tag">#丝袜</div>
+            <div class="tag">#丝袜</div>
+            <div class="tag">#丝袜</div>
+            <div class="tag">#丝袜</div>
+        </div> -->
+    </div>
+    <div class="grap-msg-box">
+        <p class="grap-msg-top">評論 (99+)</p>
+        <!-- <div class=grap-msg-content>
+            <img class="grap-msg-face" src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+            <div class="grap-msg-text">
+                <p class="grap-msg-text-name">用戶名稱預留</p>
+                <p class="grap-msg-text-p">
+                    我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論
+                </p>
+            </div>
+        </div>
+        <div class=grap-msg-content>
+            <img class="grap-msg-face" src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+            <div class="grap-msg-text">
+                <p class="grap-msg-text-name">用戶名稱預留</p>
+                <p class="grap-msg-text-p">
+                    我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論
+                </p>
+            </div>
+        </div>
+        <div class="grap-bottom-box">查看更多</div> -->
+    </div>
+    <div class="grap-text2">相關推薦</div>
+    <div class="add-video-big-box">
+        <!-- <div class="add-video-box">
+            <div class="add-shadow"></div>
+            <div class="add-face-name">
+                <img src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+                <p>糖醋榴莲</p>
+            </div>
+            <div class="add-video-img"></div>
+            <div class="add-video-text-box">
+                <p>今天吃什么呢,打算吃什么呢</p>
+                <div class="tag-content">
+                    <div class="tag">#丝袜</div>
+                    <div class="tag">#丝袜</div>
+                    <div class="tag">#丝袜</div>
+                    <div class="tag">#丝袜</div>
+                    <div class="tag">#丝袜</div>
+                </div>
+            </div>
+        </div> -->
+    </div>
+    <div class="bottom-nav">
+        <h1 class="bottom-nav-h1">美腿、美足、絲襪直播</h1>
+        <div class="bottom-nav-btn"></div>
+        <div class="bottom-close-btn"></div>
+    </div>
+    <div style="height: 2.5rem;"></div>
+</div>    
+</body>
+<script src="lib/jquery-3.1.1.min.js"></script>
+<script src="lib/swiper.min.js"></script>
+<script src="layer-v3.1.0/layer/layer.js"></script>
+<script src="lib/liMarquee.js"></script>
+<script src="lib/swiper.min.js"></script>
+<script src="lib/default.js?v='20220418'"></script>
+<script>
+$(function(){
+    var browserLang = navigator.language
+    if(browserLang.indexOf("zh")==0){
+        $(".bottom-nav").css("background","url(images/bottom-nav-En.png) no-repeat")
+        $(".bottom-nav").css("background-size","100% 100%")
+        $(".txt1").text("video")
+        $(".txt2").text("Graphics")
+        $(".bottom-nav-h1").text()
+    }
+    if(sessionStorage.topicId==undefined||sessionStorage.topicId=="undefined"){
+        window.location.href="GraphicPage.html"
+    }
+    var scrollOk =true;
+    var pageNumber=1
+    var pageNum=2
+    moreAspect()
+    $(window).on("scroll",function(){
+        scrollTopNum=$(document).scrollTop()
+        if($(document).height()-$(document).scrollTop()-$(window).height()<=10){
+            if(scrollOk==false)return;
+            scrollOk=false
+            pageNumber+=1
+
+            listAdd(pageNumber,pageNum,sessionStorage.tag)
+        }
+    })
+    $.ajax({
+        url:$ip+'/footSeen/h5/queryTopicInfo',
+        data:{
+            topicId:sessionStorage.topicId
+        },
+        success:function(data){
+            // //console.log('查看帖文详情',data)
+            var html=[];
+            var list=data.topic;
+            var details=JSON.parse(list.content)
+            if(details.images.length>1){
+                html+='<div class="swiper mySwiper">';
+                html+='<div class="swiper-wrapper">';
+                for(var i=0;i<details.images.length;i++){
+                    html+='<div data-type="'+(i+1)+'" class="swiper-slide">'
+                    html+='<div class="recommend-swiper">';
+                    html+='<div style="background: url(https://zhibocdn.yabolive.net/comm'+details.images[i].url+')no-repeat;background-size: cover;" class="swiper-img"></div>';
+                    html+='</div>'   
+                    html+='</div>'
+                }
+                html+='</div>';    
+                html+='<div class="swiper-pagination"></div>'
+                html+='</div>';
+                $(".recommend-swiper").html(html)
+                var swiper = new Swiper(".mySwiper", {
+                  pagination: {
+                    el: ".swiper-pagination",
+                  },
+                  loop:true,
+                });
+            }
+            else{
+                var html=[];
+                html+='<div class="recommend-swiper">';
+                html+='<div style="background: url(https://zhibocdn.yabolive.net/comm'+details.images[0].url+')no-repeat;background-size: cover;" class="swiper-img"></div>';
+                html+='</div>';
+                $(".recommend-swiper").html(html)
+            }
+            var html=[];
+            for(var i=0;i<details.images.length;i++){
+                html+='<div class="swiper-slide"><img src="https://zhibocdn.yabolive.net/comm'+details.images[i].url+'" alt=""></div>';
+            }
+            $(".big-img-box .swiper-wrapper").html(html);
+            var swiperOne=true;
+            $(".swiper-img").unbind("click").on("click",function(){
+                 $(".big-img-box").fadeIn(350)
+                 if(swiperOne==false)return;
+                 swiperOne=false
+                 var swiper = new Swiper(".shadowSwiper", {
+                   pagination: {
+                     el: ".swiper-pagination",
+                   },
+                   loop:true,
+                 });
+            })
+            $(".shadowSwiper").unbind("click").on("click",function(){
+                $(".big-img-box").fadeOut(350)
+            })
+            var html=[];
+            var tagsArr=[]
+            html+='<img class="grap-user-face" src="https://zhibocdn.yabolive.net/comm'+list.face+'?x-oss-process=image/resize,w_80" alt="">';
+            html+='<p class="grap-name-p1">'+list.nickname+'</p>';
+            html+='<p class="grap-name-p2">'+timeGet(list.updateTime)[0]+'年'+timeGet(list.updateTime)[1]+'月'+timeGet(list.updateTime)[2]+'日 '+timeGet(list.updateTime)[3]+':'+timeGet(list.updateTime)[5]+'</p>';
+            html+='<div class="grap-like">追蹤</div>';
+            $(".grap-name-box").html(html);
+            $(".bottom-nav-btn,.grap-like").unbind("click").on("click",function(){
+                window.location.href='download/download3.html?qd=ftsBH5TW'
+            })
+            var html=[];
+            html+='<h1 class="grap-title">'+details.title+'</h1>';
+            html+='<div class="grap-more">';
+            html+='<div class="grap-more1"><img src="images/message2.png" alt=""> '+list.comment+'</div>';
+            html+='</div>';
+            html+='<div class="tag-content">';
+            for(var j=0;j<list.tags.length;j++){
+                html+='<div data-type="'+list.tags[j].tagId+'" class="tag">#'+list.tags[j].tagName+'</div>';
+                if(j+1==list.tags.length) tagsArr+=''+list.tags[j].tagName+''
+                else tagsArr+=''+list.tags[j].tagName+','
+            }
+            html+='</div>';
+            $(".grap-content").html(html);
+            $("title").text(details.title)
+            $(".top-keywords").attr("content",tagsArr)
+        }
+    })
+    $.ajax({
+        url:$ip+'/footSeen/h5/queryTopicComment',
+        data:{
+            topicId:sessionStorage.topicId,
+            page:pageNum,
+            size:20
+        },
+        success:function(data){
+            // //console.log('查看贴文评论',data)
+            if(data.commentResult==undefined){
+                var html='<p class="grap-msg-top">評論 (0)</p><div class="grap-bottom-box">暫無評論</div>'
+                $(".grap-msg-box").html(html);       
+                return;
+            }
+            // var list=data.commentResult
+            var html=[];
+            if(data.totalSize>99) var commentNum='99+'
+            else  var commentNum=data.totalSize
+            html+='<p class="grap-msg-top">評論 ('+commentNum+')</p>';
+            for(var i=0;i<2;i++){
+                if(data.commentResult[i]==undefined)continue;
+                var list=JSON.parse(data.commentResult[i].content)
+                html+='<div class="grap-msg-content">';
+                html+='<img class="grap-msg-face" src="https://zhibocdn.yabolive.net/comm'+data.commentResult[i].face+'?x-oss-process=image/resize,w_80" alt="">';
+                html+='<div class="grap-msg-text">';
+                html+='<p class="grap-msg-text-name">'+data.commentResult[i].nickname+'</p>';
+                html+='<p class="grap-msg-text-p">'+list.text+'</p>';
+                html+='</div>';
+                html+='</div>';
+            }
+            if(commentNum>2) html+='<div class="grap-bottom-box">查看更多</div>';
+        
+            $(".grap-msg-box").html(html);    
+            var moreClick=true
+            $(".grap-bottom-box").unbind("click").on("click",function(){
+                if(moreClick==false)return;
+                moreClick=false
+                $(this).hide()
+                addMsg(pageNum)
+                pageNum++
+            })
+        }
+    })
+    function addMsg(e){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryTopicComment',
+            data:{
+                topicId:sessionStorage.topicId,
+                page:pageNum,
+                size:20
+            },
+            success:function(data){
+                // //console.log('更多贴文评论',data)
+                var html=[];
+                for(var i=0;i<20;i++){
+                    if(e==1&&i<2)continue
+                    if(data.commentResult[i]==undefined)break;
+                    var list=JSON.parse(data.commentResult[i].content)
+                    html+='<div class="grap-msg-content">';
+                    html+='<img class="grap-msg-face" src="https://zhibocdn.yabolive.net/comm'+data.commentResult[i].face+'?x-oss-process=image/resize,w_80" alt="">';
+                    html+='<div class="grap-msg-text">';
+                    html+='<p class="grap-msg-text-name">'+data.commentResult[i].nickname+'</p>';
+                    html+='<p class="grap-msg-text-p">'+list.text+'</p>';
+                    html+='</div>';
+                    html+='</div>';
+                }
+                $(".grap-msg-box").append(html);    
+                if(e*20>data.totalSize){
+                    $(".grap-msg-box").append('<div class="grap-bottom-box">没有更多了</div>');   
+                    $(".grap-bottom-box").unbind("click") 
+                }else{
+                    $(".grap-msg-box").append('<div class="grap-bottom-box">加载更多</div>');   
+                    var moreClick=true
+                    $(".grap-bottom-box").unbind("click").on("click",function(){
+                        if(moreClick==false)return;
+                        moreClick=false
+                        $(this).hide()
+                        addMsg(pageNum)
+                        pageNum++
+                    })
+                }
+            }
+        })
+    }
+    function moreAspect(){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryTopics',
+            data:{
+                page:1,
+                size:10,
+                type:2,
+                tag:sessionStorage.tag,
+            },
+            success:function(data){
+                // //console.log('獲取貼文列表',data)
+                var html=[];
+                var moreNum=0
+                for(var i=0;i<6;i++){
+                    var list=data.dataList[i]
+                    var videoList=JSON.parse(list.content)
+                    if(sessionStorage.topicId==list.topicId)continue;
+                    if(data.dataList[i].type!=2)continue;
+                    if(moreNum==3)continue;
+                    moreNum++
+                    html+='<a href="Graphics.html?topicId='+list.topicId+'&tag='+sessionStorage.tag+'"><div data-type="'+list.topicId+'" class="add-video-box">';
+                    html+='<div class="add-shadow"></div>';
+                    html+='<div class="add-face-name">';
+                    html+='<img src="https://zhibocdn.yabolive.net/comm'+list.face+'?x-oss-process=image/resize,w_80" alt="">';
+                    html+='<p>'+list.nickname+'</p>';
+                    html+='</div>';
+                    html+='<div style="background: url(https://zhibocdn.yabolive.net/comm'+videoList.images[0].url+')no-repeat;background-size: cover;" class="add-video-img">';
+                    html+='</div>';
+                    html+='<div class="add-video-text-box">';
+                    html+='<p>'+videoList.title+'</p>';
+                    html+='<div class="tag-content">';
+                    for(var j=0;j<list.tags.length;j++){
+                        html+='<div data-type="'+list.tags[j].tagId+'" class="tag">#'+list.tags[j].tagName+'</div>';
+                    }
+                    html+='</div>';
+                    html+='</div>';
+                    html+='</div></a>';
+                }
+                $(".add-video-big-box").html(html);
+                // $(".add-video-box").unbind("click").on("click",function(){
+                //     var _self=$(this).attr("data-type")
+                //     window.location.href="Graphics.html?topicId="+_self+"&tag="+sessionStorage.tag+""
+                // })
+            }
+        })
+
+    }
+    function listAdd(pageNum,typeNum,tagNum){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryTopics',
+            data:{
+                page:pageNum,
+                size:10,
+                type:typeNum,
+                tag:tagNum,
+            },
+            success:function(data){
+                // //console.log('獲取貼文列表',data)
+                for(var i=0;i<data.dataList.length;i++){
+                    if(data.dataList[i]==undefined)continue
+                    if(pageNum==1&&i<3)continue;
+                    var list=data.dataList[i]
+                    var videoList=JSON.parse(list.content)
+                    var html=[]
+                    html+='<a href="Graphics.html?topicId='+list.topicId+'&tag='+tagNum+'"><div data-type="'+list.topicId+'" class="add-video-box">';
+                    html+='<div class="add-shadow"></div>';
+                    html+='<div class="add-face-name">';
+                    html+='<img src="https://zhibocdn.yabolive.net/comm'+list.face+'?x-oss-process=image/resize,w_80" alt="">';
+                    html+='<p>'+list.nickname+'</p>';
+                    html+='</div>';
+                    html+='<div style="background: url(https://zhibocdn.yabolive.net/comm'+videoList.images[0].url+')no-repeat;background-size: cover;" class="add-video-img">';
+                    html+='</div>';
+                    html+='<div class="add-video-text-box">';
+                    html+='<p>'+videoList.title+'</p>';
+                    html+='<div class="tag-content">';
+                    for(var j=0;j<list.tags.length;j++){
+                        html+='<div data-type="'+list.tags[j].tagId+'" class="tag">#'+list.tags[j].tagName+'</div>';
+                    }
+                    html+='</div>';
+                    html+='</div>';
+                    html+='</div></a>';
+                    $(".add-video-big-box").append(html)
+                    
+                }
+                setTimeout(function(){
+                    scrollOk=true;
+                }, 500);
+                // $(".add-video-box").unbind("click").on("click",function(){
+                //     var _self=$(this).attr("data-type")
+                //     window.location.href="Graphics.html?topicId="+_self+"&tag="+tagNum+""
+                // })
+            }
+        })
+
+    }
+
+})
+</script>
+</html>
\ No newline at end of file
diff --git a/mobile/css/base.css b/mobile/css/base.css
new file mode 100644
index 0000000..20887a2
--- /dev/null
+++ b/mobile/css/base.css
@@ -0,0 +1,65 @@
+/*初始化  reset*/
+@charset "utf-8";
+body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,input,button,textarea,select,p,span,font,em,i,b,strong,button{margin:0;padding:0;}
+body{ margin:0;font-family: -apple-system,BlinkMacSystemFont,Helvetica Neue,PingFang SC,Microsoft YaHei,Source Han Sans SC,Noto Sans CJK SC,WenQuanYi Micro Hei,sans-serif;background:#fff; overflow:visible; color:#333333;}
+html, body { height: 100%;}
+input,select{font-size:12px;line-height:16px; border:0 none; vertical-align:middle;}
+button{ border:0 none;}
+.clear{clear:both;padding:0px;margin:0px;}
+img{border:0;}
+a {outline: none;}
+a:active {star:expression(this.onFocus=this.blur());}
+a:focus { outline:0; }
+input,button,select,textarea{outline:none}
+ul,li{list-style-type:none;_list-style:outside;}
+a{ text-decoration:none; color:#333;}
+a:hover{ color:#ff6600;}
+/* new clearfix清除浮动 */
+.clearfix:after {
+ visibility: hidden;
+ display: block;
+ font-size: 0;
+ content: " ";
+ clear: both;
+ height: 0;
+}
+.clearfix { display: block;zoom:1 }
+* html .clearfix {height: 1%; zoom: 1; } /* IE6 */
+*:first-child+html .clearfix { zoom: 1; } /* IE7 */
+html[xmlns] .clearfix { display: block; zoom:1}
+/*清除浮动-end*/
+h1,h2,h3,h4,h5,h6{font-weight: normal}
+
+/*这一句是用来解决在安卓上的点击出现篮框问题*/
+body{ -webkit-tap-highlight-color:rgba(0,0,0,0); }
+/*下面是解决ios上去除微信点击蓝色边框 */
+a:focus,
+input:focus,
+p:focus,
+div:focus{
+ -webkit-tap-highlight-color:rgba(0,0,0,0);
+ -webkit-user-modify:read-only;
+}
+/*清除浮动*/
+.w{
+ width: 1200px;
+ margin: 0 auto;
+}
+button{
+ cursor: pointer;
+ outline:none;
+}
+input[type=number] {
+ -moz-appearance:textfield;
+}
+input[type=number]::-webkit-inner-spin-button,
+input[type=number]::-webkit-outer-spin-button {
+ -webkit-appearance: none;
+ margin: 0;
+}
+
+/*版芯*/
+::-webkit-scrollbar{
+ display:none;
+}
+   
\ No newline at end of file
diff --git a/mobile/css/daily.css b/mobile/css/daily.css
new file mode 100644
index 0000000..2ae2687
--- /dev/null
+++ b/mobile/css/daily.css
@@ -0,0 +1,136 @@
+.overflowS {
+    overflow: scroll;
+    -webkit-overflow-scrolling: touch;
+}
+.overflowDot {
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    overflow: hidden;
+}
+.marginC {
+    margin: 0 auto;
+}
+
+.wiggle{
+    animation-name: wiggle;
+    -webkit-animation-name: wiggle;
+    animation-duration: 2s;
+    -webkit-animation-duration: 2s;
+    animation-iteration-count: infinite;
+    -webkit-animation-iteration-count: infinite;
+}
+@-webkit-keyframes wiggle {
+    10% {
+        -webkit-transform: rotate(3deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(3deg) scale(1.1);
+    }
+    20% {
+        -webkit-transform: rotate(-3deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(-3deg) scale(1.1);
+    }
+    30% {
+        -webkit-transform: rotate(3deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(3deg) scale(1.1);
+    }
+    40% {
+        -webkit-transform: rotate(-3deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(-3deg) scale(1.1);
+    }
+    50% {
+        -webkit-transform: rotate(3deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(3deg) scale(1.1);
+    }
+    60% {
+        -webkit-transform: rotate(-3deg) scale(1.1);
+        transform: rotate(-3deg) scale(1.1);
+    }
+    70% {
+        -webkit-transform: rotate(0deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(0deg) scale(1);
+    }
+    to {
+        -webkit-transform: rotate(0deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(0deg) scale(1);
+    }
+}
+@keyframes wiggle {
+    10% {
+        -webkit-transform: rotate(3deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(3deg) scale(1.1);
+    }
+    20% {
+        -webkit-transform: rotate(-3deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(-3deg) scale(1.1);
+    }
+    30% {
+        -webkit-transform: rotate(3deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(3deg) scale(1.1);
+    }
+    40% {
+        -webkit-transform: rotate(-3deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(-3deg) scale(1.1);
+    }
+    50% {
+        -webkit-transform: rotate(3deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(3deg) scale(1.1);
+    }
+    60% {
+        -webkit-transform: rotate(-3deg) scale(1.1);
+        transform: rotate(-3deg) scale(1.1);
+    }
+    70% {
+        -webkit-transform: rotate(0deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(0deg) scale(1);
+    }
+    to {
+        -webkit-transform: rotate(0deg) scale3d(1.1, 1.1, 1.1);
+        transform: rotate(0deg) scale(1);
+    }
+}
+.rotateGo{
+    animation: rotateGo 3s linear infinite;
+}
+@keyframes rotateGo{
+0%{
+    transform: rotate(0deg);
+}
+100%{
+    transform: rotate(360deg);
+}
+}
+
+.layui-layer-ico {
+    display: none !important;
+}
+.layui-layer {
+    box-shadow: none !important;
+}
+.yourclass {
+    background: rgba(0, 0, 0, 0) !important;
+    border-radius: 0rem !important;
+}
+.layui-layer-page .layui-layer-content {
+    /*border-radius: 0.4rem !important;*/
+}
+.yourclass2 {
+    border-radius: 0rem !important;
+    background: rgba(0, 0, 0, 0) !important;
+}
+.yourclass2 .layui-layer-content {
+    border-radius: 0rem !important;
+}
+.layui-layer-page .layui-layer-content{
+    overflow: inherit !important;
+}
+
+@keyframes line {
+    0% {
+        height: 0.3rem;
+    }
+    50% {
+        height: 0.1rem;
+    }
+    100% {
+        height: 0.3rem;
+    }
+}
diff --git a/mobile/css/index.css b/mobile/css/index.css
new file mode 100644
index 0000000..db9a11a
--- /dev/null
+++ b/mobile/css/index.css
@@ -0,0 +1,754 @@
+.m-content {
+  width: 10rem;
+  margin: 0 auto;
+  position: relative;
+  overflow: hidden;
+  background: #F3F3F3;
+}
+.top-bg {
+  width: 10.8rem;
+  height: 3.25rem;
+  background: url(../images/top-bg.png) no-repeat;
+  background-size: 100% 100%;
+  position: absolute;
+  left: -0.4rem;
+  top: -1.2rem;
+}
+.nav-btn {
+  font-size: 0.5rem;
+  font-weight: 700;
+  width: 10.8rem;
+  text-align: center;
+  position: relative;
+  top: 1.6rem;
+}
+.nav-btn > div {
+  width: 2rem;
+  display: inline-block;
+  height: 0.8rem;
+  text-align: center;
+  color: #FFABEE;
+  position: relative;
+}
+.nav-btn > div img {
+  display: none;
+  position: absolute;
+  width: 0.44rem;
+  left: 50%;
+  margin-left: -0.22rem;
+  bottom: 0;
+}
+.nav-btn .nav-click {
+  color: #ffffff;
+}
+.nav-btn .nav-click img {
+  display: block;
+}
+.nav-box {
+  position: absolute;
+  top: 0;
+  height: 2.6rem;
+  background: #f3f3f3;
+  width: 10rem;
+  transition: 0.35s all;
+  z-index: 450;
+}
+.nav-box-show {
+  position: fixed;
+  transform: translateY(-3.5rem);
+}
+.title-nav {
+  position: absolute;
+  height: 0.75rem;
+  line-height: 0.75rem;
+  width: 9.35rem;
+  margin: 0 auto;
+  font-size: 0;
+  left: 0.325rem;
+  top: 1.8rem;
+}
+.title-nav .title-nav-content {
+  width: 13rem;
+  height: 0.75rem;
+}
+.title-nav .title-nav-box {
+  height: 0.75rem;
+  width: 8rem;
+  overflow: scroll;
+  -webkit-overflow-scrolling: touch;
+}
+.title-nav h2 {
+  width: 1.3rem;
+  height: 0.75rem;
+  display: inline-block;
+  font-size: 0.4rem;
+  color: #606060;
+  text-align: center;
+}
+.recommend-swiper {
+  width: 9.35rem;
+  height: 5.05rem;
+  margin: 0 auto;
+  overflow: hidden;
+  margin-top: 0.2rem;
+  position: relative;
+}
+.recommend-swiper .mySwiper {
+  width: 9.35rem;
+  height: 5.05rem;
+}
+.recommend-swiper .swiper-pagination {
+  position: absolute;
+  bottom: 0.2rem !important;
+}
+.recommend-swiper .video {
+  width: 9.35rem;
+  height: 5.05rem;
+  border-radius: 0.1rem;
+}
+.swiper-slide {
+  width: 9.35rem;
+  height: 5.05rem;
+  position: relative;
+}
+.swiper-img {
+  width: 9.35rem;
+  height: 5.05rem;
+  text-align: center;
+  overflow: hidden;
+  position: relative;
+  border-radius: 0.2rem;
+  background: url(../images/nav-img.png) no-repeat;
+  background-size: cover;
+}
+.swiper-img .top-img-shadow {
+  width: 9.35rem;
+  height: 5.05rem;
+  position: absolute;
+  left: 0;
+  bottom: 0;
+  background: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0), rgba(0, 0, 0, 0), rgba(0, 0, 0, 0));
+}
+.swiper-time {
+  width: 1.35rem;
+  height: 0.55rem;
+  line-height: 0.55rem;
+  font-size: 0.3rem;
+  text-align: center;
+  color: #ffffff;
+  position: absolute;
+  top: 0.3rem;
+  right: 0;
+  background: rgba(0, 0, 0, 0.5);
+  border-radius: 1rem 0 0 1rem;
+}
+.play-icon {
+  width: 1.06rem;
+  position: absolute;
+  top: 1.85rem;
+  left: 4.14rem;
+}
+.swiper-name {
+  font-size: 0.45rem;
+  font-weight: 700;
+  position: absolute;
+  color: #ffffff;
+  top: 3.4rem;
+  left: 0.3rem;
+}
+.swiper-face-name {
+  position: absolute;
+  top: 4.2rem;
+  left: 0.3rem;
+  line-height: 0.65rem;
+  color: #ffffff;
+  font-size: 0.3rem;
+  text-indent: 0.8rem;
+  z-index: 10;
+}
+.swiper-face-name img {
+  left: 0;
+  position: absolute;
+  height: 0.55rem;
+  width: 0.55rem;
+  border-radius: 50%;
+  border: 0.05rem solid #E13D85;
+}
+.add-face-name {
+  position: absolute;
+  z-index: 10;
+  top: 4.2rem;
+  left: 0.3rem;
+  line-height: 0.65rem;
+  color: #ffffff;
+  font-size: 0.3rem;
+  text-indent: 0.8rem;
+}
+.add-face-name img {
+  left: 0;
+  position: absolute;
+  height: 0.55rem;
+  width: 0.55rem;
+  border-radius: 50%;
+  border: 0.05rem solid #E13D85;
+}
+.swiper-more {
+  width: 2rem;
+  position: absolute;
+  height: 0.5rem;
+  bottom: 0.2rem;
+  right: 0;
+}
+.swiper-more .swiper-more1 {
+  color: #ffffff;
+  font-size: 0.3rem;
+  width: 1rem;
+  height: 0.5rem;
+  line-height: 0.5rem;
+  float: left;
+  position: relative;
+  text-indent: 0.5rem;
+}
+.swiper-more .swiper-more1 img {
+  left: 0;
+  position: absolute;
+  width: 0.4rem;
+  top: 0.05rem;
+}
+.swiper-more .swiper-more2 {
+  color: #ffffff;
+  font-size: 0.3rem;
+  width: 1rem;
+  height: 0.5rem;
+  line-height: 0.5rem;
+  float: left;
+  position: relative;
+  text-indent: 0.5rem;
+}
+.swiper-more .swiper-more2 img {
+  left: 0;
+  position: absolute;
+  width: 0.4rem;
+  top: 0.05rem;
+}
+.module-title {
+  position: relative;
+  height: 0.5rem;
+  color: #333333;
+  font-size: 0.4rem;
+  font-weight: 700;
+  text-indent: 0.15rem;
+  margin-left: 0.33rem;
+  margin-top: 0.4rem;
+}
+.module-title img {
+  height: 0.32rem;
+  top: 0.09rem;
+  position: absolute;
+  left: 0;
+}
+.more-live-box {
+  height: 3rem;
+  width: 10rem;
+  overflow-x: scroll;
+  white-space: nowrap;
+  margin-top: 0.4rem;
+  position: relative;
+}
+.more-live-box .live-box {
+  display: inline-block;
+  width: 2.4rem;
+  height: 3rem;
+  margin-left: 0.2rem;
+  float: left;
+}
+.more-live-box .live-face-box {
+  width: 2.4rem;
+  height: 2.4rem;
+  border-radius: 0.2rem 0.2rem 0 0;
+  overflow: hidden;
+  font-size: 0;
+  background: #fff;
+}
+.more-live-box .live-face-box img {
+  width: 2.4rem;
+  height: 2.4rem;
+}
+.more-live-box .live-box-name {
+  height: 0.6rem;
+  width: 2.4rem;
+  line-height: 0.6rem;
+  background: #fff;
+  color: #424242;
+  font-size: 0.3rem;
+  text-indent: 0.2rem;
+  border-radius: 0 0 0.2rem 0.2rem;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+}
+.more-live-box .live-box-cotnent {
+  width: 13.5rem;
+}
+.more-live-box .live-box-cotnent .live-box:nth-child(1) {
+  margin-left: 0.3rem;
+}
+.recommended-videos {
+  height: 4.3rem;
+  width: 10rem;
+  overflow-x: scroll;
+  margin-top: 0.4rem;
+  margin-bottom: 0.5rem;
+}
+.videos-content {
+  width: 31rem;
+}
+.videos-box {
+  width: 7.35rem;
+  height: 4.3rem;
+  background: url(../images/video-bg.png) no-repeat;
+  background-size: cover;
+  border-radius: 0.2rem;
+  margin-left: 0.3rem;
+  float: left;
+  position: relative;
+}
+.videos-box .play-icon {
+  left: 3.15rem;
+  top: 1.35rem;
+}
+.videos-shadow {
+  border-radius: 0.2rem;
+  width: 7.35rem;
+  height: 4.3rem;
+  position: absolute;
+  pointer-events: none;
+  background: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0), rgba(0, 0, 0, 0), rgba(0, 0, 0, 0));
+  z-index: 1;
+}
+.video-time {
+  width: 1.35rem;
+  height: 0.55rem;
+  line-height: 0.55rem;
+  font-size: 0.3rem;
+  text-align: center;
+  color: #ffffff;
+  position: absolute;
+  top: 0.3rem;
+  right: 0;
+  background: rgba(0, 0, 0, 0.5);
+  border-radius: 1rem 0 0 1rem;
+  z-index: 2;
+}
+.video-more {
+  z-index: 2;
+  width: 2rem;
+  position: absolute;
+  height: 0.5rem;
+  bottom: 0.2rem;
+  left: 0.45rem;
+}
+.video-more .video-more1 {
+  color: #ffffff;
+  font-size: 0.3rem;
+  width: 1rem;
+  height: 0.5rem;
+  line-height: 0.5rem;
+  float: left;
+  position: relative;
+  text-indent: 0.5rem;
+}
+.video-more .video-more1 img {
+  left: 0;
+  position: absolute;
+  width: 0.4rem;
+  top: 0.05rem;
+}
+.video-more .video-more2 {
+  color: #ffffff;
+  font-size: 0.3rem;
+  width: 1rem;
+  height: 0.5rem;
+  line-height: 0.5rem;
+  float: left;
+  position: relative;
+  text-indent: 0.5rem;
+}
+.video-more .video-more2 img {
+  left: 0;
+  position: absolute;
+  width: 0.4rem;
+  top: 0.05rem;
+}
+.swiper-pagination-bullet-active {
+  background: #E53996;
+}
+.video-face {
+  z-index: 2;
+  width: 1.05rem;
+  height: 1.05rem;
+  border-radius: 50%;
+  position: absolute;
+  border: 0.05rem solid #E13D85;
+  top: 3rem;
+  left: 0.2rem;
+}
+.video-title {
+  z-index: 2;
+  font-size: 0.35rem;
+  color: #fff;
+  position: absolute;
+  top: 3.1rem;
+  left: 0.45rem;
+}
+.add-video-box {
+  position: relative;
+  width: 9.35rem;
+  min-height: 6.75rem;
+  margin: 0 auto;
+  border-radius: 0.2rem;
+  overflow: hidden;
+  margin-top: 0.3rem;
+  background: #FFFFFF;
+}
+.add-video-img {
+  width: 9.35rem;
+  height: 5.08rem;
+  background: url(../images/add-img.png) no-repeat;
+  background-size: cover;
+  position: relative;
+  background-position-y: center;
+}
+.add-video-text-box {
+  height: 1.65rem;
+  width: 9.35rem;
+  position: relative;
+}
+.add-video-text-box > p {
+  color: #131313;
+  font-size: 0.35rem;
+  text-indent: 0.28rem;
+  margin-top: 0.2rem;
+  font-weight: 700;
+}
+.tag-content {
+  margin-left: 0.28rem;
+  margin-top: 0.15rem;
+}
+.tag-content .tag {
+  min-width: 1.05rem;
+  height: 0.45rem;
+  background: #FFE8F1;
+  color: #E53985;
+  font-size: 0.3rem;
+  line-height: 0.45rem;
+  text-align: center;
+  float: left;
+  margin-right: 0.2rem;
+  border-radius: 0.1rem;
+  margin-bottom: 0.2rem;
+}
+.add-shadow {
+  width: 9.35rem;
+  height: 5.08rem;
+  background: linear-gradient(to top, rgba(0, 0, 0, 0.5), rgba(0, 0, 0, 0), rgba(0, 0, 0, 0), rgba(0, 0, 0, 0));
+  position: absolute;
+  top: 0;
+  left: 0;
+  pointer-events: none;
+  z-index: 5;
+}
+.add-time {
+  color: #fff;
+  font-size: 0.3rem;
+  position: absolute;
+  z-index: 10;
+  right: 0.4rem;
+  top: 4.3rem;
+}
+.grap-swiper-box {
+  width: 10rem;
+  height: 5.6rem;
+}
+.grap-name-box {
+  height: 1.6rem;
+  width: 10rem;
+  position: relative;
+}
+.grap-user-face {
+  width: 0.8rem;
+  height: 0.8rem;
+  position: absolute;
+  top: 0.4rem;
+  left: 0.4rem;
+  border-radius: 100%;
+}
+.grap-name-p1 {
+  font-size: 0.35rem;
+  color: #353535;
+  text-indent: 1.6rem;
+  padding-top: 0.4rem;
+}
+.grap-name-p2 {
+  font-size: 0.3rem;
+  color: #919191;
+  text-indent: 1.6rem;
+}
+.grap-like {
+  width: 1.78rem;
+  height: 0.98rem;
+  background: url(../images/like.png) no-repeat;
+  background-size: 100% 100%;
+  position: absolute;
+  color: #fff;
+  font-size: 0.33rem;
+  font-weight: 700;
+  line-height: 0.82rem;
+  right: 0.2rem;
+  text-indent: 0.7rem;
+  top: 0.4rem;
+}
+.grap-content {
+  min-height: 2.6rem;
+  width: 10rem;
+  border-bottom: 1px solid #E9E9E9;
+}
+.grap-title {
+  color: #2A2A2A;
+  font-size: 0.45rem;
+  font-weight: 700;
+  padding-top: 0.3rem;
+  width: 9.3rem;
+  margin: 0 auto;
+}
+.grap-more {
+  height: 0.75rem;
+  line-height: 0.75rem;
+  position: relative;
+  font-size: 0;
+  padding-top: 0.1rem;
+}
+.grap-more .grap-more1 {
+  float: left;
+  height: 0.75rem;
+  font-size: 0.3rem;
+  color: #A4A4A4;
+  margin-right: 0.3rem;
+  margin-left: 0.4rem;
+}
+.grap-more .grap-more1 > img {
+  vertical-align: middle;
+  width: 0.4rem;
+  margin-top: -0.08rem;
+}
+.grap-more .grap-more2 {
+  float: left;
+  height: 0.75rem;
+  font-size: 0.3rem;
+  color: #A4A4A4;
+}
+.grap-more .grap-more2 > img {
+  vertical-align: middle;
+  width: 0.4rem;
+  margin-top: -0.08rem;
+}
+.grap-msg-box {
+  position: relative;
+  width: 10rem;
+  border-bottom: 1px solid #E9E9E9;
+}
+.grap-msg-top {
+  font-size: 0.45rem;
+  color: #333333;
+  font-weight: 700;
+  text-indent: 0.4rem;
+  padding-top: 0.3rem;
+}
+.grap-msg-content {
+  width: 10rem;
+  position: relative;
+  margin-top: 0.3rem;
+}
+.grap-msg-text {
+  width: 8.3rem;
+  background: #EEEEEE;
+  margin-left: 1.1rem;
+  border-radius: 0.1rem;
+}
+.grap-msg-text-name {
+  color: #323232;
+  font-size: 0.3rem;
+  font-weight: 700;
+  text-indent: 0.25rem;
+  padding-top: 0.25rem;
+}
+.grap-msg-text-p {
+  margin-left: 0.3rem;
+  color: #323232;
+  font-size: 0.3rem;
+  margin-right: 0.2rem;
+  line-height: 0.5rem;
+  padding-bottom: 0.2rem;
+}
+.grap-msg-face {
+  width: 0.7rem;
+  height: 0.7rem;
+  border-radius: 50%;
+  position: absolute;
+  left: 0.25rem;
+}
+.grap-bottom-box {
+  height: 1.05rem;
+  width: 10rem;
+  text-align: center;
+  font-size: 0.35rem;
+  color: #E53B86;
+  line-height: 1.05rem;
+}
+.grap-text2 {
+  font-size: 0.4rem;
+  font-weight: 700;
+  color: #333333;
+  margin-left: 0.3rem;
+  padding-top: 0.4rem;
+}
+.more-btn {
+  width: 0.42rem;
+  position: absolute;
+  right: 0;
+  top: 0.13rem;
+}
+.layer-tag-box {
+  position: fixed;
+  top: -12rem;
+  left: 0;
+  width: 10rem;
+  height: 12rem;
+  background: #FFFFFF;
+  border-radius: 0 0 0.25rem 0.25rem;
+  z-index: 800;
+  transition: 0.35s all;
+}
+.layer-shadow {
+  display: none;
+  position: fixed;
+  width: 100vw;
+  height: 100vh;
+  background: rgba(0, 0, 0, 0.4);
+  z-index: 5;
+  top: 0;
+  left: 0;
+  z-index: 500;
+}
+.layer-tag-title {
+  color: #333333;
+  font-weight: 700;
+  font-size: 0.4rem;
+  text-indent: 0.4rem;
+  padding-top: 0.4rem;
+}
+.layer-tag-ul {
+  width: 10rem;
+  height: 10.8rem;
+  overflow: scroll;
+  -webkit-overflow-scrolling: touch;
+}
+.layer-tag-ul li {
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+  width: 2.8rem;
+  height: 0.9rem;
+  border-radius: 1rem;
+  margin-left: 0.4rem;
+  background: #F4F4F4;
+  float: left;
+  margin-top: 0.25rem;
+  text-align: center;
+  line-height: 0.9rem;
+  color: #353535;
+  font-size: 0.35rem;
+  font-weight: 700;
+}
+.layer-tag-ul .tag-click {
+  background: #E53985;
+  color: #fff;
+}
+.big-img-box {
+  width: 100vw;
+  height: 100vh;
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 500;
+  background: rgba(0, 0, 0, 0.7);
+}
+.big-img-box .swiper-slide img {
+  width: 10rem;
+}
+.big-img-box .swiper-slide {
+  width: 100vw !important;
+  height: 100vh !important;
+  line-height: 100vh !important;
+  font-size: 0;
+}
+.big-img-box .swiper-slide img {
+  vertical-align: middle;
+}
+.big-img-box .swiper-pagination {
+  width: 10rem;
+  position: absolute;
+  bottom: 0.5rem;
+}
+.big-img-box .swiper-pagination-bullet {
+  background: #fff;
+  opacity: 1;
+}
+.big-img-box .swiper-pagination-bullet-active {
+  background: #E53996;
+}
+.big-img-close {
+  color: #fff;
+}
+.tag-go {
+  color: #E53985 !important;
+}
+.bottom-nav {
+  width: 10.64rem;
+  height: 2.24rem;
+  background: url(../images/bottom-nav.png) no-repeat;
+  background-size: 100% 100%;
+  position: fixed;
+  z-index: 500;
+  bottom: -0.24rem;
+  left: 50%;
+  margin-left: -5.32rem;
+}
+.bottom-nav-h1 {
+  font-size: 0.3rem;
+  position: absolute;
+  color: #000;
+  top: 1.3rem;
+  left: 1.93rem;
+}
+.bottom-nav-btn {
+  width: 1.85rem;
+  height: 0.8rem;
+  position: absolute;
+  left: 8.1rem;
+  top: 0.8rem;
+}
+.bottom-close-btn {
+  width: 0.5rem;
+  height: 0.5rem;
+  position: absolute;
+  left: 9.8rem;
+  top: 0.35rem;
+}
+.back {
+  width: 0.6rem;
+  position: fixed;
+  left: 0.3rem;
+  z-index: 800;
+  top: 0.3rem;
+}
diff --git a/mobile/css/index.less b/mobile/css/index.less
new file mode 100644
index 0000000..7f073bf
--- /dev/null
+++ b/mobile/css/index.less
@@ -0,0 +1,769 @@
+.m-content{
+  width: 10rem;
+  margin: 0 auto;
+  position: relative;
+  overflow: hidden;
+  background: #F3F3F3;
+}
+.top-bg{
+  width: 10.8rem;
+  height: 3.25rem;
+  background: url(../images/top-bg.png) no-repeat;
+  background-size: 100% 100%;
+  position: absolute;
+  left: -0.4rem;
+  top: -1.2rem;
+}
+
+.nav-btn{
+  font-size: 0.5rem;
+  font-weight: 700;
+  width: 10.8rem;
+  text-align: center;
+  position: relative;
+  top: 1.6rem;
+  >div{
+    width: 2rem;
+    display: inline-block;
+    height: 0.8rem;
+    text-align: center;
+    color: #FFABEE;
+    position: relative;
+    img{
+      display: none;
+      position: absolute;
+      width: 0.44rem;
+      left: 50%;
+      margin-left: -0.22rem;
+      bottom: 0;
+    }
+  }
+  .nav-click{
+    color: #ffffff;
+    img{
+      display: block;
+    }
+  }
+}
+.nav-box{
+  position: absolute;
+  top: 0;
+  height: 2.6rem;
+  background: rgb(243, 243, 243);
+  width: 10rem;
+  transition: 0.35s all;
+  z-index: 450;
+}
+.nav-box-show{
+  position: fixed;
+  transform: translateY(-3.5rem);
+}
+.title-nav{
+  position: absolute;
+  height: 0.75rem;
+  line-height: 0.75rem;
+  width: 9.35rem;
+  margin: 0 auto;
+  font-size: 0;
+  left: 0.325rem;
+  top: 1.8rem;
+  .title-nav-content{
+    width: 13rem;
+    height: 0.75rem;
+  }
+  .title-nav-box{
+    height: 0.75rem;
+    width: 8rem;
+    overflow: scroll;
+    -webkit-overflow-scrolling: touch;
+  } 
+  h2{
+    width: 1.3rem;
+    height: 0.75rem;
+    display: inline-block;
+    font-size: 0.4rem;
+    color: #606060;
+    text-align: center;
+  }
+}
+.recommend-swiper{
+  width: 9.35rem;
+  height: 5.05rem;
+  // background: pink;
+  margin: 0 auto;
+  overflow: hidden;
+  margin-top: 0.2rem;
+  position: relative;
+  .mySwiper{
+    width: 9.35rem;
+    height: 5.05rem;
+
+  }
+  .swiper-pagination{
+    position: absolute;
+    bottom: 0.2rem !important;
+  }
+  .video{
+    width: 9.35rem;
+    height: 5.05rem;
+    border-radius: 0.1rem;
+  
+  }
+}
+.swiper-slide{
+  width: 9.35rem;
+  height: 5.05rem;
+  position: relative;
+}
+.swiper-img{
+  width: 9.35rem;
+  height: 5.05rem;
+  text-align: center;
+  overflow: hidden;
+  position: relative;
+  border-radius: 0.2rem;
+  background: url(../images/nav-img.png)no-repeat;
+  background-size: cover;
+  .top-img-shadow{
+    width: 9.35rem;
+    height: 5.05rem;
+    position: absolute;
+    left: 0;
+    bottom: 0;
+    background:linear-gradient(to top,rgba(0,0,0,0.5), rgba(0,0,0,0), rgba(0,0,0,0), rgba(0,0,0,0));
+  }
+}
+.swiper-time{
+  width: 1.35rem;
+  height: 0.55rem;
+  line-height: 0.55rem;
+  font-size: 0.3rem;
+  text-align: center;
+  color: #ffffff;
+  position: absolute;
+  top: 0.3rem;
+  right: 0;
+  background: rgba(0,0,0,0.5);
+  border-radius: 1rem 0 0 1rem;
+}
+.play-icon{
+  width: 1.06rem;
+  position: absolute;
+  top: 1.85rem;
+  left: 4.14rem;
+}
+.swiper-name{
+  font-size: 0.45rem;
+  font-weight: 700;
+  position: absolute;
+  color: #ffffff;
+  top: 3.4rem;
+  left: 0.3rem;
+}
+.swiper-face-name{
+  position: absolute;
+  top: 4.2rem;
+  left: 0.3rem;
+  line-height: 0.65rem;
+  color: #ffffff;
+  font-size: 0.3rem;
+  text-indent: 0.8rem;
+  z-index: 10;
+  img{
+    left: 0;
+    position: absolute;
+    height: 0.55rem;
+    width: 0.55rem;
+    border-radius: 50%;
+    border: 0.05rem solid #E13D85;
+  }
+}
+.add-face-name{
+  position: absolute;
+  z-index: 10;
+  top: 4.2rem;
+  left: 0.3rem;
+  line-height: 0.65rem;
+  color: #ffffff;
+  font-size: 0.3rem;
+  text-indent: 0.8rem;
+  img{
+    left: 0;
+    position: absolute;
+    height: 0.55rem;
+    width: 0.55rem;
+    border-radius: 50%;
+    border: 0.05rem solid #E13D85;
+  }
+}
+.swiper-more{
+  width: 2rem;
+  position: absolute;
+  height: 0.5rem;
+  bottom: 0.2rem;
+  right: 0;
+
+  .swiper-more1{
+    color: #ffffff;
+    font-size: 0.3rem;
+    width: 1rem;
+    height: 0.5rem;
+    line-height: 0.5rem;
+    float: left;
+    position: relative;
+    text-indent: 0.5rem;
+    img{
+      left: 0;
+      position: absolute;
+      width: 0.4rem;
+      top: 0.05rem;
+    }
+  }
+  .swiper-more2{
+    color: #ffffff;
+    font-size: 0.3rem;
+    width: 1rem;
+    height: 0.5rem;
+    line-height: 0.5rem;
+    float: left;
+    position: relative;
+    text-indent: 0.5rem;
+    img{
+      left: 0;
+      position: absolute;
+      width: 0.4rem;
+      top: 0.05rem;
+    }
+  }
+}
+.module-title{
+  position: relative;
+  height: 0.5rem;
+  color: #333333;
+  font-size: 0.4rem;
+  font-weight: 700;
+  text-indent: 0.15rem;
+  margin-left: 0.33rem;
+  margin-top: 0.4rem;
+
+  img{
+    height: 0.32rem;
+    top: 0.09rem;
+    position: absolute;
+    left: 0;
+  }
+ 
+}
+.more-live-box{
+  height: 3rem;
+  width: 10rem;
+  overflow-x: scroll;
+  white-space: nowrap;
+
+  margin-top: 0.4rem;
+  position: relative;
+  .live-box{
+    display: inline-block;
+    width: 2.4rem;
+    height:3rem;  
+    margin-left: 0.2rem;
+    float: left;
+
+  }
+  .live-face-box{
+    width: 2.4rem;
+    height: 2.4rem;
+    border-radius: 0.2rem 0.2rem 0 0;
+    overflow: hidden;
+    font-size: 0;
+    background: #fff;
+    img{
+      width: 2.4rem;
+      height: 2.4rem;
+    }
+  }
+  .live-box-name{
+    height: 0.6rem;
+    width: 2.4rem;
+    line-height: 0.6rem;
+    background: #fff;
+    color:#424242;
+    font-size: 0.3rem;
+    text-indent: 0.2rem;
+    border-radius: 0 0 0.2rem 0.2rem;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    overflow: hidden;
+  }
+  .live-box-cotnent{
+    width: 13.5rem;
+    .live-box:nth-child(1){
+      margin-left: 0.3rem;
+    }
+  }
+}
+.recommended-videos{
+  height: 4.3rem;
+  width: 10rem;
+  overflow-x: scroll;
+  margin-top: 0.4rem;
+  margin-bottom: 0.5rem;
+}
+.videos-content{
+  width: 31rem;
+}
+.videos-box{
+  width: 7.35rem;
+  height: 4.3rem;
+  background: url(../images/video-bg.png) no-repeat;
+  background-size: cover;
+  border-radius: 0.2rem;
+  margin-left: 0.3rem;
+  float: left;
+  position: relative;
+  .play-icon{
+    left: 3.15rem;
+    top: 1.35rem;
+  }
+}
+.videos-shadow{
+  border-radius: 0.2rem;
+  width: 7.35rem;
+  height: 4.3rem;
+  position: absolute;
+  pointer-events: none;
+  background:linear-gradient(to top,rgba(0,0,0,0.5), rgba(0,0,0,0), rgba(0,0,0,0), rgba(0,0,0,0));
+  z-index: 1;
+}
+.video-time{
+  width: 1.35rem;
+  height: 0.55rem;
+  line-height: 0.55rem;
+  font-size: 0.3rem;
+  text-align: center;
+  color: #ffffff;
+  position: absolute;
+  top: 0.3rem;
+  right: 0;
+  background: rgba(0,0,0,0.5);
+  border-radius: 1rem 0 0 1rem;
+  z-index: 2;
+}
+.video-more{
+  z-index: 2;
+  width: 2rem;
+  position: absolute;
+  height: 0.5rem;
+  bottom: 0.2rem;
+  left: 0.45rem;
+  .video-more1{
+    color: #ffffff;
+    font-size: 0.3rem;
+    width: 1rem;
+    height: 0.5rem;
+    line-height: 0.5rem;
+    float: left;
+    position: relative;
+    text-indent: 0.5rem;
+    img{
+      left: 0;
+      position: absolute;
+      width: 0.4rem;
+      top: 0.05rem;
+    }
+  }
+  .video-more2{
+    color: #ffffff;
+    font-size: 0.3rem;
+    width: 1rem;
+    height: 0.5rem;
+    line-height: 0.5rem;
+    float: left;
+    position: relative;
+    text-indent: 0.5rem;
+    img{
+      left: 0;
+      position: absolute;
+      width: 0.4rem;
+      top: 0.05rem;
+    }
+  }
+}
+.swiper-pagination-bullet-active{
+  background: #E53996;
+}
+.video-face{
+  z-index: 2;
+  width: 1.05rem;
+  height: 1.05rem;
+  border-radius: 50%;
+  position: absolute;
+  border: 0.05rem solid #E13D85;
+  top: 3rem;
+  left: 0.2rem;
+}
+.video-title{
+  z-index: 2;
+  font-size: 0.35rem;
+  color: #fff;
+  position: absolute;
+  top: 3.1rem;
+  left: .45rem;
+}
+.add-video-box{
+  position: relative;
+  width: 9.35rem;
+  min-height: 6.75rem;
+  margin: 0 auto;
+  border-radius: 0.2rem;
+  overflow: hidden;
+  margin-top: 0.3rem;
+  background: #FFFFFF;
+}
+.add-video-img{
+  width: 9.35rem;
+  height: 5.08rem;
+  background:url(../images/add-img.png)no-repeat;
+  background-size: cover;
+  position: relative;
+  background-position-y: center;
+}
+.add-video-text-box{
+  height: 1.65rem;
+  width: 9.35rem;
+  position: relative;
+  >p{
+    color: #131313;
+    font-size: 0.35rem;
+    text-indent: 0.28rem;
+    margin-top: 0.2rem;
+    font-weight: 700;
+  }
+}
+.tag-content{
+  margin-left: 0.28rem;
+  margin-top: 0.15rem;
+  .tag{
+    min-width: 1.05rem;
+    height: 0.45rem;
+    background: #FFE8F1;
+    color: #E53985;
+    font-size: 0.3rem;
+    line-height: 0.45rem;
+    text-align: center;
+    float: left;
+    margin-right: 0.2rem;
+    border-radius: 0.1rem;
+    margin-bottom: 0.2rem;
+  }
+}
+.add-shadow{
+  width: 9.35rem;
+  height: 5.08rem;
+  background:linear-gradient(to top,rgba(0,0,0,0.5), rgba(0,0,0,0), rgba(0,0,0,0), rgba(0,0,0,0));
+  position: absolute;
+  top: 0;
+  left: 0;
+  pointer-events: none;
+  z-index: 5;
+}
+.add-time{
+  color: #fff;
+  font-size: 0.3rem;
+  position: absolute;
+  z-index: 10;
+  right: 0.4rem;
+  top: 4.3rem;
+}
+.grap-swiper-box{
+  width: 10rem;
+  height: 5.6rem;
+  // background:pink;
+}
+.grap-name-box{
+  height: 1.6rem;
+  width: 10rem;
+
+  position: relative;
+}
+.grap-user-face{
+  width: 0.8rem;
+  height: 0.8rem;
+  position: absolute;
+  top: 0.4rem;
+  left: 0.4rem;
+  border-radius: 100%;
+}
+.grap-name-p1{
+  font-size: 0.35rem;
+  color: #353535;
+  text-indent: 1.6rem;
+  padding-top: 0.4rem;
+}
+.grap-name-p2{
+  font-size: 0.3rem;
+  color: #919191;
+  text-indent: 1.6rem;
+}
+.grap-like{
+  width: 1.78rem;
+  height: 0.98rem;
+  background: url(../images/like.png) no-repeat;
+  background-size: 100% 100%;
+  position: absolute;
+  color: #fff;
+  font-size: 0.33rem;
+  font-weight: 700;
+  line-height: 0.82rem;
+  right: 0.2rem;
+  text-indent: 0.7rem;
+  top: 0.4rem;
+}
+.grap-content{
+  min-height: 2.6rem;
+  width: 10rem;
+  border-bottom: 1px solid #E9E9E9;
+}
+.grap-title{
+  color: #2A2A2A;
+  font-size: 0.45rem;
+  font-weight: 700;
+
+  padding-top: 0.3rem;
+  width: 9.3rem;
+  margin: 0 auto;
+}
+.grap-more{
+  height: 0.75rem;
+  line-height: 0.75rem;
+  position: relative;
+  font-size: 0;
+  padding-top: 0.1rem;
+  .grap-more1{
+    float: left;
+    height: 0.75rem;
+    font-size: 0.3rem;
+    color: #A4A4A4;
+    margin-right: 0.3rem;
+    margin-left: 0.4rem;
+    >img{
+      vertical-align: middle;
+      width: 0.4rem;
+      margin-top: -0.08rem;
+    }
+  }
+  .grap-more2{
+    float: left;
+    height: 0.75rem;
+    font-size: 0.3rem;
+    color: #A4A4A4;
+    >img{
+      vertical-align: middle;
+      width: 0.4rem;
+      margin-top: -0.08rem;
+    }
+  }
+}
+.grap-msg-box{
+  position: relative;
+  // height: 6.2rem;
+  width: 10rem;
+  border-bottom: 1px solid #E9E9E9;
+}
+.grap-msg-top{
+  font-size: 0.45rem;
+  color: #333333;
+  font-weight: 700;
+  text-indent: 0.4rem;
+  padding-top: 0.3rem;
+}
+.grap-msg-content{
+  width: 10rem;
+  position: relative;
+  margin-top: 0.3rem;
+}
+.grap-msg-text{
+  width: 8.3rem;
+  background: #EEEEEE;
+  margin-left: 1.1rem;
+  border-radius: 0.1rem;
+}
+.grap-msg-text-name{
+  color: #323232;
+  font-size: 0.3rem;
+  font-weight: 700;
+  text-indent: 0.25rem;
+  padding-top: 0.25rem;
+}
+.grap-msg-text-p{
+  margin-left: 0.3rem;
+  color: #323232;
+  font-size: 0.3rem;
+  margin-right: 0.2rem;
+  line-height: 0.5rem;
+  padding-bottom: 0.2rem;
+}
+.grap-msg-face{
+  width: 0.7rem;
+  height: 0.7rem;
+  border-radius: 50%;
+  position: absolute;
+  left: 0.25rem;
+}
+.grap-bottom-box{
+  height: 1.05rem;
+  width: 10rem;
+  text-align: center;
+  font-size: 0.35rem;
+  color: #E53B86;
+  line-height: 1.05rem;
+}
+.grap-text2{
+  font-size: 0.4rem;
+  font-weight: 700;
+  color: #333333;
+  margin-left: 0.3rem;
+  padding-top: 0.4rem;
+}
+.more-btn{
+  width: 0.42rem;
+  position: absolute;
+  right: 0;
+  top: 0.13rem;
+}
+.layer-tag-box{
+  position: fixed;
+  top: -12rem;
+  left: 0;
+  width: 10rem;
+  height: 12rem;
+  background:#FFFFFF;
+  border-radius: 0 0 0.25rem 0.25rem;
+  z-index: 800;
+  transition: 0.35s all;
+}
+.layer-shadow{
+  display: none;
+  position: fixed;
+  width: 100vw;
+  height: 100vh;
+  background: rgba(0,0,0,0.4);
+  z-index: 5;
+  top: 0;
+  left: 0;
+  z-index: 500;
+}
+.layer-tag-title{
+  color: #333333;
+  font-weight: 700;
+  font-size: 0.4rem;
+  text-indent: 0.4rem;
+  padding-top: 0.4rem;
+}
+.layer-tag-ul{
+  width: 10rem;
+  height: 10.8rem;
+  overflow: scroll;
+  -webkit-overflow-scrolling: touch;
+  li{
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    overflow: hidden;
+    width: 2.8rem;
+    height: 0.9rem;
+    border-radius: 1rem;
+    margin-left: 0.4rem;
+    background: #F4F4F4;
+    float: left;
+    margin-top: 0.25rem;
+    text-align: center;
+    line-height: 0.9rem;
+    color: #353535;
+    font-size: 0.35rem;
+    font-weight: 700;
+  }
+  .tag-click{
+    background: #E53985;
+    color: #fff;
+  }
+}
+.big-img-box{
+  width: 100vw;
+  height: 100vh;
+  position: fixed;
+  top: 0;
+  left: 0;
+  z-index: 500;
+  background: rgba(0,0,0,0.7);
+  .swiper-slide{
+    img{
+      width: 10rem;
+    }
+  }
+  .swiper-slide{
+    width: 100vw !important;
+    height: 100vh !important;
+    line-height: 100vh !important;
+    font-size: 0;
+    img{
+      vertical-align: middle;
+    }
+  }
+  .swiper-pagination{
+    width: 10rem;
+    position: absolute;
+    bottom: 0.5rem;
+  }
+  .swiper-pagination-bullet{
+    background: #fff;
+    opacity: 1;
+  }
+  .swiper-pagination-bullet-active{
+    background: #E53996;
+  }
+}
+.big-img-close{
+  color: #fff;
+}
+.tag-go{
+  color: #E53985 !important;
+}
+.bottom-nav{
+  width: 10.64rem;
+  height: 2.24rem;
+  background: url(../images/bottom-nav.png)no-repeat;
+  background-size: 100% 100%;
+  position: fixed;
+  z-index: 500;
+  bottom: -0.24rem;
+  left: 50%;
+  margin-left: -5.32rem;
+}
+.bottom-nav-h1{
+  font-size: 0.3rem;
+  position: absolute;
+  color: #000;
+  top: 1.3rem;
+  left: 1.93rem;
+}
+.bottom-nav-btn{
+  width: 1.85rem;
+  height: 0.8rem;
+  position: absolute;
+  left: 8.1rem;
+  top: 0.8rem;
+}
+.bottom-close-btn{
+  width: 0.5rem;
+  height: 0.5rem;
+  position: absolute;
+  left: 9.8rem;
+  top: 0.35rem;
+}
+.back{
+  width: 0.6rem;
+  position: fixed;
+  left: 0.3rem;
+  z-index: 800;
+  top: 0.3rem;
+}
diff --git a/mobile/css/layer.css b/mobile/css/layer.css
new file mode 100644
index 0000000..b9dbf20
--- /dev/null
+++ b/mobile/css/layer.css
@@ -0,0 +1 @@
+.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
\ No newline at end of file
diff --git a/mobile/css/liMarquee.css b/mobile/css/liMarquee.css
new file mode 100644
index 0000000..05bd1e2
--- /dev/null
+++ b/mobile/css/liMarquee.css
@@ -0,0 +1,54 @@
+/*Plugin CSS*/
+.str_wrap {
+	overflow:hidden;
+	//zoom:1;
+	width:100%;
+	font-size:12px;
+	line-height:16px;
+	position:relative;
+	-moz-user-select: none;
+	-khtml-user-select: none;
+	user-select: none;
+	white-space:nowrap;
+}
+
+.str_wrap.str_active {
+	background:#f1f1f1;
+}
+.str_move { 
+	white-space:nowrap;
+	position:absolute; 
+	top:0; 
+	left:0;
+	cursor:move;
+}
+.str_move_clone {
+	display:inline-block;
+	//display:inline;
+	//zoom:1;
+	vertical-align:top;
+	position:absolute; 
+	left:100%;
+	top:0;
+}
+.str_vertical .str_move_clone {
+	left:0;
+	top:100%;
+}
+.str_down .str_move_clone {
+	left:0;
+	bottom:100%;
+}
+.str_vertical .str_move,
+.str_down .str_move {
+	white-space:normal;
+	width:100%;
+}
+.str_static .str_move,
+.no_drag .str_move,
+.noStop .str_move{
+	cursor:inherit;
+}
+.str_wrap img {
+	max-width:none !important;	
+}
\ No newline at end of file
diff --git a/mobile/css/neck.css b/mobile/css/neck.css
new file mode 100644
index 0000000..cafcff9
--- /dev/null
+++ b/mobile/css/neck.css
@@ -0,0 +1,245 @@
+.neck-nav {
+  height: 80px;
+  width: 100%;
+  background: #E43985;
+  position: fixed;
+  z-index: 500;
+}
+.m-box {
+  width: 1440px;
+  margin: 0 auto;
+}
+.neck-nav-content {
+  width: 1440px;
+  margin: 0 auto;
+  height: 80px;
+  position: relative;
+}
+.logo {
+  position: absolute;
+  top: 15px;
+}
+.box-title {
+  height: 70px;
+  line-height: 70px;
+  margin-top: 10px;
+  font-size: 0;
+}
+.box-title > img {
+  vertical-align: middle;
+  width: 72px;
+  margin-top: -22px;
+}
+.box-title span {
+  font-size: 34px;
+  font-weight: 700;
+  color: #333333;
+}
+.live-box-ul {
+  width: 1440px;
+  border-top: 1px solid #C3C3C4;
+  margin-bottom: 15px;
+}
+.live-box-ul li {
+  width: 268px;
+  height: 300px;
+  margin-top: 24px;
+  float: left;
+  margin-right: 25px;
+}
+.live-box-ul li:nth-child(5n) {
+  margin-right: 0;
+}
+.live-box-ul .live-top-box {
+  width: 268px;
+  height: 268px;
+  background: url(https://zhibocdn.yabolive.net/comm/stscli/prod/883221/1648095196207/498F890F-33A1-4EE9-9854-9D39A6905E85.jpeg?x-oss-process=image/resize,w_368) no-repeat;
+  background-size: cover;
+  border-radius: 8px;
+  overflow: hidden;
+  position: relative;
+}
+.live-box-ul .live-top-shadow {
+  width: 268px;
+  height: 50px;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  background: linear-gradient(to top, rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0));
+  pointer-events: none;
+}
+.live-box-ul .live-icon {
+  position: absolute;
+  z-index: 2;
+  width: 73px;
+  right: 10px;
+  bottom: 12px;
+}
+.live-box-ul .live-name-box {
+  line-height: 24px;
+  font-size: 18px;
+  text-align: center;
+  margin-top: 8px;
+}
+.video-box-ul {
+  width: 1440px;
+  border-top: 1px solid #C3C3C4;
+  margin-bottom: 15px;
+}
+.video-box-ul li {
+  width: 342px;
+  height: 258px;
+  margin-top: 18px;
+  margin-right: 24px;
+  float: left;
+  border-radius: 8px;
+  background: #FFFFFF;
+  overflow: hidden;
+}
+.video-box-ul li:nth-child(4n) {
+  margin-right: 0;
+}
+.video-box-ul .video-top-box {
+  height: 193px;
+  width: 342px;
+  background: url(https://zhibocdn.yabolive.net/comm/stscli/prod/883221/1648095196207/498F890F-33A1-4EE9-9854-9D39A6905E85.jpeg?x-oss-process=image/resize,w_368) no-repeat;
+  background-size: cover;
+  position: relative;
+}
+.video-box-ul .video-top-shadow {
+  width: 342px;
+  height: 50px;
+  position: absolute;
+  bottom: 0;
+  left: 0;
+  background: linear-gradient(to top, rgba(0, 0, 0, 0.4), rgba(0, 0, 0, 0));
+}
+.video-box-ul .video-time {
+  color: #fff;
+  font-size: 16px;
+  position: absolute;
+  z-index: 2;
+  right: 8px;
+  bottom: 10px;
+}
+.video-box-ul .video-name-box {
+  position: relative;
+  height: 65px;
+  width: 342px;
+}
+.video-box-ul .video-face {
+  position: absolute;
+  width: 40px;
+  height: 40px;
+  border-radius: 50%;
+  left: 6px;
+  top: 10px;
+}
+.video-box-ul .video-title {
+  color: #333333;
+  font-size: 14px;
+  text-indent: 56px;
+  padding-top: 10px;
+}
+.video-box-ul .video-tag-box {
+  margin-left: 54px;
+  margin-top: 4px;
+}
+.video-box-ul .video-tag-box > div {
+  width: 42px;
+  height: 18px;
+  background: #FFE8F1;
+  color: #E53985;
+  font-size: 12px;
+  line-height: 18px;
+  text-align: center;
+  border-radius: 4px;
+  float: left;
+  margin-right: 4px;
+  margin-bottom: 30px;
+}
+.side-nav {
+  position: fixed;
+  z-index: 500;
+  top: 80px;
+  width: 165px;
+  height: 890px;
+  background: #fff;
+  border-radius: 0 0 8px 8px;
+}
+.side-nav-top-box {
+  height: 360px;
+  margin-top: 20px;
+}
+.side-nav-top-box .side-nav-sort {
+  height: 60px;
+  width: 159px;
+  font-size: 0;
+  line-height: 60px;
+  text-indent: 38px;
+  position: relative;
+}
+.side-nav-top-box .side-nav-sort .side-icon {
+  vertical-align: middle;
+  margin-top: -9px;
+  margin-right: 15px;
+}
+.side-nav-top-box .side-nav-sort span {
+  font-size: 14px;
+  color: #333333;
+}
+.side-right-box {
+  width: 6px;
+  height: 800px;
+  right: 0;
+  top: 0;
+  position: absolute;
+  background: linear-gradient(to bottom, #F1C6E6, #fff);
+}
+.side-nav-bg {
+  display: none;
+  position: absolute;
+  z-index: -1;
+  left: -22px;
+  top: -15px;
+}
+.side-nav-sort-click span {
+  color: #fff !important;
+}
+.side-nav-sort-click .side-nav-bg {
+  display: block;
+}
+.tag-title {
+  text-align: center;
+  font-size: 0;
+  width: 159px;
+}
+.side-tag-ul {
+  width: 150px;
+  height: 450px;
+  margin-left: 5px;
+  margin-top: 6px;
+  overflow-y: scroll;
+}
+.side-tag-ul li {
+  width: 135px;
+  height: 34px;
+  line-height: 34px;
+  position: relative;
+  margin-left: 6px;
+}
+.side-tag-ul li .tag-span1 {
+  font-size: 16px;
+  display: inline-block;
+  width: 80px;
+  float: left;
+  text-indent: 6px;
+}
+.side-tag-ul li .tag-span2 {
+  font-size: 16px;
+  display: inline-block;
+  width: 50px;
+  float: left;
+  text-align: right;
+  margin-right: 5px;
+}
diff --git a/mobile/css/neck.less b/mobile/css/neck.less
new file mode 100644
index 0000000..285ee6c
--- /dev/null
+++ b/mobile/css/neck.less
@@ -0,0 +1,252 @@
+.neck-nav{
+  height: 80px;
+  width: 100%;
+  background: #E43985;
+  position: fixed;
+  z-index: 500;
+}
+.m-box{
+  width: 1440px;
+  margin: 0 auto;
+}
+.neck-nav-content{
+  width: 1440px;
+  margin: 0 auto;
+  height: 80px;
+  position: relative;
+}
+.logo{
+  position: absolute;
+  top: 15px;
+}
+.box-title{
+  height: 70px;
+  line-height: 70px;
+  margin-top: 10px;
+  font-size: 0;
+  >img{
+    vertical-align:middle;
+    width: 72px;
+    margin-top: -22px;
+  }
+  span{
+    font-size: 34px;
+    font-weight: 700;
+    color: #333333;
+  }
+}
+.live-box-ul{
+  width: 1440px;
+  border-top: 1px solid #C3C3C4;
+  margin-bottom: 15px;
+  li{
+    width: 268px;
+    height: 300px;
+    margin-top: 24px;
+    float: left;
+    margin-right: 25px;
+  }
+  li:nth-child(5n){
+    margin-right: 0;
+  }
+  .live-top-box{
+    width: 268px;
+    height: 268px;
+    background: url(https://zhibocdn.yabolive.net/comm/stscli/prod/883221/1648095196207/498F890F-33A1-4EE9-9854-9D39A6905E85.jpeg?x-oss-process=image/resize,w_368)no-repeat;
+    background-size: cover;
+    border-radius: 8px;
+    overflow: hidden;
+    position: relative;
+  }
+  .live-top-shadow{
+    width: 268px;
+    height: 50px;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    background:linear-gradient(to top,rgba(0,0,0,0.4),rgba(0,0,0,0));
+    pointer-events: none;
+  }
+  .live-icon{
+    position: absolute;
+    z-index: 2;
+    width: 73px;
+    right: 10px;
+    bottom: 12px;
+  }
+  .live-name-box{
+    line-height: 24px;
+    font-size: 18px;
+    text-align: center;
+    margin-top: 8px;
+  }
+}
+.video-box-ul{
+  width: 1440px;
+  border-top: 1px solid #C3C3C4;
+  margin-bottom: 15px;
+  li{
+    width: 342px;
+    height: 258px;
+    margin-top: 18px;
+    margin-right: 24px;
+    float: left;
+    border-radius: 8px;
+    background: #FFFFFF;
+    overflow: hidden;
+  }
+  li:nth-child(4n){
+    margin-right: 0;
+  }
+  .video-top-box{
+    height: 193px;
+    width: 342px;
+    background: url(https://zhibocdn.yabolive.net/comm/stscli/prod/883221/1648095196207/498F890F-33A1-4EE9-9854-9D39A6905E85.jpeg?x-oss-process=image/resize,w_368)no-repeat;
+    background-size: cover;
+    position: relative;
+  }
+  .video-top-shadow{
+    width: 342px;
+    height: 50px;
+    position: absolute;
+    bottom: 0;
+    left: 0;
+    background:linear-gradient(to top,rgba(0,0,0,0.4),rgba(0,0,0,0));
+  }
+  .video-time{
+    color: #fff;
+    font-size: 16px;
+    position: absolute;
+    z-index: 2;
+    right: 8px;
+    bottom: 10px;
+  }
+  .video-name-box{
+    position: relative;
+    height: 65px;
+    width: 342px;
+  }
+  .video-face{
+    position: absolute;
+    width: 40px;
+    height: 40px;
+    border-radius: 50%;
+    left: 6px;
+    top: 10px;
+  }
+  .video-title{
+    color: #333333;
+    font-size: 14px;
+    text-indent: 56px;
+    padding-top: 10px;
+  }
+  .video-tag-box{
+    margin-left: 54px;
+    margin-top: 4px;
+    >div{
+      width: 42px;
+      height: 18px;
+      background: #FFE8F1;
+      color: #E53985;
+      font-size: 12px;
+      line-height: 18px;
+      text-align: center;
+      border-radius: 4px;
+      float: left;
+      margin-right: 4px;
+      margin-bottom: 30px;
+    }
+  }
+}
+.side-nav{
+  position: fixed;
+  z-index: 500;
+  top: 80px;
+  width: 165px;
+  height: 890px;
+  background: #fff;
+  border-radius: 0 0 8px 8px;
+}
+.side-nav-top-box{
+  height: 360px;
+  margin-top: 20px;
+  .side-nav-sort{
+    height: 60px;
+    width: 159px;
+    font-size: 0;
+    line-height: 60px;
+    text-indent: 38px;
+    position: relative;
+    .side-icon{
+      vertical-align: middle;
+      margin-top: -9px;
+      margin-right: 15px;
+    }
+    span{
+      font-size: 14px;
+      color: #333333;
+    }
+  }
+}
+.side-right-box{
+  width: 6px;
+  height: 800px;
+  right: 0;
+  top: 0;
+  position: absolute;
+  background:linear-gradient(to bottom,#F1C6E6,#fff);
+}
+.side-nav-bg{
+  display: none;
+  position: absolute;
+  z-index: -1;
+  left: -22px;
+  top: -15px;
+}
+.side-nav-sort-click{
+
+  span{
+    color: #fff !important;
+  }
+  .side-nav-bg{
+    display: block;
+  }
+}
+.tag-title{
+  text-align: center;
+  font-size: 0;
+  width: 159px;
+  img{
+
+  }
+}
+.side-tag-ul{
+  width: 150px;
+  height: 450px;
+  margin-left: 5px;
+  margin-top: 6px;
+  overflow-y: scroll;
+
+  li{
+    width: 135px;
+    height: 34px;
+    line-height: 34px;
+    position: relative;
+    margin-left: 6px;
+    .tag-span1{
+      font-size: 16px;
+      display: inline-block;
+      width: 80px;
+      float: left;
+      text-indent: 6px;
+    }
+    .tag-span2{
+      font-size: 16px;
+      display: inline-block;
+      width: 50px;
+      float: left;
+      text-align: right;
+      margin-right: 5px;
+    }
+  }
+}
\ No newline at end of file
diff --git a/mobile/css/swiper.min.css b/mobile/css/swiper.min.css
new file mode 100644
index 0000000..c4a633d
--- /dev/null
+++ b/mobile/css/swiper.min.css
@@ -0,0 +1,12 @@
+/**
+ * Swiper 4.5.0
+ * Most modern mobile touch slider and framework with hardware accelerated transitions
+ * http://www.idangero.us/swiper/
+ *
+ * Copyright 2014-2019 Vladimir Kharlampidi
+ *
+ * Released under the MIT License
+ *
+ * Released on: February 22, 2019
+ */
+.swiper-container{margin:0 auto;position:relative;overflow:hidden;list-style:none;padding:0;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-transition-property:-webkit-transform;transition-property:-webkit-transform;-o-transition-property:transform;transition-property:transform;transition-property:transform,-webkit-transform;-webkit-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{-webkit-flex-shrink:0;-ms-flex-negative:0;flex-shrink:0;width:100%;height:100%;position:relative;-webkit-transition-property:-webkit-transform;transition-property:-webkit-transform;-o-transition-property:transform;transition-property:transform;transition-property:transform,-webkit-transform}.swiper-slide-invisible-blank{visibility:hidden}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-webkit-align-items:flex-start;-ms-flex-align:start;align-items:flex-start;-webkit-transition-property:height,-webkit-transform;transition-property:height,-webkit-transform;-o-transition-property:transform,height;transition-property:transform,height;transition-property:transform,height,-webkit-transform}.swiper-container-3d{-webkit-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-wp8-horizontal,.swiper-container-wp8-horizontal>.swiper-wrapper{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-container-wp8-vertical,.swiper-container-wp8-vertical>.swiper-wrapper{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;top:50%;width:27px;height:44px;margin-top:-22px;z-index:10;cursor:pointer;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{opacity:.35;cursor:auto;pointer-events:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");left:10px;right:auto}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");right:10px;left:auto}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-lock{display:none}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:.3s opacity;-o-transition:.3s opacity;transition:.3s opacity;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullets-dynamic{overflow:hidden;font-size:0}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{-webkit-transform:scale(.33);-ms-transform:scale(.33);transform:scale(.33);position:relative}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-main{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev{-webkit-transform:scale(.66);-ms-transform:scale(.66);transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-prev-prev{-webkit-transform:scale(.33);-ms-transform:scale(.33);transform:scale(.33)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next{-webkit-transform:scale(.66);-ms-transform:scale(.66);transform:scale(.66)}.swiper-pagination-bullets-dynamic .swiper-pagination-bullet-active-next-next{-webkit-transform:scale(.33);-ms-transform:scale(.33);transform:scale(.33)}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;-webkit-box-shadow:none;box-shadow:none;-webkit-appearance:none;-moz-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-bullet-active{opacity:1;background:#007aff}.swiper-container-vertical>.swiper-pagination-bullets{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:6px 0;display:block}.swiper-container-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{top:50%;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%);width:8px}.swiper-container-vertical>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{display:inline-block;-webkit-transition:.2s top,.2s -webkit-transform;transition:.2s top,.2s -webkit-transform;-o-transition:.2s transform,.2s top;transition:.2s transform,.2s top;transition:.2s transform,.2s top,.2s -webkit-transform}.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 4px}.swiper-container-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%);white-space:nowrap}.swiper-container-horizontal>.swiper-pagination-bullets.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{-webkit-transition:.2s left,.2s -webkit-transform;transition:.2s left,.2s -webkit-transform;-o-transition:.2s transform,.2s left;transition:.2s transform,.2s left;transition:.2s transform,.2s left,.2s -webkit-transform}.swiper-container-horizontal.swiper-container-rtl>.swiper-pagination-bullets-dynamic .swiper-pagination-bullet{-webkit-transition:.2s right,.2s -webkit-transform;transition:.2s right,.2s -webkit-transform;-o-transition:.2s transform,.2s right;transition:.2s transform,.2s right;transition:.2s transform,.2s right,.2s -webkit-transform}.swiper-pagination-progressbar{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progressbar .swiper-pagination-progressbar-fill{background:#007aff;position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:scale(0);-ms-transform:scale(0);transform:scale(0);-webkit-transform-origin:left top;-ms-transform-origin:left top;transform-origin:left top}.swiper-container-rtl .swiper-pagination-progressbar .swiper-pagination-progressbar-fill{-webkit-transform-origin:right top;-ms-transform-origin:right top;transform-origin:right top}.swiper-container-horizontal>.swiper-pagination-progressbar,.swiper-container-vertical>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite{width:100%;height:4px;left:0;top:0}.swiper-container-horizontal>.swiper-pagination-progressbar.swiper-pagination-progressbar-opposite,.swiper-container-vertical>.swiper-pagination-progressbar{width:4px;height:100%;left:0;top:0}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-progressbar.swiper-pagination-white{background:rgba(255,255,255,.25)}.swiper-pagination-progressbar.swiper-pagination-white .swiper-pagination-progressbar-fill{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-pagination-progressbar.swiper-pagination-black{background:rgba(0,0,0,.25)}.swiper-pagination-progressbar.swiper-pagination-black .swiper-pagination-progressbar-fill{background:#000}.swiper-pagination-lock{display:none}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-scrollbar-lock{display:none}.swiper-zoom-container{width:100%;height:100%;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-pack:center;-webkit-justify-content:center;-ms-flex-pack:center;justify-content:center;-webkit-box-align:center;-webkit-align-items:center;-ms-flex-align:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;-o-object-fit:contain;object-fit:contain}.swiper-slide-zoomed{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-ms-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:'';width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide{pointer-events:none;-webkit-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity}.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube{overflow:visible}.swiper-container-cube .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1;visibility:hidden;-webkit-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;width:100%;height:100%}.swiper-container-cube .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-container-flip{overflow:visible}.swiper-container-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-container-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-flip .swiper-slide-active,.swiper-container-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-flip .swiper-slide-shadow-bottom,.swiper-container-flip .swiper-slide-shadow-left,.swiper-container-flip .swiper-slide-shadow-right,.swiper-container-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-coverflow .swiper-wrapper{-ms-perspective:1200px}
\ No newline at end of file
diff --git a/mobile/download/css/index.css b/mobile/download/css/index.css
new file mode 100644
index 0000000..f54eec2
--- /dev/null
+++ b/mobile/download/css/index.css
@@ -0,0 +1,106 @@
+.bg {
+  width: 10rem;
+  height: 17.8rem;
+  position: relative;
+  margin: 0 auto;
+}
+.bg1 {
+  background: url(../images/bg1.png) no-repeat;
+  background-size: 100% 100%;
+}
+.bg2 {
+  background: url(../images/bg2.png) no-repeat;
+  background-size: 100% 100%;
+}
+.bg3 {
+  background: url(../images/bg3.png) no-repeat;
+  background-size: 100% 100%;
+}
+.top {
+  width: 7.1rem;
+  position: absolute;
+  left: 1.45rem;
+  top: 1rem;
+}
+.text {
+  position: absolute;
+  width: 3.62rem;
+  left: 3.19rem;
+  top: 16rem;
+}
+.down-btn {
+  width: 6.8rem;
+  height: 1.6rem;
+  background: url(../images/downBtn.png) no-repeat;
+  background-size: 100% 100%;
+  position: absolute;
+  left: 1.6rem;
+  top: 2rem;
+}
+.bottom-bg {
+  width: 10rem;
+  height: 4.42rem;
+  position: fixed;
+  background: url(../images/bottom-bg.png) no-repeat;
+  background-size: 100% 100%;
+  bottom: 0;
+  left: 50%;
+  margin-left: -5rem;
+  z-index: 500;
+}
+.new-bg {
+  width: 10rem;
+  height: 17.2rem;
+  background: url(../images/bg.png) no-repeat;
+  background-size: 100% 100%;
+  background-position-y: -0.7rem;
+  margin: 0 auto;
+  position: relative;
+}
+.down-btn2 {
+  width: 6.34rem;
+  height: 1.62rem;
+  background: url(../images/downBtn2.png) no-repeat;
+  background-size: 100% 100%;
+  position: absolute;
+  bottom: 1.2rem;
+  z-index: 5;
+  left: 50%;
+  margin-left: -3.17rem;
+}
+.down-Go {
+  animation: downGo 1s infinite;
+}
+@keyframes downGo {
+  0% {
+    transform: scale(1);
+  }
+  70% {
+    transform: scale(1.05);
+  }
+  100% {
+    transform: scale(1);
+  }
+}
+.video-bg {
+  width: 9.76rem;
+  height: 15.13rem;
+  position: absolute;
+  bottom: 0;
+  left: 0.12rem;
+  z-index: 5;
+}
+.down-webp-box {
+  width: 7.8rem;
+  height: 13.1rem;
+  position: absolute;
+  bottom: 1rem;
+  left: 1.08rem;
+  border-radius: 0.5rem;
+  overflow: hidden;
+  text-align: center;
+}
+.down-webp-box > img {
+  width: 7.7rem;
+  margin-top: -0.35rem;
+}
diff --git a/mobile/download/css/index.less b/mobile/download/css/index.less
new file mode 100644
index 0000000..a22aa30
--- /dev/null
+++ b/mobile/download/css/index.less
@@ -0,0 +1,108 @@
+.bg{
+    width: 10rem;
+    height: 17.8rem;
+    position: relative;
+    margin: 0 auto;
+}
+.bg1{
+    background: url(../images/bg1.png)no-repeat;
+    background-size: 100% 100%
+}
+.bg2{
+    background: url(../images/bg2.png)no-repeat;
+    background-size: 100% 100%
+}
+.bg3{
+    background: url(../images/bg3.png)no-repeat;
+    background-size: 100% 100%
+}
+.top{
+    width: 7.1rem;
+    position: absolute;
+    left: 1.45rem;
+    top: 1rem;
+}
+.text{
+    position: absolute;
+    width: 3.62rem;
+    left: 3.19rem;
+    top: 16rem;
+}
+.down-btn{
+    width: 6.8rem;
+    height: 1.6rem;
+    background: url(../images/downBtn.png) no-repeat;
+    background-size: 100% 100%;
+    position: absolute;
+    left: 1.6rem;
+    top: 2rem;
+}
+.bottom-bg{
+    width: 10rem;
+    height: 4.42rem;
+    position: fixed;
+    background: url(../images/bottom-bg.png)no-repeat;
+    background-size: 100% 100%;
+    bottom: 0;
+    left: 50%;
+    margin-left: -5rem;
+    z-index: 500;
+}
+.new-bg{
+    width: 10rem;
+    height: 17.2rem;
+    background: url(../images/bg.png)no-repeat;
+    background-size: 100% 100%;
+    background-position-y: -0.7rem;
+    margin: 0 auto;
+    position: relative;
+
+}
+.down-btn2{
+    width: 6.34rem;
+    height: 1.62rem;
+    background: url(../images/downBtn2.png)no-repeat;
+    background-size: 100% 100%;
+    position: absolute;
+    bottom: 1.2rem;
+    z-index: 5;
+    left: 50%;
+    margin-left: -3.17rem;
+}
+.down-Go{
+    animation: downGo 1s infinite;
+}
+@keyframes downGo{
+    0%{
+        transform: scale(1);
+    }
+    70%{
+        transform: scale(1.05);
+    }
+    100%{
+        transform: scale(1);
+    }
+}
+.video-bg{
+    width: 9.76rem;
+    height: 15.13rem;
+    position: absolute;
+    bottom: 0;
+    left: 0.12rem;
+    z-index: 5;
+}
+.down-webp-box{
+    width: 7.8rem;
+    // background: yellow;
+    height: 13.1rem;
+    position: absolute;
+    bottom: 1rem;
+    left: 1.08rem;
+    border-radius: 0.5rem;
+    overflow: hidden;
+    text-align: center;
+    >img{
+        width: 7.7rem;
+        margin-top: -0.35rem;
+    }
+}
diff --git a/mobile/download/down1.html b/mobile/download/down1.html
new file mode 100644
index 0000000..b82e468
--- /dev/null
+++ b/mobile/download/down1.html
@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <!-- Global site tag (gtag.js) - Google Analytics -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3V6KZGW418"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-3V6KZGW418');
+    </script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片</title>
+    <meta name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="../lib/fsize.js"></script>
+    <link rel="stylesheet" href="../css/base.css">
+    <link rel="stylesheet" href="css/index.css?v=20220516">
+    <link rel="stylesheet" href="../css/layer.css">
+    <style>
+
+    </style>
+</head>
+<body style="background: #F0D6E9">
+<div class="bg bg1">
+    <img class="top" src="images/top1.png" alt="在線美女互動">
+    <img class="text" src="images/text1.png" alt="腿控足控天堂">
+    <div class="bottom-bg">
+        <div class="down-btn"></div>
+    </div>
+ 
+</div>
+</body>
+<script src="../lib/jquery-3.1.1.min.js"></script>
+<script src="../lib/default.js?v='20220407'"></script>
+<script src="../layer-v3.1.0/layer/layer.js"></script>
+<script>
+$(function(){
+    $(".down-btn").on("click",function(){
+        var ua = window.navigator.userAgent.toLowerCase();
+        if (/iphone|ipad|ipod/.test(ua)) {
+            layer.msg("ios開發中,請使用安卓手機下載")
+        } else if (/android/.test(ua)) {
+           window.location.href='https://bgps2.yazhai.co/footseexyz/apk/'+sessionStorage.qd+'.apk'
+        }else{
+            window.location.href='https://bgps2.yazhai.co/footseexyz/apk/'+sessionStorage.qd+'.apk'
+        }
+    })
+})
+</script>
+</html>
\ No newline at end of file
diff --git a/mobile/download/down2.html b/mobile/download/down2.html
new file mode 100644
index 0000000..23f222e
--- /dev/null
+++ b/mobile/download/down2.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <!-- Global site tag (gtag.js) - Google Analytics -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3V6KZGW418"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-3V6KZGW418');
+    </script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片</title>
+    <meta name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="../lib/fsize.js"></script>
+    <link rel="stylesheet" href="../css/base.css">
+    <link rel="stylesheet" href="css/index.css?v=20220516">
+    <link rel="stylesheet" href="../css/layer.css">
+    <style>
+
+    </style>
+</head>
+<body style="background: #F0D2D8">
+<div class="bg bg2">
+    <img class="top" src="images/top2.png" alt="腿控足控天堂">
+    <img class="text" src="images/text2.png" alt="更多精彩影片">
+    <div class="bottom-bg">
+        <div class="down-btn"></div>
+    </div>
+</div>
+</body>
+<script src="../lib/jquery-3.1.1.min.js"></script>
+<script src="../lib/default.js?v='20220407'"></script>
+<script src="../layer-v3.1.0/layer/layer.js"></script>
+<script>
+$(function(){
+    $(".down-btn").on("click",function(){
+        var ua = window.navigator.userAgent.toLowerCase();
+        if (/iphone|ipad|ipod/.test(ua)) {
+            layer.msg("ios開發中,請使用安卓手機下載")
+        } else if (/android/.test(ua)) {
+            window.location.href='https://bgps2.yazhai.co/footseexyz/apk/'+sessionStorage.qd+'.apk'
+        }else{
+            window.location.href='https://bgps2.yazhai.co/footseexyz/apk/'+sessionStorage.qd+'.apk' 
+        }
+    })
+})
+</script>
+</html>
\ No newline at end of file
diff --git a/mobile/download/down3.html b/mobile/download/down3.html
new file mode 100644
index 0000000..37df05d
--- /dev/null
+++ b/mobile/download/down3.html
@@ -0,0 +1,56 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <!-- Global site tag (gtag.js) - Google Analytics -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3V6KZGW418"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-3V6KZGW418');
+    </script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片</title>
+    <meta name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="../lib/fsize.js"></script>
+    <link rel="stylesheet" href="../css/base.css">
+    <link rel="stylesheet" href="css/index.css?v=20220516">
+    <link rel="stylesheet" href="../css/layer.css">
+    <style>
+
+    </style>
+</head>
+<body style="background: #DFD2EF">
+<div class="bg bg3">
+    <img class="top" src="images/top3.png" alt="1v1甜蜜約會">
+    <img class="text" src="images/text1.png" alt="腿控足控天堂">
+    <div class="bottom-bg">
+        <div class="down-btn"></div>
+    </div>
+</div>
+</body>
+<script src="../lib/jquery-3.1.1.min.js"></script>
+<script src="../lib/default.js?v='20220407'"></script>
+<script src="../layer-v3.1.0/layer/layer.js"></script>
+<script>
+$(function(){
+    $(".down-btn").on("click",function(){
+        var ua = window.navigator.userAgent.toLowerCase();
+        if (/iphone|ipad|ipod/.test(ua)) {
+            layer.msg("ios開發中,請使用安卓手機下載")
+        } else if (/android/.test(ua)) {
+            window.location.href='https://bgps2.yazhai.co/footseexyz/apk/'+sessionStorage.qd+'.apk'
+        }else{
+            window.location.href='https://bgps2.yazhai.co/footseexyz/apk/'+sessionStorage.qd+'.apk'
+        }
+    })
+})
+</script>
+</html>
\ No newline at end of file
diff --git a/mobile/download/download.html b/mobile/download/download.html
new file mode 100644
index 0000000..058bf0a
--- /dev/null
+++ b/mobile/download/download.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3V6KZGW418"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-3V6KZGW418');
+    </script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片-downSY</title>
+    <meta name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="../lib/fsize.js"></script>
+    <link rel="stylesheet" href="../css/base.css">
+    <link rel="stylesheet" href="../css/layer.css">
+    <link rel="stylesheet" href="css/index.css?v=2022060208">
+    <style>
+        .down-webp{
+            position: relative;
+            z-index: 2;
+        }
+    </style>
+</head>
+<body style="background: #FBEFF7">
+<div class="new-bg">
+    <img class="video-bg" src="images/video-bg.png" alt="">
+    <div class="down-webp-box"></div>
+  
+    <!--  -->
+</div>
+  <div class="down-btn2 down-Go"></div>
+</body>
+<script src="../lib/jquery-3.1.1.min.js"></script>
+<script src="../lib/default.js?v='20220407'"></script>
+<script src="../layer-v3.1.0/layer/layer.js"></script>
+<script>
+$(function(){
+    var browserLang = navigator.language
+    if(browserLang.indexOf("zh")==-1){
+        $(".new-bg").css("background",'url("images/bg-En.png")0 -0.5rem / 100% 100% no-repeat')
+        $(".down-btn2").css("background",'url(images/downBtn2-En.png) 0/ 100% 100% no-repeat')
+    }
+    if (/iphone|ipad|ipod/.test(ua)) {
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.png" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.png" alt="">'
+        }
+
+    }   
+    else if (/android/.test(ua)) {
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.webp" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.webp" alt="">'
+        }
+
+    }else{
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.webp" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.webp" alt="">'
+        }
+    }
+    $(".down-webp-box").html(html)
+    $(".down-webp-box").append('<img style="position: absolute;left:0;top:0;z-index:1" src="https://app.ixiulive.com/static/downImg/down.jpg">')
+    $(".down-btn2").on("click",function(){
+        var ua = window.navigator.userAgent.toLowerCase();
+        if (/iphone|ipad|ipod/.test(ua)) {
+            window.location.href = 'https://app.footseen.com/download.html';
+        } else if (/android/.test(ua)) {
+           window.location.href="https://bgps2.yazhai.co/footseexyz/apk/ftsBH5SY.apk"
+        }else{
+            window.location.href="https://bgps2.yazhai.co/footseexyz/apk/ftsBH5SY.apk"
+        }
+    })
+})
+</script>
+</html>
\ No newline at end of file
diff --git a/mobile/download/download2.html b/mobile/download/download2.html
new file mode 100644
index 0000000..2f14c37
--- /dev/null
+++ b/mobile/download/download2.html
@@ -0,0 +1,105 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3V6KZGW418"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-3V6KZGW418');
+    </script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片-downSP</title>
+    <meta name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="../lib/fsize.js"></script>
+    <link rel="stylesheet" href="../css/base.css">
+    <link rel="stylesheet" href="../css/layer.css">
+    <link rel="stylesheet" href="css/index.css?v=2022060208">
+    <style>
+        .new-bg{
+            background: url(images/bg-new2.png)no-repeat;
+            background-size: 100% 100%;
+            background-position-y: -0.7rem;
+        }
+        .down-webp{
+            position: relative;
+            z-index: 2;
+        }
+    </style>
+</head>
+<body style="background: #EFEBEF">
+<div class="new-bg">
+    <img class="video-bg" src="images/video-bg.png" alt="">
+    <div class="down-webp-box"></div>
+  
+    <!--  -->
+</div>
+  <div class="down-btn2 down-Go"></div>
+</body>
+<script src="../lib/jquery-3.1.1.min.js"></script>
+<script src="../lib/default.js?v='20220407'"></script>
+<script src="../layer-v3.1.0/layer/layer.js"></script>
+<script>
+$(function(){
+    var browserLang = navigator.language
+    if(browserLang.indexOf("zh")==-1){
+        $(".new-bg").css("background",'url("images/bg-new2-En.png")0 -0.5rem / 100% 100% no-repeat')
+        $(".down-btn2").css("background",'url(images/downBtn2-En.png) 0/ 100% 100% no-repeat')
+    }
+    if (/iphone|ipad|ipod/.test(ua)) {
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.png" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.png" alt="">'
+        }
+
+    }   
+    else if (/android/.test(ua)) {
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.webp" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.webp" alt="">'
+        }
+
+    }else{
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.webp" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.webp" alt="">'
+        }
+    }
+    $(".down-webp-box").html(html)
+    $(".down-webp-box").append('<img style="position: absolute;left:0;top:0;z-index:1" src="https://app.ixiulive.com/static/downImg/down.jpg">')
+    $(".down-btn2").on("click",function(){
+        var ua = window.navigator.userAgent.toLowerCase();
+        if (/iphone|ipad|ipod/.test(ua)) {
+            window.location.href = 'https://app.footseen.com/download.html';
+        } else if (/android/.test(ua)) {
+           window.location.href="https://bgps2.yazhai.co/footseexyz/apk/ftsBH5SP.apk"
+        }else{
+            window.location.href="https://bgps2.yazhai.co/footseexyz/apk/ftsBH5SP.apk"  
+        }
+    })
+
+})
+</script>
+</html>
\ No newline at end of file
diff --git a/mobile/download/download3.html b/mobile/download/download3.html
new file mode 100644
index 0000000..0b91e8a
--- /dev/null
+++ b/mobile/download/download3.html
@@ -0,0 +1,106 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3V6KZGW418"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-3V6KZGW418');
+    </script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片-downTW</title>
+    <meta name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="../lib/fsize.js"></script>
+    <link rel="stylesheet" href="../css/base.css">
+    <link rel="stylesheet" href="../css/layer.css">
+    <link rel="stylesheet" href="css/index.css?v=2022060208">
+    <style>
+        .new-bg{
+            background: url(images/bg-new3.png)no-repeat;
+            background-size: 100% 100%;
+            background-position-y: -0.7rem;
+        }
+        .down-webp{
+            position: relative;
+            z-index: 2;
+        }
+    </style>
+</head>
+<body style="background: #EFEBEF">
+<div class="new-bg">
+    <img class="video-bg" src="images/video-bg.png" alt="">
+    <div class="down-webp-box"></div>
+  
+    <!--  -->
+</div>
+  <div class="down-btn2 down-Go"></div>
+</body>
+<script src="../lib/jquery-3.1.1.min.js"></script>
+<script src="../lib/default.js?v='20220407'"></script>
+<script src="../layer-v3.1.0/layer/layer.js"></script>
+<script>
+$(function(){
+    var browserLang = navigator.language
+    if(browserLang.indexOf("zh")==-1){
+        $(".new-bg").css("background",'url("images/bg-new3-En.png")0 -0.5rem / 100% 100% no-repeat')
+        $(".down-btn2").css("background",'url(images/downBtn2-En.png) 0/ 100% 100% no-repeat')
+    }
+    var ua = window.navigator.userAgent.toLowerCase();
+    if (/iphone|ipad|ipod/.test(ua)) {
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.png" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.png" alt="">'
+        }
+
+    }   
+    else if (/android/.test(ua)) {
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.webp" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.webp" alt="">'
+        }
+
+    }else{
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.webp" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.webp" alt="">'
+        }
+    }
+    $(".down-webp-box").html(html)
+    $(".down-webp-box").append('<img style="position: absolute;left:0;top:0;z-index:1" src="https://app.ixiulive.com/static/downImg/down.jpg">')
+    $(".down-btn2").on("click",function(){
+        // var ua = window.navigator.userAgent.toLowerCase();
+        if (/iphone|ipad|ipod/.test(ua)) {
+            window.location.href = 'https://app.footseen.com/download.html';
+        } else if (/android/.test(ua)) {
+           window.location.href="https://bgps2.yazhai.co/footseexyz/apk/ftsBH5TW.apk"
+        }else{
+            window.location.href="https://bgps2.yazhai.co/footseexyz/apk/ftsBH5TW.apk"
+        }
+    })
+
+})
+</script>
+</html>
\ No newline at end of file
diff --git a/mobile/download/download4.html b/mobile/download/download4.html
new file mode 100644
index 0000000..97f726a
--- /dev/null
+++ b/mobile/download/download4.html
@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3V6KZGW418"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-3V6KZGW418');
+    </script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片-downZB</title>
+    <meta name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="../lib/fsize.js"></script>
+    <link rel="stylesheet" href="../css/base.css">
+    <link rel="stylesheet" href="../css/layer.css">
+    <link rel="stylesheet" href="css/index.css?v=2022060208">
+    <style>
+        .down-webp{
+            position: relative;
+            z-index: 2;
+        }
+    </style>
+</head>
+<body style="background: #FBEFF7">
+<div class="new-bg">
+    <img class="video-bg" src="images/video-bg.png" alt="">
+    <div class="down-webp-box"></div>
+  
+    <!--  -->
+</div>
+  <div class="down-btn2 down-Go"></div>
+</body>
+<script src="../lib/jquery-3.1.1.min.js"></script>
+<script src="../lib/default.js?v='20220407'"></script>
+<script src="../layer-v3.1.0/layer/layer.js"></script>
+<script>
+$(function(){
+    var browserLang = navigator.language
+    if(browserLang.indexOf("zh")==-1){
+        $(".new-bg").css("background",'url("images/bg-En.png")0 -0.5rem / 100% 100% no-repeat')
+        $(".down-btn2").css("background",'url(images/downBtn2-En.png) 0/ 100% 100% no-repeat')
+    }
+    if (/iphone|ipad|ipod/.test(ua)) {
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.png" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.png" alt="">'
+        }
+    }   
+    else if (/android/.test(ua)) {
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.webp" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.webp" alt="">'
+        }
+    }else{
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.webp" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.webp" alt="">'
+        }
+    }
+    $(".down-webp-box").html(html)
+    $(".down-webp-box").append('<img style="position: absolute;left:0;top:0;z-index:1" src="https://app.ixiulive.com/static/downImg/down.jpg">')
+    $(".down-btn2").on("click",function(){
+        var ua = window.navigator.userAgent.toLowerCase();
+        if (/iphone|ipad|ipod/.test(ua)) {
+            window.location.href = 'https://app.footseen.com/download.html';
+        } else if (/android/.test(ua)) {
+           window.location.href="https://bgps2.yazhai.co/footseexyz/apk/ftsBH5ZB.apk"
+        }else{
+            window.location.href="https://bgps2.yazhai.co/footseexyz/apk/ftsBH5ZB.apk"
+        }
+    })
+})
+</script>
+</html>
\ No newline at end of file
diff --git a/mobile/download/downloadPc.html b/mobile/download/downloadPc.html
new file mode 100644
index 0000000..d58e4a1
--- /dev/null
+++ b/mobile/download/downloadPc.html
@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-QT401FZZ2K"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-QT401FZZ2K');
+    </script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片-downSY</title>
+    <meta name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="../lib/fsize.js"></script>
+    <link rel="stylesheet" href="../css/base.css">
+    <link rel="stylesheet" href="../css/layer.css">
+    <link rel="stylesheet" href="css/index.css?v=2022060208">
+    <style>
+        .down-webp{
+            position: relative;
+            z-index: 2;
+        }
+    </style>
+</head>
+<body style="background: #FBEFF7">
+<div class="new-bg">
+    <img class="video-bg" src="images/video-bg.png" alt="">
+    <div class="down-webp-box"></div>
+  
+    <!--  -->
+</div>
+  <div class="down-btn2 down-Go"></div>
+</body>
+<script src="../lib/jquery-3.1.1.min.js"></script>
+<script src="../lib/default.js?v='20220407'"></script>
+<script src="../layer-v3.1.0/layer/layer.js"></script>
+<script>
+$(function(){
+    var browserLang = navigator.language
+    if(browserLang.indexOf("zh")==-1){
+        $(".new-bg").css("background",'url("images/bg-En.png")0 -0.5rem / 100% 100% no-repeat')
+        $(".down-btn2").css("background",'url(images/downBtn2-En.png) 0/ 100% 100% no-repeat')
+    }
+    if (/iphone|ipad|ipod/.test(ua)) {
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.png" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.png" alt="">'
+        }
+
+    }   
+    else if (/android/.test(ua)) {
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.webp" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.webp" alt="">'
+        }
+
+    }else{
+        if(browserLang.indexOf("zh")==-1){
+            var videoNum=Math.ceil(Math.random()*10)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/En/down'+videoNum+'.webp" alt="">'
+        }else{
+            var videoNum=Math.ceil(Math.random()*19)
+            var html=[];
+            html+='<img class="down-webp" src="https://app.ixiulive.com/static/downImg/down'+videoNum+'.webp" alt="">'
+        }
+    }
+    $(".down-webp-box").html(html)
+    $(".down-webp-box").append('<img style="position: absolute;left:0;top:0;z-index:1" src="https://app.ixiulive.com/static/downImg/down.jpg">')
+    $(".down-btn2").on("click",function(){
+        var ua = window.navigator.userAgent.toLowerCase();
+        if (/iphone|ipad|ipod/.test(ua)) {
+            window.location.href = 'https://app.footseen.com/download.html';
+        } else if (/android/.test(ua)) {
+           window.location.href="https://bgps2.yazhai.co/footseexyz/apk/ftsBH5PC.apk"
+        }else{
+            window.location.href="https://bgps2.yazhai.co/footseexyz/apk/ftsBH5PC.apk"
+        }
+    })
+})
+</script>
+</html>
\ No newline at end of file
diff --git a/mobile/download/images/bg-En.png b/mobile/download/images/bg-En.png
new file mode 100644
index 0000000..73100db
Binary files /dev/null and b/mobile/download/images/bg-En.png differ
diff --git a/mobile/download/images/bg-new2-En.png b/mobile/download/images/bg-new2-En.png
new file mode 100644
index 0000000..01b644b
Binary files /dev/null and b/mobile/download/images/bg-new2-En.png differ
diff --git a/mobile/download/images/bg-new2.png b/mobile/download/images/bg-new2.png
new file mode 100644
index 0000000..9dde319
Binary files /dev/null and b/mobile/download/images/bg-new2.png differ
diff --git a/mobile/download/images/bg-new3-En.png b/mobile/download/images/bg-new3-En.png
new file mode 100644
index 0000000..5e100c9
Binary files /dev/null and b/mobile/download/images/bg-new3-En.png differ
diff --git a/mobile/download/images/bg-new3.png b/mobile/download/images/bg-new3.png
new file mode 100644
index 0000000..df9cae6
Binary files /dev/null and b/mobile/download/images/bg-new3.png differ
diff --git a/mobile/download/images/bg.png b/mobile/download/images/bg.png
new file mode 100644
index 0000000..72a075e
Binary files /dev/null and b/mobile/download/images/bg.png differ
diff --git a/mobile/download/images/bg1.png b/mobile/download/images/bg1.png
new file mode 100644
index 0000000..5291c51
Binary files /dev/null and b/mobile/download/images/bg1.png differ
diff --git a/mobile/download/images/bg2.png b/mobile/download/images/bg2.png
new file mode 100644
index 0000000..bc1909c
Binary files /dev/null and b/mobile/download/images/bg2.png differ
diff --git a/mobile/download/images/bg3.png b/mobile/download/images/bg3.png
new file mode 100644
index 0000000..9f5ca1a
Binary files /dev/null and b/mobile/download/images/bg3.png differ
diff --git a/mobile/download/images/bottom-bg.png b/mobile/download/images/bottom-bg.png
new file mode 100644
index 0000000..19af73e
Binary files /dev/null and b/mobile/download/images/bottom-bg.png differ
diff --git a/mobile/download/images/down.webp b/mobile/download/images/down.webp
new file mode 100644
index 0000000..b144166
Binary files /dev/null and b/mobile/download/images/down.webp differ
diff --git a/mobile/download/images/down1.png b/mobile/download/images/down1.png
new file mode 100644
index 0000000..affc56f
Binary files /dev/null and b/mobile/download/images/down1.png differ
diff --git a/mobile/download/images/down1.webp b/mobile/download/images/down1.webp
new file mode 100644
index 0000000..b144166
Binary files /dev/null and b/mobile/download/images/down1.webp differ
diff --git a/mobile/download/images/down2.png b/mobile/download/images/down2.png
new file mode 100644
index 0000000..54f08a2
Binary files /dev/null and b/mobile/download/images/down2.png differ
diff --git a/mobile/download/images/down2.webp b/mobile/download/images/down2.webp
new file mode 100644
index 0000000..4e6d14c
Binary files /dev/null and b/mobile/download/images/down2.webp differ
diff --git a/mobile/download/images/down3.png b/mobile/download/images/down3.png
new file mode 100644
index 0000000..7c61c5c
Binary files /dev/null and b/mobile/download/images/down3.png differ
diff --git a/mobile/download/images/down3.webp b/mobile/download/images/down3.webp
new file mode 100644
index 0000000..8739001
Binary files /dev/null and b/mobile/download/images/down3.webp differ
diff --git a/mobile/download/images/down4.png b/mobile/download/images/down4.png
new file mode 100644
index 0000000..5d33ab5
Binary files /dev/null and b/mobile/download/images/down4.png differ
diff --git a/mobile/download/images/down4.webp b/mobile/download/images/down4.webp
new file mode 100644
index 0000000..c0d57a3
Binary files /dev/null and b/mobile/download/images/down4.webp differ
diff --git a/mobile/download/images/down5.png b/mobile/download/images/down5.png
new file mode 100644
index 0000000..1dd83d6
Binary files /dev/null and b/mobile/download/images/down5.png differ
diff --git a/mobile/download/images/down5.webp b/mobile/download/images/down5.webp
new file mode 100644
index 0000000..14eee3a
Binary files /dev/null and b/mobile/download/images/down5.webp differ
diff --git a/mobile/download/images/down6.png b/mobile/download/images/down6.png
new file mode 100644
index 0000000..dc7c41c
Binary files /dev/null and b/mobile/download/images/down6.png differ
diff --git a/mobile/download/images/down6.webp b/mobile/download/images/down6.webp
new file mode 100644
index 0000000..b35ae92
Binary files /dev/null and b/mobile/download/images/down6.webp differ
diff --git a/mobile/download/images/down7.webp b/mobile/download/images/down7.webp
new file mode 100644
index 0000000..88adbc2
Binary files /dev/null and b/mobile/download/images/down7.webp differ
diff --git a/mobile/download/images/downBtn.png b/mobile/download/images/downBtn.png
new file mode 100644
index 0000000..67d1223
Binary files /dev/null and b/mobile/download/images/downBtn.png differ
diff --git a/mobile/download/images/downBtn2-En.png b/mobile/download/images/downBtn2-En.png
new file mode 100644
index 0000000..d270cae
Binary files /dev/null and b/mobile/download/images/downBtn2-En.png differ
diff --git a/mobile/download/images/downBtn2.png b/mobile/download/images/downBtn2.png
new file mode 100644
index 0000000..bd4ea62
Binary files /dev/null and b/mobile/download/images/downBtn2.png differ
diff --git a/mobile/download/images/text1.png b/mobile/download/images/text1.png
new file mode 100644
index 0000000..ce5199d
Binary files /dev/null and b/mobile/download/images/text1.png differ
diff --git a/mobile/download/images/text2.png b/mobile/download/images/text2.png
new file mode 100644
index 0000000..86b2e70
Binary files /dev/null and b/mobile/download/images/text2.png differ
diff --git a/mobile/download/images/top1.png b/mobile/download/images/top1.png
new file mode 100644
index 0000000..38320f3
Binary files /dev/null and b/mobile/download/images/top1.png differ
diff --git a/mobile/download/images/top2.png b/mobile/download/images/top2.png
new file mode 100644
index 0000000..eba38ec
Binary files /dev/null and b/mobile/download/images/top2.png differ
diff --git a/mobile/download/images/top3.png b/mobile/download/images/top3.png
new file mode 100644
index 0000000..6931109
Binary files /dev/null and b/mobile/download/images/top3.png differ
diff --git a/mobile/download/images/video-bg.png b/mobile/download/images/video-bg.png
new file mode 100644
index 0000000..430e237
Binary files /dev/null and b/mobile/download/images/video-bg.png differ
diff --git a/mobile/download/iosDown.html b/mobile/download/iosDown.html
new file mode 100644
index 0000000..c1fe320
--- /dev/null
+++ b/mobile/download/iosDown.html
@@ -0,0 +1,55 @@
+
+<DOCTYPE html>
+    <html>
+    <head>
+        <script src="https://res.sharetrace.com/sharetrace.min.js"></script>
+    
+        <meta charset="UTF-8">
+        <meta name="renderer" content="webkit">
+        <meta http-equiv="X-UA-Compatible" content="IE=edge">
+        <meta name="keywords" content="foot fetish,foot worship,foot tickle,Foot Seen,Video streaming">
+        <meta name="description" content="">
+        <meta content="telephone=no" name="format-detection">
+        <meta name="wap-font-scale" content="no">
+        <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no" />
+        <meta name="apple-mobile-web-app-capable" content="yes">
+        <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+        <meta content="telephone=no" name="format-detection">
+        <script src="https://www.footseen.com/js/fsize.js"></script>
+        <link rel="stylesheet" href="https://www.footseen.com/css/base2.css">
+        <link rel="stylesheet" href="https://www.footseen.com/layer-v3.1.0/layer.css">
+        <title>Footseen</title>
+        <style>
+            .guide3bg {
+                width: 10rem;
+                height: 65.107rem;
+                background: url(https://www.footseen.com/img/new2/guide3.png) no-repeat;
+                background-size: contain;
+                margin: 0 auto;
+                position: relative;
+            }
+    
+            .goBackBtn{
+                width: 7.4rem;
+                height: 1.4rem;
+                position: absolute;
+                bottom: 1.2rem;
+                left: 1.4rem;
+            }
+        </style>
+    </head>
+    
+    <body>
+        <div class="guide3bg">
+            <a href="javascript:history.back(-1);" class="goBackBtn"></a>
+        </div>
+    
+    </body>
+    
+    </html>
+    <script type="text/javascript">
+         window.onload=function (){
+        window.location.href="itms-services://?action=download-manifest&url=https://app.footseen.com/archive.plist"
+    }
+    </script>
+    
\ No newline at end of file
diff --git a/mobile/images/add-img.png b/mobile/images/add-img.png
new file mode 100644
index 0000000..32f54bc
Binary files /dev/null and b/mobile/images/add-img.png differ
diff --git a/mobile/images/back.png b/mobile/images/back.png
new file mode 100644
index 0000000..8e0c031
Binary files /dev/null and b/mobile/images/back.png differ
diff --git a/mobile/images/bottom-nav-En.png b/mobile/images/bottom-nav-En.png
new file mode 100644
index 0000000..158a6ef
Binary files /dev/null and b/mobile/images/bottom-nav-En.png differ
diff --git a/mobile/images/bottom-nav.png b/mobile/images/bottom-nav.png
new file mode 100644
index 0000000..f53edf4
Binary files /dev/null and b/mobile/images/bottom-nav.png differ
diff --git a/mobile/images/click.png b/mobile/images/click.png
new file mode 100644
index 0000000..ebd081f
Binary files /dev/null and b/mobile/images/click.png differ
diff --git a/mobile/images/good.png b/mobile/images/good.png
new file mode 100644
index 0000000..fbe942e
Binary files /dev/null and b/mobile/images/good.png differ
diff --git a/mobile/images/good2.png b/mobile/images/good2.png
new file mode 100644
index 0000000..95a1d36
Binary files /dev/null and b/mobile/images/good2.png differ
diff --git a/mobile/images/icon@2x.png b/mobile/images/icon@2x.png
new file mode 100644
index 0000000..16200a4
Binary files /dev/null and b/mobile/images/icon@2x.png differ
diff --git a/mobile/images/like.png b/mobile/images/like.png
new file mode 100644
index 0000000..181cb4e
Binary files /dev/null and b/mobile/images/like.png differ
diff --git a/mobile/images/logo.png b/mobile/images/logo.png
new file mode 100644
index 0000000..ee39a98
Binary files /dev/null and b/mobile/images/logo.png differ
diff --git a/mobile/images/message.png b/mobile/images/message.png
new file mode 100644
index 0000000..1ebd4a0
Binary files /dev/null and b/mobile/images/message.png differ
diff --git a/mobile/images/message2.png b/mobile/images/message2.png
new file mode 100644
index 0000000..008ae70
Binary files /dev/null and b/mobile/images/message2.png differ
diff --git a/mobile/images/more.png b/mobile/images/more.png
new file mode 100644
index 0000000..3a76849
Binary files /dev/null and b/mobile/images/more.png differ
diff --git a/mobile/images/nav-img.png b/mobile/images/nav-img.png
new file mode 100644
index 0000000..45aa5af
Binary files /dev/null and b/mobile/images/nav-img.png differ
diff --git a/mobile/images/play-icon.png b/mobile/images/play-icon.png
new file mode 100644
index 0000000..0f16334
Binary files /dev/null and b/mobile/images/play-icon.png differ
diff --git a/mobile/images/rule.png b/mobile/images/rule.png
new file mode 100644
index 0000000..f8079fc
Binary files /dev/null and b/mobile/images/rule.png differ
diff --git a/mobile/images/top-bg.png b/mobile/images/top-bg.png
new file mode 100644
index 0000000..e817fc2
Binary files /dev/null and b/mobile/images/top-bg.png differ
diff --git a/mobile/images/video-bg.png b/mobile/images/video-bg.png
new file mode 100644
index 0000000..75d753c
Binary files /dev/null and b/mobile/images/video-bg.png differ
diff --git a/mobile/index.html b/mobile/index.html
new file mode 100644
index 0000000..28cf42a
--- /dev/null
+++ b/mobile/index.html
@@ -0,0 +1,451 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <!-- Global site tag (gtag.js) - Google Analytics -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3V6KZGW418"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-3V6KZGW418');
+    </script>
+    <script src="lib/jquery-3.1.1.min.js"></script>
+    <script src="lib/default.js?v='20220418'"></script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片</title>
+    <meta name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="lib/fsize.js"></script>
+    <link rel="stylesheet" href="css/base.css">
+    <link rel="stylesheet" href="css/layer.css">
+    <link rel="stylesheet" href="css/index.css?v=20220615">
+    <style>
+        .layui-layer-shade {
+            opacity: 0.7 !important;
+        }
+
+        .yourclass5 {
+            border-radius: 0rem !important;
+            background: rgba(0, 0, 0, 0) !important;
+        } 
+        .yourclass5 .layui-layer-content {
+            border-radius: 0rem !important;
+        }
+        .yourclass6{
+            border-radius: 0rem !important;
+            background: rgba(0, 0, 0, 0) !important;
+            position: relative;
+            left: 1.4rem !important;
+        }
+        .yourclass6 .layui-layer-content {
+            border-radius: 0rem !important;
+        }
+    </style>
+</head>
+<body style="background: #F3F3F3">
+<div class="layer-shadow"></div>
+<div class="layer-tag-box">
+    <div class="layer-tag-title">選擇分類</div>
+    <ul class="layer-tag-ul">
+        <li class="tag-click">#全部</li>
+        <li>#黑絲</li>
+        <li>#黑絲</li>
+        <li>#黑絲</li>
+        <li>#黑絲</li>
+    </ul>
+</div>
+<div class="m-content">
+    <div class="nav-box">
+        <div class="top-bg">
+            <div class="nav-btn">
+                <div class="nav-click"><span class="txt1">影片</span><img class="click-img" src="images/click.png" alt="激情美女影片"></div>
+                <div><a style="color: #FFABEE;" href="GraphicPage.html"><span class="txt2">圖文</span><img class="click-img" src="images/click.png" alt="絲足"></a></div>
+            </div>
+        </div>
+        <div class="title-nav">
+            <div class="title-nav-box">
+                <div class="title-nav-content">
+                    <h2 data-type="9">絲襪</h2>
+                    <h2 data-type="28">秀腿</h2>
+                    <h2 data-type="45">裸足</h2>
+                    <h2 data-type="271">腳趾</h2>
+                    <h2 data-type="109">美腿</h2>
+                    <h2 data-type="11">黑絲</h2>
+                    <h2 data-type="38">高跟</h2>
+                    <h2 data-type="100">長腿</h2>
+                    <h2 data-type="91">模特</h2>
+                    <h2 data-type="55">肉絲</h2>
+                </div>
+            </div>
+            <img class="more-btn" src="images/more.png" alt="更多美腿">
+        </div>
+    </div>
+    <div style="height: 2.6rem;"></div>
+    
+    <div  class="all-box">
+        <div class="recommend-swiper">
+            <!-- <div class="swiper-img">
+                <div class="top-img-shadow"></div>
+            </div>
+            <div class="swiper-time">02:55</div>
+            <img class="play-icon" src="images/play-icon.png" alt="">
+            <p class="swiper-name">今天吃什么呢,打算吃什么呢</p>
+            <div class="swiper-face-name">
+                <img src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+                <p>糖醋榴莲</p>
+            </div>
+            <div class="swiper-more">
+                <div class="swiper-more1"><img src="images/message.png" alt=""> 25</div>
+            </div> -->
+        </div>
+        <div class="module-title"><img src="images/rule.png" alt=""> <span class="txt3">在線美女</span></div>
+        <div class="more-live-box">
+            <div class="live-box-cotnent">
+                <!-- <div class="live-box">
+                    <div class="live-face-box"><img src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_180" alt=""></div>
+                    <div class="live-box-name">主播昵称预留</div>
+                </div> -->
+            </div>
+        </div>
+        <div class="module-title"><img src="images/rule.png" alt=""> <span class="txt4">熱門影片</span></div>
+        <div class="recommended-videos">
+            <div class="videos-content">
+                <!-- <div class="videos-box">
+                    <img class="play-icon" src="images/play-icon.png" alt="">
+                    <div class="video-time">02:55</div>
+                    <div class="video-more">
+                        <div class="video-more1"><img src="images/message.png" alt=""> 25</div>
+                        <div class="video-more2"><img src="images/good.png" alt=""> 50</div>
+                    </div>
+                    <img class="video-face" src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_180" alt="">
+                    <p class="video-title">今天吃什么呢,打算吃什么呢</p>
+                    <div class="videos-shadow"></div>
+                </div>
+                <div class="videos-box"></div>
+                <div class="videos-box"></div>
+                <div class="videos-box"></div>
+                <div class="videos-box"></div> -->
+            </div>
+        </div>
+        <div class="add-video-content">
+            <!-- <div class="add-video-box">
+                <div class="add-shadow"></div>
+                <div class="add-time">35:53</div>
+                <div class="add-face-name">
+                    <img src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+                    <p>糖醋榴莲</p>
+                </div>
+                <div class="add-video-img">
+                    <img class="play-icon" src="images/play-icon.png" alt="">
+                </div>
+                <div class="add-video-text-box">
+                    <p>今天吃什么呢,打算吃什么呢</p>
+                    <div class="tag-content">
+                        <div class="tag">#丝袜</div>
+                        <div class="tag">#丝袜</div>
+                        <div class="tag">#丝袜</div>
+                        <div class="tag">#丝袜</div>
+                        <div class="tag">#丝袜</div>
+                    </div>
+                </div>
+            </div> -->
+        </div>
+    </div>
+    <div style="display: none;" class="detailed-box">
+    </div>
+    <div class="bottom-nav">
+        <h1 class="bottom-nav-h1">美腿、美足、絲襪直播</h1>
+        <div class="bottom-nav-btn"></div>
+        <div class="bottom-close-btn"></div>
+    </div>
+    <div style="height: 2.5rem;"></div>
+</div>
+</body>
+<script src="layer-v3.1.0/layer/layer.js"></script>
+
+
+<script>
+$(function(){
+    var browserLang = navigator.language
+    if(browserLang.indexOf("zh")==-1){
+        $(".bottom-nav").css("background","url(images/bottom-nav-En.png) no-repeat")
+        $(".bottom-nav").css("background-size","100% 100%")
+        $(".txt1").text("video")
+        $(".txt2").text("Graphics")
+        $(".bottom-nav-h1").text('Legs/Feet/Stockings Live')
+        $(".txt3").text("Online Beauties")
+        $(".txt4").text("Hot Videos")
+    }
+    var tagStr=''
+    var pageNumber=1
+    var typeNumber=1
+    var scrollOk=true;
+    var scrollTopNum=0
+    getLive()
+    setTimeout(function(){
+        tagGet()
+    },800)
+    $(".title-nav-content h2").on("click",function(){
+        var _self=$(this)
+        if($(this).hasClass("tag-go")){
+            $(".title-nav-content h2").removeClass("tag-go")
+            $(".detailed-box").html('').hide()
+            $(".all-box").show()
+            tagStr=''
+            pageNumber=1
+            getList(pageNumber,typeNumber,tagStr)
+        }else{
+            $(".title-nav-content h2").removeClass("tag-go")
+            pageNumber=1
+            tagStr=$(this).attr("data-type")
+            $(".all-box").hide()
+            $(".detailed-box").html('').show()
+            $(this).addClass("tag-go")
+            listAdd(pageNumber,typeNumber,tagStr)
+        } 
+    })
+    $(".more-btn").on("click",function(){
+        $(".layer-tag-box").css("top","0rem")
+        $(".layer-shadow").show()
+    })
+    $(".layer-shadow").on("click",function(){
+        $(".layer-tag-box").css("top","-12rem")
+        $(".layer-shadow").hide()
+    })
+    $(".bottom-nav-btn").on("click",function(){
+        var downNum=Math.ceil(Math.random()*3)
+        window.location.href='download/download.html?qd=ftsBH5SY'
+    })
+    $(".bottom-close-btn").on("click",function(){
+        $(".bottom-nav").fadeOut(350)
+    })
+    $(window).on("scroll",function(){
+        if(scrollTopNum<$(document).scrollTop()){
+            if($(document).scrollTop()>200){
+                $(".nav-box").hide()
+                $(".nav-box").addClass("nav-box-show").css("transform","translateY(-3.5rem)")
+            } 
+       
+        }else{
+            $(".nav-box").show()
+            $(".nav-box").css("transform","translateY(0rem)")
+        }
+        scrollTopNum=$(document).scrollTop()
+        if($(document).height()-$(document).scrollTop()-$(window).height()<=10){
+            if(scrollOk==false)return;
+            scrollOk=false
+            pageNumber+=1
+            
+            listAdd(pageNumber,typeNumber,tagStr)
+        }
+    })
+    function getLive(){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryLiveUsers',
+            success:function(data){
+                // //console.log('直播列表',data)
+                if(data.roomList.length==0){
+                    $(".module-title").hide()
+                    $(".more-live-box").hide()
+                    return;
+                }
+                var liveBoxWidth=2.7*data.roomList.length+0.2
+                $(".live-box-cotnent").css("width",""+liveBoxWidth+"rem")
+                var html=[];
+                for(var i=0;i<data.roomList.length;i++){
+                    var list=data.roomList[i]
+                    html+='<a href="download/download4.html?qd=ftsBH5ZB"><div class="live-box">';
+                    html+='<div class="live-face-box"><img src="https://zhibocdn.yabolive.net/comm'+list.face.split('?')[0]+'?x-oss-process=image/resize,w_180" alt=""></div>';
+                    html+='<div class="live-box-name">'+list.nickname+'</div>';
+                    html+='</div></a>';
+                }
+                $(".live-box-cotnent").html(html);
+                // $(".live-box").unbind("click").on("click",function(){
+                //     window.location.href='download/down1.html?qd=ftsBH5ZB'
+                // })
+            }
+        })
+    }
+    getList(pageNumber,typeNumber,tagStr)
+    function getList(pageNum,typeNum,tagNum){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryTopics',
+            data:{
+                page:pageNum,
+                size:10,
+                type:typeNum,
+                tag:tagNum,
+            },
+            success:function(data){
+                // //console.log('獲取貼文列表',data)
+                var html=[];
+                var topList=JSON.parse(data.dataList[0].content)
+                //console.log(topList)
+                // duration
+                html+='<a href="video.html?topicId='+data.dataList[0].topicId+'&tag='+tagNum+'"><div style="background: url(https://zhibocdn.yabolive.net/comm'+topList.videos[0].cover.split('?')[0]+'?x-oss-process=video/snapshot,t_90000,f_jpg,w_510,h_0,m_fast,f_jpg)no-repeat;background-size: cover;background-position-y: center;" class="swiper-img">';        
+                html+='<div class="top-img-shadow"></div>';
+                html+='</div>';
+                html+='<div class="swiper-time">'+add0(Math.floor(topList.videos[0].duration/1000/60))+':'+add0(Math.floor(topList.videos[0].duration/1000)%60)+'</div>';
+                html+='<img class="play-icon" src="images/play-icon.png" alt="">';
+                html+='<p class="swiper-name">'+topList.title+'</p>';
+                html+='<div class="swiper-face-name">';
+                html+='<img src="https://zhibocdn.yabolive.net/comm'+data.dataList[0].face+'?x-oss-process=image/resize,w_80" alt="">';
+                html+='<p>'+data.dataList[0].nickname+'</p>';
+                html+='</div>';
+                html+='<div class="swiper-more">';
+                html+='<div class="swiper-more1"><img src="images/message.png" alt=""> '+data.dataList[0].comment+'</div>';
+                html+='</div></a>';
+                $(".recommend-swiper").html(html);
+                $(".recommend-swiper").attr("data-type",data.dataList[0].topicId)
+          
+                var html=[];
+                for(var i=1;i<5;i++){
+                    var list=data.dataList[i]
+                    var videoList=JSON.parse(list.content)
+                    html+='<a href="video.html?topicId='+list.topicId+'&tag='+tagNum+'"><div data-type="'+list.topicId+'" style="background: url(https://zhibocdn.yabolive.net/comm'+videoList.videos[0].cover.split('?')[0]+'?x-oss-process=video/snapshot,t_90000,f_jpg,w_360,h_0,m_fast,f_jpg)no-repeat;background-size: cover;background-position-y: center;" class="videos-box">';
+                    html+='<img class="play-icon" src="images/play-icon.png" alt="">';
+                    html+='<div class="video-time">'+add0(Math.floor(videoList.videos[0].duration/1000/60))+':'+add0(Math.floor(videoList.videos[0].duration/1000)%60)+'</div>';
+                    html+='<div class="video-more">';
+                    html+='<div class="video-more1"><img src="images/message.png" alt=""> '+list.comment+'</div>';
+                    html+='</div>';
+                    // html+='<img class="video-face" src="https://zhibocdn.yabolive.net/comm'+list.face+'?x-oss-process=image/resize,w_180" alt="">';
+                    html+='<p class="video-title">'+videoList.title+'</p>';
+                    html+='<div class="videos-shadow"></div>';
+                    html+='</div></a>';
+                }
+                $(".videos-content").html(html);
+          
+                $(".add-video-content").html('')
+                for(var i=5;i<10;i++){
+                    if(data.dataList[i]==undefined)continue
+                    var list=data.dataList[i]
+                    var videoList=JSON.parse(list.content)
+                    var html=[]
+                    html+='<a href="video.html?topicId='+list.topicId+'&tag='+tagNum+'"><div data-type="'+list.topicId+'" class="add-video-box">';
+                    html+='<div class="add-shadow"></div>';
+                    html+='<div class="add-time">'+add0(Math.floor(videoList.videos[0].duration/1000/60))+':'+add0(Math.floor(videoList.videos[0].duration/1000)%60)+'</div>';
+                    html+='<div class="add-face-name">';
+                    html+='<img src="https://zhibocdn.yabolive.net/comm'+list.face+'?x-oss-process=image/resize,w_80" alt="">';
+                    html+='<p>'+list.nickname+'</p>';
+                    html+='</div>';
+                    html+='<div style="background: url(https://zhibocdn.yabolive.net/comm'+videoList.videos[0].cover.split('?')[0]+'?x-oss-process=video/snapshot,t_90000,f_jpg,w_510,h_0,m_fast,f_jpg)no-repeat;background-size: cover;background-position-y: center;" class="add-video-img">';
+                    html+='<img class="play-icon" src="images/play-icon.png" alt="">';
+                    html+='</div>';
+                    html+='<div class="add-video-text-box">';
+                    html+='<p>'+videoList.title+'</p>';
+                    html+='<div class="tag-content">';
+                    for(var j=0;j<list.tags.length;j++){
+                        html+='<div data-type="'+list.tags[j].tagId+'" class="tag">#'+list.tags[j].tagName+'</div>';
+                    }
+                    html+='</div>';
+                    html+='</div>';
+                    html+='</div></a>';
+                    $(".add-video-content").append(html)
+                    // $(".videos-box,.recommend-swiper,.add-video-box").unbind("click").on("click",function(){
+                    //     var _self=$(this).attr("data-type")
+                    //     window.location.href="video.html?topicId="+_self+"&tag="+tagNum+""
+                    // })
+                }
+            }
+        })
+    }
+    function listAdd(pageNum,typeNum,tagNum){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryTopics',
+            data:{
+                page:pageNum,
+                size:10,
+                type:typeNum,
+                tag:tagNum,
+            },
+            success:function(data){
+                // //console.log('獲取貼文列表',data)
+                for(var i=0;i<data.dataList.length;i++){
+                    if(data.dataList[i]==undefined)continue
+                    var list=data.dataList[i]
+                    var videoList=JSON.parse(list.content)
+                    var html=[]
+                    html+='<a href="video.html?topicId='+list.topicId+'&tag='+tagNum+'"><div data-type="'+list.topicId+'" class="add-video-box">';
+                    html+='<div class="add-shadow"></div>';
+                    html+='<div class="add-time">'+add0(Math.floor(videoList.videos[0].duration/1000/60))+':'+add0(Math.floor(videoList.videos[0].duration/1000)%60)+'</div>';
+                    html+='<div class="add-face-name">';
+                    html+='<img src="https://zhibocdn.yabolive.net/comm'+list.face+'?x-oss-process=image/resize,w_80" alt="">';
+                    html+='<p>'+list.nickname+'</p>';
+                    html+='</div>';
+                    html+='<div style="background: url(https://zhibocdn.yabolive.net/comm'+videoList.videos[0].cover.split('?')[0]+'?x-oss-process=video/snapshot,t_90000,f_jpg,w_510,h_0,m_fast,f_jpg)no-repeat;background-size: cover;background-position-y: center;" class="add-video-img">';
+                    html+='<img class="play-icon" src="images/play-icon.png" alt="">';
+                    html+='</div>';
+                    html+='<div class="add-video-text-box">';
+                    html+='<p>'+videoList.title+'</p>';
+                    html+='<div class="tag-content">';
+                    for(var j=0;j<list.tags.length;j++){
+                        html+='<div data-type="'+list.tags[j].tagId+'" class="tag">#'+list.tags[j].tagName+'</div>';
+                    }
+                    html+='</div>';
+                    html+='</div>';
+                    html+='</div></a>';
+                    if(tagStr=='')$(".add-video-content").append(html)
+                    else{
+                        $(".detailed-box").append(html)
+                    }
+                }
+                setTimeout(function(){
+                    scrollOk=true;
+                }, 500);
+                // $(".add-video-box").unbind("click").on("click",function(){
+                //     var _self=$(this).attr("data-type")
+                //     window.location.href="video.html?topicId="+_self+"&tag="+tagNum+""
+                // })
+            }
+        })
+
+    }
+
+    function tagGet(){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryTagList',
+            success:function(data){
+                // //console.log('获取标签列表',data)
+                var html=[];
+                html+='<li data-type="" class="tag-click">#全部</li>'
+                for(var i=0;i<data.tagList.length;i++){
+                    var list=data.tagList[i];
+                    html+='<li data-type="'+list.tagId+'" >'+list.tagName+'</li>'
+                }
+                $(".layer-tag-ul").html(html);
+                $(".layer-tag-ul li").on("click",function(){
+                    var _self=$(this);
+                    $(".layer-tag-ul li").removeClass("tag-click")
+                    _self.addClass("tag-click")
+                    if(_self.attr("data-type")==''){
+                        tagStr=''
+                        pageNumber=1
+                        getList(pageNumber,typeNumber,tagStr)
+                        $(".detailed-box").html('').hide()
+                        $(".all-box").show()
+                        $(".layer-tag-box").css("top","-12rem")
+                        $(".layer-shadow").hide()
+                    }else{
+                        tagStr=_self.attr("data-type")
+                        pageNumber=1
+                        $(".all-box").hide()
+                        $(".detailed-box").html('').show()
+                        listAdd(pageNumber,typeNumber,tagStr)
+                        $(".layer-tag-box").css("top","-12rem")
+                        $(".layer-shadow").hide()
+                     
+                    }
+                })
+            }
+        })
+    }
+    // function 
+})
+</script>
+</html>
\ No newline at end of file
diff --git a/mobile/layer-v3.1.0/layer.css b/mobile/layer-v3.1.0/layer.css
new file mode 100644
index 0000000..b9dbf20
--- /dev/null
+++ b/mobile/layer-v3.1.0/layer.css
@@ -0,0 +1 @@
+.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
\ No newline at end of file
diff --git a/mobile/layer-v3.1.0/layer/layer.js b/mobile/layer-v3.1.0/layer/layer.js
new file mode 100644
index 0000000..2373ba9
--- /dev/null
+++ b/mobile/layer-v3.1.0/layer/layer.js
@@ -0,0 +1,2 @@
+/*! layer-v3.1.0 Web弹层组件 MIT License  http://layer.layui.com/  By 贤心 */
+ ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.scripts,t=e[e.length-1],i=t.src;if(!t.getAttribute("merge"))return i.substring(0,i.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.0",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"&#x4FE1;&#x606F;",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'<div class="layui-layer-title" style="'+(f?r.title[1]:"")+'">'+(f?r.title[0]:r.title)+"</div>":"";return r.zIndex=s,t([r.shade?'<div class="layui-layer-shade" id="layui-layer-shade'+a+'" times="'+a+'" style="'+("z-index:"+(s-1)+"; ")+'"></div>':"",'<div class="'+l[0]+(" layui-layer-"+o.type[r.type])+(0!=r.type&&2!=r.type||r.shade?"":" layui-layer-border")+" "+(r.skin||"")+'" id="'+l[0]+a+'" type="'+o.type[r.type]+'" times="'+a+'" showtime="'+r.time+'" conType="'+(e?"object":"string")+'" style="z-index: '+s+"; width:"+r.area[0]+";height:"+r.area[1]+(r.fixed?"":";position:absolute;")+'">'+(e&&2!=r.type?"":u)+'<div id="'+(r.id||"")+'" class="layui-layer-content'+(0==r.type&&r.icon!==-1?" layui-layer-padding":"")+(3==r.type?" layui-layer-loading"+r.icon:"")+'">'+(0==r.type&&r.icon!==-1?'<i class="layui-layer-ico layui-layer-ico'+r.icon+'"></i>':"")+(1==r.type&&e?"":r.content||"")+'</div><span class="layui-layer-setwin">'+function(){var e=c?'<a class="layui-layer-min" href="javascript:;"><cite></cite></a><a class="layui-layer-ico layui-layer-max" href="javascript:;"></a>':"";return r.closeBtn&&(e+='<a class="layui-layer-ico '+l[7]+" "+l[7]+(r.title?r.closeBtn:4==r.type?"1":"2")+'" href="javascript:;"></a>'),e}()+"</span>"+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t<i;t++)e+='<a class="'+l[6]+t+'">'+r.btn[t]+"</a>";return'<div class="'+l[6]+" layui-layer-btn-"+(r.btnAlign||"")+'">'+e+"</div>"}():"")+(r.resize?'<span class="layui-layer-resize"></span>':"")+"</div>"],u,i('<div class="layui-layer-move"></div>')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"http://layer.layui.com","auto"];t.content='<iframe scrolling="'+(t.content[1]||"auto")+'" allowtransparency="true" id="'+l[4]+a+'" name="'+l[4]+a+'" onload="this.className=\'\';" class="layui-layer-load" frameborder="0" src="'+t.content[0]+'"></iframe>';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'<i class="layui-layer-TipsG"></i>',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;a<c.stX&&(a=c.stX),a>f&&(a=f),o<c.stY&&(o=c.stY),o>u&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'<textarea class="layui-layer-input"'+a+">"+(e.value||"")+"</textarea>":function(){return'<input type="'+(1==e.formType?"password":"text")+'" class="layui-layer-input" value="'+(e.value||"")+'">'}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["&#x786E;&#x5B9A;","&#x53D6;&#x6D88;"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(e){s=e.find(".layui-layer-input"),s.focus(),"function"==typeof f&&f(e)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("&#x6700;&#x591A;&#x8F93;&#x5165;"+(e.maxlength||500)+"&#x4E2A;&#x5B57;&#x6570;",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a='<span class="'+n+'">'+t[0].title+"</span>";i<e;i++)a+="<span>"+t[i].title+"</span>";return a}(),content:'<ul class="layui-layer-tabmain">'+function(){var e=t.length,i=1,a="";if(e>0)for(a='<li class="layui-layer-tabli '+n+'">'+(t[0].content||"no content")+"</li>";i<e;i++)a+='<li class="layui-layer-tabli">'+(t[i].content||"no  content")+"</li>";return a}()+"</ul>",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("&#x6CA1;&#x6709;&#x56FE;&#x7247;")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]<r[1]&&(a[0]=a[0]/r[1],a[1]=a[1]/r[1])}return[a[0]+"px",a[1]+"px"]}(),title:!1,shade:.9,shadeClose:!0,closeBtn:!1,move:".layui-layer-phimg img",moveType:1,scrollbar:!1,moveOut:!0,isOutAnim:!1,skin:"layui-layer-photos"+c("photos"),content:'<div class="layui-layer-phimg"><img src="'+u[d].src+'" alt="'+(u[d].alt||"")+'" layer-pid="'+u[d].pid+'"><div class="layui-layer-imgsee">'+(u.length>1?'<span class="layui-layer-imguide"><a href="javascript:;" class="layui-layer-iconext layui-layer-imgprev"></a><a href="javascript:;" class="layui-layer-iconext layui-layer-imgnext"></a></span>':"")+'<div class="layui-layer-imgbar" style="display:'+(a?"block":"")+'"><span class="layui-layer-imgtit"><a href="javascript:;">'+(u[d].alt||"")+"</a><em>"+s.imgIndex+"/"+u.length+"</em></span></div></div></div>",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("&#x5F53;&#x524D;&#x56FE;&#x7247;&#x5730;&#x5740;&#x5F02;&#x5E38;<br>&#x662F;&#x5426;&#x7EE7;&#x7EED;&#x67E5;&#x770B;&#x4E0B;&#x4E00;&#x5F20;&#xFF1F;",{time:3e4,btn:["&#x4E0B;&#x4E00;&#x5F20;","&#x4E0D;&#x770B;&#x4E86;"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);
\ No newline at end of file
diff --git a/mobile/layer-v3.1.0/layer/mobile/layer.js b/mobile/layer-v3.1.0/layer/mobile/layer.js
new file mode 100644
index 0000000..f9cf693
--- /dev/null
+++ b/mobile/layer-v3.1.0/layer/mobile/layer.js
@@ -0,0 +1,2 @@
+/*! layer mobile-v2.0.0 Web弹层组件 MIT License  http://layer.layui.com/mobile  By 贤心 */
+ ;!function(e){"use strict";var t=document,n="querySelectorAll",i="getElementsByClassName",a=function(e){return t[n](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var n in e)t[n]=e[n];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var r=0,o=["layui-m-layer"],c=function(e){var t=this;t.config=l.extend(e),t.view()};c.prototype.view=function(){var e=this,n=e.config,s=t.createElement("div");e.id=s.id=o[0]+r,s.setAttribute("class",o[0]+" "+o[0]+(n.type||0)),s.setAttribute("index",r);var l=function(){var e="object"==typeof n.title;return n.title?'<h3 style="'+(e?n.title[1]:"")+'">'+(e?n.title[0]:n.title)+"</h3>":""}(),c=function(){"string"==typeof n.btn&&(n.btn=[n.btn]);var e,t=(n.btn||[]).length;return 0!==t&&n.btn?(e='<span yes type="1">'+n.btn[0]+"</span>",2===t&&(e='<span no type="0">'+n.btn[1]+"</span>"+e),'<div class="layui-m-layerbtn">'+e+"</div>"):""}();if(n.fixed||(n.top=n.hasOwnProperty("top")?n.top:100,n.style=n.style||"",n.style+=" top:"+(t.body.scrollTop+n.top)+"px"),2===n.type&&(n.content='<i></i><i class="layui-m-layerload"></i><i></i><p>'+(n.content||"")+"</p>"),n.skin&&(n.anim="up"),"msg"===n.skin&&(n.shade=!1),s.innerHTML=(n.shade?"<div "+("string"==typeof n.shade?'style="'+n.shade+'"':"")+' class="layui-m-layershade"></div>':"")+'<div class="layui-m-layermain" '+(n.fixed?"":'style="position:static;"')+'><div class="layui-m-layersection"><div class="layui-m-layerchild '+(n.skin?"layui-m-layer-"+n.skin+" ":"")+(n.className?n.className:"")+" "+(n.anim?"layui-m-anim-"+n.anim:"")+'" '+(n.style?'style="'+n.style+'"':"")+">"+l+'<div class="layui-m-layercont">'+n.content+"</div>"+c+"</div></div></div>",!n.type||2===n.type){var d=t[i](o[0]+n.type),y=d.length;y>=1&&layer.close(d[0].getAttribute("index"))}document.body.appendChild(s);var u=e.elem=a("#"+e.id)[0];n.success&&n.success(u),e.index=r++,e.action(n,u)},c.prototype.action=function(e,t){var n=this;e.time&&(l.timer[n.index]=setTimeout(function(){layer.close(n.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),layer.close(n.index)):e.yes?e.yes(n.index):layer.close(n.index)};if(e.btn)for(var s=t[i]("layui-m-layerbtn")[0].children,r=s.length,o=0;o<r;o++)l.touch(s[o],a);if(e.shade&&e.shadeClose){var c=t[i]("layui-m-layershade")[0];l.touch(c,function(){layer.close(n.index,e.end)})}e.end&&(l.end[n.index]=e.end)},e.layer={v:"2.0",index:r,open:function(e){var t=new c(e||{});return t.index},close:function(e){var n=a("#"+o[0]+e)[0];n&&(n.innerHTML="",t.body.removeChild(n),clearTimeout(l.timer[e]),delete l.timer[e],"function"==typeof l.end[e]&&l.end[e](),delete l.end[e])},closeAll:function(){for(var e=t[i](o[0]),n=0,a=e.length;n<a;n++)layer.close(0|e[0].getAttribute("index"))}},"function"==typeof define?define(function(){return layer}):function(){var e=document.scripts,n=e[e.length-1],i=n.src,a=i.substring(0,i.lastIndexOf("/")+1);n.getAttribute("merge")||document.head.appendChild(function(){var e=t.createElement("link");return e.href=a+"need/layer.css?2.0",e.type="text/css",e.rel="styleSheet",e.id="layermcss",e}())}()}(window);
\ No newline at end of file
diff --git a/mobile/layer-v3.1.0/layer/mobile/need/layer.css b/mobile/layer-v3.1.0/layer/mobile/need/layer.css
new file mode 100644
index 0000000..b9dbf20
--- /dev/null
+++ b/mobile/layer-v3.1.0/layer/mobile/need/layer.css
@@ -0,0 +1 @@
+.layui-m-layer{position:relative;z-index:19891014}.layui-m-layer *{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.layui-m-layermain,.layui-m-layershade{position:fixed;left:0;top:0;width:100%;height:100%}.layui-m-layershade{background-color:rgba(0,0,0,.7);pointer-events:auto}.layui-m-layermain{display:table;font-family:Helvetica,arial,sans-serif;pointer-events:none}.layui-m-layermain .layui-m-layersection{display:table-cell;vertical-align:middle;text-align:center}.layui-m-layerchild{position:relative;display:inline-block;text-align:left;background-color:#fff;font-size:14px;border-radius:5px;box-shadow:0 0 8px rgba(0,0,0,.1);pointer-events:auto;-webkit-overflow-scrolling:touch;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layui-m-anim-scale{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}.layui-m-anim-scale{animation-name:layui-m-anim-scale;-webkit-animation-name:layui-m-anim-scale}@-webkit-keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layui-m-anim-up{0%{opacity:0;-webkit-transform:translateY(800px);transform:translateY(800px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}.layui-m-anim-up{-webkit-animation-name:layui-m-anim-up;animation-name:layui-m-anim-up}.layui-m-layer0 .layui-m-layerchild{width:90%;max-width:640px}.layui-m-layer1 .layui-m-layerchild{border:none;border-radius:0}.layui-m-layer2 .layui-m-layerchild{width:auto;max-width:260px;min-width:40px;border:none;background:0 0;box-shadow:none;color:#fff}.layui-m-layerchild h3{padding:0 10px;height:60px;line-height:60px;font-size:16px;font-weight:400;border-radius:5px 5px 0 0;text-align:center}.layui-m-layerbtn span,.layui-m-layerchild h3{text-overflow:ellipsis;overflow:hidden;white-space:nowrap}.layui-m-layercont{padding:50px 30px;line-height:22px;text-align:center}.layui-m-layer1 .layui-m-layercont{padding:0;text-align:left}.layui-m-layer2 .layui-m-layercont{text-align:center;padding:0;line-height:0}.layui-m-layer2 .layui-m-layercont i{width:25px;height:25px;margin-left:8px;display:inline-block;background-color:#fff;border-radius:100%;-webkit-animation:layui-m-anim-loading 1.4s infinite ease-in-out;animation:layui-m-anim-loading 1.4s infinite ease-in-out;-webkit-animation-fill-mode:both;animation-fill-mode:both}.layui-m-layerbtn,.layui-m-layerbtn span{position:relative;text-align:center;border-radius:0 0 5px 5px}.layui-m-layer2 .layui-m-layercont p{margin-top:20px}@-webkit-keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}@keyframes layui-m-anim-loading{0%,100%,80%{transform:scale(0);-webkit-transform:scale(0)}40%{transform:scale(1);-webkit-transform:scale(1)}}.layui-m-layer2 .layui-m-layercont i:first-child{margin-left:0;-webkit-animation-delay:-.32s;animation-delay:-.32s}.layui-m-layer2 .layui-m-layercont i.layui-m-layerload{-webkit-animation-delay:-.16s;animation-delay:-.16s}.layui-m-layer2 .layui-m-layercont>div{line-height:22px;padding-top:7px;margin-bottom:20px;font-size:14px}.layui-m-layerbtn{display:box;display:-moz-box;display:-webkit-box;width:100%;height:50px;line-height:50px;font-size:0;border-top:1px solid #D0D0D0;background-color:#F2F2F2}.layui-m-layerbtn span{display:block;-moz-box-flex:1;box-flex:1;-webkit-box-flex:1;font-size:14px;cursor:pointer}.layui-m-layerbtn span[yes]{color:#40AFFE}.layui-m-layerbtn span[no]{border-right:1px solid #D0D0D0;border-radius:0 0 0 5px}.layui-m-layerbtn span:active{background-color:#F6F6F6}.layui-m-layerend{position:absolute;right:7px;top:10px;width:30px;height:30px;border:0;font-weight:400;background:0 0;cursor:pointer;-webkit-appearance:none;font-size:30px}.layui-m-layerend::after,.layui-m-layerend::before{position:absolute;left:5px;top:15px;content:'';width:18px;height:1px;background-color:#999;transform:rotate(45deg);-webkit-transform:rotate(45deg);border-radius:3px}.layui-m-layerend::after{transform:rotate(-45deg);-webkit-transform:rotate(-45deg)}body .layui-m-layer .layui-m-layer-footer{position:fixed;width:95%;max-width:100%;margin:0 auto;left:0;right:0;bottom:10px;background:0 0}.layui-m-layer-footer .layui-m-layercont{padding:20px;border-radius:5px 5px 0 0;background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn{display:block;height:auto;background:0 0;border-top:none}.layui-m-layer-footer .layui-m-layerbtn span{background-color:rgba(255,255,255,.8)}.layui-m-layer-footer .layui-m-layerbtn span[no]{color:#FD482C;border-top:1px solid #c2c2c2;border-radius:0 0 5px 5px}.layui-m-layer-footer .layui-m-layerbtn span[yes]{margin-top:10px;border-radius:5px}body .layui-m-layer .layui-m-layer-msg{width:auto;max-width:90%;margin:0 auto;bottom:-150px;background-color:rgba(0,0,0,.7);color:#fff}.layui-m-layer-msg .layui-m-layercont{padding:10px 20px}
\ No newline at end of file
diff --git a/mobile/layer-v3.1.0/layer/theme/default/icon-ext.png b/mobile/layer-v3.1.0/layer/theme/default/icon-ext.png
new file mode 100644
index 0000000..bbbb669
Binary files /dev/null and b/mobile/layer-v3.1.0/layer/theme/default/icon-ext.png differ
diff --git a/mobile/layer-v3.1.0/layer/theme/default/icon.png b/mobile/layer-v3.1.0/layer/theme/default/icon.png
new file mode 100644
index 0000000..3e17da8
Binary files /dev/null and b/mobile/layer-v3.1.0/layer/theme/default/icon.png differ
diff --git a/mobile/layer-v3.1.0/layer/theme/default/layer.css b/mobile/layer-v3.1.0/layer/theme/default/layer.css
new file mode 100644
index 0000000..820b4a9
--- /dev/null
+++ b/mobile/layer-v3.1.0/layer/theme/default/layer.css
@@ -0,0 +1 @@
+.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span,.layui-layer-title{text-overflow:ellipsis;white-space:nowrap}html #layuicss-layer{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{-webkit-overflow-scrolling:touch;top:150px;left:0;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;border-radius:2px;box-shadow:1px 1px 50px rgba(0,0,0,.3)}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.1);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-load{background:url(loading-1.gif) center center no-repeat #eee}.layui-layer-ico{background:url(icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-move{display:none;position:fixed;*position:absolute;left:0;top:0;width:100%;height:100%;cursor:move;opacity:0;filter:alpha(opacity=0);background-color:#fff;z-index:2147483647}.layui-layer-resize{position:absolute;width:15px;height:15px;right:0;bottom:0;cursor:se-resize}.layer-anim{-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}@-webkit-keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-00{-webkit-animation-name:layer-bounceIn;animation-name:layer-bounceIn}@-webkit-keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-01{-webkit-animation-name:layer-zoomInDown;animation-name:layer-zoomInDown}@-webkit-keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes layer-fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layer-anim-02{-webkit-animation-name:layer-fadeInUpBig;animation-name:layer-fadeInUpBig}@-webkit-keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes layer-zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layer-anim-03{-webkit-animation-name:layer-zoomInLeft;animation-name:layer-zoomInLeft}@-webkit-keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes layer-rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layer-anim-04{-webkit-animation-name:layer-rollIn;animation-name:layer-rollIn}@keyframes layer-fadeIn{0%{opacity:0}100%{opacity:1}}.layer-anim-05{-webkit-animation-name:layer-fadeIn;animation-name:layer-fadeIn}@-webkit-keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes layer-shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layer-anim-06{-webkit-animation-name:layer-shake;animation-name:layer-shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;background-color:#F8F8F8;border-radius:2px 2px 0 0}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:1px -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-149px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-180px -31px}.layui-layer-btn{text-align:right;padding:0 15px 12px;pointer-events:auto;user-select:none;-webkit-user-select:none}.layui-layer-btn a{height:28px;line-height:28px;margin:5px 5px 0;padding:0 15px;border:1px solid #dedede;background-color:#fff;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.8}.layui-layer-btn .layui-layer-btn0{border-color:#1E9FFF;background-color:#1E9FFF;color:#fff}.layui-layer-btn-l{text-align:left}.layui-layer-btn-c{text-align:center}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;overflow:hidden;font-size:14px;overflow-x:hidden;overflow-y:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:8px 15px;font-size:12px;_float:left;border-radius:2px;box-shadow:1px 1px 3px rgba(0,0,0,.2);background-color:#000;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#000}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:5px;border-bottom-style:solid;border-bottom-color:#000}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-btn{padding:5px 10px 10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#fff;border-color:#E9E7E7;color:#333}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95;border-color:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1}.layui-layer-iconext{background:url(icon-ext.png) no-repeat}.layui-layer-prompt .layui-layer-input{display:block;width:230px;height:36px;margin:0 auto;line-height:30px;padding-left:10px;border:1px solid #e6e6e6;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px;padding:6px 10px}.layui-layer-prompt .layui-layer-content{padding:20px}.layui-layer-prompt .layui-layer-btn{padding-top:0}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;overflow:hidden;cursor:pointer}.layui-layer-tab .layui-layer-title span.layui-this{height:43px;border-left:1px solid #eee;border-right:1px solid #eee;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.layui-this{display:block}.layui-layer-photos{-webkit-animation-duration:.8s;animation-duration:.8s}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal}@-webkit-keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes layer-bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.05);-ms-transform:scale(1.05);transform:scale(1.05)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layer-anim-close{-webkit-animation-name:layer-bounceOut;animation-name:layer-bounceOut;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.2s;animation-duration:.2s}@media screen and (max-width:1100px){.layui-layer-iframe{overflow-y:auto;-webkit-overflow-scrolling:touch}}
\ No newline at end of file
diff --git a/mobile/layer-v3.1.0/layer/theme/default/loading-0.gif b/mobile/layer-v3.1.0/layer/theme/default/loading-0.gif
new file mode 100644
index 0000000..6f3c953
Binary files /dev/null and b/mobile/layer-v3.1.0/layer/theme/default/loading-0.gif differ
diff --git a/mobile/layer-v3.1.0/layer/theme/default/loading-1.gif b/mobile/layer-v3.1.0/layer/theme/default/loading-1.gif
new file mode 100644
index 0000000..db3a483
Binary files /dev/null and b/mobile/layer-v3.1.0/layer/theme/default/loading-1.gif differ
diff --git a/mobile/layer-v3.1.0/layer/theme/default/loading-2.gif b/mobile/layer-v3.1.0/layer/theme/default/loading-2.gif
new file mode 100644
index 0000000..5bb90fd
Binary files /dev/null and b/mobile/layer-v3.1.0/layer/theme/default/loading-2.gif differ
diff --git a/mobile/lib/default.js b/mobile/lib/default.js
new file mode 100644
index 0000000..21ad869
--- /dev/null
+++ b/mobile/lib/default.js
@@ -0,0 +1,305 @@
+/**
+ * Created by webshow on 2019/11/22.
+ */
+ var bbb = location.href;
+ if (bbb.indexOf("footseen.xyz") > -1) {
+    $ip = 'https://webserver.yabolive.net';
+    $ws='wss://zhiboweb.ishuaji.cn/yzsocket/ws?type=2'
+    $url ='https://activity.ishuaji.cn/'
+    $pay='https://pay.ishuaji.cn/'
+    $api='https://zhibo.lvdou66.com/'
+    checkIp()
+}else if(bbb.indexOf("http://test.ybact.ishuaji.cn/") > -1){
+    $ip = 'https://webserver.yabolive.net';
+    $ws = 'ws://114.55.165.186:12308/ws?type=2';
+    $url ='http://test.ybact.ishuaji.cn/'
+    $pay='http://test.pay.ishuaji.cn/'
+    $api='http://test.api.lvdou66.com/'
+}
+else{
+    $ip = 'https://webserver.yabolive.net';
+    $ws = 'ws://114.55.165.186:12308/ws?type=2';
+    $url ='http://test.ybact.ishuaji.cn/'
+    $pay='http://test.pay.ishuaji.cn/'
+    $api='http://test.api.lvdou66.com/'
+}
+ var bbb = location.href;
+ var data = url_get_params(bbb)
+ if (sessionStorage.kkk == undefined) {
+     sessionStorage.kkk = data.token; //t
+     sessionStorage.bbb = data.uid; //u
+     sessionStorage.version = data.appversion;
+     sessionStorage.pkg=data.pkg
+ 
+     if (data.roomID != undefined && data.roomID != 'undefined') {
+         sessionStorage.roomId = data.roomID;
+     } else {
+         sessionStorage.roomId = data.roomId;
+     }
+     if(sessionStorage.roomId=='undefined')sessionStorage.roomId=0
+ }
+
+sessionStorage.topicId=data.topicId
+sessionStorage.tag=data.tag
+sessionStorage.qd=data.qd
+ if(sessionStorage.open==undefined)sessionStorage.open=1
+ var ua = window.navigator.userAgent.toLowerCase();
+ try {
+     if (/iphone|ipad|ipod/.test(ua)) {
+         sessionStorage.os='ios'
+     } else if (/android/.test(ua)) {
+         sessionStorage.os='android'
+     }
+ } catch (e) {
+ }
+ function url_get_params(url_path) {
+     var url = url_path;
+     var theRequest = new Object();
+     if (url.indexOf("?") != -1) {
+         var str = url.substr(url.indexOf("?") + 1);
+         strs = str.split("&");
+         for (var i = 0; i < strs.length; i++) {
+             theRequest[strs[i].split("=")[0]] = unescape(strs[i].split("=")[1]);
+         }
+     }
+     return theRequest;
+ }
+ if (bbb.indexOf("http://localhost:63342") > -1) {
+     sessionStorage.bbb = 23871190;
+     sessionStorage.kkk = 'debug'
+     sessionStorage.roomId=23864554
+ }
+ if (bbb.indexOf("file:///") > -1) {
+     sessionStorage.bbb = 23868834;
+     sessionStorage.kkk = 'debug'
+     sessionStorage.roomId=23864554
+     if (bbb.indexOf("mc") > -1) {
+        sessionStorage.bbb = 23864554;
+        sessionStorage.kkk = 'debug'
+        sessionStorage.roomId=23864554
+    }
+ }
+ function checkIp() {
+    $.ajax({
+        url:"https://webserver.yabolive.net/user/checkIpIsChina.html",
+        async: false,
+        success: function (res) {
+            var result = JSON.parse(res);
+            if (result.code === 1) {
+                if (result.checkResult) {
+                    window.location.hash = "no-back";
+                    window.location.hash = "Again-No-back-button";
+                    window.onhashchange = function () { window.location.hash = "no-back"; }
+                    window.location.href = 'https://www.footseen.xyz/content.html?ip=' + result.ip;
+                }
+            }
+        }
+    })
+}
+ //ajax设置默认参数
+ $.ajaxSetup({
+     global: false,
+     type: 'get',
+     data: {
+         uid: sessionStorage.bbb,
+         token: sessionStorage.kkk
+     },
+     dataType: "JSON"
+ })
+
+ //点击刷新
+ $(".ref").on("click", function () {
+     sessionStorage.jump=undefined;
+     window.location.reload()
+ })
+ $(".callKf").on("click",function(){
+    callFK()
+})
+ function btnHref(e){
+     var myJson = {
+         "cid": 12,
+         "reqCode": new Date().getTime(),
+         "data": {
+             "msg":'跳转页面',
+             "jump": e,
+         }
+     }
+     var obj=JSON.stringify(myJson);
+     appCollaboration(obj)
+ }
+ //与客户端交互
+ function appCollaboration(msg) {
+     var ua = window.navigator.userAgent.toLowerCase();
+     try {
+         if (/iphone|ipad|ipod/.test(ua)) {
+             window.webkit.messageHandlers.appCollaboration.postMessage(msg);
+         } else if (/android/.test(ua)) {
+             window.yazhai.appCollaboration(msg);
+         }
+     } catch (e) {
+     }
+ }
+ //处理时间倒计时的函数
+ function timeDeal(e,time){
+     var endTime=e;
+     var newTime=time;
+     var Remain=Math.floor((endTime-newTime)/1000);
+    //  if(Remain<=0)window.location.reload();
+     var day=Math.floor(Remain/86400);
+     var hour=add0(Math.floor(Remain%86400/3600));
+     if(hour>99)hour=99;
+     var min=add0(Math.floor(Remain%3600/60));
+     var sceond=add0(Math.floor(Remain%60));
+     var timeArr=[day,hour,min,sceond];
+     return timeArr;
+ }
+ function timeDeal2(e,time){
+     var endTime=e;
+     var newTime=time;
+     var Remain=Math.floor((endTime-newTime)/1000);
+     if(Remain<=0)Remain=0
+     var bbb = location.href;
+     if (bbb.indexOf("https://activity.ishuaji.cn/") > -1) {
+        if(Remain<=0)window.location.reload();
+     }
+     var day=add0(Math.floor(Remain/86400));
+     var hour=add0(Math.floor(Remain/3600));
+     if(hour>99)hour=99;
+     var min=add0(Math.floor(Remain%3600/60));
+     var sceond=add0(Math.floor(Remain%100));
+     var timeArr=[day,hour,min,sceond];
+     return timeArr;
+ }
+ function getMyTime(){
+     $.ajax({
+         url:$ip+'activesys/getSysTimeStamp',
+         async:false,
+         success:function(data){
+             myTime=data.timestamp
+             return myTime
+         }
+     })
+ }
+ //时间戳转具体 年月日时分秒
+ function timeGet(e){
+     var time = new Date(Number(e));
+     var y = time.getFullYear();
+     var m = time.getMonth()+1;
+     var d = time.getDate();
+     var h = time.getHours();
+     var mm = time.getMinutes();
+     var s = time.getSeconds();
+     var timeArr=[y,m,d,add0(h),add0(mm),s]
+     return timeArr
+ }
+ function callFK(){
+    var obj2 = {
+        "cid": 4,
+        "reqCode": new Date().getTime(),
+        "data": {
+            "msg": "请求客服",
+        }
+    }
+    var obj = JSON.stringify(obj2);
+    appCollaboration(obj)
+}
+ //一位数前面加0
+ function add0(m) {
+     return m < 10 ? '0' + m : m
+ }
+ function add00(m){
+     if(m<10){
+         return '00'+m
+     }else if(m>10&&m<100){
+         return '0'+m
+     }else{
+         return m
+     }
+ }
+ function imgAdd(m){
+     if(String(m).length > 5) return m;
+     return (Array(5).join(0) + m).slice(-5);
+ }
+ //一万以上省略
+ function addw(e){
+     if(e>=100000000){
+         return Math.floor((e/100000000).toFixed(2)*10)/10+'亿';
+     }
+     else if(e>=10000){
+         return Math.floor((e/10000).toFixed(2)*10)/10+'万';
+     }else{
+         return Math.ceil(e);
+     }
+ }
+ function loadImageGo(name,sNum,eNum) {
+    var imgList = [];
+    var num = sNum;
+    loadImage()
+    function loadImage() {
+        var img = new Image();
+        img.addEventListener("load", loadHandler);
+        img.src = "images/" + name + "/1_" + imgAdd(num) + ".png";
+    }
+    function loadHandler() {
+        imgList.push(this.cloneNode());
+        num++;
+        if (num > eNum) { return; }
+        this.src = "images/" + name + "/1_" + imgAdd(num)  + ".png";
+    }
+}  
+function loadImageGo3(name,sNum,eNum) {
+    var imgList = [];
+    var num = sNum;
+    loadImage()
+    function loadImage() {
+        var img = new Image();
+        img.addEventListener("load", loadHandler);
+        img.src = "images/" + name + "/(" + num + ").png";
+    }
+    function loadHandler() {
+        imgList.push(this.cloneNode());
+        num++;
+        if (num > eNum) { return; }
+        this.src = "images/" + name + "/(" + num + ").png";
+    }
+}   
+ function addDoc(e){
+     if(e%1==0){
+         return e+'.0';
+     }else return e
+ }
+ //跳转充值页面
+ function goReg(){
+     if(sessionStorage.pkg=='qingliang'){
+         var ua = window.navigator.userAgent.toLowerCase();
+         if (/iphone|ipad|ipod/.test(ua)) {
+             window.location.href='yazhai://_recharge';
+         }else{
+             window.location.href='http://web.yazhai.co/milkRecharge/index.html?uid='+sessionStorage.bbb+'&token='+sessionStorage.kkk+'&pkg=qingliang';
+         }
+     } else if(sessionStorage.pkg=='qiezi'){
+         var ua = window.navigator.userAgent.toLowerCase();
+         if (/iphone|ipad|ipod/.test(ua)) {
+             window.location.href='yazhai://_recharge';
+         }else{
+             window.location.href='http://web.yazhai.co/guodongRecharge/index.html?uid='+sessionStorage.bbb+'&token='+sessionStorage.kkk+'&pkg=qingliang';
+         }
+     }
+     else{
+         window.location.href='http://web.yazhai.co/recharge/index.html?uid='+sessionStorage.bbb+'&token='+sessionStorage.kkk+'&pkg=yabo';
+     }
+ }
+ function scrollTo(element,speed) {
+     if(!speed){
+         speed = 300;
+     }
+     if(!element){
+         $("html,body").animate({scrollTop:0},speed);
+     }else{
+         if(element.length>0){
+             $("html,body").animate({scrollTop:$(element).offset().top},speed);
+         }
+     }
+ }
+ 
+ //var betEnd = new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate(), new Date().getHours(), 59, 59).getTime();
\ No newline at end of file
diff --git a/mobile/lib/flv.js b/mobile/lib/flv.js
new file mode 100644
index 0000000..4fbecbf
--- /dev/null
+++ b/mobile/lib/flv.js
@@ -0,0 +1,12056 @@
+(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.flvjs = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o<r.length;o++)s(r[o]);return s})({1:[function(_dereq_,module,exports){
+    (function (process,global){
+    /*!
+     * @overview es6-promise - a tiny implementation of Promises/A+.
+     * @copyright Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors (Conversion to ES6 API by Jake Archibald)
+     * @license   Licensed under MIT license
+     *            See https://raw.githubusercontent.com/stefanpenner/es6-promise/master/LICENSE
+     * @version   v4.2.5+7f2b526d
+     */
+    
+    (function (global, factory) {
+        typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
+        typeof define === 'function' && define.amd ? define(factory) :
+        (global.ES6Promise = factory());
+    }(this, (function () { 'use strict';
+    
+    function objectOrFunction(x) {
+      var type = typeof x;
+      return x !== null && (type === 'object' || type === 'function');
+    }
+    
+    function isFunction(x) {
+      return typeof x === 'function';
+    }
+    
+    
+    
+    var _isArray = void 0;
+    if (Array.isArray) {
+      _isArray = Array.isArray;
+    } else {
+      _isArray = function (x) {
+        return Object.prototype.toString.call(x) === '[object Array]';
+      };
+    }
+    
+    var isArray = _isArray;
+    
+    var len = 0;
+    var vertxNext = void 0;
+    var customSchedulerFn = void 0;
+    
+    var asap = function asap(callback, arg) {
+      queue[len] = callback;
+      queue[len + 1] = arg;
+      len += 2;
+      if (len === 2) {
+        // If len is 2, that means that we need to schedule an async flush.
+        // If additional callbacks are queued before the queue is flushed, they
+        // will be processed by this flush that we are scheduling.
+        if (customSchedulerFn) {
+          customSchedulerFn(flush);
+        } else {
+          scheduleFlush();
+        }
+      }
+    };
+    
+    function setScheduler(scheduleFn) {
+      customSchedulerFn = scheduleFn;
+    }
+    
+    function setAsap(asapFn) {
+      asap = asapFn;
+    }
+    
+    var browserWindow = typeof window !== 'undefined' ? window : undefined;
+    var browserGlobal = browserWindow || {};
+    var BrowserMutationObserver = browserGlobal.MutationObserver || browserGlobal.WebKitMutationObserver;
+    var isNode = typeof self === 'undefined' && typeof process !== 'undefined' && {}.toString.call(process) === '[object process]';
+    
+    // test for web worker but not in IE10
+    var isWorker = typeof Uint8ClampedArray !== 'undefined' && typeof importScripts !== 'undefined' && typeof MessageChannel !== 'undefined';
+    
+    // node
+    function useNextTick() {
+      // node version 0.10.x displays a deprecation warning when nextTick is used recursively
+      // see https://github.com/cujojs/when/issues/410 for details
+      return function () {
+        return process.nextTick(flush);
+      };
+    }
+    
+    // vertx
+    function useVertxTimer() {
+      if (typeof vertxNext !== 'undefined') {
+        return function () {
+          vertxNext(flush);
+        };
+      }
+    
+      return useSetTimeout();
+    }
+    
+    function useMutationObserver() {
+      var iterations = 0;
+      var observer = new BrowserMutationObserver(flush);
+      var node = document.createTextNode('');
+      observer.observe(node, { characterData: true });
+    
+      return function () {
+        node.data = iterations = ++iterations % 2;
+      };
+    }
+    
+    // web worker
+    function useMessageChannel() {
+      var channel = new MessageChannel();
+      channel.port1.onmessage = flush;
+      return function () {
+        return channel.port2.postMessage(0);
+      };
+    }
+    
+    function useSetTimeout() {
+      // Store setTimeout reference so es6-promise will be unaffected by
+      // other code modifying setTimeout (like sinon.useFakeTimers())
+      var globalSetTimeout = setTimeout;
+      return function () {
+        return globalSetTimeout(flush, 1);
+      };
+    }
+    
+    var queue = new Array(1000);
+    function flush() {
+      for (var i = 0; i < len; i += 2) {
+        var callback = queue[i];
+        var arg = queue[i + 1];
+    
+        callback(arg);
+    
+        queue[i] = undefined;
+        queue[i + 1] = undefined;
+      }
+    
+      len = 0;
+    }
+    
+    function attemptVertx() {
+      try {
+        var vertx = Function('return this')().require('vertx');
+        vertxNext = vertx.runOnLoop || vertx.runOnContext;
+        return useVertxTimer();
+      } catch (e) {
+        return useSetTimeout();
+      }
+    }
+    
+    var scheduleFlush = void 0;
+    // Decide what async method to use to triggering processing of queued callbacks:
+    if (isNode) {
+      scheduleFlush = useNextTick();
+    } else if (BrowserMutationObserver) {
+      scheduleFlush = useMutationObserver();
+    } else if (isWorker) {
+      scheduleFlush = useMessageChannel();
+    } else if (browserWindow === undefined && typeof _dereq_ === 'function') {
+      scheduleFlush = attemptVertx();
+    } else {
+      scheduleFlush = useSetTimeout();
+    }
+    
+    function then(onFulfillment, onRejection) {
+      var parent = this;
+    
+      var child = new this.constructor(noop);
+    
+      if (child[PROMISE_ID] === undefined) {
+        makePromise(child);
+      }
+    
+      var _state = parent._state;
+    
+    
+      if (_state) {
+        var callback = arguments[_state - 1];
+        asap(function () {
+          return invokeCallback(_state, child, callback, parent._result);
+        });
+      } else {
+        subscribe(parent, child, onFulfillment, onRejection);
+      }
+    
+      return child;
+    }
+    
+    /**
+      `Promise.resolve` returns a promise that will become resolved with the
+      passed `value`. It is shorthand for the following:
+    
+      ```javascript
+      let promise = new Promise(function(resolve, reject){
+        resolve(1);
+      });
+    
+      promise.then(function(value){
+        // value === 1
+      });
+      ```
+    
+      Instead of writing the above, your code now simply becomes the following:
+    
+      ```javascript
+      let promise = Promise.resolve(1);
+    
+      promise.then(function(value){
+        // value === 1
+      });
+      ```
+    
+      @method resolve
+      @static
+      @param {Any} value value that the returned promise will be resolved with
+      Useful for tooling.
+      @return {Promise} a promise that will become fulfilled with the given
+      `value`
+    */
+    function resolve$1(object) {
+      /*jshint validthis:true */
+      var Constructor = this;
+    
+      if (object && typeof object === 'object' && object.constructor === Constructor) {
+        return object;
+      }
+    
+      var promise = new Constructor(noop);
+      resolve(promise, object);
+      return promise;
+    }
+    
+    var PROMISE_ID = Math.random().toString(36).substring(2);
+    
+    function noop() {}
+    
+    var PENDING = void 0;
+    var FULFILLED = 1;
+    var REJECTED = 2;
+    
+    var TRY_CATCH_ERROR = { error: null };
+    
+    function selfFulfillment() {
+      return new TypeError("You cannot resolve a promise with itself");
+    }
+    
+    function cannotReturnOwn() {
+      return new TypeError('A promises callback cannot return that same promise.');
+    }
+    
+    function getThen(promise) {
+      try {
+        return promise.then;
+      } catch (error) {
+        TRY_CATCH_ERROR.error = error;
+        return TRY_CATCH_ERROR;
+      }
+    }
+    
+    function tryThen(then$$1, value, fulfillmentHandler, rejectionHandler) {
+      try {
+        then$$1.call(value, fulfillmentHandler, rejectionHandler);
+      } catch (e) {
+        return e;
+      }
+    }
+    
+    function handleForeignThenable(promise, thenable, then$$1) {
+      asap(function (promise) {
+        var sealed = false;
+        var error = tryThen(then$$1, thenable, function (value) {
+          if (sealed) {
+            return;
+          }
+          sealed = true;
+          if (thenable !== value) {
+            resolve(promise, value);
+          } else {
+            fulfill(promise, value);
+          }
+        }, function (reason) {
+          if (sealed) {
+            return;
+          }
+          sealed = true;
+    
+          reject(promise, reason);
+        }, 'Settle: ' + (promise._label || ' unknown promise'));
+    
+        if (!sealed && error) {
+          sealed = true;
+          reject(promise, error);
+        }
+      }, promise);
+    }
+    
+    function handleOwnThenable(promise, thenable) {
+      if (thenable._state === FULFILLED) {
+        fulfill(promise, thenable._result);
+      } else if (thenable._state === REJECTED) {
+        reject(promise, thenable._result);
+      } else {
+        subscribe(thenable, undefined, function (value) {
+          return resolve(promise, value);
+        }, function (reason) {
+          return reject(promise, reason);
+        });
+      }
+    }
+    
+    function handleMaybeThenable(promise, maybeThenable, then$$1) {
+      if (maybeThenable.constructor === promise.constructor && then$$1 === then && maybeThenable.constructor.resolve === resolve$1) {
+        handleOwnThenable(promise, maybeThenable);
+      } else {
+        if (then$$1 === TRY_CATCH_ERROR) {
+          reject(promise, TRY_CATCH_ERROR.error);
+          TRY_CATCH_ERROR.error = null;
+        } else if (then$$1 === undefined) {
+          fulfill(promise, maybeThenable);
+        } else if (isFunction(then$$1)) {
+          handleForeignThenable(promise, maybeThenable, then$$1);
+        } else {
+          fulfill(promise, maybeThenable);
+        }
+      }
+    }
+    
+    function resolve(promise, value) {
+      if (promise === value) {
+        reject(promise, selfFulfillment());
+      } else if (objectOrFunction(value)) {
+        handleMaybeThenable(promise, value, getThen(value));
+      } else {
+        fulfill(promise, value);
+      }
+    }
+    
+    function publishRejection(promise) {
+      if (promise._onerror) {
+        promise._onerror(promise._result);
+      }
+    
+      publish(promise);
+    }
+    
+    function fulfill(promise, value) {
+      if (promise._state !== PENDING) {
+        return;
+      }
+    
+      promise._result = value;
+      promise._state = FULFILLED;
+    
+      if (promise._subscribers.length !== 0) {
+        asap(publish, promise);
+      }
+    }
+    
+    function reject(promise, reason) {
+      if (promise._state !== PENDING) {
+        return;
+      }
+      promise._state = REJECTED;
+      promise._result = reason;
+    
+      asap(publishRejection, promise);
+    }
+    
+    function subscribe(parent, child, onFulfillment, onRejection) {
+      var _subscribers = parent._subscribers;
+      var length = _subscribers.length;
+    
+    
+      parent._onerror = null;
+    
+      _subscribers[length] = child;
+      _subscribers[length + FULFILLED] = onFulfillment;
+      _subscribers[length + REJECTED] = onRejection;
+    
+      if (length === 0 && parent._state) {
+        asap(publish, parent);
+      }
+    }
+    
+    function publish(promise) {
+      var subscribers = promise._subscribers;
+      var settled = promise._state;
+    
+      if (subscribers.length === 0) {
+        return;
+      }
+    
+      var child = void 0,
+          callback = void 0,
+          detail = promise._result;
+    
+      for (var i = 0; i < subscribers.length; i += 3) {
+        child = subscribers[i];
+        callback = subscribers[i + settled];
+    
+        if (child) {
+          invokeCallback(settled, child, callback, detail);
+        } else {
+          callback(detail);
+        }
+      }
+    
+      promise._subscribers.length = 0;
+    }
+    
+    function tryCatch(callback, detail) {
+      try {
+        return callback(detail);
+      } catch (e) {
+        TRY_CATCH_ERROR.error = e;
+        return TRY_CATCH_ERROR;
+      }
+    }
+    
+    function invokeCallback(settled, promise, callback, detail) {
+      var hasCallback = isFunction(callback),
+          value = void 0,
+          error = void 0,
+          succeeded = void 0,
+          failed = void 0;
+    
+      if (hasCallback) {
+        value = tryCatch(callback, detail);
+    
+        if (value === TRY_CATCH_ERROR) {
+          failed = true;
+          error = value.error;
+          value.error = null;
+        } else {
+          succeeded = true;
+        }
+    
+        if (promise === value) {
+          reject(promise, cannotReturnOwn());
+          return;
+        }
+      } else {
+        value = detail;
+        succeeded = true;
+      }
+    
+      if (promise._state !== PENDING) {
+        // noop
+      } else if (hasCallback && succeeded) {
+        resolve(promise, value);
+      } else if (failed) {
+        reject(promise, error);
+      } else if (settled === FULFILLED) {
+        fulfill(promise, value);
+      } else if (settled === REJECTED) {
+        reject(promise, value);
+      }
+    }
+    
+    function initializePromise(promise, resolver) {
+      try {
+        resolver(function resolvePromise(value) {
+          resolve(promise, value);
+        }, function rejectPromise(reason) {
+          reject(promise, reason);
+        });
+      } catch (e) {
+        reject(promise, e);
+      }
+    }
+    
+    var id = 0;
+    function nextId() {
+      return id++;
+    }
+    
+    function makePromise(promise) {
+      promise[PROMISE_ID] = id++;
+      promise._state = undefined;
+      promise._result = undefined;
+      promise._subscribers = [];
+    }
+    
+    function validationError() {
+      return new Error('Array Methods must be provided an Array');
+    }
+    
+    var Enumerator = function () {
+      function Enumerator(Constructor, input) {
+        this._instanceConstructor = Constructor;
+        this.promise = new Constructor(noop);
+    
+        if (!this.promise[PROMISE_ID]) {
+          makePromise(this.promise);
+        }
+    
+        if (isArray(input)) {
+          this.length = input.length;
+          this._remaining = input.length;
+    
+          this._result = new Array(this.length);
+    
+          if (this.length === 0) {
+            fulfill(this.promise, this._result);
+          } else {
+            this.length = this.length || 0;
+            this._enumerate(input);
+            if (this._remaining === 0) {
+              fulfill(this.promise, this._result);
+            }
+          }
+        } else {
+          reject(this.promise, validationError());
+        }
+      }
+    
+      Enumerator.prototype._enumerate = function _enumerate(input) {
+        for (var i = 0; this._state === PENDING && i < input.length; i++) {
+          this._eachEntry(input[i], i);
+        }
+      };
+    
+      Enumerator.prototype._eachEntry = function _eachEntry(entry, i) {
+        var c = this._instanceConstructor;
+        var resolve$$1 = c.resolve;
+    
+    
+        if (resolve$$1 === resolve$1) {
+          var _then = getThen(entry);
+    
+          if (_then === then && entry._state !== PENDING) {
+            this._settledAt(entry._state, i, entry._result);
+          } else if (typeof _then !== 'function') {
+            this._remaining--;
+            this._result[i] = entry;
+          } else if (c === Promise$1) {
+            var promise = new c(noop);
+            handleMaybeThenable(promise, entry, _then);
+            this._willSettleAt(promise, i);
+          } else {
+            this._willSettleAt(new c(function (resolve$$1) {
+              return resolve$$1(entry);
+            }), i);
+          }
+        } else {
+          this._willSettleAt(resolve$$1(entry), i);
+        }
+      };
+    
+      Enumerator.prototype._settledAt = function _settledAt(state, i, value) {
+        var promise = this.promise;
+    
+    
+        if (promise._state === PENDING) {
+          this._remaining--;
+    
+          if (state === REJECTED) {
+            reject(promise, value);
+          } else {
+            this._result[i] = value;
+          }
+        }
+    
+        if (this._remaining === 0) {
+          fulfill(promise, this._result);
+        }
+      };
+    
+      Enumerator.prototype._willSettleAt = function _willSettleAt(promise, i) {
+        var enumerator = this;
+    
+        subscribe(promise, undefined, function (value) {
+          return enumerator._settledAt(FULFILLED, i, value);
+        }, function (reason) {
+          return enumerator._settledAt(REJECTED, i, reason);
+        });
+      };
+    
+      return Enumerator;
+    }();
+    
+    /**
+      `Promise.all` accepts an array of promises, and returns a new promise which
+      is fulfilled with an array of fulfillment values for the passed promises, or
+      rejected with the reason of the first passed promise to be rejected. It casts all
+      elements of the passed iterable to promises as it runs this algorithm.
+    
+      Example:
+    
+      ```javascript
+      let promise1 = resolve(1);
+      let promise2 = resolve(2);
+      let promise3 = resolve(3);
+      let promises = [ promise1, promise2, promise3 ];
+    
+      Promise.all(promises).then(function(array){
+        // The array here would be [ 1, 2, 3 ];
+      });
+      ```
+    
+      If any of the `promises` given to `all` are rejected, the first promise
+      that is rejected will be given as an argument to the returned promises's
+      rejection handler. For example:
+    
+      Example:
+    
+      ```javascript
+      let promise1 = resolve(1);
+      let promise2 = reject(new Error("2"));
+      let promise3 = reject(new Error("3"));
+      let promises = [ promise1, promise2, promise3 ];
+    
+      Promise.all(promises).then(function(array){
+        // Code here never runs because there are rejected promises!
+      }, function(error) {
+        // error.message === "2"
+      });
+      ```
+    
+      @method all
+      @static
+      @param {Array} entries array of promises
+      @param {String} label optional string for labeling the promise.
+      Useful for tooling.
+      @return {Promise} promise that is fulfilled when all `promises` have been
+      fulfilled, or rejected if any of them become rejected.
+      @static
+    */
+    function all(entries) {
+      return new Enumerator(this, entries).promise;
+    }
+    
+    /**
+      `Promise.race` returns a new promise which is settled in the same way as the
+      first passed promise to settle.
+    
+      Example:
+    
+      ```javascript
+      let promise1 = new Promise(function(resolve, reject){
+        setTimeout(function(){
+          resolve('promise 1');
+        }, 200);
+      });
+    
+      let promise2 = new Promise(function(resolve, reject){
+        setTimeout(function(){
+          resolve('promise 2');
+        }, 100);
+      });
+    
+      Promise.race([promise1, promise2]).then(function(result){
+        // result === 'promise 2' because it was resolved before promise1
+        // was resolved.
+      });
+      ```
+    
+      `Promise.race` is deterministic in that only the state of the first
+      settled promise matters. For example, even if other promises given to the
+      `promises` array argument are resolved, but the first settled promise has
+      become rejected before the other promises became fulfilled, the returned
+      promise will become rejected:
+    
+      ```javascript
+      let promise1 = new Promise(function(resolve, reject){
+        setTimeout(function(){
+          resolve('promise 1');
+        }, 200);
+      });
+    
+      let promise2 = new Promise(function(resolve, reject){
+        setTimeout(function(){
+          reject(new Error('promise 2'));
+        }, 100);
+      });
+    
+      Promise.race([promise1, promise2]).then(function(result){
+        // Code here never runs
+      }, function(reason){
+        // reason.message === 'promise 2' because promise 2 became rejected before
+        // promise 1 became fulfilled
+      });
+      ```
+    
+      An example real-world use case is implementing timeouts:
+    
+      ```javascript
+      Promise.race([ajax('foo.json'), timeout(5000)])
+      ```
+    
+      @method race
+      @static
+      @param {Array} promises array of promises to observe
+      Useful for tooling.
+      @return {Promise} a promise which settles in the same way as the first passed
+      promise to settle.
+    */
+    function race(entries) {
+      /*jshint validthis:true */
+      var Constructor = this;
+    
+      if (!isArray(entries)) {
+        return new Constructor(function (_, reject) {
+          return reject(new TypeError('You must pass an array to race.'));
+        });
+      } else {
+        return new Constructor(function (resolve, reject) {
+          var length = entries.length;
+          for (var i = 0; i < length; i++) {
+            Constructor.resolve(entries[i]).then(resolve, reject);
+          }
+        });
+      }
+    }
+    
+    /**
+      `Promise.reject` returns a promise rejected with the passed `reason`.
+      It is shorthand for the following:
+    
+      ```javascript
+      let promise = new Promise(function(resolve, reject){
+        reject(new Error('WHOOPS'));
+      });
+    
+      promise.then(function(value){
+        // Code here doesn't run because the promise is rejected!
+      }, function(reason){
+        // reason.message === 'WHOOPS'
+      });
+      ```
+    
+      Instead of writing the above, your code now simply becomes the following:
+    
+      ```javascript
+      let promise = Promise.reject(new Error('WHOOPS'));
+    
+      promise.then(function(value){
+        // Code here doesn't run because the promise is rejected!
+      }, function(reason){
+        // reason.message === 'WHOOPS'
+      });
+      ```
+    
+      @method reject
+      @static
+      @param {Any} reason value that the returned promise will be rejected with.
+      Useful for tooling.
+      @return {Promise} a promise rejected with the given `reason`.
+    */
+    function reject$1(reason) {
+      /*jshint validthis:true */
+      var Constructor = this;
+      var promise = new Constructor(noop);
+      reject(promise, reason);
+      return promise;
+    }
+    
+    function needsResolver() {
+      throw new TypeError('You must pass a resolver function as the first argument to the promise constructor');
+    }
+    
+    function needsNew() {
+      throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");
+    }
+    
+    /**
+      Promise objects represent the eventual result of an asynchronous operation. The
+      primary way of interacting with a promise is through its `then` method, which
+      registers callbacks to receive either a promise's eventual value or the reason
+      why the promise cannot be fulfilled.
+    
+      Terminology
+      -----------
+    
+      - `promise` is an object or function with a `then` method whose behavior conforms to this specification.
+      - `thenable` is an object or function that defines a `then` method.
+      - `value` is any legal JavaScript value (including undefined, a thenable, or a promise).
+      - `exception` is a value that is thrown using the throw statement.
+      - `reason` is a value that indicates why a promise was rejected.
+      - `settled` the final resting state of a promise, fulfilled or rejected.
+    
+      A promise can be in one of three states: pending, fulfilled, or rejected.
+    
+      Promises that are fulfilled have a fulfillment value and are in the fulfilled
+      state.  Promises that are rejected have a rejection reason and are in the
+      rejected state.  A fulfillment value is never a thenable.
+    
+      Promises can also be said to *resolve* a value.  If this value is also a
+      promise, then the original promise's settled state will match the value's
+      settled state.  So a promise that *resolves* a promise that rejects will
+      itself reject, and a promise that *resolves* a promise that fulfills will
+      itself fulfill.
+    
+    
+      Basic Usage:
+      ------------
+    
+      ```js
+      let promise = new Promise(function(resolve, reject) {
+        // on success
+        resolve(value);
+    
+        // on failure
+        reject(reason);
+      });
+    
+      promise.then(function(value) {
+        // on fulfillment
+      }, function(reason) {
+        // on rejection
+      });
+      ```
+    
+      Advanced Usage:
+      ---------------
+    
+      Promises shine when abstracting away asynchronous interactions such as
+      `XMLHttpRequest`s.
+    
+      ```js
+      function getJSON(url) {
+        return new Promise(function(resolve, reject){
+          let xhr = new XMLHttpRequest();
+    
+          xhr.open('GET', url);
+          xhr.onreadystatechange = handler;
+          xhr.responseType = 'json';
+          xhr.setRequestHeader('Accept', 'application/json');
+          xhr.send();
+    
+          function handler() {
+            if (this.readyState === this.DONE) {
+              if (this.status === 200) {
+                resolve(this.response);
+              } else {
+                reject(new Error('getJSON: `' + url + '` failed with status: [' + this.status + ']'));
+              }
+            }
+          };
+        });
+      }
+    
+      getJSON('/posts.json').then(function(json) {
+        // on fulfillment
+      }, function(reason) {
+        // on rejection
+      });
+      ```
+    
+      Unlike callbacks, promises are great composable primitives.
+    
+      ```js
+      Promise.all([
+        getJSON('/posts'),
+        getJSON('/comments')
+      ]).then(function(values){
+        values[0] // => postsJSON
+        values[1] // => commentsJSON
+    
+        return values;
+      });
+      ```
+    
+      @class Promise
+      @param {Function} resolver
+      Useful for tooling.
+      @constructor
+    */
+    
+    var Promise$1 = function () {
+      function Promise(resolver) {
+        this[PROMISE_ID] = nextId();
+        this._result = this._state = undefined;
+        this._subscribers = [];
+    
+        if (noop !== resolver) {
+          typeof resolver !== 'function' && needsResolver();
+          this instanceof Promise ? initializePromise(this, resolver) : needsNew();
+        }
+      }
+    
+      /**
+      The primary way of interacting with a promise is through its `then` method,
+      which registers callbacks to receive either a promise's eventual value or the
+      reason why the promise cannot be fulfilled.
+       ```js
+      findUser().then(function(user){
+        // user is available
+      }, function(reason){
+        // user is unavailable, and you are given the reason why
+      });
+      ```
+       Chaining
+      --------
+       The return value of `then` is itself a promise.  This second, 'downstream'
+      promise is resolved with the return value of the first promise's fulfillment
+      or rejection handler, or rejected if the handler throws an exception.
+       ```js
+      findUser().then(function (user) {
+        return user.name;
+      }, function (reason) {
+        return 'default name';
+      }).then(function (userName) {
+        // If `findUser` fulfilled, `userName` will be the user's name, otherwise it
+        // will be `'default name'`
+      });
+       findUser().then(function (user) {
+        throw new Error('Found user, but still unhappy');
+      }, function (reason) {
+        throw new Error('`findUser` rejected and we're unhappy');
+      }).then(function (value) {
+        // never reached
+      }, function (reason) {
+        // if `findUser` fulfilled, `reason` will be 'Found user, but still unhappy'.
+        // If `findUser` rejected, `reason` will be '`findUser` rejected and we're unhappy'.
+      });
+      ```
+      If the downstream promise does not specify a rejection handler, rejection reasons will be propagated further downstream.
+       ```js
+      findUser().then(function (user) {
+        throw new PedagogicalException('Upstream error');
+      }).then(function (value) {
+        // never reached
+      }).then(function (value) {
+        // never reached
+      }, function (reason) {
+        // The `PedgagocialException` is propagated all the way down to here
+      });
+      ```
+       Assimilation
+      ------------
+       Sometimes the value you want to propagate to a downstream promise can only be
+      retrieved asynchronously. This can be achieved by returning a promise in the
+      fulfillment or rejection handler. The downstream promise will then be pending
+      until the returned promise is settled. This is called *assimilation*.
+       ```js
+      findUser().then(function (user) {
+        return findCommentsByAuthor(user);
+      }).then(function (comments) {
+        // The user's comments are now available
+      });
+      ```
+       If the assimliated promise rejects, then the downstream promise will also reject.
+       ```js
+      findUser().then(function (user) {
+        return findCommentsByAuthor(user);
+      }).then(function (comments) {
+        // If `findCommentsByAuthor` fulfills, we'll have the value here
+      }, function (reason) {
+        // If `findCommentsByAuthor` rejects, we'll have the reason here
+      });
+      ```
+       Simple Example
+      --------------
+       Synchronous Example
+       ```javascript
+      let result;
+       try {
+        result = findResult();
+        // success
+      } catch(reason) {
+        // failure
+      }
+      ```
+       Errback Example
+       ```js
+      findResult(function(result, err){
+        if (err) {
+          // failure
+        } else {
+          // success
+        }
+      });
+      ```
+       Promise Example;
+       ```javascript
+      findResult().then(function(result){
+        // success
+      }, function(reason){
+        // failure
+      });
+      ```
+       Advanced Example
+      --------------
+       Synchronous Example
+       ```javascript
+      let author, books;
+       try {
+        author = findAuthor();
+        books  = findBooksByAuthor(author);
+        // success
+      } catch(reason) {
+        // failure
+      }
+      ```
+       Errback Example
+       ```js
+       function foundBooks(books) {
+       }
+       function failure(reason) {
+       }
+       findAuthor(function(author, err){
+        if (err) {
+          failure(err);
+          // failure
+        } else {
+          try {
+            findBoooksByAuthor(author, function(books, err) {
+              if (err) {
+                failure(err);
+              } else {
+                try {
+                  foundBooks(books);
+                } catch(reason) {
+                  failure(reason);
+                }
+              }
+            });
+          } catch(error) {
+            failure(err);
+          }
+          // success
+        }
+      });
+      ```
+       Promise Example;
+       ```javascript
+      findAuthor().
+        then(findBooksByAuthor).
+        then(function(books){
+          // found books
+      }).catch(function(reason){
+        // something went wrong
+      });
+      ```
+       @method then
+      @param {Function} onFulfilled
+      @param {Function} onRejected
+      Useful for tooling.
+      @return {Promise}
+      */
+    
+      /**
+      `catch` is simply sugar for `then(undefined, onRejection)` which makes it the same
+      as the catch block of a try/catch statement.
+      ```js
+      function findAuthor(){
+      throw new Error('couldn't find that author');
+      }
+      // synchronous
+      try {
+      findAuthor();
+      } catch(reason) {
+      // something went wrong
+      }
+      // async with promises
+      findAuthor().catch(function(reason){
+      // something went wrong
+      });
+      ```
+      @method catch
+      @param {Function} onRejection
+      Useful for tooling.
+      @return {Promise}
+      */
+    
+    
+      Promise.prototype.catch = function _catch(onRejection) {
+        return this.then(null, onRejection);
+      };
+    
+      /**
+        `finally` will be invoked regardless of the promise's fate just as native
+        try/catch/finally behaves
+      
+        Synchronous example:
+      
+        ```js
+        findAuthor() {
+          if (Math.random() > 0.5) {
+            throw new Error();
+          }
+          return new Author();
+        }
+      
+        try {
+          return findAuthor(); // succeed or fail
+        } catch(error) {
+          return findOtherAuther();
+        } finally {
+          // always runs
+          // doesn't affect the return value
+        }
+        ```
+      
+        Asynchronous example:
+      
+        ```js
+        findAuthor().catch(function(reason){
+          return findOtherAuther();
+        }).finally(function(){
+          // author was either found, or not
+        });
+        ```
+      
+        @method finally
+        @param {Function} callback
+        @return {Promise}
+      */
+    
+    
+      Promise.prototype.finally = function _finally(callback) {
+        var promise = this;
+        var constructor = promise.constructor;
+    
+        if (isFunction(callback)) {
+          return promise.then(function (value) {
+            return constructor.resolve(callback()).then(function () {
+              return value;
+            });
+          }, function (reason) {
+            return constructor.resolve(callback()).then(function () {
+              throw reason;
+            });
+          });
+        }
+    
+        return promise.then(callback, callback);
+      };
+    
+      return Promise;
+    }();
+    
+    Promise$1.prototype.then = then;
+    Promise$1.all = all;
+    Promise$1.race = race;
+    Promise$1.resolve = resolve$1;
+    Promise$1.reject = reject$1;
+    Promise$1._setScheduler = setScheduler;
+    Promise$1._setAsap = setAsap;
+    Promise$1._asap = asap;
+    
+    /*global self*/
+    function polyfill() {
+      var local = void 0;
+    
+      if (typeof global !== 'undefined') {
+        local = global;
+      } else if (typeof self !== 'undefined') {
+        local = self;
+      } else {
+        try {
+          local = Function('return this')();
+        } catch (e) {
+          throw new Error('polyfill failed because global object is unavailable in this environment');
+        }
+      }
+    
+      var P = local.Promise;
+    
+      if (P) {
+        var promiseToString = null;
+        try {
+          promiseToString = Object.prototype.toString.call(P.resolve());
+        } catch (e) {
+          // silently ignored
+        }
+    
+        if (promiseToString === '[object Promise]' && !P.cast) {
+          return;
+        }
+      }
+    
+      local.Promise = Promise$1;
+    }
+    
+    // Strange compat..
+    Promise$1.polyfill = polyfill;
+    Promise$1.Promise = Promise$1;
+    
+    return Promise$1;
+    
+    })));
+    
+    
+    
+    
+    
+    }).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})
+    
+    },{"_process":3}],2:[function(_dereq_,module,exports){
+    // Copyright Joyent, Inc. and other Node contributors.
+    //
+    // 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.
+    
+    function EventEmitter() {
+      this._events = this._events || {};
+      this._maxListeners = this._maxListeners || undefined;
+    }
+    module.exports = EventEmitter;
+    
+    // Backwards-compat with node 0.10.x
+    EventEmitter.EventEmitter = EventEmitter;
+    
+    EventEmitter.prototype._events = undefined;
+    EventEmitter.prototype._maxListeners = undefined;
+    
+    // By default EventEmitters will print a warning if more than 10 listeners are
+    // added to it. This is a useful default which helps finding memory leaks.
+    EventEmitter.defaultMaxListeners = 10;
+    
+    // Obviously not all Emitters should be limited to 10. This function allows
+    // that to be increased. Set to zero for unlimited.
+    EventEmitter.prototype.setMaxListeners = function(n) {
+      if (!isNumber(n) || n < 0 || isNaN(n))
+        throw TypeError('n must be a positive number');
+      this._maxListeners = n;
+      return this;
+    };
+    
+    EventEmitter.prototype.emit = function(type) {
+      var er, handler, len, args, i, listeners;
+    
+      if (!this._events)
+        this._events = {};
+    
+      // If there is no 'error' event listener then throw.
+      if (type === 'error') {
+        if (!this._events.error ||
+            (isObject(this._events.error) && !this._events.error.length)) {
+          er = arguments[1];
+          if (er instanceof Error) {
+            throw er; // Unhandled 'error' event
+          } else {
+            // At least give some kind of context to the user
+            var err = new Error('Uncaught, unspecified "error" event. (' + er + ')');
+            err.context = er;
+            throw err;
+          }
+        }
+      }
+    
+      handler = this._events[type];
+    
+      if (isUndefined(handler))
+        return false;
+    
+      if (isFunction(handler)) {
+        switch (arguments.length) {
+          // fast cases
+          case 1:
+            handler.call(this);
+            break;
+          case 2:
+            handler.call(this, arguments[1]);
+            break;
+          case 3:
+            handler.call(this, arguments[1], arguments[2]);
+            break;
+          // slower
+          default:
+            args = Array.prototype.slice.call(arguments, 1);
+            handler.apply(this, args);
+        }
+      } else if (isObject(handler)) {
+        args = Array.prototype.slice.call(arguments, 1);
+        listeners = handler.slice();
+        len = listeners.length;
+        for (i = 0; i < len; i++)
+          listeners[i].apply(this, args);
+      }
+    
+      return true;
+    };
+    
+    EventEmitter.prototype.addListener = function(type, listener) {
+      var m;
+    
+      if (!isFunction(listener))
+        throw TypeError('listener must be a function');
+    
+      if (!this._events)
+        this._events = {};
+    
+      // To avoid recursion in the case that type === "newListener"! Before
+      // adding it to the listeners, first emit "newListener".
+      if (this._events.newListener)
+        this.emit('newListener', type,
+                  isFunction(listener.listener) ?
+                  listener.listener : listener);
+    
+      if (!this._events[type])
+        // Optimize the case of one listener. Don't need the extra array object.
+        this._events[type] = listener;
+      else if (isObject(this._events[type]))
+        // If we've already got an array, just append.
+        this._events[type].push(listener);
+      else
+        // Adding the second element, need to change to array.
+        this._events[type] = [this._events[type], listener];
+    
+      // Check for listener leak
+      if (isObject(this._events[type]) && !this._events[type].warned) {
+        if (!isUndefined(this._maxListeners)) {
+          m = this._maxListeners;
+        } else {
+          m = EventEmitter.defaultMaxListeners;
+        }
+    
+        if (m && m > 0 && this._events[type].length > m) {
+          this._events[type].warned = true;
+          console.error('(node) warning: possible EventEmitter memory ' +
+                        'leak detected. %d listeners added. ' +
+                        'Use emitter.setMaxListeners() to increase limit.',
+                        this._events[type].length);
+          if (typeof console.trace === 'function') {
+            // not supported in IE 10
+            console.trace();
+          }
+        }
+      }
+    
+      return this;
+    };
+    
+    EventEmitter.prototype.on = EventEmitter.prototype.addListener;
+    
+    EventEmitter.prototype.once = function(type, listener) {
+      if (!isFunction(listener))
+        throw TypeError('listener must be a function');
+    
+      var fired = false;
+    
+      function g() {
+        this.removeListener(type, g);
+    
+        if (!fired) {
+          fired = true;
+          listener.apply(this, arguments);
+        }
+      }
+    
+      g.listener = listener;
+      this.on(type, g);
+    
+      return this;
+    };
+    
+    // emits a 'removeListener' event iff the listener was removed
+    EventEmitter.prototype.removeListener = function(type, listener) {
+      var list, position, length, i;
+    
+      if (!isFunction(listener))
+        throw TypeError('listener must be a function');
+    
+      if (!this._events || !this._events[type])
+        return this;
+    
+      list = this._events[type];
+      length = list.length;
+      position = -1;
+    
+      if (list === listener ||
+          (isFunction(list.listener) && list.listener === listener)) {
+        delete this._events[type];
+        if (this._events.removeListener)
+          this.emit('removeListener', type, listener);
+    
+      } else if (isObject(list)) {
+        for (i = length; i-- > 0;) {
+          if (list[i] === listener ||
+              (list[i].listener && list[i].listener === listener)) {
+            position = i;
+            break;
+          }
+        }
+    
+        if (position < 0)
+          return this;
+    
+        if (list.length === 1) {
+          list.length = 0;
+          delete this._events[type];
+        } else {
+          list.splice(position, 1);
+        }
+    
+        if (this._events.removeListener)
+          this.emit('removeListener', type, listener);
+      }
+    
+      return this;
+    };
+    
+    EventEmitter.prototype.removeAllListeners = function(type) {
+      var key, listeners;
+    
+      if (!this._events)
+        return this;
+    
+      // not listening for removeListener, no need to emit
+      if (!this._events.removeListener) {
+        if (arguments.length === 0)
+          this._events = {};
+        else if (this._events[type])
+          delete this._events[type];
+        return this;
+      }
+    
+      // emit removeListener for all listeners on all events
+      if (arguments.length === 0) {
+        for (key in this._events) {
+          if (key === 'removeListener') continue;
+          this.removeAllListeners(key);
+        }
+        this.removeAllListeners('removeListener');
+        this._events = {};
+        return this;
+      }
+    
+      listeners = this._events[type];
+    
+      if (isFunction(listeners)) {
+        this.removeListener(type, listeners);
+      } else if (listeners) {
+        // LIFO order
+        while (listeners.length)
+          this.removeListener(type, listeners[listeners.length - 1]);
+      }
+      delete this._events[type];
+    
+      return this;
+    };
+    
+    EventEmitter.prototype.listeners = function(type) {
+      var ret;
+      if (!this._events || !this._events[type])
+        ret = [];
+      else if (isFunction(this._events[type]))
+        ret = [this._events[type]];
+      else
+        ret = this._events[type].slice();
+      return ret;
+    };
+    
+    EventEmitter.prototype.listenerCount = function(type) {
+      if (this._events) {
+        var evlistener = this._events[type];
+    
+        if (isFunction(evlistener))
+          return 1;
+        else if (evlistener)
+          return evlistener.length;
+      }
+      return 0;
+    };
+    
+    EventEmitter.listenerCount = function(emitter, type) {
+      return emitter.listenerCount(type);
+    };
+    
+    function isFunction(arg) {
+      return typeof arg === 'function';
+    }
+    
+    function isNumber(arg) {
+      return typeof arg === 'number';
+    }
+    
+    function isObject(arg) {
+      return typeof arg === 'object' && arg !== null;
+    }
+    
+    function isUndefined(arg) {
+      return arg === void 0;
+    }
+    
+    },{}],3:[function(_dereq_,module,exports){
+    // shim for using process in browser
+    var process = module.exports = {};
+    
+    // cached from whatever global is present so that test runners that stub it
+    // don't break things.  But we need to wrap it in a try catch in case it is
+    // wrapped in strict mode code which doesn't define any globals.  It's inside a
+    // function because try/catches deoptimize in certain engines.
+    
+    var cachedSetTimeout;
+    var cachedClearTimeout;
+    
+    function defaultSetTimout() {
+        throw new Error('setTimeout has not been defined');
+    }
+    function defaultClearTimeout () {
+        throw new Error('clearTimeout has not been defined');
+    }
+    (function () {
+        try {
+            if (typeof setTimeout === 'function') {
+                cachedSetTimeout = setTimeout;
+            } else {
+                cachedSetTimeout = defaultSetTimout;
+            }
+        } catch (e) {
+            cachedSetTimeout = defaultSetTimout;
+        }
+        try {
+            if (typeof clearTimeout === 'function') {
+                cachedClearTimeout = clearTimeout;
+            } else {
+                cachedClearTimeout = defaultClearTimeout;
+            }
+        } catch (e) {
+            cachedClearTimeout = defaultClearTimeout;
+        }
+    } ())
+    function runTimeout(fun) {
+        if (cachedSetTimeout === setTimeout) {
+            //normal enviroments in sane situations
+            return setTimeout(fun, 0);
+        }
+        // if setTimeout wasn't available but was latter defined
+        if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+            cachedSetTimeout = setTimeout;
+            return setTimeout(fun, 0);
+        }
+        try {
+            // when when somebody has screwed with setTimeout but no I.E. maddness
+            return cachedSetTimeout(fun, 0);
+        } catch(e){
+            try {
+                // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+                return cachedSetTimeout.call(null, fun, 0);
+            } catch(e){
+                // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+                return cachedSetTimeout.call(this, fun, 0);
+            }
+        }
+    
+    
+    }
+    function runClearTimeout(marker) {
+        if (cachedClearTimeout === clearTimeout) {
+            //normal enviroments in sane situations
+            return clearTimeout(marker);
+        }
+        // if clearTimeout wasn't available but was latter defined
+        if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+            cachedClearTimeout = clearTimeout;
+            return clearTimeout(marker);
+        }
+        try {
+            // when when somebody has screwed with setTimeout but no I.E. maddness
+            return cachedClearTimeout(marker);
+        } catch (e){
+            try {
+                // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally
+                return cachedClearTimeout.call(null, marker);
+            } catch (e){
+                // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+                // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+                return cachedClearTimeout.call(this, marker);
+            }
+        }
+    
+    
+    
+    }
+    var queue = [];
+    var draining = false;
+    var currentQueue;
+    var queueIndex = -1;
+    
+    function cleanUpNextTick() {
+        if (!draining || !currentQueue) {
+            return;
+        }
+        draining = false;
+        if (currentQueue.length) {
+            queue = currentQueue.concat(queue);
+        } else {
+            queueIndex = -1;
+        }
+        if (queue.length) {
+            drainQueue();
+        }
+    }
+    
+    function drainQueue() {
+        if (draining) {
+            return;
+        }
+        var timeout = runTimeout(cleanUpNextTick);
+        draining = true;
+    
+        var len = queue.length;
+        while(len) {
+            currentQueue = queue;
+            queue = [];
+            while (++queueIndex < len) {
+                if (currentQueue) {
+                    currentQueue[queueIndex].run();
+                }
+            }
+            queueIndex = -1;
+            len = queue.length;
+        }
+        currentQueue = null;
+        draining = false;
+        runClearTimeout(timeout);
+    }
+    
+    process.nextTick = function (fun) {
+        var args = new Array(arguments.length - 1);
+        if (arguments.length > 1) {
+            for (var i = 1; i < arguments.length; i++) {
+                args[i - 1] = arguments[i];
+            }
+        }
+        queue.push(new Item(fun, args));
+        if (queue.length === 1 && !draining) {
+            runTimeout(drainQueue);
+        }
+    };
+    
+    // v8 likes predictible objects
+    function Item(fun, array) {
+        this.fun = fun;
+        this.array = array;
+    }
+    Item.prototype.run = function () {
+        this.fun.apply(null, this.array);
+    };
+    process.title = 'browser';
+    process.browser = true;
+    process.env = {};
+    process.argv = [];
+    process.version = ''; // empty string to avoid regexp issues
+    process.versions = {};
+    
+    function noop() {}
+    
+    process.on = noop;
+    process.addListener = noop;
+    process.once = noop;
+    process.off = noop;
+    process.removeListener = noop;
+    process.removeAllListeners = noop;
+    process.emit = noop;
+    process.prependListener = noop;
+    process.prependOnceListener = noop;
+    
+    process.listeners = function (name) { return [] }
+    
+    process.binding = function (name) {
+        throw new Error('process.binding is not supported');
+    };
+    
+    process.cwd = function () { return '/' };
+    process.chdir = function (dir) {
+        throw new Error('process.chdir is not supported');
+    };
+    process.umask = function() { return 0; };
+    
+    },{}],4:[function(_dereq_,module,exports){
+    var bundleFn = arguments[3];
+    var sources = arguments[4];
+    var cache = arguments[5];
+    
+    var stringify = JSON.stringify;
+    
+    module.exports = function (fn, options) {
+        var wkey;
+        var cacheKeys = Object.keys(cache);
+    
+        for (var i = 0, l = cacheKeys.length; i < l; i++) {
+            var key = cacheKeys[i];
+            var exp = cache[key].exports;
+            // Using babel as a transpiler to use esmodule, the export will always
+            // be an object with the default export as a property of it. To ensure
+            // the existing api and babel esmodule exports are both supported we
+            // check for both
+            if (exp === fn || exp && exp.default === fn) {
+                wkey = key;
+                break;
+            }
+        }
+    
+        if (!wkey) {
+            wkey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);
+            var wcache = {};
+            for (var i = 0, l = cacheKeys.length; i < l; i++) {
+                var key = cacheKeys[i];
+                wcache[key] = key;
+            }
+            sources[wkey] = [
+                'function(require,module,exports){' + fn + '(self); }',
+                wcache
+            ];
+        }
+        var skey = Math.floor(Math.pow(16, 8) * Math.random()).toString(16);
+    
+        var scache = {}; scache[wkey] = wkey;
+        sources[skey] = [
+            'function(require,module,exports){' +
+                // try to call default if defined to also support babel esmodule exports
+                'var f = require(' + stringify(wkey) + ');' +
+                '(f.default ? f.default : f)(self);' +
+            '}',
+            scache
+        ];
+    
+        var workerSources = {};
+        resolveSources(skey);
+    
+        function resolveSources(key) {
+            workerSources[key] = true;
+    
+            for (var depPath in sources[key][1]) {
+                var depKey = sources[key][1][depPath];
+                if (!workerSources[depKey]) {
+                    resolveSources(depKey);
+                }
+            }
+        }
+    
+        var src = '(' + bundleFn + ')({'
+            + Object.keys(workerSources).map(function (key) {
+                return stringify(key) + ':['
+                    + sources[key][0]
+                    + ',' + stringify(sources[key][1]) + ']'
+                ;
+            }).join(',')
+            + '},{},[' + stringify(skey) + '])'
+        ;
+    
+        var URL = window.URL || window.webkitURL || window.mozURL || window.msURL;
+    
+        var blob = new Blob([src], { type: 'text/javascript' });
+        if (options && options.bare) { return blob; }
+        var workerUrl = URL.createObjectURL(blob);
+        var worker = new Worker(workerUrl);
+        worker.objectURL = workerUrl;
+        return worker;
+    };
+    
+    },{}],5:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    exports.createDefaultConfig = createDefaultConfig;
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var defaultConfig = exports.defaultConfig = {
+        enableWorker: false,
+        enableStashBuffer: true,
+        stashInitialSize: undefined,
+    
+        isLive: false,
+    
+        lazyLoad: true,
+        lazyLoadMaxDuration: 3 * 60,
+        lazyLoadRecoverDuration: 30,
+        deferLoadAfterSourceOpen: true,
+    
+        // autoCleanupSourceBuffer: default as false, leave unspecified
+        autoCleanupMaxBackwardDuration: 3 * 60,
+        autoCleanupMinBackwardDuration: 2 * 60,
+    
+        statisticsInfoReportInterval: 600,
+    
+        fixAudioTimestampGap: true,
+    
+        accurateSeek: false,
+        seekType: 'range', // [range, param, custom]
+        seekParamStart: 'bstart',
+        seekParamEnd: 'bend',
+        rangeLoadZeroStart: false,
+        customSeekHandler: undefined,
+        reuseRedirectedURL: false,
+        // referrerPolicy: leave as unspecified
+    
+        headers: undefined,
+        customLoader: undefined
+    };
+    
+    function createDefaultConfig() {
+        return Object.assign({}, defaultConfig);
+    }
+    
+    },{}],6:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _ioController = _dereq_('../io/io-controller.js');
+    
+    var _ioController2 = _interopRequireDefault(_ioController);
+    
+    var _config = _dereq_('../config.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    var Features = function () {
+        function Features() {
+            _classCallCheck(this, Features);
+        }
+    
+        _createClass(Features, null, [{
+            key: 'supportMSEH264Playback',
+            value: function supportMSEH264Playback() {
+                return window.MediaSource && window.MediaSource.isTypeSupported('video/mp4; codecs="avc1.42E01E,mp4a.40.2"');
+            }
+        }, {
+            key: 'supportNetworkStreamIO',
+            value: function supportNetworkStreamIO() {
+                var ioctl = new _ioController2.default({}, (0, _config.createDefaultConfig)());
+                var loaderType = ioctl.loaderType;
+                ioctl.destroy();
+                return loaderType == 'fetch-stream-loader' || loaderType == 'xhr-moz-chunked-loader';
+            }
+        }, {
+            key: 'getNetworkLoaderTypeName',
+            value: function getNetworkLoaderTypeName() {
+                var ioctl = new _ioController2.default({}, (0, _config.createDefaultConfig)());
+                var loaderType = ioctl.loaderType;
+                ioctl.destroy();
+                return loaderType;
+            }
+        }, {
+            key: 'supportNativeMediaPlayback',
+            value: function supportNativeMediaPlayback(mimeType) {
+                if (Features.videoElement == undefined) {
+                    Features.videoElement = window.document.createElement('video');
+                }
+                var canPlay = Features.videoElement.canPlayType(mimeType);
+                return canPlay === 'probably' || canPlay == 'maybe';
+            }
+        }, {
+            key: 'getFeatureList',
+            value: function getFeatureList() {
+                var features = {
+                    mseFlvPlayback: false,
+                    mseLiveFlvPlayback: false,
+                    networkStreamIO: false,
+                    networkLoaderName: '',
+                    nativeMP4H264Playback: false,
+                    nativeWebmVP8Playback: false,
+                    nativeWebmVP9Playback: false
+                };
+    
+                features.mseFlvPlayback = Features.supportMSEH264Playback();
+                features.networkStreamIO = Features.supportNetworkStreamIO();
+                features.networkLoaderName = Features.getNetworkLoaderTypeName();
+                features.mseLiveFlvPlayback = features.mseFlvPlayback && features.networkStreamIO;
+                features.nativeMP4H264Playback = Features.supportNativeMediaPlayback('video/mp4; codecs="avc1.42001E, mp4a.40.2"');
+                features.nativeWebmVP8Playback = Features.supportNativeMediaPlayback('video/webm; codecs="vp8.0, vorbis"');
+                features.nativeWebmVP9Playback = Features.supportNativeMediaPlayback('video/webm; codecs="vp9"');
+    
+                return features;
+            }
+        }]);
+    
+        return Features;
+    }();
+    
+    exports.default = Features;
+    
+    },{"../config.js":5,"../io/io-controller.js":23}],7:[function(_dereq_,module,exports){
+    "use strict";
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var MediaInfo = function () {
+        function MediaInfo() {
+            _classCallCheck(this, MediaInfo);
+    
+            this.mimeType = null;
+            this.duration = null;
+    
+            this.hasAudio = null;
+            this.hasVideo = null;
+            this.audioCodec = null;
+            this.videoCodec = null;
+            this.audioDataRate = null;
+            this.videoDataRate = null;
+    
+            this.audioSampleRate = null;
+            this.audioChannelCount = null;
+    
+            this.width = null;
+            this.height = null;
+            this.fps = null;
+            this.profile = null;
+            this.level = null;
+            this.refFrames = null;
+            this.chromaFormat = null;
+            this.sarNum = null;
+            this.sarDen = null;
+    
+            this.metadata = null;
+            this.segments = null; // MediaInfo[]
+            this.segmentCount = null;
+            this.hasKeyframesIndex = null;
+            this.keyframesIndex = null;
+        }
+    
+        _createClass(MediaInfo, [{
+            key: "isComplete",
+            value: function isComplete() {
+                var audioInfoComplete = this.hasAudio === false || this.hasAudio === true && this.audioCodec != null && this.audioSampleRate != null && this.audioChannelCount != null;
+    
+                var videoInfoComplete = this.hasVideo === false || this.hasVideo === true && this.videoCodec != null && this.width != null && this.height != null && this.fps != null && this.profile != null && this.level != null && this.refFrames != null && this.chromaFormat != null && this.sarNum != null && this.sarDen != null;
+    
+                // keyframesIndex may not be present
+                return this.mimeType != null && this.duration != null && this.metadata != null && this.hasKeyframesIndex != null && audioInfoComplete && videoInfoComplete;
+            }
+        }, {
+            key: "isSeekable",
+            value: function isSeekable() {
+                return this.hasKeyframesIndex === true;
+            }
+        }, {
+            key: "getNearestKeyframe",
+            value: function getNearestKeyframe(milliseconds) {
+                if (this.keyframesIndex == null) {
+                    return null;
+                }
+    
+                var table = this.keyframesIndex;
+                var keyframeIdx = this._search(table.times, milliseconds);
+    
+                return {
+                    index: keyframeIdx,
+                    milliseconds: table.times[keyframeIdx],
+                    fileposition: table.filepositions[keyframeIdx]
+                };
+            }
+        }, {
+            key: "_search",
+            value: function _search(list, value) {
+                var idx = 0;
+    
+                var last = list.length - 1;
+                var mid = 0;
+                var lbound = 0;
+                var ubound = last;
+    
+                if (value < list[0]) {
+                    idx = 0;
+                    lbound = ubound + 1; // skip search
+                }
+    
+                while (lbound <= ubound) {
+                    mid = lbound + Math.floor((ubound - lbound) / 2);
+                    if (mid === last || value >= list[mid] && value < list[mid + 1]) {
+                        idx = mid;
+                        break;
+                    } else if (list[mid] < value) {
+                        lbound = mid + 1;
+                    } else {
+                        ubound = mid - 1;
+                    }
+                }
+    
+                return idx;
+            }
+        }]);
+    
+        return MediaInfo;
+    }();
+    
+    exports.default = MediaInfo;
+    
+    },{}],8:[function(_dereq_,module,exports){
+    "use strict";
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    // Represents an media sample (audio / video)
+    var SampleInfo = exports.SampleInfo = function SampleInfo(dts, pts, duration, originalDts, isSync) {
+        _classCallCheck(this, SampleInfo);
+    
+        this.dts = dts;
+        this.pts = pts;
+        this.duration = duration;
+        this.originalDts = originalDts;
+        this.isSyncPoint = isSync;
+        this.fileposition = null;
+    };
+    
+    // Media Segment concept is defined in Media Source Extensions spec.
+    // Particularly in ISO BMFF format, an Media Segment contains a moof box followed by a mdat box.
+    
+    
+    var MediaSegmentInfo = exports.MediaSegmentInfo = function () {
+        function MediaSegmentInfo() {
+            _classCallCheck(this, MediaSegmentInfo);
+    
+            this.beginDts = 0;
+            this.endDts = 0;
+            this.beginPts = 0;
+            this.endPts = 0;
+            this.originalBeginDts = 0;
+            this.originalEndDts = 0;
+            this.syncPoints = []; // SampleInfo[n], for video IDR frames only
+            this.firstSample = null; // SampleInfo
+            this.lastSample = null; // SampleInfo
+        }
+    
+        _createClass(MediaSegmentInfo, [{
+            key: "appendSyncPoint",
+            value: function appendSyncPoint(sampleInfo) {
+                // also called Random Access Point
+                sampleInfo.isSyncPoint = true;
+                this.syncPoints.push(sampleInfo);
+            }
+        }]);
+    
+        return MediaSegmentInfo;
+    }();
+    
+    // Ordered list for recording video IDR frames, sorted by originalDts
+    
+    
+    var IDRSampleList = exports.IDRSampleList = function () {
+        function IDRSampleList() {
+            _classCallCheck(this, IDRSampleList);
+    
+            this._list = [];
+        }
+    
+        _createClass(IDRSampleList, [{
+            key: "clear",
+            value: function clear() {
+                this._list = [];
+            }
+        }, {
+            key: "appendArray",
+            value: function appendArray(syncPoints) {
+                var list = this._list;
+    
+                if (syncPoints.length === 0) {
+                    return;
+                }
+    
+                if (list.length > 0 && syncPoints[0].originalDts < list[list.length - 1].originalDts) {
+                    this.clear();
+                }
+    
+                Array.prototype.push.apply(list, syncPoints);
+            }
+        }, {
+            key: "getLastSyncPointBeforeDts",
+            value: function getLastSyncPointBeforeDts(dts) {
+                if (this._list.length == 0) {
+                    return null;
+                }
+    
+                var list = this._list;
+                var idx = 0;
+                var last = list.length - 1;
+                var mid = 0;
+                var lbound = 0;
+                var ubound = last;
+    
+                if (dts < list[0].dts) {
+                    idx = 0;
+                    lbound = ubound + 1;
+                }
+    
+                while (lbound <= ubound) {
+                    mid = lbound + Math.floor((ubound - lbound) / 2);
+                    if (mid === last || dts >= list[mid].dts && dts < list[mid + 1].dts) {
+                        idx = mid;
+                        break;
+                    } else if (list[mid].dts < dts) {
+                        lbound = mid + 1;
+                    } else {
+                        ubound = mid - 1;
+                    }
+                }
+                return this._list[idx];
+            }
+        }]);
+    
+        return IDRSampleList;
+    }();
+    
+    // Data structure for recording information of media segments in single track.
+    
+    
+    var MediaSegmentInfoList = exports.MediaSegmentInfoList = function () {
+        function MediaSegmentInfoList(type) {
+            _classCallCheck(this, MediaSegmentInfoList);
+    
+            this._type = type;
+            this._list = [];
+            this._lastAppendLocation = -1; // cached last insert location
+        }
+    
+        _createClass(MediaSegmentInfoList, [{
+            key: "isEmpty",
+            value: function isEmpty() {
+                return this._list.length === 0;
+            }
+        }, {
+            key: "clear",
+            value: function clear() {
+                this._list = [];
+                this._lastAppendLocation = -1;
+            }
+        }, {
+            key: "_searchNearestSegmentBefore",
+            value: function _searchNearestSegmentBefore(originalBeginDts) {
+                var list = this._list;
+                if (list.length === 0) {
+                    return -2;
+                }
+                var last = list.length - 1;
+                var mid = 0;
+                var lbound = 0;
+                var ubound = last;
+    
+                var idx = 0;
+    
+                if (originalBeginDts < list[0].originalBeginDts) {
+                    idx = -1;
+                    return idx;
+                }
+    
+                while (lbound <= ubound) {
+                    mid = lbound + Math.floor((ubound - lbound) / 2);
+                    if (mid === last || originalBeginDts > list[mid].lastSample.originalDts && originalBeginDts < list[mid + 1].originalBeginDts) {
+                        idx = mid;
+                        break;
+                    } else if (list[mid].originalBeginDts < originalBeginDts) {
+                        lbound = mid + 1;
+                    } else {
+                        ubound = mid - 1;
+                    }
+                }
+                return idx;
+            }
+        }, {
+            key: "_searchNearestSegmentAfter",
+            value: function _searchNearestSegmentAfter(originalBeginDts) {
+                return this._searchNearestSegmentBefore(originalBeginDts) + 1;
+            }
+        }, {
+            key: "append",
+            value: function append(mediaSegmentInfo) {
+                var list = this._list;
+                var msi = mediaSegmentInfo;
+                var lastAppendIdx = this._lastAppendLocation;
+                var insertIdx = 0;
+    
+                if (lastAppendIdx !== -1 && lastAppendIdx < list.length && msi.originalBeginDts >= list[lastAppendIdx].lastSample.originalDts && (lastAppendIdx === list.length - 1 || lastAppendIdx < list.length - 1 && msi.originalBeginDts < list[lastAppendIdx + 1].originalBeginDts)) {
+                    insertIdx = lastAppendIdx + 1; // use cached location idx
+                } else {
+                    if (list.length > 0) {
+                        insertIdx = this._searchNearestSegmentBefore(msi.originalBeginDts) + 1;
+                    }
+                }
+    
+                this._lastAppendLocation = insertIdx;
+                this._list.splice(insertIdx, 0, msi);
+            }
+        }, {
+            key: "getLastSegmentBefore",
+            value: function getLastSegmentBefore(originalBeginDts) {
+                var idx = this._searchNearestSegmentBefore(originalBeginDts);
+                if (idx >= 0) {
+                    return this._list[idx];
+                } else {
+                    // -1
+                    return null;
+                }
+            }
+        }, {
+            key: "getLastSampleBefore",
+            value: function getLastSampleBefore(originalBeginDts) {
+                var segment = this.getLastSegmentBefore(originalBeginDts);
+                if (segment != null) {
+                    return segment.lastSample;
+                } else {
+                    return null;
+                }
+            }
+        }, {
+            key: "getLastSyncPointBefore",
+            value: function getLastSyncPointBefore(originalBeginDts) {
+                var segmentIdx = this._searchNearestSegmentBefore(originalBeginDts);
+                var syncPoints = this._list[segmentIdx].syncPoints;
+                while (syncPoints.length === 0 && segmentIdx > 0) {
+                    segmentIdx--;
+                    syncPoints = this._list[segmentIdx].syncPoints;
+                }
+                if (syncPoints.length > 0) {
+                    return syncPoints[syncPoints.length - 1];
+                } else {
+                    return null;
+                }
+            }
+        }, {
+            key: "type",
+            get: function get() {
+                return this._type;
+            }
+        }, {
+            key: "length",
+            get: function get() {
+                return this._list.length;
+            }
+        }]);
+    
+        return MediaSegmentInfoList;
+    }();
+    
+    },{}],9:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _events = _dereq_('events');
+    
+    var _events2 = _interopRequireDefault(_events);
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _browser = _dereq_('../utils/browser.js');
+    
+    var _browser2 = _interopRequireDefault(_browser);
+    
+    var _mseEvents = _dereq_('./mse-events.js');
+    
+    var _mseEvents2 = _interopRequireDefault(_mseEvents);
+    
+    var _mediaSegmentInfo = _dereq_('./media-segment-info.js');
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    // Media Source Extensions controller
+    var MSEController = function () {
+        function MSEController(config) {
+            _classCallCheck(this, MSEController);
+    
+            this.TAG = 'MSEController';
+    
+            this._config = config;
+            this._emitter = new _events2.default();
+    
+            if (this._config.isLive && this._config.autoCleanupSourceBuffer == undefined) {
+                // For live stream, do auto cleanup by default
+                this._config.autoCleanupSourceBuffer = true;
+            }
+    
+            this.e = {
+                onSourceOpen: this._onSourceOpen.bind(this),
+                onSourceEnded: this._onSourceEnded.bind(this),
+                onSourceClose: this._onSourceClose.bind(this),
+                onSourceBufferError: this._onSourceBufferError.bind(this),
+                onSourceBufferUpdateEnd: this._onSourceBufferUpdateEnd.bind(this)
+            };
+    
+            this._mediaSource = null;
+            this._mediaSourceObjectURL = null;
+            this._mediaElement = null;
+    
+            this._isBufferFull = false;
+            this._hasPendingEos = false;
+    
+            this._requireSetMediaDuration = false;
+            this._pendingMediaDuration = 0;
+    
+            this._pendingSourceBufferInit = [];
+            this._mimeTypes = {
+                video: null,
+                audio: null
+            };
+            this._sourceBuffers = {
+                video: null,
+                audio: null
+            };
+            this._lastInitSegments = {
+                video: null,
+                audio: null
+            };
+            this._pendingSegments = {
+                video: [],
+                audio: []
+            };
+            this._pendingRemoveRanges = {
+                video: [],
+                audio: []
+            };
+            this._idrList = new _mediaSegmentInfo.IDRSampleList();
+        }
+    
+        _createClass(MSEController, [{
+            key: 'destroy',
+            value: function destroy() {
+                if (this._mediaElement || this._mediaSource) {
+                    this.detachMediaElement();
+                }
+                this.e = null;
+                this._emitter.removeAllListeners();
+                this._emitter = null;
+            }
+        }, {
+            key: 'on',
+            value: function on(event, listener) {
+                this._emitter.addListener(event, listener);
+            }
+        }, {
+            key: 'off',
+            value: function off(event, listener) {
+                this._emitter.removeListener(event, listener);
+            }
+        }, {
+            key: 'attachMediaElement',
+            value: function attachMediaElement(mediaElement) {
+                if (this._mediaSource) {
+                    throw new _exception.IllegalStateException('MediaSource has been attached to an HTMLMediaElement!');
+                }
+                var ms = this._mediaSource = new window.MediaSource();
+                ms.addEventListener('sourceopen', this.e.onSourceOpen);
+                ms.addEventListener('sourceended', this.e.onSourceEnded);
+                ms.addEventListener('sourceclose', this.e.onSourceClose);
+    
+                this._mediaElement = mediaElement;
+                this._mediaSourceObjectURL = window.URL.createObjectURL(this._mediaSource);
+                mediaElement.src = this._mediaSourceObjectURL;
+            }
+        }, {
+            key: 'detachMediaElement',
+            value: function detachMediaElement() {
+                if (this._mediaSource) {
+                    var ms = this._mediaSource;
+                    for (var type in this._sourceBuffers) {
+                        // pending segments should be discard
+                        var ps = this._pendingSegments[type];
+                        ps.splice(0, ps.length);
+                        this._pendingSegments[type] = null;
+                        this._pendingRemoveRanges[type] = null;
+                        this._lastInitSegments[type] = null;
+    
+                        // remove all sourcebuffers
+                        var sb = this._sourceBuffers[type];
+                        if (sb) {
+                            if (ms.readyState !== 'closed') {
+                                // ms edge can throw an error: Unexpected call to method or property access
+                                try {
+                                    ms.removeSourceBuffer(sb);
+                                } catch (error) {
+                                    _logger2.default.e(this.TAG, error.message);
+                                }
+                                sb.removeEventListener('error', this.e.onSourceBufferError);
+                                sb.removeEventListener('updateend', this.e.onSourceBufferUpdateEnd);
+                            }
+                            this._mimeTypes[type] = null;
+                            this._sourceBuffers[type] = null;
+                        }
+                    }
+                    if (ms.readyState === 'open') {
+                        try {
+                            ms.endOfStream();
+                        } catch (error) {
+                            _logger2.default.e(this.TAG, error.message);
+                        }
+                    }
+                    ms.removeEventListener('sourceopen', this.e.onSourceOpen);
+                    ms.removeEventListener('sourceended', this.e.onSourceEnded);
+                    ms.removeEventListener('sourceclose', this.e.onSourceClose);
+                    this._pendingSourceBufferInit = [];
+                    this._isBufferFull = false;
+                    this._idrList.clear();
+                    this._mediaSource = null;
+                }
+    
+                if (this._mediaElement) {
+                    this._mediaElement.src = '';
+                    this._mediaElement.removeAttribute('src');
+                    this._mediaElement = null;
+                }
+                if (this._mediaSourceObjectURL) {
+                    window.URL.revokeObjectURL(this._mediaSourceObjectURL);
+                    this._mediaSourceObjectURL = null;
+                }
+            }
+        }, {
+            key: 'appendInitSegment',
+            value: function appendInitSegment(initSegment, deferred) {
+                if (!this._mediaSource || this._mediaSource.readyState !== 'open') {
+                    // sourcebuffer creation requires mediaSource.readyState === 'open'
+                    // so we defer the sourcebuffer creation, until sourceopen event triggered
+                    this._pendingSourceBufferInit.push(initSegment);
+                    // make sure that this InitSegment is in the front of pending segments queue
+                    this._pendingSegments[initSegment.type].push(initSegment);
+                    return;
+                }
+    
+                var is = initSegment;
+                var mimeType = '' + is.container;
+                if (is.codec && is.codec.length > 0) {
+                    mimeType += ';codecs=' + is.codec;
+                }
+    
+                var firstInitSegment = false;
+    
+                _logger2.default.v(this.TAG, 'Received Initialization Segment, mimeType: ' + mimeType);
+                this._lastInitSegments[is.type] = is;
+    
+                if (mimeType !== this._mimeTypes[is.type]) {
+                    if (!this._mimeTypes[is.type]) {
+                        // empty, first chance create sourcebuffer
+                        firstInitSegment = true;
+                        try {
+                            var sb = this._sourceBuffers[is.type] = this._mediaSource.addSourceBuffer(mimeType);
+                            sb.addEventListener('error', this.e.onSourceBufferError);
+                            sb.addEventListener('updateend', this.e.onSourceBufferUpdateEnd);
+                        } catch (error) {
+                            _logger2.default.e(this.TAG, error.message);
+                            this._emitter.emit(_mseEvents2.default.ERROR, { code: error.code, msg: error.message });
+                            return;
+                        }
+                    } else {
+                        _logger2.default.v(this.TAG, 'Notice: ' + is.type + ' mimeType changed, origin: ' + this._mimeTypes[is.type] + ', target: ' + mimeType);
+                    }
+                    this._mimeTypes[is.type] = mimeType;
+                }
+    
+                if (!deferred) {
+                    // deferred means this InitSegment has been pushed to pendingSegments queue
+                    this._pendingSegments[is.type].push(is);
+                }
+                if (!firstInitSegment) {
+                    // append immediately only if init segment in subsequence
+                    if (this._sourceBuffers[is.type] && !this._sourceBuffers[is.type].updating) {
+                        this._doAppendSegments();
+                    }
+                }
+                if (_browser2.default.safari && is.container === 'audio/mpeg' && is.mediaDuration > 0) {
+                    // 'audio/mpeg' track under Safari may cause MediaElement's duration to be NaN
+                    // Manually correct MediaSource.duration to make progress bar seekable, and report right duration
+                    this._requireSetMediaDuration = true;
+                    this._pendingMediaDuration = is.mediaDuration / 1000; // in seconds
+                    this._updateMediaSourceDuration();
+                }
+            }
+        }, {
+            key: 'appendMediaSegment',
+            value: function appendMediaSegment(mediaSegment) {
+                var ms = mediaSegment;
+                this._pendingSegments[ms.type].push(ms);
+    
+                if (this._config.autoCleanupSourceBuffer && this._needCleanupSourceBuffer()) {
+                    this._doCleanupSourceBuffer();
+                }
+    
+                var sb = this._sourceBuffers[ms.type];
+                if (sb && !sb.updating && !this._hasPendingRemoveRanges()) {
+                    this._doAppendSegments();
+                }
+            }
+        }, {
+            key: 'seek',
+            value: function seek(seconds) {
+                // remove all appended buffers
+                for (var type in this._sourceBuffers) {
+                    if (!this._sourceBuffers[type]) {
+                        continue;
+                    }
+    
+                    // abort current buffer append algorithm
+                    var sb = this._sourceBuffers[type];
+                    if (this._mediaSource.readyState === 'open') {
+                        try {
+                            // If range removal algorithm is running, InvalidStateError will be throwed
+                            // Ignore it.
+                            sb.abort();
+                        } catch (error) {
+                            _logger2.default.e(this.TAG, error.message);
+                        }
+                    }
+    
+                    // IDRList should be clear
+                    this._idrList.clear();
+    
+                    // pending segments should be discard
+                    var ps = this._pendingSegments[type];
+                    ps.splice(0, ps.length);
+    
+                    if (this._mediaSource.readyState === 'closed') {
+                        // Parent MediaSource object has been detached from HTMLMediaElement
+                        continue;
+                    }
+    
+                    // record ranges to be remove from SourceBuffer
+                    for (var i = 0; i < sb.buffered.length; i++) {
+                        var start = sb.buffered.start(i);
+                        var end = sb.buffered.end(i);
+                        this._pendingRemoveRanges[type].push({ start: start, end: end });
+                    }
+    
+                    // if sb is not updating, let's remove ranges now!
+                    if (!sb.updating) {
+                        this._doRemoveRanges();
+                    }
+    
+                    // Safari 10 may get InvalidStateError in the later appendBuffer() after SourceBuffer.remove() call
+                    // Internal parser's state may be invalid at this time. Re-append last InitSegment to workaround.
+                    // Related issue: https://bugs.webkit.org/show_bug.cgi?id=159230
+                    if (_browser2.default.safari) {
+                        var lastInitSegment = this._lastInitSegments[type];
+                        if (lastInitSegment) {
+                            this._pendingSegments[type].push(lastInitSegment);
+                            if (!sb.updating) {
+                                this._doAppendSegments();
+                            }
+                        }
+                    }
+                }
+            }
+        }, {
+            key: 'endOfStream',
+            value: function endOfStream() {
+                var ms = this._mediaSource;
+                var sb = this._sourceBuffers;
+                if (!ms || ms.readyState !== 'open') {
+                    if (ms && ms.readyState === 'closed' && this._hasPendingSegments()) {
+                        // If MediaSource hasn't turned into open state, and there're pending segments
+                        // Mark pending endOfStream, defer call until all pending segments appended complete
+                        this._hasPendingEos = true;
+                    }
+                    return;
+                }
+                if (sb.video && sb.video.updating || sb.audio && sb.audio.updating) {
+                    // If any sourcebuffer is updating, defer endOfStream operation
+                    // See _onSourceBufferUpdateEnd()
+                    this._hasPendingEos = true;
+                } else {
+                    this._hasPendingEos = false;
+                    // Notify media data loading complete
+                    // This is helpful for correcting total duration to match last media segment
+                    // Otherwise MediaElement's ended event may not be triggered
+                    ms.endOfStream();
+                }
+            }
+        }, {
+            key: 'getNearestKeyframe',
+            value: function getNearestKeyframe(dts) {
+                return this._idrList.getLastSyncPointBeforeDts(dts);
+            }
+        }, {
+            key: '_needCleanupSourceBuffer',
+            value: function _needCleanupSourceBuffer() {
+                if (!this._config.autoCleanupSourceBuffer) {
+                    return false;
+                }
+    
+                var currentTime = this._mediaElement.currentTime;
+    
+                for (var type in this._sourceBuffers) {
+                    var sb = this._sourceBuffers[type];
+                    if (sb) {
+                        var buffered = sb.buffered;
+                        if (buffered.length >= 1) {
+                            if (currentTime - buffered.start(0) >= this._config.autoCleanupMaxBackwardDuration) {
+                                return true;
+                            }
+                        }
+                    }
+                }
+    
+                return false;
+            }
+        }, {
+            key: '_doCleanupSourceBuffer',
+            value: function _doCleanupSourceBuffer() {
+                var currentTime = this._mediaElement.currentTime;
+    
+                for (var type in this._sourceBuffers) {
+                    var sb = this._sourceBuffers[type];
+                    if (sb) {
+                        var buffered = sb.buffered;
+                        var doRemove = false;
+    
+                        for (var i = 0; i < buffered.length; i++) {
+                            var start = buffered.start(i);
+                            var end = buffered.end(i);
+    
+                            if (start <= currentTime && currentTime < end + 3) {
+                                // padding 3 seconds
+                                if (currentTime - start >= this._config.autoCleanupMaxBackwardDuration) {
+                                    doRemove = true;
+                                    var removeEnd = currentTime - this._config.autoCleanupMinBackwardDuration;
+                                    this._pendingRemoveRanges[type].push({ start: start, end: removeEnd });
+                                }
+                            } else if (end < currentTime) {
+                                doRemove = true;
+                                this._pendingRemoveRanges[type].push({ start: start, end: end });
+                            }
+                        }
+    
+                        if (doRemove && !sb.updating) {
+                            this._doRemoveRanges();
+                        }
+                    }
+                }
+            }
+        }, {
+            key: '_updateMediaSourceDuration',
+            value: function _updateMediaSourceDuration() {
+                var sb = this._sourceBuffers;
+                if (this._mediaElement.readyState === 0 || this._mediaSource.readyState !== 'open') {
+                    return;
+                }
+                if (sb.video && sb.video.updating || sb.audio && sb.audio.updating) {
+                    return;
+                }
+    
+                var current = this._mediaSource.duration;
+                var target = this._pendingMediaDuration;
+    
+                if (target > 0 && (isNaN(current) || target > current)) {
+                    _logger2.default.v(this.TAG, 'Update MediaSource duration from ' + current + ' to ' + target);
+                    this._mediaSource.duration = target;
+                }
+    
+                this._requireSetMediaDuration = false;
+                this._pendingMediaDuration = 0;
+            }
+        }, {
+            key: '_doRemoveRanges',
+            value: function _doRemoveRanges() {
+                for (var type in this._pendingRemoveRanges) {
+                    if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {
+                        continue;
+                    }
+                    var sb = this._sourceBuffers[type];
+                    var ranges = this._pendingRemoveRanges[type];
+                    while (ranges.length && !sb.updating) {
+                        var range = ranges.shift();
+                        sb.remove(range.start, range.end);
+                    }
+                }
+            }
+        }, {
+            key: '_doAppendSegments',
+            value: function _doAppendSegments() {
+                var pendingSegments = this._pendingSegments;
+    
+                for (var type in pendingSegments) {
+                    if (!this._sourceBuffers[type] || this._sourceBuffers[type].updating) {
+                        continue;
+                    }
+    
+                    if (pendingSegments[type].length > 0) {
+                        var segment = pendingSegments[type].shift();
+    
+                        if (segment.timestampOffset) {
+                            // For MPEG audio stream in MSE, if unbuffered-seeking occurred
+                            // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.
+                            var currentOffset = this._sourceBuffers[type].timestampOffset;
+                            var targetOffset = segment.timestampOffset / 1000; // in seconds
+    
+                            var delta = Math.abs(currentOffset - targetOffset);
+                            if (delta > 0.1) {
+                                // If time delta > 100ms
+                                _logger2.default.v(this.TAG, 'Update MPEG audio timestampOffset from ' + currentOffset + ' to ' + targetOffset);
+                                this._sourceBuffers[type].timestampOffset = targetOffset;
+                            }
+                            delete segment.timestampOffset;
+                        }
+    
+                        if (!segment.data || segment.data.byteLength === 0) {
+                            // Ignore empty buffer
+                            continue;
+                        }
+    
+                        try {
+                            this._sourceBuffers[type].appendBuffer(segment.data);
+                            this._isBufferFull = false;
+                            if (type === 'video' && segment.hasOwnProperty('info')) {
+                                this._idrList.appendArray(segment.info.syncPoints);
+                            }
+                        } catch (error) {
+                            this._pendingSegments[type].unshift(segment);
+                            if (error.code === 22) {
+                                // QuotaExceededError
+                                /* Notice that FireFox may not throw QuotaExceededError if SourceBuffer is full
+                                 * Currently we can only do lazy-load to avoid SourceBuffer become scattered.
+                                 * SourceBuffer eviction policy may be changed in future version of FireFox.
+                                 *
+                                 * Related issues:
+                                 * https://bugzilla.mozilla.org/show_bug.cgi?id=1279885
+                                 * https://bugzilla.mozilla.org/show_bug.cgi?id=1280023
+                                 */
+    
+                                // report buffer full, abort network IO
+                                if (!this._isBufferFull) {
+                                    this._emitter.emit(_mseEvents2.default.BUFFER_FULL);
+                                }
+                                this._isBufferFull = true;
+                            } else {
+                                _logger2.default.e(this.TAG, error.message);
+                                this._emitter.emit(_mseEvents2.default.ERROR, { code: error.code, msg: error.message });
+                            }
+                        }
+                    }
+                }
+            }
+        }, {
+            key: '_onSourceOpen',
+            value: function _onSourceOpen() {
+                _logger2.default.v(this.TAG, 'MediaSource onSourceOpen');
+                this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);
+                // deferred sourcebuffer creation / initialization
+                if (this._pendingSourceBufferInit.length > 0) {
+                    var pendings = this._pendingSourceBufferInit;
+                    while (pendings.length) {
+                        var segment = pendings.shift();
+                        this.appendInitSegment(segment, true);
+                    }
+                }
+                // there may be some pending media segments, append them
+                if (this._hasPendingSegments()) {
+                    this._doAppendSegments();
+                }
+                this._emitter.emit(_mseEvents2.default.SOURCE_OPEN);
+            }
+        }, {
+            key: '_onSourceEnded',
+            value: function _onSourceEnded() {
+                // fired on endOfStream
+                _logger2.default.v(this.TAG, 'MediaSource onSourceEnded');
+            }
+        }, {
+            key: '_onSourceClose',
+            value: function _onSourceClose() {
+                // fired on detaching from media element
+                _logger2.default.v(this.TAG, 'MediaSource onSourceClose');
+                if (this._mediaSource && this.e != null) {
+                    this._mediaSource.removeEventListener('sourceopen', this.e.onSourceOpen);
+                    this._mediaSource.removeEventListener('sourceended', this.e.onSourceEnded);
+                    this._mediaSource.removeEventListener('sourceclose', this.e.onSourceClose);
+                }
+            }
+        }, {
+            key: '_hasPendingSegments',
+            value: function _hasPendingSegments() {
+                var ps = this._pendingSegments;
+                return ps.video.length > 0 || ps.audio.length > 0;
+            }
+        }, {
+            key: '_hasPendingRemoveRanges',
+            value: function _hasPendingRemoveRanges() {
+                var prr = this._pendingRemoveRanges;
+                return prr.video.length > 0 || prr.audio.length > 0;
+            }
+        }, {
+            key: '_onSourceBufferUpdateEnd',
+            value: function _onSourceBufferUpdateEnd() {
+                if (this._requireSetMediaDuration) {
+                    this._updateMediaSourceDuration();
+                } else if (this._hasPendingRemoveRanges()) {
+                    this._doRemoveRanges();
+                } else if (this._hasPendingSegments()) {
+                    this._doAppendSegments();
+                } else if (this._hasPendingEos) {
+                    this.endOfStream();
+                }
+                this._emitter.emit(_mseEvents2.default.UPDATE_END);
+            }
+        }, {
+            key: '_onSourceBufferError',
+            value: function _onSourceBufferError(e) {
+                _logger2.default.e(this.TAG, 'SourceBuffer Error: ' + e);
+                // this error might not always be fatal, just ignore it
+            }
+        }]);
+    
+        return MSEController;
+    }();
+    
+    exports.default = MSEController;
+    
+    },{"../utils/browser.js":39,"../utils/exception.js":40,"../utils/logger.js":41,"./media-segment-info.js":8,"./mse-events.js":10,"events":2}],10:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+      value: true
+    });
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var MSEEvents = {
+      ERROR: 'error',
+      SOURCE_OPEN: 'source_open',
+      UPDATE_END: 'update_end',
+      BUFFER_FULL: 'buffer_full'
+    };
+    
+    exports.default = MSEEvents;
+    
+    },{}],11:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _events = _dereq_('events');
+    
+    var _events2 = _interopRequireDefault(_events);
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _loggingControl = _dereq_('../utils/logging-control.js');
+    
+    var _loggingControl2 = _interopRequireDefault(_loggingControl);
+    
+    var _transmuxingController = _dereq_('./transmuxing-controller.js');
+    
+    var _transmuxingController2 = _interopRequireDefault(_transmuxingController);
+    
+    var _transmuxingEvents = _dereq_('./transmuxing-events.js');
+    
+    var _transmuxingEvents2 = _interopRequireDefault(_transmuxingEvents);
+    
+    var _transmuxingWorker = _dereq_('./transmuxing-worker.js');
+    
+    var _transmuxingWorker2 = _interopRequireDefault(_transmuxingWorker);
+    
+    var _mediaInfo = _dereq_('./media-info.js');
+    
+    var _mediaInfo2 = _interopRequireDefault(_mediaInfo);
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    var Transmuxer = function () {
+        function Transmuxer(mediaDataSource, config) {
+            _classCallCheck(this, Transmuxer);
+    
+            this.TAG = 'Transmuxer';
+            this._emitter = new _events2.default();
+    
+            if (config.enableWorker && typeof Worker !== 'undefined') {
+                try {
+                    var work = _dereq_('webworkify');
+                    this._worker = work(_transmuxingWorker2.default);
+                    this._workerDestroying = false;
+                    this._worker.addEventListener('message', this._onWorkerMessage.bind(this));
+                    this._worker.postMessage({ cmd: 'init', param: [mediaDataSource, config] });
+                    this.e = {
+                        onLoggingConfigChanged: this._onLoggingConfigChanged.bind(this)
+                    };
+                    _loggingControl2.default.registerListener(this.e.onLoggingConfigChanged);
+                    this._worker.postMessage({ cmd: 'logging_config', param: _loggingControl2.default.getConfig() });
+                } catch (error) {
+                    _logger2.default.e(this.TAG, 'Error while initialize transmuxing worker, fallback to inline transmuxing');
+                    this._worker = null;
+                    this._controller = new _transmuxingController2.default(mediaDataSource, config);
+                }
+            } else {
+                this._controller = new _transmuxingController2.default(mediaDataSource, config);
+            }
+    
+            if (this._controller) {
+                var ctl = this._controller;
+                ctl.on(_transmuxingEvents2.default.IO_ERROR, this._onIOError.bind(this));
+                ctl.on(_transmuxingEvents2.default.DEMUX_ERROR, this._onDemuxError.bind(this));
+                ctl.on(_transmuxingEvents2.default.INIT_SEGMENT, this._onInitSegment.bind(this));
+                ctl.on(_transmuxingEvents2.default.MEDIA_SEGMENT, this._onMediaSegment.bind(this));
+                ctl.on(_transmuxingEvents2.default.LOADING_COMPLETE, this._onLoadingComplete.bind(this));
+                ctl.on(_transmuxingEvents2.default.RECOVERED_EARLY_EOF, this._onRecoveredEarlyEof.bind(this));
+                ctl.on(_transmuxingEvents2.default.MEDIA_INFO, this._onMediaInfo.bind(this));
+                ctl.on(_transmuxingEvents2.default.METADATA_ARRIVED, this._onMetaDataArrived.bind(this));
+                ctl.on(_transmuxingEvents2.default.SCRIPTDATA_ARRIVED, this._onScriptDataArrived.bind(this));
+                ctl.on(_transmuxingEvents2.default.STATISTICS_INFO, this._onStatisticsInfo.bind(this));
+                ctl.on(_transmuxingEvents2.default.RECOMMEND_SEEKPOINT, this._onRecommendSeekpoint.bind(this));
+            }
+        }
+    
+        _createClass(Transmuxer, [{
+            key: 'destroy',
+            value: function destroy() {
+                if (this._worker) {
+                    if (!this._workerDestroying) {
+                        this._workerDestroying = true;
+                        this._worker.postMessage({ cmd: 'destroy' });
+                        _loggingControl2.default.removeListener(this.e.onLoggingConfigChanged);
+                        this.e = null;
+                    }
+                } else {
+                    this._controller.destroy();
+                    this._controller = null;
+                }
+                this._emitter.removeAllListeners();
+                this._emitter = null;
+            }
+        }, {
+            key: 'on',
+            value: function on(event, listener) {
+                this._emitter.addListener(event, listener);
+            }
+        }, {
+            key: 'off',
+            value: function off(event, listener) {
+                this._emitter.removeListener(event, listener);
+            }
+        }, {
+            key: 'hasWorker',
+            value: function hasWorker() {
+                return this._worker != null;
+            }
+        }, {
+            key: 'open',
+            value: function open() {
+                if (this._worker) {
+                    this._worker.postMessage({ cmd: 'start' });
+                } else {
+                    this._controller.start();
+                }
+            }
+        }, {
+            key: 'close',
+            value: function close() {
+                if (this._worker) {
+                    this._worker.postMessage({ cmd: 'stop' });
+                } else {
+                    this._controller.stop();
+                }
+            }
+        }, {
+            key: 'seek',
+            value: function seek(milliseconds) {
+                if (this._worker) {
+                    this._worker.postMessage({ cmd: 'seek', param: milliseconds });
+                } else {
+                    this._controller.seek(milliseconds);
+                }
+            }
+        }, {
+            key: 'pause',
+            value: function pause() {
+                if (this._worker) {
+                    this._worker.postMessage({ cmd: 'pause' });
+                } else {
+                    this._controller.pause();
+                }
+            }
+        }, {
+            key: 'resume',
+            value: function resume() {
+                if (this._worker) {
+                    this._worker.postMessage({ cmd: 'resume' });
+                } else {
+                    this._controller.resume();
+                }
+            }
+        }, {
+            key: '_onInitSegment',
+            value: function _onInitSegment(type, initSegment) {
+                var _this = this;
+    
+                // do async invoke
+                Promise.resolve().then(function () {
+                    _this._emitter.emit(_transmuxingEvents2.default.INIT_SEGMENT, type, initSegment);
+                });
+            }
+        }, {
+            key: '_onMediaSegment',
+            value: function _onMediaSegment(type, mediaSegment) {
+                var _this2 = this;
+    
+                Promise.resolve().then(function () {
+                    _this2._emitter.emit(_transmuxingEvents2.default.MEDIA_SEGMENT, type, mediaSegment);
+                });
+            }
+        }, {
+            key: '_onLoadingComplete',
+            value: function _onLoadingComplete() {
+                var _this3 = this;
+    
+                Promise.resolve().then(function () {
+                    _this3._emitter.emit(_transmuxingEvents2.default.LOADING_COMPLETE);
+                });
+            }
+        }, {
+            key: '_onRecoveredEarlyEof',
+            value: function _onRecoveredEarlyEof() {
+                var _this4 = this;
+    
+                Promise.resolve().then(function () {
+                    _this4._emitter.emit(_transmuxingEvents2.default.RECOVERED_EARLY_EOF);
+                });
+            }
+        }, {
+            key: '_onMediaInfo',
+            value: function _onMediaInfo(mediaInfo) {
+                var _this5 = this;
+    
+                Promise.resolve().then(function () {
+                    _this5._emitter.emit(_transmuxingEvents2.default.MEDIA_INFO, mediaInfo);
+                });
+            }
+        }, {
+            key: '_onMetaDataArrived',
+            value: function _onMetaDataArrived(metadata) {
+                var _this6 = this;
+    
+                Promise.resolve().then(function () {
+                    _this6._emitter.emit(_transmuxingEvents2.default.METADATA_ARRIVED, metadata);
+                });
+            }
+        }, {
+            key: '_onScriptDataArrived',
+            value: function _onScriptDataArrived(data) {
+                var _this7 = this;
+    
+                Promise.resolve().then(function () {
+                    _this7._emitter.emit(_transmuxingEvents2.default.SCRIPTDATA_ARRIVED, data);
+                });
+            }
+        }, {
+            key: '_onStatisticsInfo',
+            value: function _onStatisticsInfo(statisticsInfo) {
+                var _this8 = this;
+    
+                Promise.resolve().then(function () {
+                    _this8._emitter.emit(_transmuxingEvents2.default.STATISTICS_INFO, statisticsInfo);
+                });
+            }
+        }, {
+            key: '_onIOError',
+            value: function _onIOError(type, info) {
+                var _this9 = this;
+    
+                Promise.resolve().then(function () {
+                    _this9._emitter.emit(_transmuxingEvents2.default.IO_ERROR, type, info);
+                });
+            }
+        }, {
+            key: '_onDemuxError',
+            value: function _onDemuxError(type, info) {
+                var _this10 = this;
+    
+                Promise.resolve().then(function () {
+                    _this10._emitter.emit(_transmuxingEvents2.default.DEMUX_ERROR, type, info);
+                });
+            }
+        }, {
+            key: '_onRecommendSeekpoint',
+            value: function _onRecommendSeekpoint(milliseconds) {
+                var _this11 = this;
+    
+                Promise.resolve().then(function () {
+                    _this11._emitter.emit(_transmuxingEvents2.default.RECOMMEND_SEEKPOINT, milliseconds);
+                });
+            }
+        }, {
+            key: '_onLoggingConfigChanged',
+            value: function _onLoggingConfigChanged(config) {
+                if (this._worker) {
+                    this._worker.postMessage({ cmd: 'logging_config', param: config });
+                }
+            }
+        }, {
+            key: '_onWorkerMessage',
+            value: function _onWorkerMessage(e) {
+                var message = e.data;
+                var data = message.data;
+    
+                if (message.msg === 'destroyed' || this._workerDestroying) {
+                    this._workerDestroying = false;
+                    this._worker.terminate();
+                    this._worker = null;
+                    return;
+                }
+    
+                switch (message.msg) {
+                    case _transmuxingEvents2.default.INIT_SEGMENT:
+                    case _transmuxingEvents2.default.MEDIA_SEGMENT:
+                        this._emitter.emit(message.msg, data.type, data.data);
+                        break;
+                    case _transmuxingEvents2.default.LOADING_COMPLETE:
+                    case _transmuxingEvents2.default.RECOVERED_EARLY_EOF:
+                        this._emitter.emit(message.msg);
+                        break;
+                    case _transmuxingEvents2.default.MEDIA_INFO:
+                        Object.setPrototypeOf(data, _mediaInfo2.default.prototype);
+                        this._emitter.emit(message.msg, data);
+                        break;
+                    case _transmuxingEvents2.default.METADATA_ARRIVED:
+                    case _transmuxingEvents2.default.SCRIPTDATA_ARRIVED:
+                    case _transmuxingEvents2.default.STATISTICS_INFO:
+                        this._emitter.emit(message.msg, data);
+                        break;
+                    case _transmuxingEvents2.default.IO_ERROR:
+                    case _transmuxingEvents2.default.DEMUX_ERROR:
+                        this._emitter.emit(message.msg, data.type, data.info);
+                        break;
+                    case _transmuxingEvents2.default.RECOMMEND_SEEKPOINT:
+                        this._emitter.emit(message.msg, data);
+                        break;
+                    case 'logcat_callback':
+                        _logger2.default.emitter.emit('log', data.type, data.logcat);
+                        break;
+                    default:
+                        break;
+                }
+            }
+        }]);
+    
+        return Transmuxer;
+    }();
+    
+    exports.default = Transmuxer;
+    
+    },{"../utils/logger.js":41,"../utils/logging-control.js":42,"./media-info.js":7,"./transmuxing-controller.js":12,"./transmuxing-events.js":13,"./transmuxing-worker.js":14,"events":2,"webworkify":4}],12:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _events = _dereq_('events');
+    
+    var _events2 = _interopRequireDefault(_events);
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _browser = _dereq_('../utils/browser.js');
+    
+    var _browser2 = _interopRequireDefault(_browser);
+    
+    var _mediaInfo = _dereq_('./media-info.js');
+    
+    var _mediaInfo2 = _interopRequireDefault(_mediaInfo);
+    
+    var _flvDemuxer = _dereq_('../demux/flv-demuxer.js');
+    
+    var _flvDemuxer2 = _interopRequireDefault(_flvDemuxer);
+    
+    var _mp4Remuxer = _dereq_('../remux/mp4-remuxer.js');
+    
+    var _mp4Remuxer2 = _interopRequireDefault(_mp4Remuxer);
+    
+    var _demuxErrors = _dereq_('../demux/demux-errors.js');
+    
+    var _demuxErrors2 = _interopRequireDefault(_demuxErrors);
+    
+    var _ioController = _dereq_('../io/io-controller.js');
+    
+    var _ioController2 = _interopRequireDefault(_ioController);
+    
+    var _transmuxingEvents = _dereq_('./transmuxing-events.js');
+    
+    var _transmuxingEvents2 = _interopRequireDefault(_transmuxingEvents);
+    
+    var _loader = _dereq_('../io/loader.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    // Transmuxing (IO, Demuxing, Remuxing) controller, with multipart support
+    var TransmuxingController = function () {
+        function TransmuxingController(mediaDataSource, config) {
+            _classCallCheck(this, TransmuxingController);
+    
+            this.TAG = 'TransmuxingController';
+            this._emitter = new _events2.default();
+    
+            this._config = config;
+    
+            // treat single part media as multipart media, which has only one segment
+            if (!mediaDataSource.segments) {
+                mediaDataSource.segments = [{
+                    duration: mediaDataSource.duration,
+                    filesize: mediaDataSource.filesize,
+                    url: mediaDataSource.url
+                }];
+            }
+    
+            // fill in default IO params if not exists
+            if (typeof mediaDataSource.cors !== 'boolean') {
+                mediaDataSource.cors = true;
+            }
+            if (typeof mediaDataSource.withCredentials !== 'boolean') {
+                mediaDataSource.withCredentials = false;
+            }
+    
+            this._mediaDataSource = mediaDataSource;
+            this._currentSegmentIndex = 0;
+            var totalDuration = 0;
+    
+            this._mediaDataSource.segments.forEach(function (segment) {
+                // timestampBase for each segment, and calculate total duration
+                segment.timestampBase = totalDuration;
+                totalDuration += segment.duration;
+                // params needed by IOController
+                segment.cors = mediaDataSource.cors;
+                segment.withCredentials = mediaDataSource.withCredentials;
+                // referrer policy control, if exist
+                if (config.referrerPolicy) {
+                    segment.referrerPolicy = config.referrerPolicy;
+                }
+            });
+    
+            if (!isNaN(totalDuration) && this._mediaDataSource.duration !== totalDuration) {
+                this._mediaDataSource.duration = totalDuration;
+            }
+    
+            this._mediaInfo = null;
+            this._demuxer = null;
+            this._remuxer = null;
+            this._ioctl = null;
+    
+            this._pendingSeekTime = null;
+            this._pendingResolveSeekPoint = null;
+    
+            this._statisticsReporter = null;
+        }
+    
+        _createClass(TransmuxingController, [{
+            key: 'destroy',
+            value: function destroy() {
+                this._mediaInfo = null;
+                this._mediaDataSource = null;
+    
+                if (this._statisticsReporter) {
+                    this._disableStatisticsReporter();
+                }
+                if (this._ioctl) {
+                    this._ioctl.destroy();
+                    this._ioctl = null;
+                }
+                if (this._demuxer) {
+                    this._demuxer.destroy();
+                    this._demuxer = null;
+                }
+                if (this._remuxer) {
+                    this._remuxer.destroy();
+                    this._remuxer = null;
+                }
+    
+                this._emitter.removeAllListeners();
+                this._emitter = null;
+            }
+        }, {
+            key: 'on',
+            value: function on(event, listener) {
+                this._emitter.addListener(event, listener);
+            }
+        }, {
+            key: 'off',
+            value: function off(event, listener) {
+                this._emitter.removeListener(event, listener);
+            }
+        }, {
+            key: 'start',
+            value: function start() {
+                this._loadSegment(0);
+                this._enableStatisticsReporter();
+            }
+        }, {
+            key: '_loadSegment',
+            value: function _loadSegment(segmentIndex, optionalFrom) {
+                this._currentSegmentIndex = segmentIndex;
+                var dataSource = this._mediaDataSource.segments[segmentIndex];
+    
+                var ioctl = this._ioctl = new _ioController2.default(dataSource, this._config, segmentIndex);
+                ioctl.onError = this._onIOException.bind(this);
+                ioctl.onSeeked = this._onIOSeeked.bind(this);
+                ioctl.onComplete = this._onIOComplete.bind(this);
+                ioctl.onRedirect = this._onIORedirect.bind(this);
+                ioctl.onRecoveredEarlyEof = this._onIORecoveredEarlyEof.bind(this);
+    
+                if (optionalFrom) {
+                    this._demuxer.bindDataSource(this._ioctl);
+                } else {
+                    ioctl.onDataArrival = this._onInitChunkArrival.bind(this);
+                }
+    
+                ioctl.open(optionalFrom);
+            }
+        }, {
+            key: 'stop',
+            value: function stop() {
+                this._internalAbort();
+                this._disableStatisticsReporter();
+            }
+        }, {
+            key: '_internalAbort',
+            value: function _internalAbort() {
+                if (this._ioctl) {
+                    this._ioctl.destroy();
+                    this._ioctl = null;
+                }
+            }
+        }, {
+            key: 'pause',
+            value: function pause() {
+                // take a rest
+                if (this._ioctl && this._ioctl.isWorking()) {
+                    this._ioctl.pause();
+                    this._disableStatisticsReporter();
+                }
+            }
+        }, {
+            key: 'resume',
+            value: function resume() {
+                if (this._ioctl && this._ioctl.isPaused()) {
+                    this._ioctl.resume();
+                    this._enableStatisticsReporter();
+                }
+            }
+        }, {
+            key: 'seek',
+            value: function seek(milliseconds) {
+                if (this._mediaInfo == null || !this._mediaInfo.isSeekable()) {
+                    return;
+                }
+    
+                var targetSegmentIndex = this._searchSegmentIndexContains(milliseconds);
+    
+                if (targetSegmentIndex === this._currentSegmentIndex) {
+                    // intra-segment seeking
+                    var segmentInfo = this._mediaInfo.segments[targetSegmentIndex];
+    
+                    if (segmentInfo == undefined) {
+                        // current segment loading started, but mediainfo hasn't received yet
+                        // wait for the metadata loaded, then seek to expected position
+                        this._pendingSeekTime = milliseconds;
+                    } else {
+                        var keyframe = segmentInfo.getNearestKeyframe(milliseconds);
+                        this._remuxer.seek(keyframe.milliseconds);
+                        this._ioctl.seek(keyframe.fileposition);
+                        // Will be resolved in _onRemuxerMediaSegmentArrival()
+                        this._pendingResolveSeekPoint = keyframe.milliseconds;
+                    }
+                } else {
+                    // cross-segment seeking
+                    var targetSegmentInfo = this._mediaInfo.segments[targetSegmentIndex];
+    
+                    if (targetSegmentInfo == undefined) {
+                        // target segment hasn't been loaded. We need metadata then seek to expected time
+                        this._pendingSeekTime = milliseconds;
+                        this._internalAbort();
+                        this._remuxer.seek();
+                        this._remuxer.insertDiscontinuity();
+                        this._loadSegment(targetSegmentIndex);
+                        // Here we wait for the metadata loaded, then seek to expected position
+                    } else {
+                        // We have target segment's metadata, direct seek to target position
+                        var _keyframe = targetSegmentInfo.getNearestKeyframe(milliseconds);
+                        this._internalAbort();
+                        this._remuxer.seek(milliseconds);
+                        this._remuxer.insertDiscontinuity();
+                        this._demuxer.resetMediaInfo();
+                        this._demuxer.timestampBase = this._mediaDataSource.segments[targetSegmentIndex].timestampBase;
+                        this._loadSegment(targetSegmentIndex, _keyframe.fileposition);
+                        this._pendingResolveSeekPoint = _keyframe.milliseconds;
+                        this._reportSegmentMediaInfo(targetSegmentIndex);
+                    }
+                }
+    
+                this._enableStatisticsReporter();
+            }
+        }, {
+            key: '_searchSegmentIndexContains',
+            value: function _searchSegmentIndexContains(milliseconds) {
+                var segments = this._mediaDataSource.segments;
+                var idx = segments.length - 1;
+    
+                for (var i = 0; i < segments.length; i++) {
+                    if (milliseconds < segments[i].timestampBase) {
+                        idx = i - 1;
+                        break;
+                    }
+                }
+                return idx;
+            }
+        }, {
+            key: '_onInitChunkArrival',
+            value: function _onInitChunkArrival(data, byteStart) {
+                var _this = this;
+    
+                var probeData = null;
+                var consumed = 0;
+    
+                if (byteStart > 0) {
+                    // IOController seeked immediately after opened, byteStart > 0 callback may received
+                    this._demuxer.bindDataSource(this._ioctl);
+                    this._demuxer.timestampBase = this._mediaDataSource.segments[this._currentSegmentIndex].timestampBase;
+    
+                    consumed = this._demuxer.parseChunks(data, byteStart);
+                } else if ((probeData = _flvDemuxer2.default.probe(data)).match) {
+                    // Always create new FLVDemuxer
+                    this._demuxer = new _flvDemuxer2.default(probeData, this._config);
+    
+                    if (!this._remuxer) {
+                        this._remuxer = new _mp4Remuxer2.default(this._config);
+                    }
+    
+                    var mds = this._mediaDataSource;
+                    if (mds.duration != undefined && !isNaN(mds.duration)) {
+                        this._demuxer.overridedDuration = mds.duration;
+                    }
+                    if (typeof mds.hasAudio === 'boolean') {
+                        this._demuxer.overridedHasAudio = mds.hasAudio;
+                    }
+                    if (typeof mds.hasVideo === 'boolean') {
+                        this._demuxer.overridedHasVideo = mds.hasVideo;
+                    }
+    
+                    this._demuxer.timestampBase = mds.segments[this._currentSegmentIndex].timestampBase;
+    
+                    this._demuxer.onError = this._onDemuxException.bind(this);
+                    this._demuxer.onMediaInfo = this._onMediaInfo.bind(this);
+                    this._demuxer.onMetaDataArrived = this._onMetaDataArrived.bind(this);
+                    this._demuxer.onScriptDataArrived = this._onScriptDataArrived.bind(this);
+    
+                    this._remuxer.bindDataSource(this._demuxer.bindDataSource(this._ioctl));
+    
+                    this._remuxer.onInitSegment = this._onRemuxerInitSegmentArrival.bind(this);
+                    this._remuxer.onMediaSegment = this._onRemuxerMediaSegmentArrival.bind(this);
+    
+                    consumed = this._demuxer.parseChunks(data, byteStart);
+                } else {
+                    probeData = null;
+                    _logger2.default.e(this.TAG, 'Non-FLV, Unsupported media type!');
+                    Promise.resolve().then(function () {
+                        _this._internalAbort();
+                    });
+                    this._emitter.emit(_transmuxingEvents2.default.DEMUX_ERROR, _demuxErrors2.default.FORMAT_UNSUPPORTED, 'Non-FLV, Unsupported media type');
+    
+                    consumed = 0;
+                }
+    
+                return consumed;
+            }
+        }, {
+            key: '_onMediaInfo',
+            value: function _onMediaInfo(mediaInfo) {
+                var _this2 = this;
+    
+                if (this._mediaInfo == null) {
+                    // Store first segment's mediainfo as global mediaInfo
+                    this._mediaInfo = Object.assign({}, mediaInfo);
+                    this._mediaInfo.keyframesIndex = null;
+                    this._mediaInfo.segments = [];
+                    this._mediaInfo.segmentCount = this._mediaDataSource.segments.length;
+                    Object.setPrototypeOf(this._mediaInfo, _mediaInfo2.default.prototype);
+                }
+    
+                var segmentInfo = Object.assign({}, mediaInfo);
+                Object.setPrototypeOf(segmentInfo, _mediaInfo2.default.prototype);
+                this._mediaInfo.segments[this._currentSegmentIndex] = segmentInfo;
+    
+                // notify mediaInfo update
+                this._reportSegmentMediaInfo(this._currentSegmentIndex);
+    
+                if (this._pendingSeekTime != null) {
+                    Promise.resolve().then(function () {
+                        var target = _this2._pendingSeekTime;
+                        _this2._pendingSeekTime = null;
+                        _this2.seek(target);
+                    });
+                }
+            }
+        }, {
+            key: '_onMetaDataArrived',
+            value: function _onMetaDataArrived(metadata) {
+                this._emitter.emit(_transmuxingEvents2.default.METADATA_ARRIVED, metadata);
+            }
+        }, {
+            key: '_onScriptDataArrived',
+            value: function _onScriptDataArrived(data) {
+                this._emitter.emit(_transmuxingEvents2.default.SCRIPTDATA_ARRIVED, data);
+            }
+        }, {
+            key: '_onIOSeeked',
+            value: function _onIOSeeked() {
+                this._remuxer.insertDiscontinuity();
+            }
+        }, {
+            key: '_onIOComplete',
+            value: function _onIOComplete(extraData) {
+                var segmentIndex = extraData;
+                var nextSegmentIndex = segmentIndex + 1;
+    
+                if (nextSegmentIndex < this._mediaDataSource.segments.length) {
+                    this._internalAbort();
+                    this._remuxer.flushStashedSamples();
+                    this._loadSegment(nextSegmentIndex);
+                } else {
+                    this._remuxer.flushStashedSamples();
+                    this._emitter.emit(_transmuxingEvents2.default.LOADING_COMPLETE);
+                    this._disableStatisticsReporter();
+                }
+            }
+        }, {
+            key: '_onIORedirect',
+            value: function _onIORedirect(redirectedURL) {
+                var segmentIndex = this._ioctl.extraData;
+                this._mediaDataSource.segments[segmentIndex].redirectedURL = redirectedURL;
+            }
+        }, {
+            key: '_onIORecoveredEarlyEof',
+            value: function _onIORecoveredEarlyEof() {
+                this._emitter.emit(_transmuxingEvents2.default.RECOVERED_EARLY_EOF);
+            }
+        }, {
+            key: '_onIOException',
+            value: function _onIOException(type, info) {
+                _logger2.default.e(this.TAG, 'IOException: type = ' + type + ', code = ' + info.code + ', msg = ' + info.msg);
+                this._emitter.emit(_transmuxingEvents2.default.IO_ERROR, type, info);
+                this._disableStatisticsReporter();
+            }
+        }, {
+            key: '_onDemuxException',
+            value: function _onDemuxException(type, info) {
+                _logger2.default.e(this.TAG, 'DemuxException: type = ' + type + ', info = ' + info);
+                this._emitter.emit(_transmuxingEvents2.default.DEMUX_ERROR, type, info);
+            }
+        }, {
+            key: '_onRemuxerInitSegmentArrival',
+            value: function _onRemuxerInitSegmentArrival(type, initSegment) {
+                this._emitter.emit(_transmuxingEvents2.default.INIT_SEGMENT, type, initSegment);
+            }
+        }, {
+            key: '_onRemuxerMediaSegmentArrival',
+            value: function _onRemuxerMediaSegmentArrival(type, mediaSegment) {
+                if (this._pendingSeekTime != null) {
+                    // Media segments after new-segment cross-seeking should be dropped.
+                    return;
+                }
+                this._emitter.emit(_transmuxingEvents2.default.MEDIA_SEGMENT, type, mediaSegment);
+    
+                // Resolve pending seekPoint
+                if (this._pendingResolveSeekPoint != null && type === 'video') {
+                    var syncPoints = mediaSegment.info.syncPoints;
+                    var seekpoint = this._pendingResolveSeekPoint;
+                    this._pendingResolveSeekPoint = null;
+    
+                    // Safari: Pass PTS for recommend_seekpoint
+                    if (_browser2.default.safari && syncPoints.length > 0 && syncPoints[0].originalDts === seekpoint) {
+                        seekpoint = syncPoints[0].pts;
+                    }
+                    // else: use original DTS (keyframe.milliseconds)
+    
+                    this._emitter.emit(_transmuxingEvents2.default.RECOMMEND_SEEKPOINT, seekpoint);
+                }
+            }
+        }, {
+            key: '_enableStatisticsReporter',
+            value: function _enableStatisticsReporter() {
+                if (this._statisticsReporter == null) {
+                    this._statisticsReporter = self.setInterval(this._reportStatisticsInfo.bind(this), this._config.statisticsInfoReportInterval);
+                }
+            }
+        }, {
+            key: '_disableStatisticsReporter',
+            value: function _disableStatisticsReporter() {
+                if (this._statisticsReporter) {
+                    self.clearInterval(this._statisticsReporter);
+                    this._statisticsReporter = null;
+                }
+            }
+        }, {
+            key: '_reportSegmentMediaInfo',
+            value: function _reportSegmentMediaInfo(segmentIndex) {
+                var segmentInfo = this._mediaInfo.segments[segmentIndex];
+                var exportInfo = Object.assign({}, segmentInfo);
+    
+                exportInfo.duration = this._mediaInfo.duration;
+                exportInfo.segmentCount = this._mediaInfo.segmentCount;
+                delete exportInfo.segments;
+                delete exportInfo.keyframesIndex;
+    
+                this._emitter.emit(_transmuxingEvents2.default.MEDIA_INFO, exportInfo);
+            }
+        }, {
+            key: '_reportStatisticsInfo',
+            value: function _reportStatisticsInfo() {
+                var info = {};
+    
+                info.url = this._ioctl.currentURL;
+                info.hasRedirect = this._ioctl.hasRedirect;
+                if (info.hasRedirect) {
+                    info.redirectedURL = this._ioctl.currentRedirectedURL;
+                }
+    
+                info.speed = this._ioctl.currentSpeed;
+                info.loaderType = this._ioctl.loaderType;
+                info.currentSegmentIndex = this._currentSegmentIndex;
+                info.totalSegmentCount = this._mediaDataSource.segments.length;
+    
+                this._emitter.emit(_transmuxingEvents2.default.STATISTICS_INFO, info);
+            }
+        }]);
+    
+        return TransmuxingController;
+    }();
+    
+    exports.default = TransmuxingController;
+    
+    },{"../demux/demux-errors.js":16,"../demux/flv-demuxer.js":18,"../io/io-controller.js":23,"../io/loader.js":24,"../remux/mp4-remuxer.js":38,"../utils/browser.js":39,"../utils/logger.js":41,"./media-info.js":7,"./transmuxing-events.js":13,"events":2}],13:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+      value: true
+    });
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var TransmuxingEvents = {
+      IO_ERROR: 'io_error',
+      DEMUX_ERROR: 'demux_error',
+      INIT_SEGMENT: 'init_segment',
+      MEDIA_SEGMENT: 'media_segment',
+      LOADING_COMPLETE: 'loading_complete',
+      RECOVERED_EARLY_EOF: 'recovered_early_eof',
+      MEDIA_INFO: 'media_info',
+      METADATA_ARRIVED: 'metadata_arrived',
+      SCRIPTDATA_ARRIVED: 'scriptdata_arrived',
+      STATISTICS_INFO: 'statistics_info',
+      RECOMMEND_SEEKPOINT: 'recommend_seekpoint'
+    };
+    
+    exports.default = TransmuxingEvents;
+    
+    },{}],14:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _loggingControl = _dereq_('../utils/logging-control.js');
+    
+    var _loggingControl2 = _interopRequireDefault(_loggingControl);
+    
+    var _polyfill = _dereq_('../utils/polyfill.js');
+    
+    var _polyfill2 = _interopRequireDefault(_polyfill);
+    
+    var _transmuxingController = _dereq_('./transmuxing-controller.js');
+    
+    var _transmuxingController2 = _interopRequireDefault(_transmuxingController);
+    
+    var _transmuxingEvents = _dereq_('./transmuxing-events.js');
+    
+    var _transmuxingEvents2 = _interopRequireDefault(_transmuxingEvents);
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    /* post message to worker:
+       data: {
+           cmd: string
+           param: any
+       }
+    
+       receive message from worker:
+       data: {
+           msg: string,
+           data: any
+       }
+     */
+    
+    var TransmuxingWorker = function TransmuxingWorker(self) {
+    
+        var TAG = 'TransmuxingWorker';
+        var controller = null;
+        var logcatListener = onLogcatCallback.bind(this);
+    
+        _polyfill2.default.install();
+    
+        self.addEventListener('message', function (e) {
+            switch (e.data.cmd) {
+                case 'init':
+                    controller = new _transmuxingController2.default(e.data.param[0], e.data.param[1]);
+                    controller.on(_transmuxingEvents2.default.IO_ERROR, onIOError.bind(this));
+                    controller.on(_transmuxingEvents2.default.DEMUX_ERROR, onDemuxError.bind(this));
+                    controller.on(_transmuxingEvents2.default.INIT_SEGMENT, onInitSegment.bind(this));
+                    controller.on(_transmuxingEvents2.default.MEDIA_SEGMENT, onMediaSegment.bind(this));
+                    controller.on(_transmuxingEvents2.default.LOADING_COMPLETE, onLoadingComplete.bind(this));
+                    controller.on(_transmuxingEvents2.default.RECOVERED_EARLY_EOF, onRecoveredEarlyEof.bind(this));
+                    controller.on(_transmuxingEvents2.default.MEDIA_INFO, onMediaInfo.bind(this));
+                    controller.on(_transmuxingEvents2.default.METADATA_ARRIVED, onMetaDataArrived.bind(this));
+                    controller.on(_transmuxingEvents2.default.SCRIPTDATA_ARRIVED, onScriptDataArrived.bind(this));
+                    controller.on(_transmuxingEvents2.default.STATISTICS_INFO, onStatisticsInfo.bind(this));
+                    controller.on(_transmuxingEvents2.default.RECOMMEND_SEEKPOINT, onRecommendSeekpoint.bind(this));
+                    break;
+                case 'destroy':
+                    if (controller) {
+                        controller.destroy();
+                        controller = null;
+                    }
+                    self.postMessage({ msg: 'destroyed' });
+                    break;
+                case 'start':
+                    controller.start();
+                    break;
+                case 'stop':
+                    controller.stop();
+                    break;
+                case 'seek':
+                    controller.seek(e.data.param);
+                    break;
+                case 'pause':
+                    controller.pause();
+                    break;
+                case 'resume':
+                    controller.resume();
+                    break;
+                case 'logging_config':
+                    {
+                        var config = e.data.param;
+                        _loggingControl2.default.applyConfig(config);
+    
+                        if (config.enableCallback === true) {
+                            _loggingControl2.default.addLogListener(logcatListener);
+                        } else {
+                            _loggingControl2.default.removeLogListener(logcatListener);
+                        }
+                        break;
+                    }
+            }
+        });
+    
+        function onInitSegment(type, initSegment) {
+            var obj = {
+                msg: _transmuxingEvents2.default.INIT_SEGMENT,
+                data: {
+                    type: type,
+                    data: initSegment
+                }
+            };
+            self.postMessage(obj, [initSegment.data]); // data: ArrayBuffer
+        }
+    
+        function onMediaSegment(type, mediaSegment) {
+            var obj = {
+                msg: _transmuxingEvents2.default.MEDIA_SEGMENT,
+                data: {
+                    type: type,
+                    data: mediaSegment
+                }
+            };
+            self.postMessage(obj, [mediaSegment.data]); // data: ArrayBuffer
+        }
+    
+        function onLoadingComplete() {
+            var obj = {
+                msg: _transmuxingEvents2.default.LOADING_COMPLETE
+            };
+            self.postMessage(obj);
+        }
+    
+        function onRecoveredEarlyEof() {
+            var obj = {
+                msg: _transmuxingEvents2.default.RECOVERED_EARLY_EOF
+            };
+            self.postMessage(obj);
+        }
+    
+        function onMediaInfo(mediaInfo) {
+            var obj = {
+                msg: _transmuxingEvents2.default.MEDIA_INFO,
+                data: mediaInfo
+            };
+            self.postMessage(obj);
+        }
+    
+        function onMetaDataArrived(metadata) {
+            var obj = {
+                msg: _transmuxingEvents2.default.METADATA_ARRIVED,
+                data: metadata
+            };
+            self.postMessage(obj);
+        }
+    
+        function onScriptDataArrived(data) {
+            var obj = {
+                msg: _transmuxingEvents2.default.SCRIPTDATA_ARRIVED,
+                data: data
+            };
+            self.postMessage(obj);
+        }
+    
+        function onStatisticsInfo(statInfo) {
+            var obj = {
+                msg: _transmuxingEvents2.default.STATISTICS_INFO,
+                data: statInfo
+            };
+            self.postMessage(obj);
+        }
+    
+        function onIOError(type, info) {
+            self.postMessage({
+                msg: _transmuxingEvents2.default.IO_ERROR,
+                data: {
+                    type: type,
+                    info: info
+                }
+            });
+        }
+    
+        function onDemuxError(type, info) {
+            self.postMessage({
+                msg: _transmuxingEvents2.default.DEMUX_ERROR,
+                data: {
+                    type: type,
+                    info: info
+                }
+            });
+        }
+    
+        function onRecommendSeekpoint(milliseconds) {
+            self.postMessage({
+                msg: _transmuxingEvents2.default.RECOMMEND_SEEKPOINT,
+                data: milliseconds
+            });
+        }
+    
+        function onLogcatCallback(type, str) {
+            self.postMessage({
+                msg: 'logcat_callback',
+                data: {
+                    type: type,
+                    logcat: str
+                }
+            });
+        }
+    }; /*
+        * Copyright (C) 2016 Bilibili. All Rights Reserved.
+        *
+        * @author zheng qian <xqq@xqq.im>
+        *
+        * Licensed under the Apache License, Version 2.0 (the "License");
+        * you may not use this file except in compliance with the License.
+        * You may obtain a copy of the License at
+        *
+        *     http://www.apache.org/licenses/LICENSE-2.0
+        *
+        * Unless required by applicable law or agreed to in writing, software
+        * distributed under the License is distributed on an "AS IS" BASIS,
+        * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+        * See the License for the specific language governing permissions and
+        * limitations under the License.
+        */
+    
+    exports.default = TransmuxingWorker;
+    
+    },{"../utils/logger.js":41,"../utils/logging-control.js":42,"../utils/polyfill.js":43,"./transmuxing-controller.js":12,"./transmuxing-events.js":13}],15:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _utf8Conv = _dereq_('../utils/utf8-conv.js');
+    
+    var _utf8Conv2 = _interopRequireDefault(_utf8Conv);
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    var le = function () {
+        var buf = new ArrayBuffer(2);
+        new DataView(buf).setInt16(0, 256, true); // little-endian write
+        return new Int16Array(buf)[0] === 256; // platform-spec read, if equal then LE
+    }();
+    
+    var AMF = function () {
+        function AMF() {
+            _classCallCheck(this, AMF);
+        }
+    
+        _createClass(AMF, null, [{
+            key: 'parseScriptData',
+            value: function parseScriptData(arrayBuffer, dataOffset, dataSize) {
+                var data = {};
+    
+                try {
+                    var name = AMF.parseValue(arrayBuffer, dataOffset, dataSize);
+                    var value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);
+    
+                    data[name.data] = value.data;
+                } catch (e) {
+                    _logger2.default.e('AMF', e.toString());
+                }
+    
+                return data;
+            }
+        }, {
+            key: 'parseObject',
+            value: function parseObject(arrayBuffer, dataOffset, dataSize) {
+                if (dataSize < 3) {
+                    throw new _exception.IllegalStateException('Data not enough when parse ScriptDataObject');
+                }
+                var name = AMF.parseString(arrayBuffer, dataOffset, dataSize);
+                var value = AMF.parseValue(arrayBuffer, dataOffset + name.size, dataSize - name.size);
+                var isObjectEnd = value.objectEnd;
+    
+                return {
+                    data: {
+                        name: name.data,
+                        value: value.data
+                    },
+                    size: name.size + value.size,
+                    objectEnd: isObjectEnd
+                };
+            }
+        }, {
+            key: 'parseVariable',
+            value: function parseVariable(arrayBuffer, dataOffset, dataSize) {
+                return AMF.parseObject(arrayBuffer, dataOffset, dataSize);
+            }
+        }, {
+            key: 'parseString',
+            value: function parseString(arrayBuffer, dataOffset, dataSize) {
+                if (dataSize < 2) {
+                    throw new _exception.IllegalStateException('Data not enough when parse String');
+                }
+                var v = new DataView(arrayBuffer, dataOffset, dataSize);
+                var length = v.getUint16(0, !le);
+    
+                var str = void 0;
+                if (length > 0) {
+                    str = (0, _utf8Conv2.default)(new Uint8Array(arrayBuffer, dataOffset + 2, length));
+                } else {
+                    str = '';
+                }
+    
+                return {
+                    data: str,
+                    size: 2 + length
+                };
+            }
+        }, {
+            key: 'parseLongString',
+            value: function parseLongString(arrayBuffer, dataOffset, dataSize) {
+                if (dataSize < 4) {
+                    throw new _exception.IllegalStateException('Data not enough when parse LongString');
+                }
+                var v = new DataView(arrayBuffer, dataOffset, dataSize);
+                var length = v.getUint32(0, !le);
+    
+                var str = void 0;
+                if (length > 0) {
+                    str = (0, _utf8Conv2.default)(new Uint8Array(arrayBuffer, dataOffset + 4, length));
+                } else {
+                    str = '';
+                }
+    
+                return {
+                    data: str,
+                    size: 4 + length
+                };
+            }
+        }, {
+            key: 'parseDate',
+            value: function parseDate(arrayBuffer, dataOffset, dataSize) {
+                if (dataSize < 10) {
+                    throw new _exception.IllegalStateException('Data size invalid when parse Date');
+                }
+                var v = new DataView(arrayBuffer, dataOffset, dataSize);
+                var timestamp = v.getFloat64(0, !le);
+                var localTimeOffset = v.getInt16(8, !le);
+                timestamp += localTimeOffset * 60 * 1000; // get UTC time
+    
+                return {
+                    data: new Date(timestamp),
+                    size: 8 + 2
+                };
+            }
+        }, {
+            key: 'parseValue',
+            value: function parseValue(arrayBuffer, dataOffset, dataSize) {
+                if (dataSize < 1) {
+                    throw new _exception.IllegalStateException('Data not enough when parse Value');
+                }
+    
+                var v = new DataView(arrayBuffer, dataOffset, dataSize);
+    
+                var offset = 1;
+                var type = v.getUint8(0);
+                var value = void 0;
+                var objectEnd = false;
+    
+                try {
+                    switch (type) {
+                        case 0:
+                            // Number(Double) type
+                            value = v.getFloat64(1, !le);
+                            offset += 8;
+                            break;
+                        case 1:
+                            {
+                                // Boolean type
+                                var b = v.getUint8(1);
+                                value = b ? true : false;
+                                offset += 1;
+                                break;
+                            }
+                        case 2:
+                            {
+                                // String type
+                                var amfstr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);
+                                value = amfstr.data;
+                                offset += amfstr.size;
+                                break;
+                            }
+                        case 3:
+                            {
+                                // Object(s) type
+                                value = {};
+                                var terminal = 0; // workaround for malformed Objects which has missing ScriptDataObjectEnd
+                                if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {
+                                    terminal = 3;
+                                }
+                                while (offset < dataSize - 4) {
+                                    // 4 === type(UI8) + ScriptDataObjectEnd(UI24)
+                                    var amfobj = AMF.parseObject(arrayBuffer, dataOffset + offset, dataSize - offset - terminal);
+                                    if (amfobj.objectEnd) break;
+                                    value[amfobj.data.name] = amfobj.data.value;
+                                    offset += amfobj.size;
+                                }
+                                if (offset <= dataSize - 3) {
+                                    var marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;
+                                    if (marker === 9) {
+                                        offset += 3;
+                                    }
+                                }
+                                break;
+                            }
+                        case 8:
+                            {
+                                // ECMA array type (Mixed array)
+                                value = {};
+                                offset += 4; // ECMAArrayLength(UI32)
+                                var _terminal = 0; // workaround for malformed MixedArrays which has missing ScriptDataObjectEnd
+                                if ((v.getUint32(dataSize - 4, !le) & 0x00FFFFFF) === 9) {
+                                    _terminal = 3;
+                                }
+                                while (offset < dataSize - 8) {
+                                    // 8 === type(UI8) + ECMAArrayLength(UI32) + ScriptDataVariableEnd(UI24)
+                                    var amfvar = AMF.parseVariable(arrayBuffer, dataOffset + offset, dataSize - offset - _terminal);
+                                    if (amfvar.objectEnd) break;
+                                    value[amfvar.data.name] = amfvar.data.value;
+                                    offset += amfvar.size;
+                                }
+                                if (offset <= dataSize - 3) {
+                                    var _marker = v.getUint32(offset - 1, !le) & 0x00FFFFFF;
+                                    if (_marker === 9) {
+                                        offset += 3;
+                                    }
+                                }
+                                break;
+                            }
+                        case 9:
+                            // ScriptDataObjectEnd
+                            value = undefined;
+                            offset = 1;
+                            objectEnd = true;
+                            break;
+                        case 10:
+                            {
+                                // Strict array type
+                                // ScriptDataValue[n]. NOTE: according to video_file_format_spec_v10_1.pdf
+                                value = [];
+                                var strictArrayLength = v.getUint32(1, !le);
+                                offset += 4;
+                                for (var i = 0; i < strictArrayLength; i++) {
+                                    var val = AMF.parseValue(arrayBuffer, dataOffset + offset, dataSize - offset);
+                                    value.push(val.data);
+                                    offset += val.size;
+                                }
+                                break;
+                            }
+                        case 11:
+                            {
+                                // Date type
+                                var date = AMF.parseDate(arrayBuffer, dataOffset + 1, dataSize - 1);
+                                value = date.data;
+                                offset += date.size;
+                                break;
+                            }
+                        case 12:
+                            {
+                                // Long string type
+                                var amfLongStr = AMF.parseString(arrayBuffer, dataOffset + 1, dataSize - 1);
+                                value = amfLongStr.data;
+                                offset += amfLongStr.size;
+                                break;
+                            }
+                        default:
+                            // ignore and skip
+                            offset = dataSize;
+                            _logger2.default.w('AMF', 'Unsupported AMF value type ' + type);
+                    }
+                } catch (e) {
+                    _logger2.default.e('AMF', e.toString());
+                }
+    
+                return {
+                    data: value,
+                    size: offset,
+                    objectEnd: objectEnd
+                };
+            }
+        }]);
+    
+        return AMF;
+    }();
+    
+    exports.default = AMF;
+    
+    },{"../utils/exception.js":40,"../utils/logger.js":41,"../utils/utf8-conv.js":44}],16:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+      value: true
+    });
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var DemuxErrors = {
+      OK: 'OK',
+      FORMAT_ERROR: 'FormatError',
+      FORMAT_UNSUPPORTED: 'FormatUnsupported',
+      CODEC_UNSUPPORTED: 'CodecUnsupported'
+    };
+    
+    exports.default = DemuxErrors;
+    
+    },{}],17:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    // Exponential-Golomb buffer decoder
+    var ExpGolomb = function () {
+        function ExpGolomb(uint8array) {
+            _classCallCheck(this, ExpGolomb);
+    
+            this.TAG = 'ExpGolomb';
+    
+            this._buffer = uint8array;
+            this._buffer_index = 0;
+            this._total_bytes = uint8array.byteLength;
+            this._total_bits = uint8array.byteLength * 8;
+            this._current_word = 0;
+            this._current_word_bits_left = 0;
+        }
+    
+        _createClass(ExpGolomb, [{
+            key: 'destroy',
+            value: function destroy() {
+                this._buffer = null;
+            }
+        }, {
+            key: '_fillCurrentWord',
+            value: function _fillCurrentWord() {
+                var buffer_bytes_left = this._total_bytes - this._buffer_index;
+                if (buffer_bytes_left <= 0) throw new _exception.IllegalStateException('ExpGolomb: _fillCurrentWord() but no bytes available');
+    
+                var bytes_read = Math.min(4, buffer_bytes_left);
+                var word = new Uint8Array(4);
+                word.set(this._buffer.subarray(this._buffer_index, this._buffer_index + bytes_read));
+                this._current_word = new DataView(word.buffer).getUint32(0, false);
+    
+                this._buffer_index += bytes_read;
+                this._current_word_bits_left = bytes_read * 8;
+            }
+        }, {
+            key: 'readBits',
+            value: function readBits(bits) {
+                if (bits > 32) throw new _exception.InvalidArgumentException('ExpGolomb: readBits() bits exceeded max 32bits!');
+    
+                if (bits <= this._current_word_bits_left) {
+                    var _result = this._current_word >>> 32 - bits;
+                    this._current_word <<= bits;
+                    this._current_word_bits_left -= bits;
+                    return _result;
+                }
+    
+                var result = this._current_word_bits_left ? this._current_word : 0;
+                result = result >>> 32 - this._current_word_bits_left;
+                var bits_need_left = bits - this._current_word_bits_left;
+    
+                this._fillCurrentWord();
+                var bits_read_next = Math.min(bits_need_left, this._current_word_bits_left);
+    
+                var result2 = this._current_word >>> 32 - bits_read_next;
+                this._current_word <<= bits_read_next;
+                this._current_word_bits_left -= bits_read_next;
+    
+                result = result << bits_read_next | result2;
+                return result;
+            }
+        }, {
+            key: 'readBool',
+            value: function readBool() {
+                return this.readBits(1) === 1;
+            }
+        }, {
+            key: 'readByte',
+            value: function readByte() {
+                return this.readBits(8);
+            }
+        }, {
+            key: '_skipLeadingZero',
+            value: function _skipLeadingZero() {
+                var zero_count = void 0;
+                for (zero_count = 0; zero_count < this._current_word_bits_left; zero_count++) {
+                    if (0 !== (this._current_word & 0x80000000 >>> zero_count)) {
+                        this._current_word <<= zero_count;
+                        this._current_word_bits_left -= zero_count;
+                        return zero_count;
+                    }
+                }
+                this._fillCurrentWord();
+                return zero_count + this._skipLeadingZero();
+            }
+        }, {
+            key: 'readUEG',
+            value: function readUEG() {
+                // unsigned exponential golomb
+                var leading_zeros = this._skipLeadingZero();
+                return this.readBits(leading_zeros + 1) - 1;
+            }
+        }, {
+            key: 'readSEG',
+            value: function readSEG() {
+                // signed exponential golomb
+                var value = this.readUEG();
+                if (value & 0x01) {
+                    return value + 1 >>> 1;
+                } else {
+                    return -1 * (value >>> 1);
+                }
+            }
+        }]);
+    
+        return ExpGolomb;
+    }();
+    
+    exports.default = ExpGolomb;
+    
+    },{"../utils/exception.js":40}],18:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _amfParser = _dereq_('./amf-parser.js');
+    
+    var _amfParser2 = _interopRequireDefault(_amfParser);
+    
+    var _spsParser = _dereq_('./sps-parser.js');
+    
+    var _spsParser2 = _interopRequireDefault(_spsParser);
+    
+    var _demuxErrors = _dereq_('./demux-errors.js');
+    
+    var _demuxErrors2 = _interopRequireDefault(_demuxErrors);
+    
+    var _mediaInfo = _dereq_('../core/media-info.js');
+    
+    var _mediaInfo2 = _interopRequireDefault(_mediaInfo);
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    function Swap16(src) {
+        return src >>> 8 & 0xFF | (src & 0xFF) << 8;
+    }
+    
+    function Swap32(src) {
+        return (src & 0xFF000000) >>> 24 | (src & 0x00FF0000) >>> 8 | (src & 0x0000FF00) << 8 | (src & 0x000000FF) << 24;
+    }
+    
+    function ReadBig32(array, index) {
+        return array[index] << 24 | array[index + 1] << 16 | array[index + 2] << 8 | array[index + 3];
+    }
+    
+    var FLVDemuxer = function () {
+        function FLVDemuxer(probeData, config) {
+            _classCallCheck(this, FLVDemuxer);
+    
+            this.TAG = 'FLVDemuxer';
+    
+            this._config = config;
+    
+            this._onError = null;
+            this._onMediaInfo = null;
+            this._onMetaDataArrived = null;
+            this._onScriptDataArrived = null;
+            this._onTrackMetadata = null;
+            this._onDataAvailable = null;
+    
+            this._dataOffset = probeData.dataOffset;
+            this._firstParse = true;
+            this._dispatch = false;
+    
+            this._hasAudio = probeData.hasAudioTrack;
+            this._hasVideo = probeData.hasVideoTrack;
+    
+            this._hasAudioFlagOverrided = false;
+            this._hasVideoFlagOverrided = false;
+    
+            this._audioInitialMetadataDispatched = false;
+            this._videoInitialMetadataDispatched = false;
+    
+            this._mediaInfo = new _mediaInfo2.default();
+            this._mediaInfo.hasAudio = this._hasAudio;
+            this._mediaInfo.hasVideo = this._hasVideo;
+            this._metadata = null;
+            this._audioMetadata = null;
+            this._videoMetadata = null;
+    
+            this._naluLengthSize = 4;
+            this._timestampBase = 0; // int32, in milliseconds
+            this._timescale = 1000;
+            this._duration = 0; // int32, in milliseconds
+            this._durationOverrided = false;
+            this._referenceFrameRate = {
+                fixed: true,
+                fps: 23.976,
+                fps_num: 23976,
+                fps_den: 1000
+            };
+    
+            this._flvSoundRateTable = [5500, 11025, 22050, 44100, 48000];
+    
+            this._mpegSamplingRates = [96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050, 16000, 12000, 11025, 8000, 7350];
+    
+            this._mpegAudioV10SampleRateTable = [44100, 48000, 32000, 0];
+            this._mpegAudioV20SampleRateTable = [22050, 24000, 16000, 0];
+            this._mpegAudioV25SampleRateTable = [11025, 12000, 8000, 0];
+    
+            this._mpegAudioL1BitRateTable = [0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448, -1];
+            this._mpegAudioL2BitRateTable = [0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384, -1];
+            this._mpegAudioL3BitRateTable = [0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, -1];
+    
+            this._videoTrack = { type: 'video', id: 1, sequenceNumber: 0, samples: [], length: 0 };
+            this._audioTrack = { type: 'audio', id: 2, sequenceNumber: 0, samples: [], length: 0 };
+    
+            this._littleEndian = function () {
+                var buf = new ArrayBuffer(2);
+                new DataView(buf).setInt16(0, 256, true); // little-endian write
+                return new Int16Array(buf)[0] === 256; // platform-spec read, if equal then LE
+            }();
+        }
+    
+        _createClass(FLVDemuxer, [{
+            key: 'destroy',
+            value: function destroy() {
+                this._mediaInfo = null;
+                this._metadata = null;
+                this._audioMetadata = null;
+                this._videoMetadata = null;
+                this._videoTrack = null;
+                this._audioTrack = null;
+    
+                this._onError = null;
+                this._onMediaInfo = null;
+                this._onMetaDataArrived = null;
+                this._onScriptDataArrived = null;
+                this._onTrackMetadata = null;
+                this._onDataAvailable = null;
+            }
+        }, {
+            key: 'bindDataSource',
+            value: function bindDataSource(loader) {
+                loader.onDataArrival = this.parseChunks.bind(this);
+                return this;
+            }
+    
+            // prototype: function(type: string, metadata: any): void
+    
+        }, {
+            key: 'resetMediaInfo',
+            value: function resetMediaInfo() {
+                this._mediaInfo = new _mediaInfo2.default();
+            }
+        }, {
+            key: '_isInitialMetadataDispatched',
+            value: function _isInitialMetadataDispatched() {
+                if (this._hasAudio && this._hasVideo) {
+                    // both audio & video
+                    return this._audioInitialMetadataDispatched && this._videoInitialMetadataDispatched;
+                }
+                if (this._hasAudio && !this._hasVideo) {
+                    // audio only
+                    return this._audioInitialMetadataDispatched;
+                }
+                if (!this._hasAudio && this._hasVideo) {
+                    // video only
+                    return this._videoInitialMetadataDispatched;
+                }
+                return false;
+            }
+    
+            // function parseChunks(chunk: ArrayBuffer, byteStart: number): number;
+    
+        }, {
+            key: 'parseChunks',
+            value: function parseChunks(chunk, byteStart) {
+                if (!this._onError || !this._onMediaInfo || !this._onTrackMetadata || !this._onDataAvailable) {
+                    throw new _exception.IllegalStateException('Flv: onError & onMediaInfo & onTrackMetadata & onDataAvailable callback must be specified');
+                }
+    
+                var offset = 0;
+                var le = this._littleEndian;
+    
+                if (byteStart === 0) {
+                    // buffer with FLV header
+                    if (chunk.byteLength > 13) {
+                        var probeData = FLVDemuxer.probe(chunk);
+                        offset = probeData.dataOffset;
+                    } else {
+                        return 0;
+                    }
+                }
+    
+                if (this._firstParse) {
+                    // handle PreviousTagSize0 before Tag1
+                    this._firstParse = false;
+                    if (byteStart + offset !== this._dataOffset) {
+                        _logger2.default.w(this.TAG, 'First time parsing but chunk byteStart invalid!');
+                    }
+    
+                    var v = new DataView(chunk, offset);
+                    var prevTagSize0 = v.getUint32(0, !le);
+                    if (prevTagSize0 !== 0) {
+                        _logger2.default.w(this.TAG, 'PrevTagSize0 !== 0 !!!');
+                    }
+                    offset += 4;
+                }
+    
+                while (offset < chunk.byteLength) {
+                    this._dispatch = true;
+    
+                    var _v = new DataView(chunk, offset);
+    
+                    if (offset + 11 + 4 > chunk.byteLength) {
+                        // data not enough for parsing an flv tag
+                        break;
+                    }
+    
+                    var tagType = _v.getUint8(0);
+                    var dataSize = _v.getUint32(0, !le) & 0x00FFFFFF;
+    
+                    if (offset + 11 + dataSize + 4 > chunk.byteLength) {
+                        // data not enough for parsing actual data body
+                        break;
+                    }
+    
+                    if (tagType !== 8 && tagType !== 9 && tagType !== 18) {
+                        _logger2.default.w(this.TAG, 'Unsupported tag type ' + tagType + ', skipped');
+                        // consume the whole tag (skip it)
+                        offset += 11 + dataSize + 4;
+                        continue;
+                    }
+    
+                    var ts2 = _v.getUint8(4);
+                    var ts1 = _v.getUint8(5);
+                    var ts0 = _v.getUint8(6);
+                    var ts3 = _v.getUint8(7);
+    
+                    var timestamp = ts0 | ts1 << 8 | ts2 << 16 | ts3 << 24;
+    
+                    var streamId = _v.getUint32(7, !le) & 0x00FFFFFF;
+                    if (streamId !== 0) {
+                        _logger2.default.w(this.TAG, 'Meet tag which has StreamID != 0!');
+                    }
+    
+                    var dataOffset = offset + 11;
+    
+                    switch (tagType) {
+                        case 8:
+                            // Audio
+                            this._parseAudioData(chunk, dataOffset, dataSize, timestamp);
+                            break;
+                        case 9:
+                            // Video
+                            this._parseVideoData(chunk, dataOffset, dataSize, timestamp, byteStart + offset);
+                            break;
+                        case 18:
+                            // ScriptDataObject
+                            this._parseScriptData(chunk, dataOffset, dataSize);
+                            break;
+                    }
+    
+                    var prevTagSize = _v.getUint32(11 + dataSize, !le);
+                    if (prevTagSize !== 11 + dataSize) {
+                        _logger2.default.w(this.TAG, 'Invalid PrevTagSize ' + prevTagSize);
+                    }
+    
+                    offset += 11 + dataSize + 4; // tagBody + dataSize + prevTagSize
+                }
+    
+                // dispatch parsed frames to consumer (typically, the remuxer)
+                if (this._isInitialMetadataDispatched()) {
+                    if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {
+                        this._onDataAvailable(this._audioTrack, this._videoTrack);
+                    }
+                }
+    
+                return offset; // consumed bytes, just equals latest offset index
+            }
+        }, {
+            key: '_parseScriptData',
+            value: function _parseScriptData(arrayBuffer, dataOffset, dataSize) {
+                var scriptData = _amfParser2.default.parseScriptData(arrayBuffer, dataOffset, dataSize);
+    
+                if (scriptData.hasOwnProperty('onMetaData')) {
+                    if (scriptData.onMetaData == null || _typeof(scriptData.onMetaData) !== 'object') {
+                        _logger2.default.w(this.TAG, 'Invalid onMetaData structure!');
+                        return;
+                    }
+                    if (this._metadata) {
+                        _logger2.default.w(this.TAG, 'Found another onMetaData tag!');
+                    }
+                    this._metadata = scriptData;
+                    var onMetaData = this._metadata.onMetaData;
+    
+                    if (this._onMetaDataArrived) {
+                        this._onMetaDataArrived(Object.assign({}, onMetaData));
+                    }
+    
+                    if (typeof onMetaData.hasAudio === 'boolean') {
+                        // hasAudio
+                        if (this._hasAudioFlagOverrided === false) {
+                            this._hasAudio = onMetaData.hasAudio;
+                            this._mediaInfo.hasAudio = this._hasAudio;
+                        }
+                    }
+                    if (typeof onMetaData.hasVideo === 'boolean') {
+                        // hasVideo
+                        if (this._hasVideoFlagOverrided === false) {
+                            this._hasVideo = onMetaData.hasVideo;
+                            this._mediaInfo.hasVideo = this._hasVideo;
+                        }
+                    }
+                    if (typeof onMetaData.audiodatarate === 'number') {
+                        // audiodatarate
+                        this._mediaInfo.audioDataRate = onMetaData.audiodatarate;
+                    }
+                    if (typeof onMetaData.videodatarate === 'number') {
+                        // videodatarate
+                        this._mediaInfo.videoDataRate = onMetaData.videodatarate;
+                    }
+                    if (typeof onMetaData.width === 'number') {
+                        // width
+                        this._mediaInfo.width = onMetaData.width;
+                    }
+                    if (typeof onMetaData.height === 'number') {
+                        // height
+                        this._mediaInfo.height = onMetaData.height;
+                    }
+                    if (typeof onMetaData.duration === 'number') {
+                        // duration
+                        if (!this._durationOverrided) {
+                            var duration = Math.floor(onMetaData.duration * this._timescale);
+                            this._duration = duration;
+                            this._mediaInfo.duration = duration;
+                        }
+                    } else {
+                        this._mediaInfo.duration = 0;
+                    }
+                    if (typeof onMetaData.framerate === 'number') {
+                        // framerate
+                        var fps_num = Math.floor(onMetaData.framerate * 1000);
+                        if (fps_num > 0) {
+                            var fps = fps_num / 1000;
+                            this._referenceFrameRate.fixed = true;
+                            this._referenceFrameRate.fps = fps;
+                            this._referenceFrameRate.fps_num = fps_num;
+                            this._referenceFrameRate.fps_den = 1000;
+                            this._mediaInfo.fps = fps;
+                        }
+                    }
+                    if (_typeof(onMetaData.keyframes) === 'object') {
+                        // keyframes
+                        this._mediaInfo.hasKeyframesIndex = true;
+                        var keyframes = onMetaData.keyframes;
+                        this._mediaInfo.keyframesIndex = this._parseKeyframesIndex(keyframes);
+                        onMetaData.keyframes = null; // keyframes has been extracted, remove it
+                    } else {
+                        this._mediaInfo.hasKeyframesIndex = false;
+                    }
+                    this._dispatch = false;
+                    this._mediaInfo.metadata = onMetaData;
+                    _logger2.default.v(this.TAG, 'Parsed onMetaData');
+                    if (this._mediaInfo.isComplete()) {
+                        this._onMediaInfo(this._mediaInfo);
+                    }
+                }
+    
+                if (Object.keys(scriptData).length > 0) {
+                    if (this._onScriptDataArrived) {
+                        this._onScriptDataArrived(Object.assign({}, scriptData));
+                    }
+                }
+            }
+        }, {
+            key: '_parseKeyframesIndex',
+            value: function _parseKeyframesIndex(keyframes) {
+                var times = [];
+                var filepositions = [];
+    
+                // ignore first keyframe which is actually AVC Sequence Header (AVCDecoderConfigurationRecord)
+                for (var i = 1; i < keyframes.times.length; i++) {
+                    var time = this._timestampBase + Math.floor(keyframes.times[i] * 1000);
+                    times.push(time);
+                    filepositions.push(keyframes.filepositions[i]);
+                }
+    
+                return {
+                    times: times,
+                    filepositions: filepositions
+                };
+            }
+        }, {
+            key: '_parseAudioData',
+            value: function _parseAudioData(arrayBuffer, dataOffset, dataSize, tagTimestamp) {
+                if (dataSize <= 1) {
+                    _logger2.default.w(this.TAG, 'Flv: Invalid audio packet, missing SoundData payload!');
+                    return;
+                }
+    
+                if (this._hasAudioFlagOverrided === true && this._hasAudio === false) {
+                    // If hasAudio: false indicated explicitly in MediaDataSource,
+                    // Ignore all the audio packets
+                    return;
+                }
+    
+                var le = this._littleEndian;
+                var v = new DataView(arrayBuffer, dataOffset, dataSize);
+    
+                var soundSpec = v.getUint8(0);
+    
+                var soundFormat = soundSpec >>> 4;
+                if (soundFormat !== 2 && soundFormat !== 10) {
+                    // MP3 or AAC
+                    this._onError(_demuxErrors2.default.CODEC_UNSUPPORTED, 'Flv: Unsupported audio codec idx: ' + soundFormat);
+                    return;
+                }
+    
+                var soundRate = 0;
+                var soundRateIndex = (soundSpec & 12) >>> 2;
+                if (soundRateIndex >= 0 && soundRateIndex <= 4) {
+                    soundRate = this._flvSoundRateTable[soundRateIndex];
+                } else {
+                    this._onError(_demuxErrors2.default.FORMAT_ERROR, 'Flv: Invalid audio sample rate idx: ' + soundRateIndex);
+                    return;
+                }
+    
+                var soundSize = (soundSpec & 2) >>> 1; // unused
+                var soundType = soundSpec & 1;
+    
+                var meta = this._audioMetadata;
+                var track = this._audioTrack;
+    
+                if (!meta) {
+                    if (this._hasAudio === false && this._hasAudioFlagOverrided === false) {
+                        this._hasAudio = true;
+                        this._mediaInfo.hasAudio = true;
+                    }
+    
+                    // initial metadata
+                    meta = this._audioMetadata = {};
+                    meta.type = 'audio';
+                    meta.id = track.id;
+                    meta.timescale = this._timescale;
+                    meta.duration = this._duration;
+                    meta.audioSampleRate = soundRate;
+                    meta.channelCount = soundType === 0 ? 1 : 2;
+                }
+    
+                if (soundFormat === 10) {
+                    // AAC
+                    var aacData = this._parseAACAudioData(arrayBuffer, dataOffset + 1, dataSize - 1);
+                    if (aacData == undefined) {
+                        return;
+                    }
+    
+                    if (aacData.packetType === 0) {
+                        // AAC sequence header (AudioSpecificConfig)
+                        if (meta.config) {
+                            _logger2.default.w(this.TAG, 'Found another AudioSpecificConfig!');
+                        }
+                        var misc = aacData.data;
+                        meta.audioSampleRate = misc.samplingRate;
+                        meta.channelCount = misc.channelCount;
+                        meta.codec = misc.codec;
+                        meta.originalCodec = misc.originalCodec;
+                        meta.config = misc.config;
+                        // The decode result of an aac sample is 1024 PCM samples
+                        meta.refSampleDuration = 1024 / meta.audioSampleRate * meta.timescale;
+                        _logger2.default.v(this.TAG, 'Parsed AudioSpecificConfig');
+    
+                        if (this._isInitialMetadataDispatched()) {
+                            // Non-initial metadata, force dispatch (or flush) parsed frames to remuxer
+                            if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {
+                                this._onDataAvailable(this._audioTrack, this._videoTrack);
+                            }
+                        } else {
+                            this._audioInitialMetadataDispatched = true;
+                        }
+                        // then notify new metadata
+                        this._dispatch = false;
+                        this._onTrackMetadata('audio', meta);
+    
+                        var mi = this._mediaInfo;
+                        mi.audioCodec = meta.originalCodec;
+                        mi.audioSampleRate = meta.audioSampleRate;
+                        mi.audioChannelCount = meta.channelCount;
+                        if (mi.hasVideo) {
+                            if (mi.videoCodec != null) {
+                                mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + ',' + mi.audioCodec + '"';
+                            }
+                        } else {
+                            mi.mimeType = 'video/x-flv; codecs="' + mi.audioCodec + '"';
+                        }
+                        if (mi.isComplete()) {
+                            this._onMediaInfo(mi);
+                        }
+                    } else if (aacData.packetType === 1) {
+                        // AAC raw frame data
+                        var dts = this._timestampBase + tagTimestamp;
+                        var aacSample = { unit: aacData.data, length: aacData.data.byteLength, dts: dts, pts: dts };
+                        track.samples.push(aacSample);
+                        track.length += aacData.data.length;
+                    } else {
+                        _logger2.default.e(this.TAG, 'Flv: Unsupported AAC data type ' + aacData.packetType);
+                    }
+                } else if (soundFormat === 2) {
+                    // MP3
+                    if (!meta.codec) {
+                        // We need metadata for mp3 audio track, extract info from frame header
+                        var _misc = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, true);
+                        if (_misc == undefined) {
+                            return;
+                        }
+                        meta.audioSampleRate = _misc.samplingRate;
+                        meta.channelCount = _misc.channelCount;
+                        meta.codec = _misc.codec;
+                        meta.originalCodec = _misc.originalCodec;
+                        // The decode result of an mp3 sample is 1152 PCM samples
+                        meta.refSampleDuration = 1152 / meta.audioSampleRate * meta.timescale;
+                        _logger2.default.v(this.TAG, 'Parsed MPEG Audio Frame Header');
+    
+                        this._audioInitialMetadataDispatched = true;
+                        this._onTrackMetadata('audio', meta);
+    
+                        var _mi = this._mediaInfo;
+                        _mi.audioCodec = meta.codec;
+                        _mi.audioSampleRate = meta.audioSampleRate;
+                        _mi.audioChannelCount = meta.channelCount;
+                        _mi.audioDataRate = _misc.bitRate;
+                        if (_mi.hasVideo) {
+                            if (_mi.videoCodec != null) {
+                                _mi.mimeType = 'video/x-flv; codecs="' + _mi.videoCodec + ',' + _mi.audioCodec + '"';
+                            }
+                        } else {
+                            _mi.mimeType = 'video/x-flv; codecs="' + _mi.audioCodec + '"';
+                        }
+                        if (_mi.isComplete()) {
+                            this._onMediaInfo(_mi);
+                        }
+                    }
+    
+                    // This packet is always a valid audio packet, extract it
+                    var data = this._parseMP3AudioData(arrayBuffer, dataOffset + 1, dataSize - 1, false);
+                    if (data == undefined) {
+                        return;
+                    }
+                    var _dts = this._timestampBase + tagTimestamp;
+                    var mp3Sample = { unit: data, length: data.byteLength, dts: _dts, pts: _dts };
+                    track.samples.push(mp3Sample);
+                    track.length += data.length;
+                }
+            }
+        }, {
+            key: '_parseAACAudioData',
+            value: function _parseAACAudioData(arrayBuffer, dataOffset, dataSize) {
+                if (dataSize <= 1) {
+                    _logger2.default.w(this.TAG, 'Flv: Invalid AAC packet, missing AACPacketType or/and Data!');
+                    return;
+                }
+    
+                var result = {};
+                var array = new Uint8Array(arrayBuffer, dataOffset, dataSize);
+    
+                result.packetType = array[0];
+    
+                if (array[0] === 0) {
+                    result.data = this._parseAACAudioSpecificConfig(arrayBuffer, dataOffset + 1, dataSize - 1);
+                } else {
+                    result.data = array.subarray(1);
+                }
+    
+                return result;
+            }
+        }, {
+            key: '_parseAACAudioSpecificConfig',
+            value: function _parseAACAudioSpecificConfig(arrayBuffer, dataOffset, dataSize) {
+                var array = new Uint8Array(arrayBuffer, dataOffset, dataSize);
+                var config = null;
+    
+                /* Audio Object Type:
+                   0: Null
+                   1: AAC Main
+                   2: AAC LC
+                   3: AAC SSR (Scalable Sample Rate)
+                   4: AAC LTP (Long Term Prediction)
+                   5: HE-AAC / SBR (Spectral Band Replication)
+                   6: AAC Scalable
+                */
+    
+                var audioObjectType = 0;
+                var originalAudioObjectType = 0;
+                var audioExtensionObjectType = null;
+                var samplingIndex = 0;
+                var extensionSamplingIndex = null;
+    
+                // 5 bits
+                audioObjectType = originalAudioObjectType = array[0] >>> 3;
+                // 4 bits
+                samplingIndex = (array[0] & 0x07) << 1 | array[1] >>> 7;
+                if (samplingIndex < 0 || samplingIndex >= this._mpegSamplingRates.length) {
+                    this._onError(_demuxErrors2.default.FORMAT_ERROR, 'Flv: AAC invalid sampling frequency index!');
+                    return;
+                }
+    
+                var samplingFrequence = this._mpegSamplingRates[samplingIndex];
+    
+                // 4 bits
+                var channelConfig = (array[1] & 0x78) >>> 3;
+                if (channelConfig < 0 || channelConfig >= 8) {
+                    this._onError(_demuxErrors2.default.FORMAT_ERROR, 'Flv: AAC invalid channel configuration');
+                    return;
+                }
+    
+                if (audioObjectType === 5) {
+                    // HE-AAC?
+                    // 4 bits
+                    extensionSamplingIndex = (array[1] & 0x07) << 1 | array[2] >>> 7;
+                    // 5 bits
+                    audioExtensionObjectType = (array[2] & 0x7C) >>> 2;
+                }
+    
+                // workarounds for various browsers
+                var userAgent = self.navigator.userAgent.toLowerCase();
+    
+                if (userAgent.indexOf('firefox') !== -1) {
+                    // firefox: use SBR (HE-AAC) if freq less than 24kHz
+                    if (samplingIndex >= 6) {
+                        audioObjectType = 5;
+                        config = new Array(4);
+                        extensionSamplingIndex = samplingIndex - 3;
+                    } else {
+                        // use LC-AAC
+                        audioObjectType = 2;
+                        config = new Array(2);
+                        extensionSamplingIndex = samplingIndex;
+                    }
+                } else if (userAgent.indexOf('android') !== -1) {
+                    // android: always use LC-AAC
+                    audioObjectType = 2;
+                    config = new Array(2);
+                    extensionSamplingIndex = samplingIndex;
+                } else {
+                    // for other browsers, e.g. chrome...
+                    // Always use HE-AAC to make it easier to switch aac codec profile
+                    audioObjectType = 5;
+                    extensionSamplingIndex = samplingIndex;
+                    config = new Array(4);
+    
+                    if (samplingIndex >= 6) {
+                        extensionSamplingIndex = samplingIndex - 3;
+                    } else if (channelConfig === 1) {
+                        // Mono channel
+                        audioObjectType = 2;
+                        config = new Array(2);
+                        extensionSamplingIndex = samplingIndex;
+                    }
+                }
+    
+                config[0] = audioObjectType << 3;
+                config[0] |= (samplingIndex & 0x0F) >>> 1;
+                config[1] = (samplingIndex & 0x0F) << 7;
+                config[1] |= (channelConfig & 0x0F) << 3;
+                if (audioObjectType === 5) {
+                    config[1] |= (extensionSamplingIndex & 0x0F) >>> 1;
+                    config[2] = (extensionSamplingIndex & 0x01) << 7;
+                    // extended audio object type: force to 2 (LC-AAC)
+                    config[2] |= 2 << 2;
+                    config[3] = 0;
+                }
+    
+                return {
+                    config: config,
+                    samplingRate: samplingFrequence,
+                    channelCount: channelConfig,
+                    codec: 'mp4a.40.' + audioObjectType,
+                    originalCodec: 'mp4a.40.' + originalAudioObjectType
+                };
+            }
+        }, {
+            key: '_parseMP3AudioData',
+            value: function _parseMP3AudioData(arrayBuffer, dataOffset, dataSize, requestHeader) {
+                if (dataSize < 4) {
+                    _logger2.default.w(this.TAG, 'Flv: Invalid MP3 packet, header missing!');
+                    return;
+                }
+    
+                var le = this._littleEndian;
+                var array = new Uint8Array(arrayBuffer, dataOffset, dataSize);
+                var result = null;
+    
+                if (requestHeader) {
+                    if (array[0] !== 0xFF) {
+                        return;
+                    }
+                    var ver = array[1] >>> 3 & 0x03;
+                    var layer = (array[1] & 0x06) >> 1;
+    
+                    var bitrate_index = (array[2] & 0xF0) >>> 4;
+                    var sampling_freq_index = (array[2] & 0x0C) >>> 2;
+    
+                    var channel_mode = array[3] >>> 6 & 0x03;
+                    var channel_count = channel_mode !== 3 ? 2 : 1;
+    
+                    var sample_rate = 0;
+                    var bit_rate = 0;
+                    var object_type = 34; // Layer-3, listed in MPEG-4 Audio Object Types
+    
+                    var codec = 'mp3';
+    
+                    switch (ver) {
+                        case 0:
+                            // MPEG 2.5
+                            sample_rate = this._mpegAudioV25SampleRateTable[sampling_freq_index];
+                            break;
+                        case 2:
+                            // MPEG 2
+                            sample_rate = this._mpegAudioV20SampleRateTable[sampling_freq_index];
+                            break;
+                        case 3:
+                            // MPEG 1
+                            sample_rate = this._mpegAudioV10SampleRateTable[sampling_freq_index];
+                            break;
+                    }
+    
+                    switch (layer) {
+                        case 1:
+                            // Layer 3
+                            object_type = 34;
+                            if (bitrate_index < this._mpegAudioL3BitRateTable.length) {
+                                bit_rate = this._mpegAudioL3BitRateTable[bitrate_index];
+                            }
+                            break;
+                        case 2:
+                            // Layer 2
+                            object_type = 33;
+                            if (bitrate_index < this._mpegAudioL2BitRateTable.length) {
+                                bit_rate = this._mpegAudioL2BitRateTable[bitrate_index];
+                            }
+                            break;
+                        case 3:
+                            // Layer 1
+                            object_type = 32;
+                            if (bitrate_index < this._mpegAudioL1BitRateTable.length) {
+                                bit_rate = this._mpegAudioL1BitRateTable[bitrate_index];
+                            }
+                            break;
+                    }
+    
+                    result = {
+                        bitRate: bit_rate,
+                        samplingRate: sample_rate,
+                        channelCount: channel_count,
+                        codec: codec,
+                        originalCodec: codec
+                    };
+                } else {
+                    result = array;
+                }
+    
+                return result;
+            }
+        }, {
+            key: '_parseVideoData',
+            value: function _parseVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition) {
+                if (dataSize <= 1) {
+                    _logger2.default.w(this.TAG, 'Flv: Invalid video packet, missing VideoData payload!');
+                    return;
+                }
+    
+                if (this._hasVideoFlagOverrided === true && this._hasVideo === false) {
+                    // If hasVideo: false indicated explicitly in MediaDataSource,
+                    // Ignore all the video packets
+                    return;
+                }
+    
+                var spec = new Uint8Array(arrayBuffer, dataOffset, dataSize)[0];
+    
+                var frameType = (spec & 240) >>> 4;
+                var codecId = spec & 15;
+    
+                if (codecId !== 7) {
+                    this._onError(_demuxErrors2.default.CODEC_UNSUPPORTED, 'Flv: Unsupported codec in video frame: ' + codecId);
+                    return;
+                }
+    
+                this._parseAVCVideoPacket(arrayBuffer, dataOffset + 1, dataSize - 1, tagTimestamp, tagPosition, frameType);
+            }
+        }, {
+            key: '_parseAVCVideoPacket',
+            value: function _parseAVCVideoPacket(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType) {
+                if (dataSize < 4) {
+                    _logger2.default.w(this.TAG, 'Flv: Invalid AVC packet, missing AVCPacketType or/and CompositionTime');
+                    return;
+                }
+    
+                var le = this._littleEndian;
+                var v = new DataView(arrayBuffer, dataOffset, dataSize);
+    
+                var packetType = v.getUint8(0);
+                var cts_unsigned = v.getUint32(0, !le) & 0x00FFFFFF;
+                var cts = cts_unsigned << 8 >> 8; // convert to 24-bit signed int
+    
+                if (packetType === 0) {
+                    // AVCDecoderConfigurationRecord
+                    this._parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset + 4, dataSize - 4);
+                } else if (packetType === 1) {
+                    // One or more Nalus
+                    this._parseAVCVideoData(arrayBuffer, dataOffset + 4, dataSize - 4, tagTimestamp, tagPosition, frameType, cts);
+                } else if (packetType === 2) {
+                    // empty, AVC end of sequence
+                } else {
+                    this._onError(_demuxErrors2.default.FORMAT_ERROR, 'Flv: Invalid video packet type ' + packetType);
+                    return;
+                }
+            }
+        }, {
+            key: '_parseAVCDecoderConfigurationRecord',
+            value: function _parseAVCDecoderConfigurationRecord(arrayBuffer, dataOffset, dataSize) {
+                if (dataSize < 7) {
+                    _logger2.default.w(this.TAG, 'Flv: Invalid AVCDecoderConfigurationRecord, lack of data!');
+                    return;
+                }
+    
+                var meta = this._videoMetadata;
+                var track = this._videoTrack;
+                var le = this._littleEndian;
+                var v = new DataView(arrayBuffer, dataOffset, dataSize);
+    
+                if (!meta) {
+                    if (this._hasVideo === false && this._hasVideoFlagOverrided === false) {
+                        this._hasVideo = true;
+                        this._mediaInfo.hasVideo = true;
+                    }
+    
+                    meta = this._videoMetadata = {};
+                    meta.type = 'video';
+                    meta.id = track.id;
+                    meta.timescale = this._timescale;
+                    meta.duration = this._duration;
+                } else {
+                    if (typeof meta.avcc !== 'undefined') {
+                        _logger2.default.w(this.TAG, 'Found another AVCDecoderConfigurationRecord!');
+                    }
+                }
+    
+                var version = v.getUint8(0); // configurationVersion
+                var avcProfile = v.getUint8(1); // avcProfileIndication
+                var profileCompatibility = v.getUint8(2); // profile_compatibility
+                var avcLevel = v.getUint8(3); // AVCLevelIndication
+    
+                if (version !== 1 || avcProfile === 0) {
+                    this._onError(_demuxErrors2.default.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord');
+                    return;
+                }
+    
+                this._naluLengthSize = (v.getUint8(4) & 3) + 1; // lengthSizeMinusOne
+                if (this._naluLengthSize !== 3 && this._naluLengthSize !== 4) {
+                    // holy shit!!!
+                    this._onError(_demuxErrors2.default.FORMAT_ERROR, 'Flv: Strange NaluLengthSizeMinusOne: ' + (this._naluLengthSize - 1));
+                    return;
+                }
+    
+                var spsCount = v.getUint8(5) & 31; // numOfSequenceParameterSets
+                if (spsCount === 0) {
+                    this._onError(_demuxErrors2.default.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No SPS');
+                    return;
+                } else if (spsCount > 1) {
+                    _logger2.default.w(this.TAG, 'Flv: Strange AVCDecoderConfigurationRecord: SPS Count = ' + spsCount);
+                }
+    
+                var offset = 6;
+    
+                for (var i = 0; i < spsCount; i++) {
+                    var len = v.getUint16(offset, !le); // sequenceParameterSetLength
+                    offset += 2;
+    
+                    if (len === 0) {
+                        continue;
+                    }
+    
+                    // Notice: Nalu without startcode header (00 00 00 01)
+                    var sps = new Uint8Array(arrayBuffer, dataOffset + offset, len);
+                    offset += len;
+    
+                    var config = _spsParser2.default.parseSPS(sps);
+                    if (i !== 0) {
+                        // ignore other sps's config
+                        continue;
+                    }
+    
+                    meta.codecWidth = config.codec_size.width;
+                    meta.codecHeight = config.codec_size.height;
+                    meta.presentWidth = config.present_size.width;
+                    meta.presentHeight = config.present_size.height;
+    
+                    meta.profile = config.profile_string;
+                    meta.level = config.level_string;
+                    meta.bitDepth = config.bit_depth;
+                    meta.chromaFormat = config.chroma_format;
+                    meta.sarRatio = config.sar_ratio;
+                    meta.frameRate = config.frame_rate;
+    
+                    if (config.frame_rate.fixed === false || config.frame_rate.fps_num === 0 || config.frame_rate.fps_den === 0) {
+                        meta.frameRate = this._referenceFrameRate;
+                    }
+    
+                    var fps_den = meta.frameRate.fps_den;
+                    var fps_num = meta.frameRate.fps_num;
+                    meta.refSampleDuration = meta.timescale * (fps_den / fps_num);
+    
+                    var codecArray = sps.subarray(1, 4);
+                    var codecString = 'avc1.';
+                    for (var j = 0; j < 3; j++) {
+                        var h = codecArray[j].toString(16);
+                        if (h.length < 2) {
+                            h = '0' + h;
+                        }
+                        codecString += h;
+                    }
+                    meta.codec = codecString;
+    
+                    var mi = this._mediaInfo;
+                    mi.width = meta.codecWidth;
+                    mi.height = meta.codecHeight;
+                    mi.fps = meta.frameRate.fps;
+                    mi.profile = meta.profile;
+                    mi.level = meta.level;
+                    mi.refFrames = config.ref_frames;
+                    mi.chromaFormat = config.chroma_format_string;
+                    mi.sarNum = meta.sarRatio.width;
+                    mi.sarDen = meta.sarRatio.height;
+                    mi.videoCodec = codecString;
+    
+                    if (mi.hasAudio) {
+                        if (mi.audioCodec != null) {
+                            mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + ',' + mi.audioCodec + '"';
+                        }
+                    } else {
+                        mi.mimeType = 'video/x-flv; codecs="' + mi.videoCodec + '"';
+                    }
+                    if (mi.isComplete()) {
+                        this._onMediaInfo(mi);
+                    }
+                }
+    
+                var ppsCount = v.getUint8(offset); // numOfPictureParameterSets
+                if (ppsCount === 0) {
+                    this._onError(_demuxErrors2.default.FORMAT_ERROR, 'Flv: Invalid AVCDecoderConfigurationRecord: No PPS');
+                    return;
+                } else if (ppsCount > 1) {
+                    _logger2.default.w(this.TAG, 'Flv: Strange AVCDecoderConfigurationRecord: PPS Count = ' + ppsCount);
+                }
+    
+                offset++;
+    
+                for (var _i = 0; _i < ppsCount; _i++) {
+                    var _len = v.getUint16(offset, !le); // pictureParameterSetLength
+                    offset += 2;
+    
+                    if (_len === 0) {
+                        continue;
+                    }
+    
+                    // pps is useless for extracting video information
+                    offset += _len;
+                }
+    
+                meta.avcc = new Uint8Array(dataSize);
+                meta.avcc.set(new Uint8Array(arrayBuffer, dataOffset, dataSize), 0);
+                _logger2.default.v(this.TAG, 'Parsed AVCDecoderConfigurationRecord');
+    
+                if (this._isInitialMetadataDispatched()) {
+                    // flush parsed frames
+                    if (this._dispatch && (this._audioTrack.length || this._videoTrack.length)) {
+                        this._onDataAvailable(this._audioTrack, this._videoTrack);
+                    }
+                } else {
+                    this._videoInitialMetadataDispatched = true;
+                }
+                // notify new metadata
+                this._dispatch = false;
+                this._onTrackMetadata('video', meta);
+            }
+        }, {
+            key: '_parseAVCVideoData',
+            value: function _parseAVCVideoData(arrayBuffer, dataOffset, dataSize, tagTimestamp, tagPosition, frameType, cts) {
+                var le = this._littleEndian;
+                var v = new DataView(arrayBuffer, dataOffset, dataSize);
+    
+                var units = [],
+                    length = 0;
+    
+                var offset = 0;
+                var lengthSize = this._naluLengthSize;
+                var dts = this._timestampBase + tagTimestamp;
+                var keyframe = frameType === 1; // from FLV Frame Type constants
+    
+                while (offset < dataSize) {
+                    if (offset + 4 >= dataSize) {
+                        _logger2.default.w(this.TAG, 'Malformed Nalu near timestamp ' + dts + ', offset = ' + offset + ', dataSize = ' + dataSize);
+                        break; // data not enough for next Nalu
+                    }
+                    // Nalu with length-header (AVC1)
+                    var naluSize = v.getUint32(offset, !le); // Big-Endian read
+                    if (lengthSize === 3) {
+                        naluSize >>>= 8;
+                    }
+                    if (naluSize > dataSize - lengthSize) {
+                        _logger2.default.w(this.TAG, 'Malformed Nalus near timestamp ' + dts + ', NaluSize > DataSize!');
+                        return;
+                    }
+    
+                    var unitType = v.getUint8(offset + lengthSize) & 0x1F;
+    
+                    if (unitType === 5) {
+                        // IDR
+                        keyframe = true;
+                    }
+    
+                    var data = new Uint8Array(arrayBuffer, dataOffset + offset, lengthSize + naluSize);
+                    var unit = { type: unitType, data: data };
+                    units.push(unit);
+                    length += data.byteLength;
+    
+                    offset += lengthSize + naluSize;
+                }
+    
+                if (units.length) {
+                    var track = this._videoTrack;
+                    var avcSample = {
+                        units: units,
+                        length: length,
+                        isKeyframe: keyframe,
+                        dts: dts,
+                        cts: cts,
+                        pts: dts + cts
+                    };
+                    if (keyframe) {
+                        avcSample.fileposition = tagPosition;
+                    }
+                    track.samples.push(avcSample);
+                    track.length += length;
+                }
+            }
+        }, {
+            key: 'onTrackMetadata',
+            get: function get() {
+                return this._onTrackMetadata;
+            },
+            set: function set(callback) {
+                this._onTrackMetadata = callback;
+            }
+    
+            // prototype: function(mediaInfo: MediaInfo): void
+    
+        }, {
+            key: 'onMediaInfo',
+            get: function get() {
+                return this._onMediaInfo;
+            },
+            set: function set(callback) {
+                this._onMediaInfo = callback;
+            }
+        }, {
+            key: 'onMetaDataArrived',
+            get: function get() {
+                return this._onMetaDataArrived;
+            },
+            set: function set(callback) {
+                this._onMetaDataArrived = callback;
+            }
+        }, {
+            key: 'onScriptDataArrived',
+            get: function get() {
+                return this._onScriptDataArrived;
+            },
+            set: function set(callback) {
+                this._onScriptDataArrived = callback;
+            }
+    
+            // prototype: function(type: number, info: string): void
+    
+        }, {
+            key: 'onError',
+            get: function get() {
+                return this._onError;
+            },
+            set: function set(callback) {
+                this._onError = callback;
+            }
+    
+            // prototype: function(videoTrack: any, audioTrack: any): void
+    
+        }, {
+            key: 'onDataAvailable',
+            get: function get() {
+                return this._onDataAvailable;
+            },
+            set: function set(callback) {
+                this._onDataAvailable = callback;
+            }
+    
+            // timestamp base for output samples, must be in milliseconds
+    
+        }, {
+            key: 'timestampBase',
+            get: function get() {
+                return this._timestampBase;
+            },
+            set: function set(base) {
+                this._timestampBase = base;
+            }
+        }, {
+            key: 'overridedDuration',
+            get: function get() {
+                return this._duration;
+            }
+    
+            // Force-override media duration. Must be in milliseconds, int32
+            ,
+            set: function set(duration) {
+                this._durationOverrided = true;
+                this._duration = duration;
+                this._mediaInfo.duration = duration;
+            }
+    
+            // Force-override audio track present flag, boolean
+    
+        }, {
+            key: 'overridedHasAudio',
+            set: function set(hasAudio) {
+                this._hasAudioFlagOverrided = true;
+                this._hasAudio = hasAudio;
+                this._mediaInfo.hasAudio = hasAudio;
+            }
+    
+            // Force-override video track present flag, boolean
+    
+        }, {
+            key: 'overridedHasVideo',
+            set: function set(hasVideo) {
+                this._hasVideoFlagOverrided = true;
+                this._hasVideo = hasVideo;
+                this._mediaInfo.hasVideo = hasVideo;
+            }
+        }], [{
+            key: 'probe',
+            value: function probe(buffer) {
+                var data = new Uint8Array(buffer);
+                var mismatch = { match: false };
+    
+                if (data[0] !== 0x46 || data[1] !== 0x4C || data[2] !== 0x56 || data[3] !== 0x01) {
+                    return mismatch;
+                }
+    
+                var hasAudio = (data[4] & 4) >>> 2 !== 0;
+                var hasVideo = (data[4] & 1) !== 0;
+    
+                var offset = ReadBig32(data, 5);
+    
+                if (offset < 9) {
+                    return mismatch;
+                }
+    
+                return {
+                    match: true,
+                    consumed: offset,
+                    dataOffset: offset,
+                    hasAudioTrack: hasAudio,
+                    hasVideoTrack: hasVideo
+                };
+            }
+        }]);
+    
+        return FLVDemuxer;
+    }();
+    
+    exports.default = FLVDemuxer;
+    
+    },{"../core/media-info.js":7,"../utils/exception.js":40,"../utils/logger.js":41,"./amf-parser.js":15,"./demux-errors.js":16,"./sps-parser.js":19}],19:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _expGolomb = _dereq_('./exp-golomb.js');
+    
+    var _expGolomb2 = _interopRequireDefault(_expGolomb);
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    var SPSParser = function () {
+        function SPSParser() {
+            _classCallCheck(this, SPSParser);
+        }
+    
+        _createClass(SPSParser, null, [{
+            key: '_ebsp2rbsp',
+            value: function _ebsp2rbsp(uint8array) {
+                var src = uint8array;
+                var src_length = src.byteLength;
+                var dst = new Uint8Array(src_length);
+                var dst_idx = 0;
+    
+                for (var i = 0; i < src_length; i++) {
+                    if (i >= 2) {
+                        // Unescape: Skip 0x03 after 00 00
+                        if (src[i] === 0x03 && src[i - 1] === 0x00 && src[i - 2] === 0x00) {
+                            continue;
+                        }
+                    }
+                    dst[dst_idx] = src[i];
+                    dst_idx++;
+                }
+    
+                return new Uint8Array(dst.buffer, 0, dst_idx);
+            }
+        }, {
+            key: 'parseSPS',
+            value: function parseSPS(uint8array) {
+                var rbsp = SPSParser._ebsp2rbsp(uint8array);
+                var gb = new _expGolomb2.default(rbsp);
+    
+                gb.readByte();
+                var profile_idc = gb.readByte(); // profile_idc
+                gb.readByte(); // constraint_set_flags[5] + reserved_zero[3]
+                var level_idc = gb.readByte(); // level_idc
+                gb.readUEG(); // seq_parameter_set_id
+    
+                var profile_string = SPSParser.getProfileString(profile_idc);
+                var level_string = SPSParser.getLevelString(level_idc);
+                var chroma_format_idc = 1;
+                var chroma_format = 420;
+                var chroma_format_table = [0, 420, 422, 444];
+                var bit_depth = 8;
+    
+                if (profile_idc === 100 || profile_idc === 110 || profile_idc === 122 || profile_idc === 244 || profile_idc === 44 || profile_idc === 83 || profile_idc === 86 || profile_idc === 118 || profile_idc === 128 || profile_idc === 138 || profile_idc === 144) {
+    
+                    chroma_format_idc = gb.readUEG();
+                    if (chroma_format_idc === 3) {
+                        gb.readBits(1); // separate_colour_plane_flag
+                    }
+                    if (chroma_format_idc <= 3) {
+                        chroma_format = chroma_format_table[chroma_format_idc];
+                    }
+    
+                    bit_depth = gb.readUEG() + 8; // bit_depth_luma_minus8
+                    gb.readUEG(); // bit_depth_chroma_minus8
+                    gb.readBits(1); // qpprime_y_zero_transform_bypass_flag
+                    if (gb.readBool()) {
+                        // seq_scaling_matrix_present_flag
+                        var scaling_list_count = chroma_format_idc !== 3 ? 8 : 12;
+                        for (var i = 0; i < scaling_list_count; i++) {
+                            if (gb.readBool()) {
+                                // seq_scaling_list_present_flag
+                                if (i < 6) {
+                                    SPSParser._skipScalingList(gb, 16);
+                                } else {
+                                    SPSParser._skipScalingList(gb, 64);
+                                }
+                            }
+                        }
+                    }
+                }
+                gb.readUEG(); // log2_max_frame_num_minus4
+                var pic_order_cnt_type = gb.readUEG();
+                if (pic_order_cnt_type === 0) {
+                    gb.readUEG(); // log2_max_pic_order_cnt_lsb_minus_4
+                } else if (pic_order_cnt_type === 1) {
+                    gb.readBits(1); // delta_pic_order_always_zero_flag
+                    gb.readSEG(); // offset_for_non_ref_pic
+                    gb.readSEG(); // offset_for_top_to_bottom_field
+                    var num_ref_frames_in_pic_order_cnt_cycle = gb.readUEG();
+                    for (var _i = 0; _i < num_ref_frames_in_pic_order_cnt_cycle; _i++) {
+                        gb.readSEG(); // offset_for_ref_frame
+                    }
+                }
+                var ref_frames = gb.readUEG(); // max_num_ref_frames
+                gb.readBits(1); // gaps_in_frame_num_value_allowed_flag
+    
+                var pic_width_in_mbs_minus1 = gb.readUEG();
+                var pic_height_in_map_units_minus1 = gb.readUEG();
+    
+                var frame_mbs_only_flag = gb.readBits(1);
+                if (frame_mbs_only_flag === 0) {
+                    gb.readBits(1); // mb_adaptive_frame_field_flag
+                }
+                gb.readBits(1); // direct_8x8_inference_flag
+    
+                var frame_crop_left_offset = 0;
+                var frame_crop_right_offset = 0;
+                var frame_crop_top_offset = 0;
+                var frame_crop_bottom_offset = 0;
+    
+                var frame_cropping_flag = gb.readBool();
+                if (frame_cropping_flag) {
+                    frame_crop_left_offset = gb.readUEG();
+                    frame_crop_right_offset = gb.readUEG();
+                    frame_crop_top_offset = gb.readUEG();
+                    frame_crop_bottom_offset = gb.readUEG();
+                }
+    
+                var sar_width = 1,
+                    sar_height = 1;
+                var fps = 0,
+                    fps_fixed = true,
+                    fps_num = 0,
+                    fps_den = 0;
+    
+                var vui_parameters_present_flag = gb.readBool();
+                if (vui_parameters_present_flag) {
+                    if (gb.readBool()) {
+                        // aspect_ratio_info_present_flag
+                        var aspect_ratio_idc = gb.readByte();
+                        var sar_w_table = [1, 12, 10, 16, 40, 24, 20, 32, 80, 18, 15, 64, 160, 4, 3, 2];
+                        var sar_h_table = [1, 11, 11, 11, 33, 11, 11, 11, 33, 11, 11, 33, 99, 3, 2, 1];
+    
+                        if (aspect_ratio_idc > 0 && aspect_ratio_idc < 16) {
+                            sar_width = sar_w_table[aspect_ratio_idc - 1];
+                            sar_height = sar_h_table[aspect_ratio_idc - 1];
+                        } else if (aspect_ratio_idc === 255) {
+                            sar_width = gb.readByte() << 8 | gb.readByte();
+                            sar_height = gb.readByte() << 8 | gb.readByte();
+                        }
+                    }
+    
+                    if (gb.readBool()) {
+                        // overscan_info_present_flag
+                        gb.readBool(); // overscan_appropriate_flag
+                    }
+                    if (gb.readBool()) {
+                        // video_signal_type_present_flag
+                        gb.readBits(4); // video_format & video_full_range_flag
+                        if (gb.readBool()) {
+                            // colour_description_present_flag
+                            gb.readBits(24); // colour_primaries & transfer_characteristics & matrix_coefficients
+                        }
+                    }
+                    if (gb.readBool()) {
+                        // chroma_loc_info_present_flag
+                        gb.readUEG(); // chroma_sample_loc_type_top_field
+                        gb.readUEG(); // chroma_sample_loc_type_bottom_field
+                    }
+                    if (gb.readBool()) {
+                        // timing_info_present_flag
+                        var num_units_in_tick = gb.readBits(32);
+                        var time_scale = gb.readBits(32);
+                        fps_fixed = gb.readBool(); // fixed_frame_rate_flag
+    
+                        fps_num = time_scale;
+                        fps_den = num_units_in_tick * 2;
+                        fps = fps_num / fps_den;
+                    }
+                }
+    
+                var sarScale = 1;
+                if (sar_width !== 1 || sar_height !== 1) {
+                    sarScale = sar_width / sar_height;
+                }
+    
+                var crop_unit_x = 0,
+                    crop_unit_y = 0;
+                if (chroma_format_idc === 0) {
+                    crop_unit_x = 1;
+                    crop_unit_y = 2 - frame_mbs_only_flag;
+                } else {
+                    var sub_wc = chroma_format_idc === 3 ? 1 : 2;
+                    var sub_hc = chroma_format_idc === 1 ? 2 : 1;
+                    crop_unit_x = sub_wc;
+                    crop_unit_y = sub_hc * (2 - frame_mbs_only_flag);
+                }
+    
+                var codec_width = (pic_width_in_mbs_minus1 + 1) * 16;
+                var codec_height = (2 - frame_mbs_only_flag) * ((pic_height_in_map_units_minus1 + 1) * 16);
+    
+                codec_width -= (frame_crop_left_offset + frame_crop_right_offset) * crop_unit_x;
+                codec_height -= (frame_crop_top_offset + frame_crop_bottom_offset) * crop_unit_y;
+    
+                var present_width = Math.ceil(codec_width * sarScale);
+    
+                gb.destroy();
+                gb = null;
+    
+                return {
+                    profile_string: profile_string, // baseline, high, high10, ...
+                    level_string: level_string, // 3, 3.1, 4, 4.1, 5, 5.1, ...
+                    bit_depth: bit_depth, // 8bit, 10bit, ...
+                    ref_frames: ref_frames,
+                    chroma_format: chroma_format, // 4:2:0, 4:2:2, ...
+                    chroma_format_string: SPSParser.getChromaFormatString(chroma_format),
+    
+                    frame_rate: {
+                        fixed: fps_fixed,
+                        fps: fps,
+                        fps_den: fps_den,
+                        fps_num: fps_num
+                    },
+    
+                    sar_ratio: {
+                        width: sar_width,
+                        height: sar_height
+                    },
+    
+                    codec_size: {
+                        width: codec_width,
+                        height: codec_height
+                    },
+    
+                    present_size: {
+                        width: present_width,
+                        height: codec_height
+                    }
+                };
+            }
+        }, {
+            key: '_skipScalingList',
+            value: function _skipScalingList(gb, count) {
+                var last_scale = 8,
+                    next_scale = 8;
+                var delta_scale = 0;
+                for (var i = 0; i < count; i++) {
+                    if (next_scale !== 0) {
+                        delta_scale = gb.readSEG();
+                        next_scale = (last_scale + delta_scale + 256) % 256;
+                    }
+                    last_scale = next_scale === 0 ? last_scale : next_scale;
+                }
+            }
+        }, {
+            key: 'getProfileString',
+            value: function getProfileString(profile_idc) {
+                switch (profile_idc) {
+                    case 66:
+                        return 'Baseline';
+                    case 77:
+                        return 'Main';
+                    case 88:
+                        return 'Extended';
+                    case 100:
+                        return 'High';
+                    case 110:
+                        return 'High10';
+                    case 122:
+                        return 'High422';
+                    case 244:
+                        return 'High444';
+                    default:
+                        return 'Unknown';
+                }
+            }
+        }, {
+            key: 'getLevelString',
+            value: function getLevelString(level_idc) {
+                return (level_idc / 10).toFixed(1);
+            }
+        }, {
+            key: 'getChromaFormatString',
+            value: function getChromaFormatString(chroma) {
+                switch (chroma) {
+                    case 420:
+                        return '4:2:0';
+                    case 422:
+                        return '4:2:2';
+                    case 444:
+                        return '4:4:4';
+                    default:
+                        return 'Unknown';
+                }
+            }
+        }]);
+    
+        return SPSParser;
+    }();
+    
+    exports.default = SPSParser;
+    
+    },{"./exp-golomb.js":17}],20:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; /*
+                                                                                                                                                                                                                                                                                   * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                   *
+                                                                                                                                                                                                                                                                                   * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                   *
+                                                                                                                                                                                                                                                                                   * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                   * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                   * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                   *
+                                                                                                                                                                                                                                                                                   *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                   *
+                                                                                                                                                                                                                                                                                   * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                   * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                   * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                   * limitations under the License.
+                                                                                                                                                                                                                                                                                   */
+    
+    var _polyfill = _dereq_('./utils/polyfill.js');
+    
+    var _polyfill2 = _interopRequireDefault(_polyfill);
+    
+    var _features = _dereq_('./core/features.js');
+    
+    var _features2 = _interopRequireDefault(_features);
+    
+    var _loader = _dereq_('./io/loader.js');
+    
+    var _flvPlayer = _dereq_('./player/flv-player.js');
+    
+    var _flvPlayer2 = _interopRequireDefault(_flvPlayer);
+    
+    var _nativePlayer = _dereq_('./player/native-player.js');
+    
+    var _nativePlayer2 = _interopRequireDefault(_nativePlayer);
+    
+    var _playerEvents = _dereq_('./player/player-events.js');
+    
+    var _playerEvents2 = _interopRequireDefault(_playerEvents);
+    
+    var _playerErrors = _dereq_('./player/player-errors.js');
+    
+    var _loggingControl = _dereq_('./utils/logging-control.js');
+    
+    var _loggingControl2 = _interopRequireDefault(_loggingControl);
+    
+    var _exception = _dereq_('./utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    // here are all the interfaces
+    
+    // install polyfills
+    _polyfill2.default.install();
+    
+    // factory method
+    function createPlayer(mediaDataSource, optionalConfig) {
+        var mds = mediaDataSource;
+        if (mds == null || (typeof mds === 'undefined' ? 'undefined' : _typeof(mds)) !== 'object') {
+            throw new _exception.InvalidArgumentException('MediaDataSource must be an javascript object!');
+        }
+    
+        if (!mds.hasOwnProperty('type')) {
+            throw new _exception.InvalidArgumentException('MediaDataSource must has type field to indicate video file type!');
+        }
+    
+        switch (mds.type) {
+            case 'flv':
+                return new _flvPlayer2.default(mds, optionalConfig);
+            default:
+                return new _nativePlayer2.default(mds, optionalConfig);
+        }
+    }
+    
+    // feature detection
+    function isSupported() {
+        return _features2.default.supportMSEH264Playback();
+    }
+    
+    function getFeatureList() {
+        return _features2.default.getFeatureList();
+    }
+    
+    // interfaces
+    var flvjs = {};
+    
+    flvjs.createPlayer = createPlayer;
+    flvjs.isSupported = isSupported;
+    flvjs.getFeatureList = getFeatureList;
+    
+    flvjs.BaseLoader = _loader.BaseLoader;
+    flvjs.LoaderStatus = _loader.LoaderStatus;
+    flvjs.LoaderErrors = _loader.LoaderErrors;
+    
+    flvjs.Events = _playerEvents2.default;
+    flvjs.ErrorTypes = _playerErrors.ErrorTypes;
+    flvjs.ErrorDetails = _playerErrors.ErrorDetails;
+    
+    flvjs.FlvPlayer = _flvPlayer2.default;
+    flvjs.NativePlayer = _nativePlayer2.default;
+    flvjs.LoggingControl = _loggingControl2.default;
+    
+    Object.defineProperty(flvjs, 'version', {
+        enumerable: true,
+        get: function get() {
+            // replaced by browserify-versionify transform
+            return '1.5.0';
+        }
+    });
+    
+    exports.default = flvjs;
+    
+    },{"./core/features.js":6,"./io/loader.js":24,"./player/flv-player.js":32,"./player/native-player.js":33,"./player/player-errors.js":34,"./player/player-events.js":35,"./utils/exception.js":40,"./utils/logging-control.js":42,"./utils/polyfill.js":43}],21:[function(_dereq_,module,exports){
+    'use strict';
+    
+    // entry/index file
+    
+    // make it compatible with browserify's umd wrapper
+    module.exports = _dereq_('./flv.js').default;
+    
+    },{"./flv.js":20}],22:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+    
+    var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _browser = _dereq_('../utils/browser.js');
+    
+    var _browser2 = _interopRequireDefault(_browser);
+    
+    var _loader = _dereq_('./loader.js');
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+    
+    function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    */
+    
+    /* fetch + stream IO loader. Currently working on chrome 43+.
+     * fetch provides a better alternative http API to XMLHttpRequest
+     *
+     * fetch spec   https://fetch.spec.whatwg.org/
+     * stream spec  https://streams.spec.whatwg.org/
+     */
+    var FetchStreamLoader = function (_BaseLoader) {
+        _inherits(FetchStreamLoader, _BaseLoader);
+    
+        _createClass(FetchStreamLoader, null, [{
+            key: 'isSupported',
+            value: function isSupported() {
+                try {
+                    // fetch + stream is broken on Microsoft Edge. Disable before build 15048.
+                    // see https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/8196907/
+                    // Fixed in Jan 10, 2017. Build 15048+ removed from blacklist.
+                    var isWorkWellEdge = _browser2.default.msedge && _browser2.default.version.minor >= 15048;
+                    var browserNotBlacklisted = _browser2.default.msedge ? isWorkWellEdge : true;
+                    return self.fetch && self.ReadableStream && browserNotBlacklisted;
+                } catch (e) {
+                    return false;
+                }
+            }
+        }]);
+    
+        function FetchStreamLoader(seekHandler, config) {
+            _classCallCheck(this, FetchStreamLoader);
+    
+            var _this = _possibleConstructorReturn(this, (FetchStreamLoader.__proto__ || Object.getPrototypeOf(FetchStreamLoader)).call(this, 'fetch-stream-loader'));
+    
+            _this.TAG = 'FetchStreamLoader';
+    
+            _this._seekHandler = seekHandler;
+            _this._config = config;
+            _this._needStash = true;
+    
+            _this._requestAbort = false;
+            _this._contentLength = null;
+            _this._receivedLength = 0;
+            return _this;
+        }
+    
+        _createClass(FetchStreamLoader, [{
+            key: 'destroy',
+            value: function destroy() {
+                if (this.isWorking()) {
+                    this.abort();
+                }
+                _get(FetchStreamLoader.prototype.__proto__ || Object.getPrototypeOf(FetchStreamLoader.prototype), 'destroy', this).call(this);
+            }
+        }, {
+            key: 'open',
+            value: function open(dataSource, range) {
+                var _this2 = this;
+    
+                this._dataSource = dataSource;
+                this._range = range;
+    
+                var sourceURL = dataSource.url;
+                if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {
+                    sourceURL = dataSource.redirectedURL;
+                }
+    
+                var seekConfig = this._seekHandler.getConfig(sourceURL, range);
+    
+                var headers = new self.Headers();
+    
+                if (_typeof(seekConfig.headers) === 'object') {
+                    var configHeaders = seekConfig.headers;
+                    for (var key in configHeaders) {
+                        if (configHeaders.hasOwnProperty(key)) {
+                            headers.append(key, configHeaders[key]);
+                        }
+                    }
+                }
+    
+                var params = {
+                    method: 'GET',
+                    headers: headers,
+                    mode: 'cors',
+                    cache: 'default',
+                    // The default policy of Fetch API in the whatwg standard
+                    // Safari incorrectly indicates 'no-referrer' as default policy, fuck it
+                    referrerPolicy: 'no-referrer-when-downgrade'
+                };
+    
+                // add additional headers
+                if (_typeof(this._config.headers) === 'object') {
+                    for (var _key in this._config.headers) {
+                        headers.append(_key, this._config.headers[_key]);
+                    }
+                }
+    
+                // cors is enabled by default
+                if (dataSource.cors === false) {
+                    // no-cors means 'disregard cors policy', which can only be used in ServiceWorker
+                    params.mode = 'same-origin';
+                }
+    
+                // withCredentials is disabled by default
+                if (dataSource.withCredentials) {
+                    params.credentials = 'include';
+                }
+    
+                // referrerPolicy from config
+                if (dataSource.referrerPolicy) {
+                    params.referrerPolicy = dataSource.referrerPolicy;
+                }
+    
+                this._status = _loader.LoaderStatus.kConnecting;
+                self.fetch(seekConfig.url, params).then(function (res) {
+                    if (_this2._requestAbort) {
+                        _this2._requestAbort = false;
+                        _this2._status = _loader.LoaderStatus.kIdle;
+                        return;
+                    }
+                    if (res.ok && res.status >= 200 && res.status <= 299) {
+                        if (res.url !== seekConfig.url) {
+                            if (_this2._onURLRedirect) {
+                                var redirectedURL = _this2._seekHandler.removeURLParameters(res.url);
+                                _this2._onURLRedirect(redirectedURL);
+                            }
+                        }
+    
+                        var lengthHeader = res.headers.get('Content-Length');
+                        if (lengthHeader != null) {
+                            _this2._contentLength = parseInt(lengthHeader);
+                            if (_this2._contentLength !== 0) {
+                                if (_this2._onContentLengthKnown) {
+                                    _this2._onContentLengthKnown(_this2._contentLength);
+                                }
+                            }
+                        }
+    
+                        return _this2._pump.call(_this2, res.body.getReader());
+                    } else {
+                        _this2._status = _loader.LoaderStatus.kError;
+                        if (_this2._onError) {
+                            _this2._onError(_loader.LoaderErrors.HTTP_STATUS_CODE_INVALID, { code: res.status, msg: res.statusText });
+                        } else {
+                            throw new _exception.RuntimeException('FetchStreamLoader: Http code invalid, ' + res.status + ' ' + res.statusText);
+                        }
+                    }
+                }).catch(function (e) {
+                    _this2._status = _loader.LoaderStatus.kError;
+                    if (_this2._onError) {
+                        _this2._onError(_loader.LoaderErrors.EXCEPTION, { code: -1, msg: e.message });
+                    } else {
+                        throw e;
+                    }
+                });
+            }
+        }, {
+            key: 'abort',
+            value: function abort() {
+                this._requestAbort = true;
+            }
+        }, {
+            key: '_pump',
+            value: function _pump(reader) {
+                var _this3 = this;
+    
+                // ReadableStreamReader
+                return reader.read().then(function (result) {
+                    if (result.done) {
+                        // First check received length
+                        if (_this3._contentLength !== null && _this3._receivedLength < _this3._contentLength) {
+                            // Report Early-EOF
+                            _this3._status = _loader.LoaderStatus.kError;
+                            var type = _loader.LoaderErrors.EARLY_EOF;
+                            var info = { code: -1, msg: 'Fetch stream meet Early-EOF' };
+                            if (_this3._onError) {
+                                _this3._onError(type, info);
+                            } else {
+                                throw new _exception.RuntimeException(info.msg);
+                            }
+                        } else {
+                            // OK. Download complete
+                            _this3._status = _loader.LoaderStatus.kComplete;
+                            if (_this3._onComplete) {
+                                _this3._onComplete(_this3._range.from, _this3._range.from + _this3._receivedLength - 1);
+                            }
+                        }
+                    } else {
+                        if (_this3._requestAbort === true) {
+                            _this3._requestAbort = false;
+                            _this3._status = _loader.LoaderStatus.kComplete;
+                            return reader.cancel();
+                        }
+    
+                        _this3._status = _loader.LoaderStatus.kBuffering;
+    
+                        var chunk = result.value.buffer;
+                        var byteStart = _this3._range.from + _this3._receivedLength;
+                        _this3._receivedLength += chunk.byteLength;
+    
+                        if (_this3._onDataArrival) {
+                            _this3._onDataArrival(chunk, byteStart, _this3._receivedLength);
+                        }
+    
+                        _this3._pump(reader);
+                    }
+                }).catch(function (e) {
+                    if (e.code === 11 && _browser2.default.msedge) {
+                        // InvalidStateError on Microsoft Edge
+                        // Workaround: Edge may throw InvalidStateError after ReadableStreamReader.cancel() call
+                        // Ignore the unknown exception.
+                        // Related issue: https://developer.microsoft.com/en-us/microsoft-edge/platform/issues/11265202/
+                        return;
+                    }
+    
+                    _this3._status = _loader.LoaderStatus.kError;
+                    var type = 0;
+                    var info = null;
+    
+                    if ((e.code === 19 || e.message === 'network error') && ( // NETWORK_ERR
+                    _this3._contentLength === null || _this3._contentLength !== null && _this3._receivedLength < _this3._contentLength)) {
+                        type = _loader.LoaderErrors.EARLY_EOF;
+                        info = { code: e.code, msg: 'Fetch stream meet Early-EOF' };
+                    } else {
+                        type = _loader.LoaderErrors.EXCEPTION;
+                        info = { code: e.code, msg: e.message };
+                    }
+    
+                    if (_this3._onError) {
+                        _this3._onError(type, info);
+                    } else {
+                        throw new _exception.RuntimeException(info.msg);
+                    }
+                });
+            }
+        }]);
+    
+        return FetchStreamLoader;
+    }(_loader.BaseLoader);
+    
+    exports.default = FetchStreamLoader;
+    
+    },{"../utils/browser.js":39,"../utils/exception.js":40,"../utils/logger.js":41,"./loader.js":24}],23:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _speedSampler = _dereq_('./speed-sampler.js');
+    
+    var _speedSampler2 = _interopRequireDefault(_speedSampler);
+    
+    var _loader = _dereq_('./loader.js');
+    
+    var _fetchStreamLoader = _dereq_('./fetch-stream-loader.js');
+    
+    var _fetchStreamLoader2 = _interopRequireDefault(_fetchStreamLoader);
+    
+    var _xhrMozChunkedLoader = _dereq_('./xhr-moz-chunked-loader.js');
+    
+    var _xhrMozChunkedLoader2 = _interopRequireDefault(_xhrMozChunkedLoader);
+    
+    var _xhrMsstreamLoader = _dereq_('./xhr-msstream-loader.js');
+    
+    var _xhrMsstreamLoader2 = _interopRequireDefault(_xhrMsstreamLoader);
+    
+    var _xhrRangeLoader = _dereq_('./xhr-range-loader.js');
+    
+    var _xhrRangeLoader2 = _interopRequireDefault(_xhrRangeLoader);
+    
+    var _websocketLoader = _dereq_('./websocket-loader.js');
+    
+    var _websocketLoader2 = _interopRequireDefault(_websocketLoader);
+    
+    var _rangeSeekHandler = _dereq_('./range-seek-handler.js');
+    
+    var _rangeSeekHandler2 = _interopRequireDefault(_rangeSeekHandler);
+    
+    var _paramSeekHandler = _dereq_('./param-seek-handler.js');
+    
+    var _paramSeekHandler2 = _interopRequireDefault(_paramSeekHandler);
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    /**
+     * DataSource: {
+     *     url: string,
+     *     filesize: number,
+     *     cors: boolean,
+     *     withCredentials: boolean
+     * }
+     * 
+     */
+    
+    // Manage IO Loaders
+    var IOController = function () {
+        function IOController(dataSource, config, extraData) {
+            _classCallCheck(this, IOController);
+    
+            this.TAG = 'IOController';
+    
+            this._config = config;
+            this._extraData = extraData;
+    
+            this._stashInitialSize = 1024 * 384; // default initial size: 384KB
+            if (config.stashInitialSize != undefined && config.stashInitialSize > 0) {
+                // apply from config
+                this._stashInitialSize = config.stashInitialSize;
+            }
+    
+            this._stashUsed = 0;
+            this._stashSize = this._stashInitialSize;
+            this._bufferSize = 1024 * 1024 * 3; // initial size: 3MB
+            this._stashBuffer = new ArrayBuffer(this._bufferSize);
+            this._stashByteStart = 0;
+            this._enableStash = true;
+            if (config.enableStashBuffer === false) {
+                this._enableStash = false;
+            }
+    
+            this._loader = null;
+            this._loaderClass = null;
+            this._seekHandler = null;
+    
+            this._dataSource = dataSource;
+            this._isWebSocketURL = /wss?:\/\/(.+?)/.test(dataSource.url);
+            this._refTotalLength = dataSource.filesize ? dataSource.filesize : null;
+            this._totalLength = this._refTotalLength;
+            this._fullRequestFlag = false;
+            this._currentRange = null;
+            this._redirectedURL = null;
+    
+            this._speedNormalized = 0;
+            this._speedSampler = new _speedSampler2.default();
+            this._speedNormalizeList = [64, 128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096];
+    
+            this._isEarlyEofReconnecting = false;
+    
+            this._paused = false;
+            this._resumeFrom = 0;
+    
+            this._onDataArrival = null;
+            this._onSeeked = null;
+            this._onError = null;
+            this._onComplete = null;
+            this._onRedirect = null;
+            this._onRecoveredEarlyEof = null;
+    
+            this._selectSeekHandler();
+            this._selectLoader();
+            this._createLoader();
+        }
+    
+        _createClass(IOController, [{
+            key: 'destroy',
+            value: function destroy() {
+                if (this._loader.isWorking()) {
+                    this._loader.abort();
+                }
+                this._loader.destroy();
+                this._loader = null;
+                this._loaderClass = null;
+                this._dataSource = null;
+                this._stashBuffer = null;
+                this._stashUsed = this._stashSize = this._bufferSize = this._stashByteStart = 0;
+                this._currentRange = null;
+                this._speedSampler = null;
+    
+                this._isEarlyEofReconnecting = false;
+    
+                this._onDataArrival = null;
+                this._onSeeked = null;
+                this._onError = null;
+                this._onComplete = null;
+                this._onRedirect = null;
+                this._onRecoveredEarlyEof = null;
+    
+                this._extraData = null;
+            }
+        }, {
+            key: 'isWorking',
+            value: function isWorking() {
+                return this._loader && this._loader.isWorking() && !this._paused;
+            }
+        }, {
+            key: 'isPaused',
+            value: function isPaused() {
+                return this._paused;
+            }
+        }, {
+            key: '_selectSeekHandler',
+            value: function _selectSeekHandler() {
+                var config = this._config;
+    
+                if (config.seekType === 'range') {
+                    this._seekHandler = new _rangeSeekHandler2.default(this._config.rangeLoadZeroStart);
+                } else if (config.seekType === 'param') {
+                    var paramStart = config.seekParamStart || 'bstart';
+                    var paramEnd = config.seekParamEnd || 'bend';
+    
+                    this._seekHandler = new _paramSeekHandler2.default(paramStart, paramEnd);
+                } else if (config.seekType === 'custom') {
+                    if (typeof config.customSeekHandler !== 'function') {
+                        throw new _exception.InvalidArgumentException('Custom seekType specified in config but invalid customSeekHandler!');
+                    }
+                    this._seekHandler = new config.customSeekHandler();
+                } else {
+                    throw new _exception.InvalidArgumentException('Invalid seekType in config: ' + config.seekType);
+                }
+            }
+        }, {
+            key: '_selectLoader',
+            value: function _selectLoader() {
+                if (this._config.customLoader != null) {
+                    this._loaderClass = this._config.customLoader;
+                } else if (this._isWebSocketURL) {
+                    this._loaderClass = _websocketLoader2.default;
+                } else if (_fetchStreamLoader2.default.isSupported()) {
+                    this._loaderClass = _fetchStreamLoader2.default;
+                } else if (_xhrMozChunkedLoader2.default.isSupported()) {
+                    this._loaderClass = _xhrMozChunkedLoader2.default;
+                } else if (_xhrRangeLoader2.default.isSupported()) {
+                    this._loaderClass = _xhrRangeLoader2.default;
+                } else {
+                    throw new _exception.RuntimeException('Your browser doesn\'t support xhr with arraybuffer responseType!');
+                }
+            }
+        }, {
+            key: '_createLoader',
+            value: function _createLoader() {
+                this._loader = new this._loaderClass(this._seekHandler, this._config);
+                if (this._loader.needStashBuffer === false) {
+                    this._enableStash = false;
+                }
+                this._loader.onContentLengthKnown = this._onContentLengthKnown.bind(this);
+                this._loader.onURLRedirect = this._onURLRedirect.bind(this);
+                this._loader.onDataArrival = this._onLoaderChunkArrival.bind(this);
+                this._loader.onComplete = this._onLoaderComplete.bind(this);
+                this._loader.onError = this._onLoaderError.bind(this);
+            }
+        }, {
+            key: 'open',
+            value: function open(optionalFrom) {
+                this._currentRange = { from: 0, to: -1 };
+                if (optionalFrom) {
+                    this._currentRange.from = optionalFrom;
+                }
+    
+                this._speedSampler.reset();
+                if (!optionalFrom) {
+                    this._fullRequestFlag = true;
+                }
+    
+                this._loader.open(this._dataSource, Object.assign({}, this._currentRange));
+            }
+        }, {
+            key: 'abort',
+            value: function abort() {
+                this._loader.abort();
+    
+                if (this._paused) {
+                    this._paused = false;
+                    this._resumeFrom = 0;
+                }
+            }
+        }, {
+            key: 'pause',
+            value: function pause() {
+                if (this.isWorking()) {
+                    this._loader.abort();
+    
+                    if (this._stashUsed !== 0) {
+                        this._resumeFrom = this._stashByteStart;
+                        this._currentRange.to = this._stashByteStart - 1;
+                    } else {
+                        this._resumeFrom = this._currentRange.to + 1;
+                    }
+                    this._stashUsed = 0;
+                    this._stashByteStart = 0;
+                    this._paused = true;
+                }
+            }
+        }, {
+            key: 'resume',
+            value: function resume() {
+                if (this._paused) {
+                    this._paused = false;
+                    var bytes = this._resumeFrom;
+                    this._resumeFrom = 0;
+                    this._internalSeek(bytes, true);
+                }
+            }
+        }, {
+            key: 'seek',
+            value: function seek(bytes) {
+                this._paused = false;
+                this._stashUsed = 0;
+                this._stashByteStart = 0;
+                this._internalSeek(bytes, true);
+            }
+    
+            /**
+             * When seeking request is from media seeking, unconsumed stash data should be dropped
+             * However, stash data shouldn't be dropped if seeking requested from http reconnection
+             *
+             * @dropUnconsumed: Ignore and discard all unconsumed data in stash buffer
+             */
+    
+        }, {
+            key: '_internalSeek',
+            value: function _internalSeek(bytes, dropUnconsumed) {
+                if (this._loader.isWorking()) {
+                    this._loader.abort();
+                }
+    
+                // dispatch & flush stash buffer before seek
+                this._flushStashBuffer(dropUnconsumed);
+    
+                this._loader.destroy();
+                this._loader = null;
+    
+                var requestRange = { from: bytes, to: -1 };
+                this._currentRange = { from: requestRange.from, to: -1 };
+    
+                this._speedSampler.reset();
+                this._stashSize = this._stashInitialSize;
+                this._createLoader();
+                this._loader.open(this._dataSource, requestRange);
+    
+                if (this._onSeeked) {
+                    this._onSeeked();
+                }
+            }
+        }, {
+            key: 'updateUrl',
+            value: function updateUrl(url) {
+                if (!url || typeof url !== 'string' || url.length === 0) {
+                    throw new _exception.InvalidArgumentException('Url must be a non-empty string!');
+                }
+    
+                this._dataSource.url = url;
+    
+                // TODO: replace with new url
+            }
+        }, {
+            key: '_expandBuffer',
+            value: function _expandBuffer(expectedBytes) {
+                var bufferNewSize = this._stashSize;
+                while (bufferNewSize + 1024 * 1024 * 1 < expectedBytes) {
+                    bufferNewSize *= 2;
+                }
+    
+                bufferNewSize += 1024 * 1024 * 1; // bufferSize = stashSize + 1MB
+                if (bufferNewSize === this._bufferSize) {
+                    return;
+                }
+    
+                var newBuffer = new ArrayBuffer(bufferNewSize);
+    
+                if (this._stashUsed > 0) {
+                    // copy existing data into new buffer
+                    var stashOldArray = new Uint8Array(this._stashBuffer, 0, this._stashUsed);
+                    var stashNewArray = new Uint8Array(newBuffer, 0, bufferNewSize);
+                    stashNewArray.set(stashOldArray, 0);
+                }
+    
+                this._stashBuffer = newBuffer;
+                this._bufferSize = bufferNewSize;
+            }
+        }, {
+            key: '_normalizeSpeed',
+            value: function _normalizeSpeed(input) {
+                var list = this._speedNormalizeList;
+                var last = list.length - 1;
+                var mid = 0;
+                var lbound = 0;
+                var ubound = last;
+    
+                if (input < list[0]) {
+                    return list[0];
+                }
+    
+                // binary search
+                while (lbound <= ubound) {
+                    mid = lbound + Math.floor((ubound - lbound) / 2);
+                    if (mid === last || input >= list[mid] && input < list[mid + 1]) {
+                        return list[mid];
+                    } else if (list[mid] < input) {
+                        lbound = mid + 1;
+                    } else {
+                        ubound = mid - 1;
+                    }
+                }
+            }
+        }, {
+            key: '_adjustStashSize',
+            value: function _adjustStashSize(normalized) {
+                var stashSizeKB = 0;
+    
+                if (this._config.isLive) {
+                    // live stream: always use single normalized speed for size of stashSizeKB
+                    stashSizeKB = normalized;
+                } else {
+                    if (normalized < 512) {
+                        stashSizeKB = normalized;
+                    } else if (normalized >= 512 && normalized <= 1024) {
+                        stashSizeKB = Math.floor(normalized * 1.5);
+                    } else {
+                        stashSizeKB = normalized * 2;
+                    }
+                }
+    
+                if (stashSizeKB > 8192) {
+                    stashSizeKB = 8192;
+                }
+    
+                var bufferSize = stashSizeKB * 1024 + 1024 * 1024 * 1; // stashSize + 1MB
+                if (this._bufferSize < bufferSize) {
+                    this._expandBuffer(bufferSize);
+                }
+                this._stashSize = stashSizeKB * 1024;
+            }
+        }, {
+            key: '_dispatchChunks',
+            value: function _dispatchChunks(chunks, byteStart) {
+                this._currentRange.to = byteStart + chunks.byteLength - 1;
+                return this._onDataArrival(chunks, byteStart);
+            }
+        }, {
+            key: '_onURLRedirect',
+            value: function _onURLRedirect(redirectedURL) {
+                this._redirectedURL = redirectedURL;
+                if (this._onRedirect) {
+                    this._onRedirect(redirectedURL);
+                }
+            }
+        }, {
+            key: '_onContentLengthKnown',
+            value: function _onContentLengthKnown(contentLength) {
+                if (contentLength && this._fullRequestFlag) {
+                    this._totalLength = contentLength;
+                    this._fullRequestFlag = false;
+                }
+            }
+        }, {
+            key: '_onLoaderChunkArrival',
+            value: function _onLoaderChunkArrival(chunk, byteStart, receivedLength) {
+                if (!this._onDataArrival) {
+                    throw new _exception.IllegalStateException('IOController: No existing consumer (onDataArrival) callback!');
+                }
+                if (this._paused) {
+                    return;
+                }
+                if (this._isEarlyEofReconnecting) {
+                    // Auto-reconnect for EarlyEof succeed, notify to upper-layer by callback
+                    this._isEarlyEofReconnecting = false;
+                    if (this._onRecoveredEarlyEof) {
+                        this._onRecoveredEarlyEof();
+                    }
+                }
+    
+                this._speedSampler.addBytes(chunk.byteLength);
+    
+                // adjust stash buffer size according to network speed dynamically
+                var KBps = this._speedSampler.lastSecondKBps;
+                if (KBps !== 0) {
+                    var normalized = this._normalizeSpeed(KBps);
+                    if (this._speedNormalized !== normalized) {
+                        this._speedNormalized = normalized;
+                        this._adjustStashSize(normalized);
+                    }
+                }
+    
+                if (!this._enableStash) {
+                    // disable stash
+                    if (this._stashUsed === 0) {
+                        // dispatch chunk directly to consumer;
+                        // check ret value (consumed bytes) and stash unconsumed to stashBuffer
+                        var consumed = this._dispatchChunks(chunk, byteStart);
+                        if (consumed < chunk.byteLength) {
+                            // unconsumed data remain.
+                            var remain = chunk.byteLength - consumed;
+                            if (remain > this._bufferSize) {
+                                this._expandBuffer(remain);
+                            }
+                            var stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+                            stashArray.set(new Uint8Array(chunk, consumed), 0);
+                            this._stashUsed += remain;
+                            this._stashByteStart = byteStart + consumed;
+                        }
+                    } else {
+                        // else: Merge chunk into stashBuffer, and dispatch stashBuffer to consumer.
+                        if (this._stashUsed + chunk.byteLength > this._bufferSize) {
+                            this._expandBuffer(this._stashUsed + chunk.byteLength);
+                        }
+                        var _stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+                        _stashArray.set(new Uint8Array(chunk), this._stashUsed);
+                        this._stashUsed += chunk.byteLength;
+                        var _consumed = this._dispatchChunks(this._stashBuffer.slice(0, this._stashUsed), this._stashByteStart);
+                        if (_consumed < this._stashUsed && _consumed > 0) {
+                            // unconsumed data remain
+                            var remainArray = new Uint8Array(this._stashBuffer, _consumed);
+                            _stashArray.set(remainArray, 0);
+                        }
+                        this._stashUsed -= _consumed;
+                        this._stashByteStart += _consumed;
+                    }
+                } else {
+                    // enable stash
+                    if (this._stashUsed === 0 && this._stashByteStart === 0) {
+                        // seeked? or init chunk?
+                        // This is the first chunk after seek action
+                        this._stashByteStart = byteStart;
+                    }
+                    if (this._stashUsed + chunk.byteLength <= this._stashSize) {
+                        // just stash
+                        var _stashArray2 = new Uint8Array(this._stashBuffer, 0, this._stashSize);
+                        _stashArray2.set(new Uint8Array(chunk), this._stashUsed);
+                        this._stashUsed += chunk.byteLength;
+                    } else {
+                        // stashUsed + chunkSize > stashSize, size limit exceeded
+                        var _stashArray3 = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+                        if (this._stashUsed > 0) {
+                            // There're stash datas in buffer
+                            // dispatch the whole stashBuffer, and stash remain data
+                            // then append chunk to stashBuffer (stash)
+                            var buffer = this._stashBuffer.slice(0, this._stashUsed);
+                            var _consumed2 = this._dispatchChunks(buffer, this._stashByteStart);
+                            if (_consumed2 < buffer.byteLength) {
+                                if (_consumed2 > 0) {
+                                    var _remainArray = new Uint8Array(buffer, _consumed2);
+                                    _stashArray3.set(_remainArray, 0);
+                                    this._stashUsed = _remainArray.byteLength;
+                                    this._stashByteStart += _consumed2;
+                                }
+                            } else {
+                                this._stashUsed = 0;
+                                this._stashByteStart += _consumed2;
+                            }
+                            if (this._stashUsed + chunk.byteLength > this._bufferSize) {
+                                this._expandBuffer(this._stashUsed + chunk.byteLength);
+                                _stashArray3 = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+                            }
+                            _stashArray3.set(new Uint8Array(chunk), this._stashUsed);
+                            this._stashUsed += chunk.byteLength;
+                        } else {
+                            // stash buffer empty, but chunkSize > stashSize (oh, holy shit)
+                            // dispatch chunk directly and stash remain data
+                            var _consumed3 = this._dispatchChunks(chunk, byteStart);
+                            if (_consumed3 < chunk.byteLength) {
+                                var _remain = chunk.byteLength - _consumed3;
+                                if (_remain > this._bufferSize) {
+                                    this._expandBuffer(_remain);
+                                    _stashArray3 = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+                                }
+                                _stashArray3.set(new Uint8Array(chunk, _consumed3), 0);
+                                this._stashUsed += _remain;
+                                this._stashByteStart = byteStart + _consumed3;
+                            }
+                        }
+                    }
+                }
+            }
+        }, {
+            key: '_flushStashBuffer',
+            value: function _flushStashBuffer(dropUnconsumed) {
+                if (this._stashUsed > 0) {
+                    var buffer = this._stashBuffer.slice(0, this._stashUsed);
+                    var consumed = this._dispatchChunks(buffer, this._stashByteStart);
+                    var remain = buffer.byteLength - consumed;
+    
+                    if (consumed < buffer.byteLength) {
+                        if (dropUnconsumed) {
+                            _logger2.default.w(this.TAG, remain + ' bytes unconsumed data remain when flush buffer, dropped');
+                        } else {
+                            if (consumed > 0) {
+                                var stashArray = new Uint8Array(this._stashBuffer, 0, this._bufferSize);
+                                var remainArray = new Uint8Array(buffer, consumed);
+                                stashArray.set(remainArray, 0);
+                                this._stashUsed = remainArray.byteLength;
+                                this._stashByteStart += consumed;
+                            }
+                            return 0;
+                        }
+                    }
+                    this._stashUsed = 0;
+                    this._stashByteStart = 0;
+                    return remain;
+                }
+                return 0;
+            }
+        }, {
+            key: '_onLoaderComplete',
+            value: function _onLoaderComplete(from, to) {
+                // Force-flush stash buffer, and drop unconsumed data
+                this._flushStashBuffer(true);
+    
+                if (this._onComplete) {
+                    this._onComplete(this._extraData);
+                }
+            }
+        }, {
+            key: '_onLoaderError',
+            value: function _onLoaderError(type, data) {
+                _logger2.default.e(this.TAG, 'Loader error, code = ' + data.code + ', msg = ' + data.msg);
+    
+                this._flushStashBuffer(false);
+    
+                if (this._isEarlyEofReconnecting) {
+                    // Auto-reconnect for EarlyEof failed, throw UnrecoverableEarlyEof error to upper-layer
+                    this._isEarlyEofReconnecting = false;
+                    type = _loader.LoaderErrors.UNRECOVERABLE_EARLY_EOF;
+                }
+    
+                switch (type) {
+                    case _loader.LoaderErrors.EARLY_EOF:
+                        {
+                            if (!this._config.isLive) {
+                                // Do internal http reconnect if not live stream
+                                if (this._totalLength) {
+                                    var nextFrom = this._currentRange.to + 1;
+                                    if (nextFrom < this._totalLength) {
+                                        _logger2.default.w(this.TAG, 'Connection lost, trying reconnect...');
+                                        this._isEarlyEofReconnecting = true;
+                                        this._internalSeek(nextFrom, false);
+                                    }
+                                    return;
+                                }
+                                // else: We don't know totalLength, throw UnrecoverableEarlyEof
+                            }
+                            // live stream: throw UnrecoverableEarlyEof error to upper-layer
+                            type = _loader.LoaderErrors.UNRECOVERABLE_EARLY_EOF;
+                            break;
+                        }
+                    case _loader.LoaderErrors.UNRECOVERABLE_EARLY_EOF:
+                    case _loader.LoaderErrors.CONNECTING_TIMEOUT:
+                    case _loader.LoaderErrors.HTTP_STATUS_CODE_INVALID:
+                    case _loader.LoaderErrors.EXCEPTION:
+                        break;
+                }
+    
+                if (this._onError) {
+                    this._onError(type, data);
+                } else {
+                    throw new _exception.RuntimeException('IOException: ' + data.msg);
+                }
+            }
+        }, {
+            key: 'status',
+            get: function get() {
+                return this._loader.status;
+            }
+        }, {
+            key: 'extraData',
+            get: function get() {
+                return this._extraData;
+            },
+            set: function set(data) {
+                this._extraData = data;
+            }
+    
+            // prototype: function onDataArrival(chunks: ArrayBuffer, byteStart: number): number
+    
+        }, {
+            key: 'onDataArrival',
+            get: function get() {
+                return this._onDataArrival;
+            },
+            set: function set(callback) {
+                this._onDataArrival = callback;
+            }
+        }, {
+            key: 'onSeeked',
+            get: function get() {
+                return this._onSeeked;
+            },
+            set: function set(callback) {
+                this._onSeeked = callback;
+            }
+    
+            // prototype: function onError(type: number, info: {code: number, msg: string}): void
+    
+        }, {
+            key: 'onError',
+            get: function get() {
+                return this._onError;
+            },
+            set: function set(callback) {
+                this._onError = callback;
+            }
+        }, {
+            key: 'onComplete',
+            get: function get() {
+                return this._onComplete;
+            },
+            set: function set(callback) {
+                this._onComplete = callback;
+            }
+        }, {
+            key: 'onRedirect',
+            get: function get() {
+                return this._onRedirect;
+            },
+            set: function set(callback) {
+                this._onRedirect = callback;
+            }
+        }, {
+            key: 'onRecoveredEarlyEof',
+            get: function get() {
+                return this._onRecoveredEarlyEof;
+            },
+            set: function set(callback) {
+                this._onRecoveredEarlyEof = callback;
+            }
+        }, {
+            key: 'currentURL',
+            get: function get() {
+                return this._dataSource.url;
+            }
+        }, {
+            key: 'hasRedirect',
+            get: function get() {
+                return this._redirectedURL != null || this._dataSource.redirectedURL != undefined;
+            }
+        }, {
+            key: 'currentRedirectedURL',
+            get: function get() {
+                return this._redirectedURL || this._dataSource.redirectedURL;
+            }
+    
+            // in KB/s
+    
+        }, {
+            key: 'currentSpeed',
+            get: function get() {
+                if (this._loaderClass === _xhrRangeLoader2.default) {
+                    // SpeedSampler is inaccuracy if loader is RangeLoader
+                    return this._loader.currentSpeed;
+                }
+                return this._speedSampler.lastSecondKBps;
+            }
+        }, {
+            key: 'loaderType',
+            get: function get() {
+                return this._loader.type;
+            }
+        }]);
+    
+        return IOController;
+    }();
+    
+    exports.default = IOController;
+    
+    },{"../utils/exception.js":40,"../utils/logger.js":41,"./fetch-stream-loader.js":22,"./loader.js":24,"./param-seek-handler.js":25,"./range-seek-handler.js":26,"./speed-sampler.js":27,"./websocket-loader.js":28,"./xhr-moz-chunked-loader.js":29,"./xhr-msstream-loader.js":30,"./xhr-range-loader.js":31}],24:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    exports.BaseLoader = exports.LoaderErrors = exports.LoaderStatus = undefined;
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    var LoaderStatus = exports.LoaderStatus = {
+        kIdle: 0,
+        kConnecting: 1,
+        kBuffering: 2,
+        kError: 3,
+        kComplete: 4
+    };
+    
+    var LoaderErrors = exports.LoaderErrors = {
+        OK: 'OK',
+        EXCEPTION: 'Exception',
+        HTTP_STATUS_CODE_INVALID: 'HttpStatusCodeInvalid',
+        CONNECTING_TIMEOUT: 'ConnectingTimeout',
+        EARLY_EOF: 'EarlyEof',
+        UNRECOVERABLE_EARLY_EOF: 'UnrecoverableEarlyEof'
+    };
+    
+    /* Loader has callbacks which have following prototypes:
+     *     function onContentLengthKnown(contentLength: number): void
+     *     function onURLRedirect(url: string): void
+     *     function onDataArrival(chunk: ArrayBuffer, byteStart: number, receivedLength: number): void
+     *     function onError(errorType: number, errorInfo: {code: number, msg: string}): void
+     *     function onComplete(rangeFrom: number, rangeTo: number): void
+     */
+    
+    var BaseLoader = exports.BaseLoader = function () {
+        function BaseLoader(typeName) {
+            _classCallCheck(this, BaseLoader);
+    
+            this._type = typeName || 'undefined';
+            this._status = LoaderStatus.kIdle;
+            this._needStash = false;
+            // callbacks
+            this._onContentLengthKnown = null;
+            this._onURLRedirect = null;
+            this._onDataArrival = null;
+            this._onError = null;
+            this._onComplete = null;
+        }
+    
+        _createClass(BaseLoader, [{
+            key: 'destroy',
+            value: function destroy() {
+                this._status = LoaderStatus.kIdle;
+                this._onContentLengthKnown = null;
+                this._onURLRedirect = null;
+                this._onDataArrival = null;
+                this._onError = null;
+                this._onComplete = null;
+            }
+        }, {
+            key: 'isWorking',
+            value: function isWorking() {
+                return this._status === LoaderStatus.kConnecting || this._status === LoaderStatus.kBuffering;
+            }
+        }, {
+            key: 'open',
+    
+    
+            // pure virtual
+            value: function open(dataSource, range) {
+                throw new _exception.NotImplementedException('Unimplemented abstract function!');
+            }
+        }, {
+            key: 'abort',
+            value: function abort() {
+                throw new _exception.NotImplementedException('Unimplemented abstract function!');
+            }
+        }, {
+            key: 'type',
+            get: function get() {
+                return this._type;
+            }
+        }, {
+            key: 'status',
+            get: function get() {
+                return this._status;
+            }
+        }, {
+            key: 'needStashBuffer',
+            get: function get() {
+                return this._needStash;
+            }
+        }, {
+            key: 'onContentLengthKnown',
+            get: function get() {
+                return this._onContentLengthKnown;
+            },
+            set: function set(callback) {
+                this._onContentLengthKnown = callback;
+            }
+        }, {
+            key: 'onURLRedirect',
+            get: function get() {
+                return this._onURLRedirect;
+            },
+            set: function set(callback) {
+                this._onURLRedirect = callback;
+            }
+        }, {
+            key: 'onDataArrival',
+            get: function get() {
+                return this._onDataArrival;
+            },
+            set: function set(callback) {
+                this._onDataArrival = callback;
+            }
+        }, {
+            key: 'onError',
+            get: function get() {
+                return this._onError;
+            },
+            set: function set(callback) {
+                this._onError = callback;
+            }
+        }, {
+            key: 'onComplete',
+            get: function get() {
+                return this._onComplete;
+            },
+            set: function set(callback) {
+                this._onComplete = callback;
+            }
+        }]);
+    
+        return BaseLoader;
+    }();
+    
+    },{"../utils/exception.js":40}],25:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var ParamSeekHandler = function () {
+        function ParamSeekHandler(paramStart, paramEnd) {
+            _classCallCheck(this, ParamSeekHandler);
+    
+            this._startName = paramStart;
+            this._endName = paramEnd;
+        }
+    
+        _createClass(ParamSeekHandler, [{
+            key: 'getConfig',
+            value: function getConfig(baseUrl, range) {
+                var url = baseUrl;
+    
+                if (range.from !== 0 || range.to !== -1) {
+                    var needAnd = true;
+                    if (url.indexOf('?') === -1) {
+                        url += '?';
+                        needAnd = false;
+                    }
+    
+                    if (needAnd) {
+                        url += '&';
+                    }
+    
+                    url += this._startName + '=' + range.from.toString();
+    
+                    if (range.to !== -1) {
+                        url += '&' + this._endName + '=' + range.to.toString();
+                    }
+                }
+    
+                return {
+                    url: url,
+                    headers: {}
+                };
+            }
+        }, {
+            key: 'removeURLParameters',
+            value: function removeURLParameters(seekedURL) {
+                var baseURL = seekedURL.split('?')[0];
+                var params = undefined;
+    
+                var queryIndex = seekedURL.indexOf('?');
+                if (queryIndex !== -1) {
+                    params = seekedURL.substring(queryIndex + 1);
+                }
+    
+                var resultParams = '';
+    
+                if (params != undefined && params.length > 0) {
+                    var pairs = params.split('&');
+    
+                    for (var i = 0; i < pairs.length; i++) {
+                        var pair = pairs[i].split('=');
+                        var requireAnd = i > 0;
+    
+                        if (pair[0] !== this._startName && pair[0] !== this._endName) {
+                            if (requireAnd) {
+                                resultParams += '&';
+                            }
+                            resultParams += pairs[i];
+                        }
+                    }
+                }
+    
+                return resultParams.length === 0 ? baseURL : baseURL + '?' + resultParams;
+            }
+        }]);
+    
+        return ParamSeekHandler;
+    }();
+    
+    exports.default = ParamSeekHandler;
+    
+    },{}],26:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var RangeSeekHandler = function () {
+        function RangeSeekHandler(zeroStart) {
+            _classCallCheck(this, RangeSeekHandler);
+    
+            this._zeroStart = zeroStart || false;
+        }
+    
+        _createClass(RangeSeekHandler, [{
+            key: 'getConfig',
+            value: function getConfig(url, range) {
+                var headers = {};
+    
+                if (range.from !== 0 || range.to !== -1) {
+                    var param = void 0;
+                    if (range.to !== -1) {
+                        param = 'bytes=' + range.from.toString() + '-' + range.to.toString();
+                    } else {
+                        param = 'bytes=' + range.from.toString() + '-';
+                    }
+                    headers['Range'] = param;
+                } else if (this._zeroStart) {
+                    headers['Range'] = 'bytes=0-';
+                }
+    
+                return {
+                    url: url,
+                    headers: headers
+                };
+            }
+        }, {
+            key: 'removeURLParameters',
+            value: function removeURLParameters(seekedURL) {
+                return seekedURL;
+            }
+        }]);
+    
+        return RangeSeekHandler;
+    }();
+    
+    exports.default = RangeSeekHandler;
+    
+    },{}],27:[function(_dereq_,module,exports){
+    "use strict";
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    // Utility class to calculate realtime network I/O speed
+    var SpeedSampler = function () {
+        function SpeedSampler() {
+            _classCallCheck(this, SpeedSampler);
+    
+            // milliseconds
+            this._firstCheckpoint = 0;
+            this._lastCheckpoint = 0;
+            this._intervalBytes = 0;
+            this._totalBytes = 0;
+            this._lastSecondBytes = 0;
+    
+            // compatibility detection
+            if (self.performance && self.performance.now) {
+                this._now = self.performance.now.bind(self.performance);
+            } else {
+                this._now = Date.now;
+            }
+        }
+    
+        _createClass(SpeedSampler, [{
+            key: "reset",
+            value: function reset() {
+                this._firstCheckpoint = this._lastCheckpoint = 0;
+                this._totalBytes = this._intervalBytes = 0;
+                this._lastSecondBytes = 0;
+            }
+        }, {
+            key: "addBytes",
+            value: function addBytes(bytes) {
+                if (this._firstCheckpoint === 0) {
+                    this._firstCheckpoint = this._now();
+                    this._lastCheckpoint = this._firstCheckpoint;
+                    this._intervalBytes += bytes;
+                    this._totalBytes += bytes;
+                } else if (this._now() - this._lastCheckpoint < 1000) {
+                    this._intervalBytes += bytes;
+                    this._totalBytes += bytes;
+                } else {
+                    // duration >= 1000
+                    this._lastSecondBytes = this._intervalBytes;
+                    this._intervalBytes = bytes;
+                    this._totalBytes += bytes;
+                    this._lastCheckpoint = this._now();
+                }
+            }
+        }, {
+            key: "currentKBps",
+            get: function get() {
+                this.addBytes(0);
+    
+                var durationSeconds = (this._now() - this._lastCheckpoint) / 1000;
+                if (durationSeconds == 0) durationSeconds = 1;
+                return this._intervalBytes / durationSeconds / 1024;
+            }
+        }, {
+            key: "lastSecondKBps",
+            get: function get() {
+                this.addBytes(0);
+    
+                if (this._lastSecondBytes !== 0) {
+                    return this._lastSecondBytes / 1024;
+                } else {
+                    // lastSecondBytes === 0
+                    if (this._now() - this._lastCheckpoint >= 500) {
+                        // if time interval since last checkpoint has exceeded 500ms
+                        // the speed is nearly accurate
+                        return this.currentKBps;
+                    } else {
+                        // We don't know
+                        return 0;
+                    }
+                }
+            }
+        }, {
+            key: "averageKBps",
+            get: function get() {
+                var durationSeconds = (this._now() - this._firstCheckpoint) / 1000;
+                return this._totalBytes / durationSeconds / 1024;
+            }
+        }]);
+    
+        return SpeedSampler;
+    }();
+    
+    exports.default = SpeedSampler;
+    
+    },{}],28:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _loader = _dereq_('./loader.js');
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+    
+    function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    */
+    
+    // For FLV over WebSocket live stream
+    var WebSocketLoader = function (_BaseLoader) {
+        _inherits(WebSocketLoader, _BaseLoader);
+    
+        _createClass(WebSocketLoader, null, [{
+            key: 'isSupported',
+            value: function isSupported() {
+                try {
+                    return typeof self.WebSocket !== 'undefined';
+                } catch (e) {
+                    return false;
+                }
+            }
+        }]);
+    
+        function WebSocketLoader() {
+            _classCallCheck(this, WebSocketLoader);
+    
+            var _this = _possibleConstructorReturn(this, (WebSocketLoader.__proto__ || Object.getPrototypeOf(WebSocketLoader)).call(this, 'websocket-loader'));
+    
+            _this.TAG = 'WebSocketLoader';
+    
+            _this._needStash = true;
+    
+            _this._ws = null;
+            _this._requestAbort = false;
+            _this._receivedLength = 0;
+            return _this;
+        }
+    
+        _createClass(WebSocketLoader, [{
+            key: 'destroy',
+            value: function destroy() {
+                if (this._ws) {
+                    this.abort();
+                }
+                _get(WebSocketLoader.prototype.__proto__ || Object.getPrototypeOf(WebSocketLoader.prototype), 'destroy', this).call(this);
+            }
+        }, {
+            key: 'open',
+            value: function open(dataSource) {
+                try {
+                    var ws = this._ws = new self.WebSocket(dataSource.url);
+                    ws.binaryType = 'arraybuffer';
+                    ws.onopen = this._onWebSocketOpen.bind(this);
+                    ws.onclose = this._onWebSocketClose.bind(this);
+                    ws.onmessage = this._onWebSocketMessage.bind(this);
+                    ws.onerror = this._onWebSocketError.bind(this);
+    
+                    this._status = _loader.LoaderStatus.kConnecting;
+                } catch (e) {
+                    this._status = _loader.LoaderStatus.kError;
+    
+                    var info = { code: e.code, msg: e.message };
+    
+                    if (this._onError) {
+                        this._onError(_loader.LoaderErrors.EXCEPTION, info);
+                    } else {
+                        throw new _exception.RuntimeException(info.msg);
+                    }
+                }
+            }
+        }, {
+            key: 'abort',
+            value: function abort() {
+                var ws = this._ws;
+                if (ws && (ws.readyState === 0 || ws.readyState === 1)) {
+                    // CONNECTING || OPEN
+                    this._requestAbort = true;
+                    ws.close();
+                }
+    
+                this._ws = null;
+                this._status = _loader.LoaderStatus.kComplete;
+            }
+        }, {
+            key: '_onWebSocketOpen',
+            value: function _onWebSocketOpen(e) {
+                this._status = _loader.LoaderStatus.kBuffering;
+            }
+        }, {
+            key: '_onWebSocketClose',
+            value: function _onWebSocketClose(e) {
+                if (this._requestAbort === true) {
+                    this._requestAbort = false;
+                    return;
+                }
+    
+                this._status = _loader.LoaderStatus.kComplete;
+    
+                if (this._onComplete) {
+                    this._onComplete(0, this._receivedLength - 1);
+                }
+            }
+        }, {
+            key: '_onWebSocketMessage',
+            value: function _onWebSocketMessage(e) {
+                var _this2 = this;
+    
+                if (e.data instanceof ArrayBuffer) {
+                    this._dispatchArrayBuffer(e.data);
+                } else if (e.data instanceof Blob) {
+                    var reader = new FileReader();
+                    reader.onload = function () {
+                        _this2._dispatchArrayBuffer(reader.result);
+                    };
+                    reader.readAsArrayBuffer(e.data);
+                } else {
+                    this._status = _loader.LoaderStatus.kError;
+                    var info = { code: -1, msg: 'Unsupported WebSocket message type: ' + e.data.constructor.name };
+    
+                    if (this._onError) {
+                        this._onError(_loader.LoaderErrors.EXCEPTION, info);
+                    } else {
+                        throw new _exception.RuntimeException(info.msg);
+                    }
+                }
+            }
+        }, {
+            key: '_dispatchArrayBuffer',
+            value: function _dispatchArrayBuffer(arraybuffer) {
+                var chunk = arraybuffer;
+                var byteStart = this._receivedLength;
+                this._receivedLength += chunk.byteLength;
+    
+                if (this._onDataArrival) {
+                    this._onDataArrival(chunk, byteStart, this._receivedLength);
+                }
+            }
+        }, {
+            key: '_onWebSocketError',
+            value: function _onWebSocketError(e) {
+                this._status = _loader.LoaderStatus.kError;
+    
+                var info = {
+                    code: e.code,
+                    msg: e.message
+                };
+    
+                if (this._onError) {
+                    this._onError(_loader.LoaderErrors.EXCEPTION, info);
+                } else {
+                    throw new _exception.RuntimeException(info.msg);
+                }
+            }
+        }]);
+    
+        return WebSocketLoader;
+    }(_loader.BaseLoader);
+    
+    exports.default = WebSocketLoader;
+    
+    },{"../utils/exception.js":40,"../utils/logger.js":41,"./loader.js":24}],29:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+    
+    var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _loader = _dereq_('./loader.js');
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+    
+    function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    */
+    
+    // For FireFox browser which supports `xhr.responseType = 'moz-chunked-arraybuffer'`
+    var MozChunkedLoader = function (_BaseLoader) {
+        _inherits(MozChunkedLoader, _BaseLoader);
+    
+        _createClass(MozChunkedLoader, null, [{
+            key: 'isSupported',
+            value: function isSupported() {
+                try {
+                    var xhr = new XMLHttpRequest();
+                    // Firefox 37- requires .open() to be called before setting responseType
+                    xhr.open('GET', 'https://example.com', true);
+                    xhr.responseType = 'moz-chunked-arraybuffer';
+                    return xhr.responseType === 'moz-chunked-arraybuffer';
+                } catch (e) {
+                    _logger2.default.w('MozChunkedLoader', e.message);
+                    return false;
+                }
+            }
+        }]);
+    
+        function MozChunkedLoader(seekHandler, config) {
+            _classCallCheck(this, MozChunkedLoader);
+    
+            var _this = _possibleConstructorReturn(this, (MozChunkedLoader.__proto__ || Object.getPrototypeOf(MozChunkedLoader)).call(this, 'xhr-moz-chunked-loader'));
+    
+            _this.TAG = 'MozChunkedLoader';
+    
+            _this._seekHandler = seekHandler;
+            _this._config = config;
+            _this._needStash = true;
+    
+            _this._xhr = null;
+            _this._requestAbort = false;
+            _this._contentLength = null;
+            _this._receivedLength = 0;
+            return _this;
+        }
+    
+        _createClass(MozChunkedLoader, [{
+            key: 'destroy',
+            value: function destroy() {
+                if (this.isWorking()) {
+                    this.abort();
+                }
+                if (this._xhr) {
+                    this._xhr.onreadystatechange = null;
+                    this._xhr.onprogress = null;
+                    this._xhr.onloadend = null;
+                    this._xhr.onerror = null;
+                    this._xhr = null;
+                }
+                _get(MozChunkedLoader.prototype.__proto__ || Object.getPrototypeOf(MozChunkedLoader.prototype), 'destroy', this).call(this);
+            }
+        }, {
+            key: 'open',
+            value: function open(dataSource, range) {
+                this._dataSource = dataSource;
+                this._range = range;
+    
+                var sourceURL = dataSource.url;
+                if (this._config.reuseRedirectedURL && dataSource.redirectedURL != undefined) {
+                    sourceURL = dataSource.redirectedURL;
+                }
+    
+                var seekConfig = this._seekHandler.getConfig(sourceURL, range);
+                this._requestURL = seekConfig.url;
+    
+                var xhr = this._xhr = new XMLHttpRequest();
+                xhr.open('GET', seekConfig.url, true);
+                xhr.responseType = 'moz-chunked-arraybuffer';
+                xhr.onreadystatechange = this._onReadyStateChange.bind(this);
+                xhr.onprogress = this._onProgress.bind(this);
+                xhr.onloadend = this._onLoadEnd.bind(this);
+                xhr.onerror = this._onXhrError.bind(this);
+    
+                // cors is auto detected and enabled by xhr
+    
+                // withCredentials is disabled by default
+                if (dataSource.withCredentials) {
+                    xhr.withCredentials = true;
+                }
+    
+                if (_typeof(seekConfig.headers) === 'object') {
+                    var headers = seekConfig.headers;
+    
+                    for (var key in headers) {
+                        if (headers.hasOwnProperty(key)) {
+                            xhr.setRequestHeader(key, headers[key]);
+                        }
+                    }
+                }
+    
+                // add additional headers
+                if (_typeof(this._config.headers) === 'object') {
+                    var _headers = this._config.headers;
+    
+                    for (var _key in _headers) {
+                        if (_headers.hasOwnProperty(_key)) {
+                            xhr.setRequestHeader(_key, _headers[_key]);
+                        }
+                    }
+                }
+    
+                this._status = _loader.LoaderStatus.kConnecting;
+                xhr.send();
+            }
+        }, {
+            key: 'abort',
+            value: function abort() {
+                this._requestAbort = true;
+                if (this._xhr) {
+                    this._xhr.abort();
+                }
+                this._status = _loader.LoaderStatus.kComplete;
+            }
+        }, {
+            key: '_onReadyStateChange',
+            value: function _onReadyStateChange(e) {
+                var xhr = e.target;
+    
+                if (xhr.readyState === 2) {
+                    // HEADERS_RECEIVED
+                    if (xhr.responseURL != undefined && xhr.responseURL !== this._requestURL) {
+                        if (this._onURLRedirect) {
+                            var redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);
+                            this._onURLRedirect(redirectedURL);
+                        }
+                    }
+    
+                    if (xhr.status !== 0 && (xhr.status < 200 || xhr.status > 299)) {
+                        this._status = _loader.LoaderStatus.kError;
+                        if (this._onError) {
+                            this._onError(_loader.LoaderErrors.HTTP_STATUS_CODE_INVALID, { code: xhr.status, msg: xhr.statusText });
+                        } else {
+                            throw new _exception.RuntimeException('MozChunkedLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);
+                        }
+                    } else {
+                        this._status = _loader.LoaderStatus.kBuffering;
+                    }
+                }
+            }
+        }, {
+            key: '_onProgress',
+            value: function _onProgress(e) {
+                if (this._status === _loader.LoaderStatus.kError) {
+                    // Ignore error response
+                    return;
+                }
+    
+                if (this._contentLength === null) {
+                    if (e.total !== null && e.total !== 0) {
+                        this._contentLength = e.total;
+                        if (this._onContentLengthKnown) {
+                            this._onContentLengthKnown(this._contentLength);
+                        }
+                    }
+                }
+    
+                var chunk = e.target.response;
+                var byteStart = this._range.from + this._receivedLength;
+                this._receivedLength += chunk.byteLength;
+    
+                if (this._onDataArrival) {
+                    this._onDataArrival(chunk, byteStart, this._receivedLength);
+                }
+            }
+        }, {
+            key: '_onLoadEnd',
+            value: function _onLoadEnd(e) {
+                if (this._requestAbort === true) {
+                    this._requestAbort = false;
+                    return;
+                } else if (this._status === _loader.LoaderStatus.kError) {
+                    return;
+                }
+    
+                this._status = _loader.LoaderStatus.kComplete;
+                if (this._onComplete) {
+                    this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);
+                }
+            }
+        }, {
+            key: '_onXhrError',
+            value: function _onXhrError(e) {
+                this._status = _loader.LoaderStatus.kError;
+                var type = 0;
+                var info = null;
+    
+                if (this._contentLength && e.loaded < this._contentLength) {
+                    type = _loader.LoaderErrors.EARLY_EOF;
+                    info = { code: -1, msg: 'Moz-Chunked stream meet Early-Eof' };
+                } else {
+                    type = _loader.LoaderErrors.EXCEPTION;
+                    info = { code: -1, msg: e.constructor.name + ' ' + e.type };
+                }
+    
+                if (this._onError) {
+                    this._onError(type, info);
+                } else {
+                    throw new _exception.RuntimeException(info.msg);
+                }
+            }
+        }]);
+    
+        return MozChunkedLoader;
+    }(_loader.BaseLoader);
+    
+    exports.default = MozChunkedLoader;
+    
+    },{"../utils/exception.js":40,"../utils/logger.js":41,"./loader.js":24}],30:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+    
+    var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _loader = _dereq_('./loader.js');
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+    
+    function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    */
+    
+    /* Notice: ms-stream may cause IE/Edge browser crash if seek too frequently!!!
+     * The browser may crash in wininet.dll. Disable for now.
+     *
+     * For IE11/Edge browser by microsoft which supports `xhr.responseType = 'ms-stream'`
+     * Notice that ms-stream API sucks. The buffer is always expanding along with downloading.
+     *
+     * We need to abort the xhr if buffer size exceeded limit size (e.g. 16 MiB), then do reconnect.
+     * in order to release previous ArrayBuffer to avoid memory leak
+     *
+     * Otherwise, the ArrayBuffer will increase to a terrible size that equals final file size.
+     */
+    var MSStreamLoader = function (_BaseLoader) {
+        _inherits(MSStreamLoader, _BaseLoader);
+    
+        _createClass(MSStreamLoader, null, [{
+            key: 'isSupported',
+            value: function isSupported() {
+                try {
+                    if (typeof self.MSStream === 'undefined' || typeof self.MSStreamReader === 'undefined') {
+                        return false;
+                    }
+    
+                    var xhr = new XMLHttpRequest();
+                    xhr.open('GET', 'https://example.com', true);
+                    xhr.responseType = 'ms-stream';
+                    return xhr.responseType === 'ms-stream';
+                } catch (e) {
+                    _logger2.default.w('MSStreamLoader', e.message);
+                    return false;
+                }
+            }
+        }]);
+    
+        function MSStreamLoader(seekHandler, config) {
+            _classCallCheck(this, MSStreamLoader);
+    
+            var _this = _possibleConstructorReturn(this, (MSStreamLoader.__proto__ || Object.getPrototypeOf(MSStreamLoader)).call(this, 'xhr-msstream-loader'));
+    
+            _this.TAG = 'MSStreamLoader';
+    
+            _this._seekHandler = seekHandler;
+            _this._config = config;
+            _this._needStash = true;
+    
+            _this._xhr = null;
+            _this._reader = null; // MSStreamReader
+    
+            _this._totalRange = null;
+            _this._currentRange = null;
+    
+            _this._currentRequestURL = null;
+            _this._currentRedirectedURL = null;
+    
+            _this._contentLength = null;
+            _this._receivedLength = 0;
+    
+            _this._bufferLimit = 16 * 1024 * 1024; // 16MB
+            _this._lastTimeBufferSize = 0;
+            _this._isReconnecting = false;
+            return _this;
+        }
+    
+        _createClass(MSStreamLoader, [{
+            key: 'destroy',
+            value: function destroy() {
+                if (this.isWorking()) {
+                    this.abort();
+                }
+                if (this._reader) {
+                    this._reader.onprogress = null;
+                    this._reader.onload = null;
+                    this._reader.onerror = null;
+                    this._reader = null;
+                }
+                if (this._xhr) {
+                    this._xhr.onreadystatechange = null;
+                    this._xhr = null;
+                }
+                _get(MSStreamLoader.prototype.__proto__ || Object.getPrototypeOf(MSStreamLoader.prototype), 'destroy', this).call(this);
+            }
+        }, {
+            key: 'open',
+            value: function open(dataSource, range) {
+                this._internalOpen(dataSource, range, false);
+            }
+        }, {
+            key: '_internalOpen',
+            value: function _internalOpen(dataSource, range, isSubrange) {
+                this._dataSource = dataSource;
+    
+                if (!isSubrange) {
+                    this._totalRange = range;
+                } else {
+                    this._currentRange = range;
+                }
+    
+                var sourceURL = dataSource.url;
+                if (this._config.reuseRedirectedURL) {
+                    if (this._currentRedirectedURL != undefined) {
+                        sourceURL = this._currentRedirectedURL;
+                    } else if (dataSource.redirectedURL != undefined) {
+                        sourceURL = dataSource.redirectedURL;
+                    }
+                }
+    
+                var seekConfig = this._seekHandler.getConfig(sourceURL, range);
+                this._currentRequestURL = seekConfig.url;
+    
+                var reader = this._reader = new self.MSStreamReader();
+                reader.onprogress = this._msrOnProgress.bind(this);
+                reader.onload = this._msrOnLoad.bind(this);
+                reader.onerror = this._msrOnError.bind(this);
+    
+                var xhr = this._xhr = new XMLHttpRequest();
+                xhr.open('GET', seekConfig.url, true);
+                xhr.responseType = 'ms-stream';
+                xhr.onreadystatechange = this._xhrOnReadyStateChange.bind(this);
+                xhr.onerror = this._xhrOnError.bind(this);
+    
+                if (dataSource.withCredentials) {
+                    xhr.withCredentials = true;
+                }
+    
+                if (_typeof(seekConfig.headers) === 'object') {
+                    var headers = seekConfig.headers;
+    
+                    for (var key in headers) {
+                        if (headers.hasOwnProperty(key)) {
+                            xhr.setRequestHeader(key, headers[key]);
+                        }
+                    }
+                }
+    
+                // add additional headers
+                if (_typeof(this._config.headers) === 'object') {
+                    var _headers = this._config.headers;
+    
+                    for (var _key in _headers) {
+                        if (_headers.hasOwnProperty(_key)) {
+                            xhr.setRequestHeader(_key, _headers[_key]);
+                        }
+                    }
+                }
+    
+                if (this._isReconnecting) {
+                    this._isReconnecting = false;
+                } else {
+                    this._status = _loader.LoaderStatus.kConnecting;
+                }
+                xhr.send();
+            }
+        }, {
+            key: 'abort',
+            value: function abort() {
+                this._internalAbort();
+                this._status = _loader.LoaderStatus.kComplete;
+            }
+        }, {
+            key: '_internalAbort',
+            value: function _internalAbort() {
+                if (this._reader) {
+                    if (this._reader.readyState === 1) {
+                        // LOADING
+                        this._reader.abort();
+                    }
+                    this._reader.onprogress = null;
+                    this._reader.onload = null;
+                    this._reader.onerror = null;
+                    this._reader = null;
+                }
+                if (this._xhr) {
+                    this._xhr.abort();
+                    this._xhr.onreadystatechange = null;
+                    this._xhr = null;
+                }
+            }
+        }, {
+            key: '_xhrOnReadyStateChange',
+            value: function _xhrOnReadyStateChange(e) {
+                var xhr = e.target;
+    
+                if (xhr.readyState === 2) {
+                    // HEADERS_RECEIVED
+                    if (xhr.status >= 200 && xhr.status <= 299) {
+                        this._status = _loader.LoaderStatus.kBuffering;
+    
+                        if (xhr.responseURL != undefined) {
+                            var redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);
+                            if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) {
+                                this._currentRedirectedURL = redirectedURL;
+                                if (this._onURLRedirect) {
+                                    this._onURLRedirect(redirectedURL);
+                                }
+                            }
+                        }
+    
+                        var lengthHeader = xhr.getResponseHeader('Content-Length');
+                        if (lengthHeader != null && this._contentLength == null) {
+                            var length = parseInt(lengthHeader);
+                            if (length > 0) {
+                                this._contentLength = length;
+                                if (this._onContentLengthKnown) {
+                                    this._onContentLengthKnown(this._contentLength);
+                                }
+                            }
+                        }
+                    } else {
+                        this._status = _loader.LoaderStatus.kError;
+                        if (this._onError) {
+                            this._onError(_loader.LoaderErrors.HTTP_STATUS_CODE_INVALID, { code: xhr.status, msg: xhr.statusText });
+                        } else {
+                            throw new _exception.RuntimeException('MSStreamLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);
+                        }
+                    }
+                } else if (xhr.readyState === 3) {
+                    // LOADING
+                    if (xhr.status >= 200 && xhr.status <= 299) {
+                        this._status = _loader.LoaderStatus.kBuffering;
+    
+                        var msstream = xhr.response;
+                        this._reader.readAsArrayBuffer(msstream);
+                    }
+                }
+            }
+        }, {
+            key: '_xhrOnError',
+            value: function _xhrOnError(e) {
+                this._status = _loader.LoaderStatus.kError;
+                var type = _loader.LoaderErrors.EXCEPTION;
+                var info = { code: -1, msg: e.constructor.name + ' ' + e.type };
+    
+                if (this._onError) {
+                    this._onError(type, info);
+                } else {
+                    throw new _exception.RuntimeException(info.msg);
+                }
+            }
+        }, {
+            key: '_msrOnProgress',
+            value: function _msrOnProgress(e) {
+                var reader = e.target;
+                var bigbuffer = reader.result;
+                if (bigbuffer == null) {
+                    // result may be null, workaround for buggy M$
+                    this._doReconnectIfNeeded();
+                    return;
+                }
+    
+                var slice = bigbuffer.slice(this._lastTimeBufferSize);
+                this._lastTimeBufferSize = bigbuffer.byteLength;
+                var byteStart = this._totalRange.from + this._receivedLength;
+                this._receivedLength += slice.byteLength;
+    
+                if (this._onDataArrival) {
+                    this._onDataArrival(slice, byteStart, this._receivedLength);
+                }
+    
+                if (bigbuffer.byteLength >= this._bufferLimit) {
+                    _logger2.default.v(this.TAG, 'MSStream buffer exceeded max size near ' + (byteStart + slice.byteLength) + ', reconnecting...');
+                    this._doReconnectIfNeeded();
+                }
+            }
+        }, {
+            key: '_doReconnectIfNeeded',
+            value: function _doReconnectIfNeeded() {
+                if (this._contentLength == null || this._receivedLength < this._contentLength) {
+                    this._isReconnecting = true;
+                    this._lastTimeBufferSize = 0;
+                    this._internalAbort();
+    
+                    var range = {
+                        from: this._totalRange.from + this._receivedLength,
+                        to: -1
+                    };
+                    this._internalOpen(this._dataSource, range, true);
+                }
+            }
+        }, {
+            key: '_msrOnLoad',
+            value: function _msrOnLoad(e) {
+                // actually it is onComplete event
+                this._status = _loader.LoaderStatus.kComplete;
+                if (this._onComplete) {
+                    this._onComplete(this._totalRange.from, this._totalRange.from + this._receivedLength - 1);
+                }
+            }
+        }, {
+            key: '_msrOnError',
+            value: function _msrOnError(e) {
+                this._status = _loader.LoaderStatus.kError;
+                var type = 0;
+                var info = null;
+    
+                if (this._contentLength && this._receivedLength < this._contentLength) {
+                    type = _loader.LoaderErrors.EARLY_EOF;
+                    info = { code: -1, msg: 'MSStream meet Early-Eof' };
+                } else {
+                    type = _loader.LoaderErrors.EARLY_EOF;
+                    info = { code: -1, msg: e.constructor.name + ' ' + e.type };
+                }
+    
+                if (this._onError) {
+                    this._onError(type, info);
+                } else {
+                    throw new _exception.RuntimeException(info.msg);
+                }
+            }
+        }]);
+    
+        return MSStreamLoader;
+    }(_loader.BaseLoader);
+    
+    exports.default = MSStreamLoader;
+    
+    },{"../utils/exception.js":40,"../utils/logger.js":41,"./loader.js":24}],31:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+    
+    var _get = function get(object, property, receiver) { if (object === null) object = Function.prototype; var desc = Object.getOwnPropertyDescriptor(object, property); if (desc === undefined) { var parent = Object.getPrototypeOf(object); if (parent === null) { return undefined; } else { return get(parent, property, receiver); } } else if ("value" in desc) { return desc.value; } else { var getter = desc.get; if (getter === undefined) { return undefined; } return getter.call(receiver); } };
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _speedSampler = _dereq_('./speed-sampler.js');
+    
+    var _speedSampler2 = _interopRequireDefault(_speedSampler);
+    
+    var _loader = _dereq_('./loader.js');
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+    
+    function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; } /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    */
+    
+    // Universal IO Loader, implemented by adding Range header in xhr's request header
+    var RangeLoader = function (_BaseLoader) {
+        _inherits(RangeLoader, _BaseLoader);
+    
+        _createClass(RangeLoader, null, [{
+            key: 'isSupported',
+            value: function isSupported() {
+                try {
+                    var xhr = new XMLHttpRequest();
+                    xhr.open('GET', 'https://example.com', true);
+                    xhr.responseType = 'arraybuffer';
+                    return xhr.responseType === 'arraybuffer';
+                } catch (e) {
+                    _logger2.default.w('RangeLoader', e.message);
+                    return false;
+                }
+            }
+        }]);
+    
+        function RangeLoader(seekHandler, config) {
+            _classCallCheck(this, RangeLoader);
+    
+            var _this = _possibleConstructorReturn(this, (RangeLoader.__proto__ || Object.getPrototypeOf(RangeLoader)).call(this, 'xhr-range-loader'));
+    
+            _this.TAG = 'RangeLoader';
+    
+            _this._seekHandler = seekHandler;
+            _this._config = config;
+            _this._needStash = false;
+    
+            _this._chunkSizeKBList = [128, 256, 384, 512, 768, 1024, 1536, 2048, 3072, 4096, 5120, 6144, 7168, 8192];
+            _this._currentChunkSizeKB = 384;
+            _this._currentSpeedNormalized = 0;
+            _this._zeroSpeedChunkCount = 0;
+    
+            _this._xhr = null;
+            _this._speedSampler = new _speedSampler2.default();
+    
+            _this._requestAbort = false;
+            _this._waitForTotalLength = false;
+            _this._totalLengthReceived = false;
+    
+            _this._currentRequestURL = null;
+            _this._currentRedirectedURL = null;
+            _this._currentRequestRange = null;
+            _this._totalLength = null; // size of the entire file
+            _this._contentLength = null; // Content-Length of entire request range
+            _this._receivedLength = 0; // total received bytes
+            _this._lastTimeLoaded = 0; // received bytes of current request sub-range
+            return _this;
+        }
+    
+        _createClass(RangeLoader, [{
+            key: 'destroy',
+            value: function destroy() {
+                if (this.isWorking()) {
+                    this.abort();
+                }
+                if (this._xhr) {
+                    this._xhr.onreadystatechange = null;
+                    this._xhr.onprogress = null;
+                    this._xhr.onload = null;
+                    this._xhr.onerror = null;
+                    this._xhr = null;
+                }
+                _get(RangeLoader.prototype.__proto__ || Object.getPrototypeOf(RangeLoader.prototype), 'destroy', this).call(this);
+            }
+        }, {
+            key: 'open',
+            value: function open(dataSource, range) {
+                this._dataSource = dataSource;
+                this._range = range;
+                this._status = _loader.LoaderStatus.kConnecting;
+    
+                var useRefTotalLength = false;
+                if (this._dataSource.filesize != undefined && this._dataSource.filesize !== 0) {
+                    useRefTotalLength = true;
+                    this._totalLength = this._dataSource.filesize;
+                }
+    
+                if (!this._totalLengthReceived && !useRefTotalLength) {
+                    // We need total filesize
+                    this._waitForTotalLength = true;
+                    this._internalOpen(this._dataSource, { from: 0, to: -1 });
+                } else {
+                    // We have filesize, start loading
+                    this._openSubRange();
+                }
+            }
+        }, {
+            key: '_openSubRange',
+            value: function _openSubRange() {
+                var chunkSize = this._currentChunkSizeKB * 1024;
+    
+                var from = this._range.from + this._receivedLength;
+                var to = from + chunkSize;
+    
+                if (this._contentLength != null) {
+                    if (to - this._range.from >= this._contentLength) {
+                        to = this._range.from + this._contentLength - 1;
+                    }
+                }
+    
+                this._currentRequestRange = { from: from, to: to };
+                this._internalOpen(this._dataSource, this._currentRequestRange);
+            }
+        }, {
+            key: '_internalOpen',
+            value: function _internalOpen(dataSource, range) {
+                this._lastTimeLoaded = 0;
+    
+                var sourceURL = dataSource.url;
+                if (this._config.reuseRedirectedURL) {
+                    if (this._currentRedirectedURL != undefined) {
+                        sourceURL = this._currentRedirectedURL;
+                    } else if (dataSource.redirectedURL != undefined) {
+                        sourceURL = dataSource.redirectedURL;
+                    }
+                }
+    
+                var seekConfig = this._seekHandler.getConfig(sourceURL, range);
+                this._currentRequestURL = seekConfig.url;
+    
+                var xhr = this._xhr = new XMLHttpRequest();
+                xhr.open('GET', seekConfig.url, true);
+                xhr.responseType = 'arraybuffer';
+                xhr.onreadystatechange = this._onReadyStateChange.bind(this);
+                xhr.onprogress = this._onProgress.bind(this);
+                xhr.onload = this._onLoad.bind(this);
+                xhr.onerror = this._onXhrError.bind(this);
+    
+                if (dataSource.withCredentials) {
+                    xhr.withCredentials = true;
+                }
+    
+                if (_typeof(seekConfig.headers) === 'object') {
+                    var headers = seekConfig.headers;
+    
+                    for (var key in headers) {
+                        if (headers.hasOwnProperty(key)) {
+                            xhr.setRequestHeader(key, headers[key]);
+                        }
+                    }
+                }
+    
+                // add additional headers
+                if (_typeof(this._config.headers) === 'object') {
+                    var _headers = this._config.headers;
+    
+                    for (var _key in _headers) {
+                        if (_headers.hasOwnProperty(_key)) {
+                            xhr.setRequestHeader(_key, _headers[_key]);
+                        }
+                    }
+                }
+    
+                xhr.send();
+            }
+        }, {
+            key: 'abort',
+            value: function abort() {
+                this._requestAbort = true;
+                this._internalAbort();
+                this._status = _loader.LoaderStatus.kComplete;
+            }
+        }, {
+            key: '_internalAbort',
+            value: function _internalAbort() {
+                if (this._xhr) {
+                    this._xhr.onreadystatechange = null;
+                    this._xhr.onprogress = null;
+                    this._xhr.onload = null;
+                    this._xhr.onerror = null;
+                    this._xhr.abort();
+                    this._xhr = null;
+                }
+            }
+        }, {
+            key: '_onReadyStateChange',
+            value: function _onReadyStateChange(e) {
+                var xhr = e.target;
+    
+                if (xhr.readyState === 2) {
+                    // HEADERS_RECEIVED
+                    if (xhr.responseURL != undefined) {
+                        // if the browser support this property
+                        var redirectedURL = this._seekHandler.removeURLParameters(xhr.responseURL);
+                        if (xhr.responseURL !== this._currentRequestURL && redirectedURL !== this._currentRedirectedURL) {
+                            this._currentRedirectedURL = redirectedURL;
+                            if (this._onURLRedirect) {
+                                this._onURLRedirect(redirectedURL);
+                            }
+                        }
+                    }
+    
+                    if (xhr.status >= 200 && xhr.status <= 299) {
+                        if (this._waitForTotalLength) {
+                            return;
+                        }
+                        this._status = _loader.LoaderStatus.kBuffering;
+                    } else {
+                        this._status = _loader.LoaderStatus.kError;
+                        if (this._onError) {
+                            this._onError(_loader.LoaderErrors.HTTP_STATUS_CODE_INVALID, { code: xhr.status, msg: xhr.statusText });
+                        } else {
+                            throw new _exception.RuntimeException('RangeLoader: Http code invalid, ' + xhr.status + ' ' + xhr.statusText);
+                        }
+                    }
+                }
+            }
+        }, {
+            key: '_onProgress',
+            value: function _onProgress(e) {
+                if (this._status === _loader.LoaderStatus.kError) {
+                    // Ignore error response
+                    return;
+                }
+    
+                if (this._contentLength === null) {
+                    var openNextRange = false;
+    
+                    if (this._waitForTotalLength) {
+                        this._waitForTotalLength = false;
+                        this._totalLengthReceived = true;
+                        openNextRange = true;
+    
+                        var total = e.total;
+                        this._internalAbort();
+                        if (total != null & total !== 0) {
+                            this._totalLength = total;
+                        }
+                    }
+    
+                    // calculate currrent request range's contentLength
+                    if (this._range.to === -1) {
+                        this._contentLength = this._totalLength - this._range.from;
+                    } else {
+                        // to !== -1
+                        this._contentLength = this._range.to - this._range.from + 1;
+                    }
+    
+                    if (openNextRange) {
+                        this._openSubRange();
+                        return;
+                    }
+                    if (this._onContentLengthKnown) {
+                        this._onContentLengthKnown(this._contentLength);
+                    }
+                }
+    
+                var delta = e.loaded - this._lastTimeLoaded;
+                this._lastTimeLoaded = e.loaded;
+                this._speedSampler.addBytes(delta);
+            }
+        }, {
+            key: '_normalizeSpeed',
+            value: function _normalizeSpeed(input) {
+                var list = this._chunkSizeKBList;
+                var last = list.length - 1;
+                var mid = 0;
+                var lbound = 0;
+                var ubound = last;
+    
+                if (input < list[0]) {
+                    return list[0];
+                }
+    
+                while (lbound <= ubound) {
+                    mid = lbound + Math.floor((ubound - lbound) / 2);
+                    if (mid === last || input >= list[mid] && input < list[mid + 1]) {
+                        return list[mid];
+                    } else if (list[mid] < input) {
+                        lbound = mid + 1;
+                    } else {
+                        ubound = mid - 1;
+                    }
+                }
+            }
+        }, {
+            key: '_onLoad',
+            value: function _onLoad(e) {
+                if (this._status === _loader.LoaderStatus.kError) {
+                    // Ignore error response
+                    return;
+                }
+    
+                if (this._waitForTotalLength) {
+                    this._waitForTotalLength = false;
+                    return;
+                }
+    
+                this._lastTimeLoaded = 0;
+                var KBps = this._speedSampler.lastSecondKBps;
+                if (KBps === 0) {
+                    this._zeroSpeedChunkCount++;
+                    if (this._zeroSpeedChunkCount >= 3) {
+                        // Try get currentKBps after 3 chunks
+                        KBps = this._speedSampler.currentKBps;
+                    }
+                }
+    
+                if (KBps !== 0) {
+                    var normalized = this._normalizeSpeed(KBps);
+                    if (this._currentSpeedNormalized !== normalized) {
+                        this._currentSpeedNormalized = normalized;
+                        this._currentChunkSizeKB = normalized;
+                    }
+                }
+    
+                var chunk = e.target.response;
+                var byteStart = this._range.from + this._receivedLength;
+                this._receivedLength += chunk.byteLength;
+    
+                var reportComplete = false;
+    
+                if (this._contentLength != null && this._receivedLength < this._contentLength) {
+                    // continue load next chunk
+                    this._openSubRange();
+                } else {
+                    reportComplete = true;
+                }
+    
+                // dispatch received chunk
+                if (this._onDataArrival) {
+                    this._onDataArrival(chunk, byteStart, this._receivedLength);
+                }
+    
+                if (reportComplete) {
+                    this._status = _loader.LoaderStatus.kComplete;
+                    if (this._onComplete) {
+                        this._onComplete(this._range.from, this._range.from + this._receivedLength - 1);
+                    }
+                }
+            }
+        }, {
+            key: '_onXhrError',
+            value: function _onXhrError(e) {
+                this._status = _loader.LoaderStatus.kError;
+                var type = 0;
+                var info = null;
+    
+                if (this._contentLength && this._receivedLength > 0 && this._receivedLength < this._contentLength) {
+                    type = _loader.LoaderErrors.EARLY_EOF;
+                    info = { code: -1, msg: 'RangeLoader meet Early-Eof' };
+                } else {
+                    type = _loader.LoaderErrors.EXCEPTION;
+                    info = { code: -1, msg: e.constructor.name + ' ' + e.type };
+                }
+    
+                if (this._onError) {
+                    this._onError(type, info);
+                } else {
+                    throw new _exception.RuntimeException(info.msg);
+                }
+            }
+        }, {
+            key: 'currentSpeed',
+            get: function get() {
+                return this._speedSampler.lastSecondKBps;
+            }
+        }]);
+    
+        return RangeLoader;
+    }(_loader.BaseLoader);
+    
+    exports.default = RangeLoader;
+    
+    },{"../utils/exception.js":40,"../utils/logger.js":41,"./loader.js":24,"./speed-sampler.js":27}],32:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _events = _dereq_('events');
+    
+    var _events2 = _interopRequireDefault(_events);
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _browser = _dereq_('../utils/browser.js');
+    
+    var _browser2 = _interopRequireDefault(_browser);
+    
+    var _playerEvents = _dereq_('./player-events.js');
+    
+    var _playerEvents2 = _interopRequireDefault(_playerEvents);
+    
+    var _transmuxer = _dereq_('../core/transmuxer.js');
+    
+    var _transmuxer2 = _interopRequireDefault(_transmuxer);
+    
+    var _transmuxingEvents = _dereq_('../core/transmuxing-events.js');
+    
+    var _transmuxingEvents2 = _interopRequireDefault(_transmuxingEvents);
+    
+    var _mseController = _dereq_('../core/mse-controller.js');
+    
+    var _mseController2 = _interopRequireDefault(_mseController);
+    
+    var _mseEvents = _dereq_('../core/mse-events.js');
+    
+    var _mseEvents2 = _interopRequireDefault(_mseEvents);
+    
+    var _playerErrors = _dereq_('./player-errors.js');
+    
+    var _config = _dereq_('../config.js');
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    var FlvPlayer = function () {
+        function FlvPlayer(mediaDataSource, config) {
+            _classCallCheck(this, FlvPlayer);
+    
+            this.TAG = 'FlvPlayer';
+            this._type = 'FlvPlayer';
+            this._emitter = new _events2.default();
+    
+            this._config = (0, _config.createDefaultConfig)();
+            if ((typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object') {
+                Object.assign(this._config, config);
+            }
+    
+            if (mediaDataSource.type.toLowerCase() !== 'flv') {
+                throw new _exception.InvalidArgumentException('FlvPlayer requires an flv MediaDataSource input!');
+            }
+    
+            if (mediaDataSource.isLive === true) {
+                this._config.isLive = true;
+            }
+    
+            this.e = {
+                onvLoadedMetadata: this._onvLoadedMetadata.bind(this),
+                onvSeeking: this._onvSeeking.bind(this),
+                onvCanPlay: this._onvCanPlay.bind(this),
+                onvStalled: this._onvStalled.bind(this),
+                onvProgress: this._onvProgress.bind(this)
+            };
+    
+            if (self.performance && self.performance.now) {
+                this._now = self.performance.now.bind(self.performance);
+            } else {
+                this._now = Date.now;
+            }
+    
+            this._pendingSeekTime = null; // in seconds
+            this._requestSetTime = false;
+            this._seekpointRecord = null;
+            this._progressChecker = null;
+    
+            this._mediaDataSource = mediaDataSource;
+            this._mediaElement = null;
+            this._msectl = null;
+            this._transmuxer = null;
+    
+            this._mseSourceOpened = false;
+            this._hasPendingLoad = false;
+            this._receivedCanPlay = false;
+    
+            this._mediaInfo = null;
+            this._statisticsInfo = null;
+    
+            var chromeNeedIDRFix = _browser2.default.chrome && (_browser2.default.version.major < 50 || _browser2.default.version.major === 50 && _browser2.default.version.build < 2661);
+            this._alwaysSeekKeyframe = chromeNeedIDRFix || _browser2.default.msedge || _browser2.default.msie ? true : false;
+    
+            if (this._alwaysSeekKeyframe) {
+                this._config.accurateSeek = false;
+            }
+        }
+    
+        _createClass(FlvPlayer, [{
+            key: 'destroy',
+            value: function destroy() {
+                if (this._progressChecker != null) {
+                    window.clearInterval(this._progressChecker);
+                    this._progressChecker = null;
+                }
+                if (this._transmuxer) {
+                    this.unload();
+                }
+                if (this._mediaElement) {
+                    this.detachMediaElement();
+                }
+                this.e = null;
+                this._mediaDataSource = null;
+    
+                this._emitter.removeAllListeners();
+                this._emitter = null;
+            }
+        }, {
+            key: 'on',
+            value: function on(event, listener) {
+                var _this = this;
+    
+                if (event === _playerEvents2.default.MEDIA_INFO) {
+                    if (this._mediaInfo != null) {
+                        Promise.resolve().then(function () {
+                            _this._emitter.emit(_playerEvents2.default.MEDIA_INFO, _this.mediaInfo);
+                        });
+                    }
+                } else if (event === _playerEvents2.default.STATISTICS_INFO) {
+                    if (this._statisticsInfo != null) {
+                        Promise.resolve().then(function () {
+                            _this._emitter.emit(_playerEvents2.default.STATISTICS_INFO, _this.statisticsInfo);
+                        });
+                    }
+                }
+                this._emitter.addListener(event, listener);
+            }
+        }, {
+            key: 'off',
+            value: function off(event, listener) {
+                this._emitter.removeListener(event, listener);
+            }
+        }, {
+            key: 'attachMediaElement',
+            value: function attachMediaElement(mediaElement) {
+                var _this2 = this;
+    
+                this._mediaElement = mediaElement;
+                mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);
+                mediaElement.addEventListener('seeking', this.e.onvSeeking);
+                mediaElement.addEventListener('canplay', this.e.onvCanPlay);
+                mediaElement.addEventListener('stalled', this.e.onvStalled);
+                mediaElement.addEventListener('progress', this.e.onvProgress);
+    
+                this._msectl = new _mseController2.default(this._config);
+    
+                this._msectl.on(_mseEvents2.default.UPDATE_END, this._onmseUpdateEnd.bind(this));
+                this._msectl.on(_mseEvents2.default.BUFFER_FULL, this._onmseBufferFull.bind(this));
+                this._msectl.on(_mseEvents2.default.SOURCE_OPEN, function () {
+                    _this2._mseSourceOpened = true;
+                    if (_this2._hasPendingLoad) {
+                        _this2._hasPendingLoad = false;
+                        _this2.load();
+                    }
+                });
+                this._msectl.on(_mseEvents2.default.ERROR, function (info) {
+                    _this2._emitter.emit(_playerEvents2.default.ERROR, _playerErrors.ErrorTypes.MEDIA_ERROR, _playerErrors.ErrorDetails.MEDIA_MSE_ERROR, info);
+                });
+    
+                this._msectl.attachMediaElement(mediaElement);
+    
+                if (this._pendingSeekTime != null) {
+                    try {
+                        mediaElement.currentTime = this._pendingSeekTime;
+                        this._pendingSeekTime = null;
+                    } catch (e) {
+                        // IE11 may throw InvalidStateError if readyState === 0
+                        // We can defer set currentTime operation after loadedmetadata
+                    }
+                }
+            }
+        }, {
+            key: 'detachMediaElement',
+            value: function detachMediaElement() {
+                if (this._mediaElement) {
+                    this._msectl.detachMediaElement();
+                    this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);
+                    this._mediaElement.removeEventListener('seeking', this.e.onvSeeking);
+                    this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);
+                    this._mediaElement.removeEventListener('stalled', this.e.onvStalled);
+                    this._mediaElement.removeEventListener('progress', this.e.onvProgress);
+                    this._mediaElement = null;
+                }
+                if (this._msectl) {
+                    this._msectl.destroy();
+                    this._msectl = null;
+                }
+            }
+        }, {
+            key: 'load',
+            value: function load() {
+                var _this3 = this;
+    
+                if (!this._mediaElement) {
+                    throw new _exception.IllegalStateException('HTMLMediaElement must be attached before load()!');
+                }
+                if (this._transmuxer) {
+                    throw new _exception.IllegalStateException('FlvPlayer.load() has been called, please call unload() first!');
+                }
+                if (this._hasPendingLoad) {
+                    return;
+                }
+    
+                if (this._config.deferLoadAfterSourceOpen && this._mseSourceOpened === false) {
+                    this._hasPendingLoad = true;
+                    return;
+                }
+    
+                if (this._mediaElement.readyState > 0) {
+                    this._requestSetTime = true;
+                    // IE11 may throw InvalidStateError if readyState === 0
+                    this._mediaElement.currentTime = 0;
+                }
+    
+                this._transmuxer = new _transmuxer2.default(this._mediaDataSource, this._config);
+    
+                this._transmuxer.on(_transmuxingEvents2.default.INIT_SEGMENT, function (type, is) {
+                    _this3._msectl.appendInitSegment(is);
+                });
+                this._transmuxer.on(_transmuxingEvents2.default.MEDIA_SEGMENT, function (type, ms) {
+                    _this3._msectl.appendMediaSegment(ms);
+    
+                    // lazyLoad check
+                    if (_this3._config.lazyLoad && !_this3._config.isLive) {
+                        var currentTime = _this3._mediaElement.currentTime;
+                        if (ms.info.endDts >= (currentTime + _this3._config.lazyLoadMaxDuration) * 1000) {
+                            if (_this3._progressChecker == null) {
+                                _logger2.default.v(_this3.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');
+                                _this3._suspendTransmuxer();
+                            }
+                        }
+                    }
+                });
+                this._transmuxer.on(_transmuxingEvents2.default.LOADING_COMPLETE, function () {
+                    _this3._msectl.endOfStream();
+                    _this3._emitter.emit(_playerEvents2.default.LOADING_COMPLETE);
+                });
+                this._transmuxer.on(_transmuxingEvents2.default.RECOVERED_EARLY_EOF, function () {
+                    _this3._emitter.emit(_playerEvents2.default.RECOVERED_EARLY_EOF);
+                });
+                this._transmuxer.on(_transmuxingEvents2.default.IO_ERROR, function (detail, info) {
+                    _this3._emitter.emit(_playerEvents2.default.ERROR, _playerErrors.ErrorTypes.NETWORK_ERROR, detail, info);
+                });
+                this._transmuxer.on(_transmuxingEvents2.default.DEMUX_ERROR, function (detail, info) {
+                    _this3._emitter.emit(_playerEvents2.default.ERROR, _playerErrors.ErrorTypes.MEDIA_ERROR, detail, { code: -1, msg: info });
+                });
+                this._transmuxer.on(_transmuxingEvents2.default.MEDIA_INFO, function (mediaInfo) {
+                    _this3._mediaInfo = mediaInfo;
+                    _this3._emitter.emit(_playerEvents2.default.MEDIA_INFO, Object.assign({}, mediaInfo));
+                });
+                this._transmuxer.on(_transmuxingEvents2.default.METADATA_ARRIVED, function (metadata) {
+                    _this3._emitter.emit(_playerEvents2.default.METADATA_ARRIVED, metadata);
+                });
+                this._transmuxer.on(_transmuxingEvents2.default.SCRIPTDATA_ARRIVED, function (data) {
+                    _this3._emitter.emit(_playerEvents2.default.SCRIPTDATA_ARRIVED, data);
+                });
+                this._transmuxer.on(_transmuxingEvents2.default.STATISTICS_INFO, function (statInfo) {
+                    _this3._statisticsInfo = _this3._fillStatisticsInfo(statInfo);
+                    _this3._emitter.emit(_playerEvents2.default.STATISTICS_INFO, Object.assign({}, _this3._statisticsInfo));
+                });
+                this._transmuxer.on(_transmuxingEvents2.default.RECOMMEND_SEEKPOINT, function (milliseconds) {
+                    if (_this3._mediaElement && !_this3._config.accurateSeek) {
+                        _this3._requestSetTime = true;
+                        _this3._mediaElement.currentTime = milliseconds / 1000;
+                    }
+                });
+    
+                this._transmuxer.open();
+            }
+        }, {
+            key: 'unload',
+            value: function unload() {
+                if (this._mediaElement) {
+                    this._mediaElement.pause();
+                }
+                if (this._msectl) {
+                    this._msectl.seek(0);
+                }
+                if (this._transmuxer) {
+                    this._transmuxer.close();
+                    this._transmuxer.destroy();
+                    this._transmuxer = null;
+                }
+            }
+        }, {
+            key: 'play',
+            value: function play() {
+                return this._mediaElement.play();
+            }
+        }, {
+            key: 'pause',
+            value: function pause() {
+                this._mediaElement.pause();
+            }
+        }, {
+            key: '_fillStatisticsInfo',
+            value: function _fillStatisticsInfo(statInfo) {
+                statInfo.playerType = this._type;
+    
+                if (!(this._mediaElement instanceof HTMLVideoElement)) {
+                    return statInfo;
+                }
+    
+                var hasQualityInfo = true;
+                var decoded = 0;
+                var dropped = 0;
+    
+                if (this._mediaElement.getVideoPlaybackQuality) {
+                    var quality = this._mediaElement.getVideoPlaybackQuality();
+                    decoded = quality.totalVideoFrames;
+                    dropped = quality.droppedVideoFrames;
+                } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {
+                    decoded = this._mediaElement.webkitDecodedFrameCount;
+                    dropped = this._mediaElement.webkitDroppedFrameCount;
+                } else {
+                    hasQualityInfo = false;
+                }
+    
+                if (hasQualityInfo) {
+                    statInfo.decodedFrames = decoded;
+                    statInfo.droppedFrames = dropped;
+                }
+    
+                return statInfo;
+            }
+        }, {
+            key: '_onmseUpdateEnd',
+            value: function _onmseUpdateEnd() {
+                if (!this._config.lazyLoad || this._config.isLive) {
+                    return;
+                }
+    
+                var buffered = this._mediaElement.buffered;
+                var currentTime = this._mediaElement.currentTime;
+                var currentRangeStart = 0;
+                var currentRangeEnd = 0;
+    
+                for (var i = 0; i < buffered.length; i++) {
+                    var start = buffered.start(i);
+                    var end = buffered.end(i);
+                    if (start <= currentTime && currentTime < end) {
+                        currentRangeStart = start;
+                        currentRangeEnd = end;
+                        break;
+                    }
+                }
+    
+                if (currentRangeEnd >= currentTime + this._config.lazyLoadMaxDuration && this._progressChecker == null) {
+                    _logger2.default.v(this.TAG, 'Maximum buffering duration exceeded, suspend transmuxing task');
+                    this._suspendTransmuxer();
+                }
+            }
+        }, {
+            key: '_onmseBufferFull',
+            value: function _onmseBufferFull() {
+                _logger2.default.v(this.TAG, 'MSE SourceBuffer is full, suspend transmuxing task');
+                if (this._progressChecker == null) {
+                    this._suspendTransmuxer();
+                }
+            }
+        }, {
+            key: '_suspendTransmuxer',
+            value: function _suspendTransmuxer() {
+                if (this._transmuxer) {
+                    this._transmuxer.pause();
+    
+                    if (this._progressChecker == null) {
+                        this._progressChecker = window.setInterval(this._checkProgressAndResume.bind(this), 1000);
+                    }
+                }
+            }
+        }, {
+            key: '_checkProgressAndResume',
+            value: function _checkProgressAndResume() {
+                var currentTime = this._mediaElement.currentTime;
+                var buffered = this._mediaElement.buffered;
+    
+                var needResume = false;
+    
+                for (var i = 0; i < buffered.length; i++) {
+                    var from = buffered.start(i);
+                    var to = buffered.end(i);
+                    if (currentTime >= from && currentTime < to) {
+                        if (currentTime >= to - this._config.lazyLoadRecoverDuration) {
+                            needResume = true;
+                        }
+                        break;
+                    }
+                }
+    
+                if (needResume) {
+                    window.clearInterval(this._progressChecker);
+                    this._progressChecker = null;
+                    if (needResume) {
+                        _logger2.default.v(this.TAG, 'Continue loading from paused position');
+                        this._transmuxer.resume();
+                    }
+                }
+            }
+        }, {
+            key: '_isTimepointBuffered',
+            value: function _isTimepointBuffered(seconds) {
+                var buffered = this._mediaElement.buffered;
+    
+                for (var i = 0; i < buffered.length; i++) {
+                    var from = buffered.start(i);
+                    var to = buffered.end(i);
+                    if (seconds >= from && seconds < to) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+        }, {
+            key: '_internalSeek',
+            value: function _internalSeek(seconds) {
+                var directSeek = this._isTimepointBuffered(seconds);
+    
+                var directSeekBegin = false;
+                var directSeekBeginTime = 0;
+    
+                if (seconds < 1.0 && this._mediaElement.buffered.length > 0) {
+                    var videoBeginTime = this._mediaElement.buffered.start(0);
+                    if (videoBeginTime < 1.0 && seconds < videoBeginTime || _browser2.default.safari) {
+                        directSeekBegin = true;
+                        // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid
+                        directSeekBeginTime = _browser2.default.safari ? 0.1 : videoBeginTime;
+                    }
+                }
+    
+                if (directSeekBegin) {
+                    // seek to video begin, set currentTime directly if beginPTS buffered
+                    this._requestSetTime = true;
+                    this._mediaElement.currentTime = directSeekBeginTime;
+                } else if (directSeek) {
+                    // buffered position
+                    if (!this._alwaysSeekKeyframe) {
+                        this._requestSetTime = true;
+                        this._mediaElement.currentTime = seconds;
+                    } else {
+                        var idr = this._msectl.getNearestKeyframe(Math.floor(seconds * 1000));
+                        this._requestSetTime = true;
+                        if (idr != null) {
+                            this._mediaElement.currentTime = idr.dts / 1000;
+                        } else {
+                            this._mediaElement.currentTime = seconds;
+                        }
+                    }
+                    if (this._progressChecker != null) {
+                        this._checkProgressAndResume();
+                    }
+                } else {
+                    if (this._progressChecker != null) {
+                        window.clearInterval(this._progressChecker);
+                        this._progressChecker = null;
+                    }
+                    this._msectl.seek(seconds);
+                    this._transmuxer.seek(Math.floor(seconds * 1000)); // in milliseconds
+                    // no need to set mediaElement.currentTime if non-accurateSeek,
+                    // just wait for the recommend_seekpoint callback
+                    if (this._config.accurateSeek) {
+                        this._requestSetTime = true;
+                        this._mediaElement.currentTime = seconds;
+                    }
+                }
+            }
+        }, {
+            key: '_checkAndApplyUnbufferedSeekpoint',
+            value: function _checkAndApplyUnbufferedSeekpoint() {
+                if (this._seekpointRecord) {
+                    if (this._seekpointRecord.recordTime <= this._now() - 100) {
+                        var target = this._mediaElement.currentTime;
+                        this._seekpointRecord = null;
+                        if (!this._isTimepointBuffered(target)) {
+                            if (this._progressChecker != null) {
+                                window.clearTimeout(this._progressChecker);
+                                this._progressChecker = null;
+                            }
+                            // .currentTime is consists with .buffered timestamp
+                            // Chrome/Edge use DTS, while FireFox/Safari use PTS
+                            this._msectl.seek(target);
+                            this._transmuxer.seek(Math.floor(target * 1000));
+                            // set currentTime if accurateSeek, or wait for recommend_seekpoint callback
+                            if (this._config.accurateSeek) {
+                                this._requestSetTime = true;
+                                this._mediaElement.currentTime = target;
+                            }
+                        }
+                    } else {
+                        window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);
+                    }
+                }
+            }
+        }, {
+            key: '_checkAndResumeStuckPlayback',
+            value: function _checkAndResumeStuckPlayback(stalled) {
+                var media = this._mediaElement;
+                if (stalled || !this._receivedCanPlay || media.readyState < 2) {
+                    // HAVE_CURRENT_DATA
+                    var buffered = media.buffered;
+                    if (buffered.length > 0 && media.currentTime < buffered.start(0)) {
+                        _logger2.default.w(this.TAG, 'Playback seems stuck at ' + media.currentTime + ', seek to ' + buffered.start(0));
+                        this._requestSetTime = true;
+                        this._mediaElement.currentTime = buffered.start(0);
+                        this._mediaElement.removeEventListener('progress', this.e.onvProgress);
+                    }
+                } else {
+                    // Playback didn't stuck, remove progress event listener
+                    this._mediaElement.removeEventListener('progress', this.e.onvProgress);
+                }
+            }
+        }, {
+            key: '_onvLoadedMetadata',
+            value: function _onvLoadedMetadata(e) {
+                if (this._pendingSeekTime != null) {
+                    this._mediaElement.currentTime = this._pendingSeekTime;
+                    this._pendingSeekTime = null;
+                }
+            }
+        }, {
+            key: '_onvSeeking',
+            value: function _onvSeeking(e) {
+                // handle seeking request from browser's progress bar
+                var target = this._mediaElement.currentTime;
+                var buffered = this._mediaElement.buffered;
+    
+                if (this._requestSetTime) {
+                    this._requestSetTime = false;
+                    return;
+                }
+    
+                if (target < 1.0 && buffered.length > 0) {
+                    // seek to video begin, set currentTime directly if beginPTS buffered
+                    var videoBeginTime = buffered.start(0);
+                    if (videoBeginTime < 1.0 && target < videoBeginTime || _browser2.default.safari) {
+                        this._requestSetTime = true;
+                        // also workaround for Safari: Seek to 0 may cause video stuck, use 0.1 to avoid
+                        this._mediaElement.currentTime = _browser2.default.safari ? 0.1 : videoBeginTime;
+                        return;
+                    }
+                }
+    
+                if (this._isTimepointBuffered(target)) {
+                    if (this._alwaysSeekKeyframe) {
+                        var idr = this._msectl.getNearestKeyframe(Math.floor(target * 1000));
+                        if (idr != null) {
+                            this._requestSetTime = true;
+                            this._mediaElement.currentTime = idr.dts / 1000;
+                        }
+                    }
+                    if (this._progressChecker != null) {
+                        this._checkProgressAndResume();
+                    }
+                    return;
+                }
+    
+                this._seekpointRecord = {
+                    seekPoint: target,
+                    recordTime: this._now()
+                };
+                window.setTimeout(this._checkAndApplyUnbufferedSeekpoint.bind(this), 50);
+            }
+        }, {
+            key: '_onvCanPlay',
+            value: function _onvCanPlay(e) {
+                this._receivedCanPlay = true;
+                this._mediaElement.removeEventListener('canplay', this.e.onvCanPlay);
+            }
+        }, {
+            key: '_onvStalled',
+            value: function _onvStalled(e) {
+                this._checkAndResumeStuckPlayback(true);
+            }
+        }, {
+            key: '_onvProgress',
+            value: function _onvProgress(e) {
+                this._checkAndResumeStuckPlayback();
+            }
+        }, {
+            key: 'type',
+            get: function get() {
+                return this._type;
+            }
+        }, {
+            key: 'buffered',
+            get: function get() {
+                return this._mediaElement.buffered;
+            }
+        }, {
+            key: 'duration',
+            get: function get() {
+                return this._mediaElement.duration;
+            }
+        }, {
+            key: 'volume',
+            get: function get() {
+                return this._mediaElement.volume;
+            },
+            set: function set(value) {
+                this._mediaElement.volume = value;
+            }
+        }, {
+            key: 'muted',
+            get: function get() {
+                return this._mediaElement.muted;
+            },
+            set: function set(muted) {
+                this._mediaElement.muted = muted;
+            }
+        }, {
+            key: 'currentTime',
+            get: function get() {
+                if (this._mediaElement) {
+                    return this._mediaElement.currentTime;
+                }
+                return 0;
+            },
+            set: function set(seconds) {
+                if (this._mediaElement) {
+                    this._internalSeek(seconds);
+                } else {
+                    this._pendingSeekTime = seconds;
+                }
+            }
+        }, {
+            key: 'mediaInfo',
+            get: function get() {
+                return Object.assign({}, this._mediaInfo);
+            }
+        }, {
+            key: 'statisticsInfo',
+            get: function get() {
+                if (this._statisticsInfo == null) {
+                    this._statisticsInfo = {};
+                }
+                this._statisticsInfo = this._fillStatisticsInfo(this._statisticsInfo);
+                return Object.assign({}, this._statisticsInfo);
+            }
+        }]);
+    
+        return FlvPlayer;
+    }();
+    
+    exports.default = FlvPlayer;
+    
+    },{"../config.js":5,"../core/mse-controller.js":9,"../core/mse-events.js":10,"../core/transmuxer.js":11,"../core/transmuxing-events.js":13,"../utils/browser.js":39,"../utils/exception.js":40,"../utils/logger.js":41,"./player-errors.js":34,"./player-events.js":35,"events":2}],33:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _events = _dereq_('events');
+    
+    var _events2 = _interopRequireDefault(_events);
+    
+    var _playerEvents = _dereq_('./player-events.js');
+    
+    var _playerEvents2 = _interopRequireDefault(_playerEvents);
+    
+    var _config = _dereq_('../config.js');
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    // Player wrapper for browser's native player (HTMLVideoElement) without MediaSource src. 
+    var NativePlayer = function () {
+        function NativePlayer(mediaDataSource, config) {
+            _classCallCheck(this, NativePlayer);
+    
+            this.TAG = 'NativePlayer';
+            this._type = 'NativePlayer';
+            this._emitter = new _events2.default();
+    
+            this._config = (0, _config.createDefaultConfig)();
+            if ((typeof config === 'undefined' ? 'undefined' : _typeof(config)) === 'object') {
+                Object.assign(this._config, config);
+            }
+    
+            if (mediaDataSource.type.toLowerCase() === 'flv') {
+                throw new _exception.InvalidArgumentException('NativePlayer does\'t support flv MediaDataSource input!');
+            }
+            if (mediaDataSource.hasOwnProperty('segments')) {
+                throw new _exception.InvalidArgumentException('NativePlayer(' + mediaDataSource.type + ') doesn\'t support multipart playback!');
+            }
+    
+            this.e = {
+                onvLoadedMetadata: this._onvLoadedMetadata.bind(this)
+            };
+    
+            this._pendingSeekTime = null;
+            this._statisticsReporter = null;
+    
+            this._mediaDataSource = mediaDataSource;
+            this._mediaElement = null;
+        }
+    
+        _createClass(NativePlayer, [{
+            key: 'destroy',
+            value: function destroy() {
+                if (this._mediaElement) {
+                    this.unload();
+                    this.detachMediaElement();
+                }
+                this.e = null;
+                this._mediaDataSource = null;
+                this._emitter.removeAllListeners();
+                this._emitter = null;
+            }
+        }, {
+            key: 'on',
+            value: function on(event, listener) {
+                var _this = this;
+    
+                if (event === _playerEvents2.default.MEDIA_INFO) {
+                    if (this._mediaElement != null && this._mediaElement.readyState !== 0) {
+                        // HAVE_NOTHING
+                        Promise.resolve().then(function () {
+                            _this._emitter.emit(_playerEvents2.default.MEDIA_INFO, _this.mediaInfo);
+                        });
+                    }
+                } else if (event === _playerEvents2.default.STATISTICS_INFO) {
+                    if (this._mediaElement != null && this._mediaElement.readyState !== 0) {
+                        Promise.resolve().then(function () {
+                            _this._emitter.emit(_playerEvents2.default.STATISTICS_INFO, _this.statisticsInfo);
+                        });
+                    }
+                }
+                this._emitter.addListener(event, listener);
+            }
+        }, {
+            key: 'off',
+            value: function off(event, listener) {
+                this._emitter.removeListener(event, listener);
+            }
+        }, {
+            key: 'attachMediaElement',
+            value: function attachMediaElement(mediaElement) {
+                this._mediaElement = mediaElement;
+                mediaElement.addEventListener('loadedmetadata', this.e.onvLoadedMetadata);
+    
+                if (this._pendingSeekTime != null) {
+                    try {
+                        mediaElement.currentTime = this._pendingSeekTime;
+                        this._pendingSeekTime = null;
+                    } catch (e) {
+                        // IE11 may throw InvalidStateError if readyState === 0
+                        // Defer set currentTime operation after loadedmetadata
+                    }
+                }
+            }
+        }, {
+            key: 'detachMediaElement',
+            value: function detachMediaElement() {
+                if (this._mediaElement) {
+                    this._mediaElement.src = '';
+                    this._mediaElement.removeAttribute('src');
+                    this._mediaElement.removeEventListener('loadedmetadata', this.e.onvLoadedMetadata);
+                    this._mediaElement = null;
+                }
+                if (this._statisticsReporter != null) {
+                    window.clearInterval(this._statisticsReporter);
+                    this._statisticsReporter = null;
+                }
+            }
+        }, {
+            key: 'load',
+            value: function load() {
+                if (!this._mediaElement) {
+                    throw new _exception.IllegalStateException('HTMLMediaElement must be attached before load()!');
+                }
+                this._mediaElement.src = this._mediaDataSource.url;
+    
+                if (this._mediaElement.readyState > 0) {
+                    this._mediaElement.currentTime = 0;
+                }
+    
+                this._mediaElement.preload = 'auto';
+                this._mediaElement.load();
+                this._statisticsReporter = window.setInterval(this._reportStatisticsInfo.bind(this), this._config.statisticsInfoReportInterval);
+            }
+        }, {
+            key: 'unload',
+            value: function unload() {
+                if (this._mediaElement) {
+                    this._mediaElement.src = '';
+                    this._mediaElement.removeAttribute('src');
+                }
+                if (this._statisticsReporter != null) {
+                    window.clearInterval(this._statisticsReporter);
+                    this._statisticsReporter = null;
+                }
+            }
+        }, {
+            key: 'play',
+            value: function play() {
+                return this._mediaElement.play();
+            }
+        }, {
+            key: 'pause',
+            value: function pause() {
+                this._mediaElement.pause();
+            }
+        }, {
+            key: '_onvLoadedMetadata',
+            value: function _onvLoadedMetadata(e) {
+                if (this._pendingSeekTime != null) {
+                    this._mediaElement.currentTime = this._pendingSeekTime;
+                    this._pendingSeekTime = null;
+                }
+                this._emitter.emit(_playerEvents2.default.MEDIA_INFO, this.mediaInfo);
+            }
+        }, {
+            key: '_reportStatisticsInfo',
+            value: function _reportStatisticsInfo() {
+                this._emitter.emit(_playerEvents2.default.STATISTICS_INFO, this.statisticsInfo);
+            }
+        }, {
+            key: 'type',
+            get: function get() {
+                return this._type;
+            }
+        }, {
+            key: 'buffered',
+            get: function get() {
+                return this._mediaElement.buffered;
+            }
+        }, {
+            key: 'duration',
+            get: function get() {
+                return this._mediaElement.duration;
+            }
+        }, {
+            key: 'volume',
+            get: function get() {
+                return this._mediaElement.volume;
+            },
+            set: function set(value) {
+                this._mediaElement.volume = value;
+            }
+        }, {
+            key: 'muted',
+            get: function get() {
+                return this._mediaElement.muted;
+            },
+            set: function set(muted) {
+                this._mediaElement.muted = muted;
+            }
+        }, {
+            key: 'currentTime',
+            get: function get() {
+                if (this._mediaElement) {
+                    return this._mediaElement.currentTime;
+                }
+                return 0;
+            },
+            set: function set(seconds) {
+                if (this._mediaElement) {
+                    this._mediaElement.currentTime = seconds;
+                } else {
+                    this._pendingSeekTime = seconds;
+                }
+            }
+        }, {
+            key: 'mediaInfo',
+            get: function get() {
+                var mediaPrefix = this._mediaElement instanceof HTMLAudioElement ? 'audio/' : 'video/';
+                var info = {
+                    mimeType: mediaPrefix + this._mediaDataSource.type
+                };
+                if (this._mediaElement) {
+                    info.duration = Math.floor(this._mediaElement.duration * 1000);
+                    if (this._mediaElement instanceof HTMLVideoElement) {
+                        info.width = this._mediaElement.videoWidth;
+                        info.height = this._mediaElement.videoHeight;
+                    }
+                }
+                return info;
+            }
+        }, {
+            key: 'statisticsInfo',
+            get: function get() {
+                var info = {
+                    playerType: this._type,
+                    url: this._mediaDataSource.url
+                };
+    
+                if (!(this._mediaElement instanceof HTMLVideoElement)) {
+                    return info;
+                }
+    
+                var hasQualityInfo = true;
+                var decoded = 0;
+                var dropped = 0;
+    
+                if (this._mediaElement.getVideoPlaybackQuality) {
+                    var quality = this._mediaElement.getVideoPlaybackQuality();
+                    decoded = quality.totalVideoFrames;
+                    dropped = quality.droppedVideoFrames;
+                } else if (this._mediaElement.webkitDecodedFrameCount != undefined) {
+                    decoded = this._mediaElement.webkitDecodedFrameCount;
+                    dropped = this._mediaElement.webkitDroppedFrameCount;
+                } else {
+                    hasQualityInfo = false;
+                }
+    
+                if (hasQualityInfo) {
+                    info.decodedFrames = decoded;
+                    info.droppedFrames = dropped;
+                }
+    
+                return info;
+            }
+        }]);
+    
+        return NativePlayer;
+    }();
+    
+    exports.default = NativePlayer;
+    
+    },{"../config.js":5,"../utils/exception.js":40,"./player-events.js":35,"events":2}],34:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    exports.ErrorDetails = exports.ErrorTypes = undefined;
+    
+    var _loader = _dereq_('../io/loader.js');
+    
+    var _demuxErrors = _dereq_('../demux/demux-errors.js');
+    
+    var _demuxErrors2 = _interopRequireDefault(_demuxErrors);
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var ErrorTypes = exports.ErrorTypes = {
+        NETWORK_ERROR: 'NetworkError',
+        MEDIA_ERROR: 'MediaError',
+        OTHER_ERROR: 'OtherError'
+    };
+    
+    var ErrorDetails = exports.ErrorDetails = {
+        NETWORK_EXCEPTION: _loader.LoaderErrors.EXCEPTION,
+        NETWORK_STATUS_CODE_INVALID: _loader.LoaderErrors.HTTP_STATUS_CODE_INVALID,
+        NETWORK_TIMEOUT: _loader.LoaderErrors.CONNECTING_TIMEOUT,
+        NETWORK_UNRECOVERABLE_EARLY_EOF: _loader.LoaderErrors.UNRECOVERABLE_EARLY_EOF,
+    
+        MEDIA_MSE_ERROR: 'MediaMSEError',
+    
+        MEDIA_FORMAT_ERROR: _demuxErrors2.default.FORMAT_ERROR,
+        MEDIA_FORMAT_UNSUPPORTED: _demuxErrors2.default.FORMAT_UNSUPPORTED,
+        MEDIA_CODEC_UNSUPPORTED: _demuxErrors2.default.CODEC_UNSUPPORTED
+    };
+    
+    },{"../demux/demux-errors.js":16,"../io/loader.js":24}],35:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+      value: true
+    });
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var PlayerEvents = {
+      ERROR: 'error',
+      LOADING_COMPLETE: 'loading_complete',
+      RECOVERED_EARLY_EOF: 'recovered_early_eof',
+      MEDIA_INFO: 'media_info',
+      METADATA_ARRIVED: 'metadata_arrived',
+      SCRIPTDATA_ARRIVED: 'scriptdata_arrived',
+      STATISTICS_INFO: 'statistics_info'
+    };
+    
+    exports.default = PlayerEvents;
+    
+    },{}],36:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * This file is modified from dailymotion's hls.js library (hls.js/src/helper/aac.js)
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var AAC = function () {
+        function AAC() {
+            _classCallCheck(this, AAC);
+        }
+    
+        _createClass(AAC, null, [{
+            key: 'getSilentFrame',
+            value: function getSilentFrame(codec, channelCount) {
+                if (codec === 'mp4a.40.2') {
+                    // handle LC-AAC
+                    if (channelCount === 1) {
+                        return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x23, 0x80]);
+                    } else if (channelCount === 2) {
+                        return new Uint8Array([0x21, 0x00, 0x49, 0x90, 0x02, 0x19, 0x00, 0x23, 0x80]);
+                    } else if (channelCount === 3) {
+                        return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x8e]);
+                    } else if (channelCount === 4) {
+                        return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x80, 0x2c, 0x80, 0x08, 0x02, 0x38]);
+                    } else if (channelCount === 5) {
+                        return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x38]);
+                    } else if (channelCount === 6) {
+                        return new Uint8Array([0x00, 0xc8, 0x00, 0x80, 0x20, 0x84, 0x01, 0x26, 0x40, 0x08, 0x64, 0x00, 0x82, 0x30, 0x04, 0x99, 0x00, 0x21, 0x90, 0x02, 0x00, 0xb2, 0x00, 0x20, 0x08, 0xe0]);
+                    }
+                } else {
+                    // handle HE-AAC (mp4a.40.5 / mp4a.40.29)
+                    if (channelCount === 1) {
+                        // ffmpeg -y -f lavfi -i "aevalsrc=0:d=0.05" -c:a libfdk_aac -profile:a aac_he -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac
+                        return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x4e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x1c, 0x6, 0xf1, 0xc1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);
+                    } else if (channelCount === 2) {
+                        // ffmpeg -y -f lavfi -i "aevalsrc=0|0:d=0.05" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac
+                        return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);
+                    } else if (channelCount === 3) {
+                        // ffmpeg -y -f lavfi -i "aevalsrc=0|0|0:d=0.05" -c:a libfdk_aac -profile:a aac_he_v2 -b:a 4k output.aac && hexdump -v -e '16/1 "0x%x," "\n"' -v output.aac
+                        return new Uint8Array([0x1, 0x40, 0x22, 0x80, 0xa3, 0x5e, 0xe6, 0x80, 0xba, 0x8, 0x0, 0x0, 0x0, 0x0, 0x95, 0x0, 0x6, 0xf1, 0xa1, 0xa, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5a, 0x5e]);
+                    }
+                }
+                return null;
+            }
+        }]);
+    
+        return AAC;
+    }();
+    
+    exports.default = AAC;
+    
+    },{}],37:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * This file is derived from dailymotion's hls.js library (hls.js/src/remux/mp4-generator.js)
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    //  MP4 boxes generator for ISO BMFF (ISO Base Media File Format, defined in ISO/IEC 14496-12)
+    var MP4 = function () {
+        function MP4() {
+            _classCallCheck(this, MP4);
+        }
+    
+        _createClass(MP4, null, [{
+            key: 'init',
+            value: function init() {
+                MP4.types = {
+                    avc1: [], avcC: [], btrt: [], dinf: [],
+                    dref: [], esds: [], ftyp: [], hdlr: [],
+                    mdat: [], mdhd: [], mdia: [], mfhd: [],
+                    minf: [], moof: [], moov: [], mp4a: [],
+                    mvex: [], mvhd: [], sdtp: [], stbl: [],
+                    stco: [], stsc: [], stsd: [], stsz: [],
+                    stts: [], tfdt: [], tfhd: [], traf: [],
+                    trak: [], trun: [], trex: [], tkhd: [],
+                    vmhd: [], smhd: [], '.mp3': []
+                };
+    
+                for (var name in MP4.types) {
+                    if (MP4.types.hasOwnProperty(name)) {
+                        MP4.types[name] = [name.charCodeAt(0), name.charCodeAt(1), name.charCodeAt(2), name.charCodeAt(3)];
+                    }
+                }
+    
+                var constants = MP4.constants = {};
+    
+                constants.FTYP = new Uint8Array([0x69, 0x73, 0x6F, 0x6D, // major_brand: isom
+                0x0, 0x0, 0x0, 0x1, // minor_version: 0x01
+                0x69, 0x73, 0x6F, 0x6D, // isom
+                0x61, 0x76, 0x63, 0x31 // avc1
+                ]);
+    
+                constants.STSD_PREFIX = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+                0x00, 0x00, 0x00, 0x01 // entry_count
+                ]);
+    
+                constants.STTS = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+                0x00, 0x00, 0x00, 0x00 // entry_count
+                ]);
+    
+                constants.STSC = constants.STCO = constants.STTS;
+    
+                constants.STSZ = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+                0x00, 0x00, 0x00, 0x00, // sample_size
+                0x00, 0x00, 0x00, 0x00 // sample_count
+                ]);
+    
+                constants.HDLR_VIDEO = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+                0x00, 0x00, 0x00, 0x00, // pre_defined
+                0x76, 0x69, 0x64, 0x65, // handler_type: 'vide'
+                0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x56, 0x69, 0x64, 0x65, 0x6F, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72, 0x00 // name: VideoHandler
+                ]);
+    
+                constants.HDLR_AUDIO = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+                0x00, 0x00, 0x00, 0x00, // pre_defined
+                0x73, 0x6F, 0x75, 0x6E, // handler_type: 'soun'
+                0x00, 0x00, 0x00, 0x00, // reserved: 3 * 4 bytes
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x53, 0x6F, 0x75, 0x6E, 0x64, 0x48, 0x61, 0x6E, 0x64, 0x6C, 0x65, 0x72, 0x00 // name: SoundHandler
+                ]);
+    
+                constants.DREF = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+                0x00, 0x00, 0x00, 0x01, // entry_count
+                0x00, 0x00, 0x00, 0x0C, // entry_size
+                0x75, 0x72, 0x6C, 0x20, // type 'url '
+                0x00, 0x00, 0x00, 0x01 // version(0) + flags
+                ]);
+    
+                // Sound media header
+                constants.SMHD = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+                0x00, 0x00, 0x00, 0x00 // balance(2) + reserved(2)
+                ]);
+    
+                // video media header
+                constants.VMHD = new Uint8Array([0x00, 0x00, 0x00, 0x01, // version(0) + flags
+                0x00, 0x00, // graphicsmode: 2 bytes
+                0x00, 0x00, 0x00, 0x00, // opcolor: 3 * 2 bytes
+                0x00, 0x00]);
+            }
+    
+            // Generate a box
+    
+        }, {
+            key: 'box',
+            value: function box(type) {
+                var size = 8;
+                var result = null;
+                var datas = Array.prototype.slice.call(arguments, 1);
+                var arrayCount = datas.length;
+    
+                for (var i = 0; i < arrayCount; i++) {
+                    size += datas[i].byteLength;
+                }
+    
+                result = new Uint8Array(size);
+                result[0] = size >>> 24 & 0xFF; // size
+                result[1] = size >>> 16 & 0xFF;
+                result[2] = size >>> 8 & 0xFF;
+                result[3] = size & 0xFF;
+    
+                result.set(type, 4); // type
+    
+                var offset = 8;
+                for (var _i = 0; _i < arrayCount; _i++) {
+                    // data body
+                    result.set(datas[_i], offset);
+                    offset += datas[_i].byteLength;
+                }
+    
+                return result;
+            }
+    
+            // emit ftyp & moov
+    
+        }, {
+            key: 'generateInitSegment',
+            value: function generateInitSegment(meta) {
+                var ftyp = MP4.box(MP4.types.ftyp, MP4.constants.FTYP);
+                var moov = MP4.moov(meta);
+    
+                var result = new Uint8Array(ftyp.byteLength + moov.byteLength);
+                result.set(ftyp, 0);
+                result.set(moov, ftyp.byteLength);
+                return result;
+            }
+    
+            // Movie metadata box
+    
+        }, {
+            key: 'moov',
+            value: function moov(meta) {
+                var mvhd = MP4.mvhd(meta.timescale, meta.duration);
+                var trak = MP4.trak(meta);
+                var mvex = MP4.mvex(meta);
+                return MP4.box(MP4.types.moov, mvhd, trak, mvex);
+            }
+    
+            // Movie header box
+    
+        }, {
+            key: 'mvhd',
+            value: function mvhd(timescale, duration) {
+                return MP4.box(MP4.types.mvhd, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+                0x00, 0x00, 0x00, 0x00, // creation_time
+                0x00, 0x00, 0x00, 0x00, // modification_time
+                timescale >>> 24 & 0xFF, // timescale: 4 bytes
+                timescale >>> 16 & 0xFF, timescale >>> 8 & 0xFF, timescale & 0xFF, duration >>> 24 & 0xFF, // duration: 4 bytes
+                duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x00, 0x01, 0x00, 0x00, // Preferred rate: 1.0
+                0x01, 0x00, 0x00, 0x00, // PreferredVolume(1.0, 2bytes) + reserved(2bytes)
+                0x00, 0x00, 0x00, 0x00, // reserved: 4 + 4 bytes
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----
+                0x00, 0x00, 0x00, 0x00, // ----begin pre_defined 6 * 4 bytes----
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // ----end pre_defined 6 * 4 bytes----
+                0xFF, 0xFF, 0xFF, 0xFF // next_track_ID
+                ]));
+            }
+    
+            // Track box
+    
+        }, {
+            key: 'trak',
+            value: function trak(meta) {
+                return MP4.box(MP4.types.trak, MP4.tkhd(meta), MP4.mdia(meta));
+            }
+    
+            // Track header box
+    
+        }, {
+            key: 'tkhd',
+            value: function tkhd(meta) {
+                var trackId = meta.id,
+                    duration = meta.duration;
+                var width = meta.presentWidth,
+                    height = meta.presentHeight;
+    
+                return MP4.box(MP4.types.tkhd, new Uint8Array([0x00, 0x00, 0x00, 0x07, // version(0) + flags
+                0x00, 0x00, 0x00, 0x00, // creation_time
+                0x00, 0x00, 0x00, 0x00, // modification_time
+                trackId >>> 24 & 0xFF, // track_ID: 4 bytes
+                trackId >>> 16 & 0xFF, trackId >>> 8 & 0xFF, trackId & 0xFF, 0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes
+                duration >>> 24 & 0xFF, // duration: 4 bytes
+                duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // layer(2bytes) + alternate_group(2bytes)
+                0x00, 0x00, 0x00, 0x00, // volume(2bytes) + reserved(2bytes)
+                0x00, 0x01, 0x00, 0x00, // ----begin composition matrix----
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, // ----end composition matrix----
+                width >>> 8 & 0xFF, // width and height
+                width & 0xFF, 0x00, 0x00, height >>> 8 & 0xFF, height & 0xFF, 0x00, 0x00]));
+            }
+    
+            // Media Box
+    
+        }, {
+            key: 'mdia',
+            value: function mdia(meta) {
+                return MP4.box(MP4.types.mdia, MP4.mdhd(meta), MP4.hdlr(meta), MP4.minf(meta));
+            }
+    
+            // Media header box
+    
+        }, {
+            key: 'mdhd',
+            value: function mdhd(meta) {
+                var timescale = meta.timescale;
+                var duration = meta.duration;
+                return MP4.box(MP4.types.mdhd, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+                0x00, 0x00, 0x00, 0x00, // creation_time
+                0x00, 0x00, 0x00, 0x00, // modification_time
+                timescale >>> 24 & 0xFF, // timescale: 4 bytes
+                timescale >>> 16 & 0xFF, timescale >>> 8 & 0xFF, timescale & 0xFF, duration >>> 24 & 0xFF, // duration: 4 bytes
+                duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, 0x55, 0xC4, // language: und (undetermined)
+                0x00, 0x00 // pre_defined = 0
+                ]));
+            }
+    
+            // Media handler reference box
+    
+        }, {
+            key: 'hdlr',
+            value: function hdlr(meta) {
+                var data = null;
+                if (meta.type === 'audio') {
+                    data = MP4.constants.HDLR_AUDIO;
+                } else {
+                    data = MP4.constants.HDLR_VIDEO;
+                }
+                return MP4.box(MP4.types.hdlr, data);
+            }
+    
+            // Media infomation box
+    
+        }, {
+            key: 'minf',
+            value: function minf(meta) {
+                var xmhd = null;
+                if (meta.type === 'audio') {
+                    xmhd = MP4.box(MP4.types.smhd, MP4.constants.SMHD);
+                } else {
+                    xmhd = MP4.box(MP4.types.vmhd, MP4.constants.VMHD);
+                }
+                return MP4.box(MP4.types.minf, xmhd, MP4.dinf(), MP4.stbl(meta));
+            }
+    
+            // Data infomation box
+    
+        }, {
+            key: 'dinf',
+            value: function dinf() {
+                var result = MP4.box(MP4.types.dinf, MP4.box(MP4.types.dref, MP4.constants.DREF));
+                return result;
+            }
+    
+            // Sample table box
+    
+        }, {
+            key: 'stbl',
+            value: function stbl(meta) {
+                var result = MP4.box(MP4.types.stbl, // type: stbl
+                MP4.stsd(meta), // Sample Description Table
+                MP4.box(MP4.types.stts, MP4.constants.STTS), // Time-To-Sample
+                MP4.box(MP4.types.stsc, MP4.constants.STSC), // Sample-To-Chunk
+                MP4.box(MP4.types.stsz, MP4.constants.STSZ), // Sample size
+                MP4.box(MP4.types.stco, MP4.constants.STCO // Chunk offset
+                ));
+                return result;
+            }
+    
+            // Sample description box
+    
+        }, {
+            key: 'stsd',
+            value: function stsd(meta) {
+                if (meta.type === 'audio') {
+                    if (meta.codec === 'mp3') {
+                        return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp3(meta));
+                    }
+                    // else: aac -> mp4a
+                    return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.mp4a(meta));
+                } else {
+                    return MP4.box(MP4.types.stsd, MP4.constants.STSD_PREFIX, MP4.avc1(meta));
+                }
+            }
+        }, {
+            key: 'mp3',
+            value: function mp3(meta) {
+                var channelCount = meta.channelCount;
+                var sampleRate = meta.audioSampleRate;
+    
+                var data = new Uint8Array([0x00, 0x00, 0x00, 0x00, // reserved(4)
+                0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)
+                0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes
+                0x00, 0x00, 0x00, 0x00, 0x00, channelCount, // channelCount(2)
+                0x00, 0x10, // sampleSize(2)
+                0x00, 0x00, 0x00, 0x00, // reserved(4)
+                sampleRate >>> 8 & 0xFF, // Audio sample rate
+                sampleRate & 0xFF, 0x00, 0x00]);
+    
+                return MP4.box(MP4.types['.mp3'], data);
+            }
+        }, {
+            key: 'mp4a',
+            value: function mp4a(meta) {
+                var channelCount = meta.channelCount;
+                var sampleRate = meta.audioSampleRate;
+    
+                var data = new Uint8Array([0x00, 0x00, 0x00, 0x00, // reserved(4)
+                0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)
+                0x00, 0x00, 0x00, 0x00, // reserved: 2 * 4 bytes
+                0x00, 0x00, 0x00, 0x00, 0x00, channelCount, // channelCount(2)
+                0x00, 0x10, // sampleSize(2)
+                0x00, 0x00, 0x00, 0x00, // reserved(4)
+                sampleRate >>> 8 & 0xFF, // Audio sample rate
+                sampleRate & 0xFF, 0x00, 0x00]);
+    
+                return MP4.box(MP4.types.mp4a, data, MP4.esds(meta));
+            }
+        }, {
+            key: 'esds',
+            value: function esds(meta) {
+                var config = meta.config || [];
+                var configSize = config.length;
+                var data = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version 0 + flags
+    
+                0x03, // descriptor_type
+                0x17 + configSize, // length3
+                0x00, 0x01, // es_id
+                0x00, // stream_priority
+    
+                0x04, // descriptor_type
+                0x0F + configSize, // length
+                0x40, // codec: mpeg4_audio
+                0x15, // stream_type: Audio
+                0x00, 0x00, 0x00, // buffer_size
+                0x00, 0x00, 0x00, 0x00, // maxBitrate
+                0x00, 0x00, 0x00, 0x00, // avgBitrate
+    
+                0x05 // descriptor_type
+                ].concat([configSize]).concat(config).concat([0x06, 0x01, 0x02 // GASpecificConfig
+                ]));
+                return MP4.box(MP4.types.esds, data);
+            }
+        }, {
+            key: 'avc1',
+            value: function avc1(meta) {
+                var avcc = meta.avcc;
+                var width = meta.codecWidth,
+                    height = meta.codecHeight;
+    
+                var data = new Uint8Array([0x00, 0x00, 0x00, 0x00, // reserved(4)
+                0x00, 0x00, 0x00, 0x01, // reserved(2) + data_reference_index(2)
+                0x00, 0x00, 0x00, 0x00, // pre_defined(2) + reserved(2)
+                0x00, 0x00, 0x00, 0x00, // pre_defined: 3 * 4 bytes
+                0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, width >>> 8 & 0xFF, // width: 2 bytes
+                width & 0xFF, height >>> 8 & 0xFF, // height: 2 bytes
+                height & 0xFF, 0x00, 0x48, 0x00, 0x00, // horizresolution: 4 bytes
+                0x00, 0x48, 0x00, 0x00, // vertresolution: 4 bytes
+                0x00, 0x00, 0x00, 0x00, // reserved: 4 bytes
+                0x00, 0x01, // frame_count
+                0x0A, // strlen
+                0x78, 0x71, 0x71, 0x2F, // compressorname: 32 bytes
+                0x66, 0x6C, 0x76, 0x2E, 0x6A, 0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, // depth
+                0xFF, 0xFF // pre_defined = -1
+                ]);
+                return MP4.box(MP4.types.avc1, data, MP4.box(MP4.types.avcC, avcc));
+            }
+    
+            // Movie Extends box
+    
+        }, {
+            key: 'mvex',
+            value: function mvex(meta) {
+                return MP4.box(MP4.types.mvex, MP4.trex(meta));
+            }
+    
+            // Track Extends box
+    
+        }, {
+            key: 'trex',
+            value: function trex(meta) {
+                var trackId = meta.id;
+                var data = new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) + flags
+                trackId >>> 24 & 0xFF, // track_ID
+                trackId >>> 16 & 0xFF, trackId >>> 8 & 0xFF, trackId & 0xFF, 0x00, 0x00, 0x00, 0x01, // default_sample_description_index
+                0x00, 0x00, 0x00, 0x00, // default_sample_duration
+                0x00, 0x00, 0x00, 0x00, // default_sample_size
+                0x00, 0x01, 0x00, 0x01 // default_sample_flags
+                ]);
+                return MP4.box(MP4.types.trex, data);
+            }
+    
+            // Movie fragment box
+    
+        }, {
+            key: 'moof',
+            value: function moof(track, baseMediaDecodeTime) {
+                return MP4.box(MP4.types.moof, MP4.mfhd(track.sequenceNumber), MP4.traf(track, baseMediaDecodeTime));
+            }
+        }, {
+            key: 'mfhd',
+            value: function mfhd(sequenceNumber) {
+                var data = new Uint8Array([0x00, 0x00, 0x00, 0x00, sequenceNumber >>> 24 & 0xFF, // sequence_number: int32
+                sequenceNumber >>> 16 & 0xFF, sequenceNumber >>> 8 & 0xFF, sequenceNumber & 0xFF]);
+                return MP4.box(MP4.types.mfhd, data);
+            }
+    
+            // Track fragment box
+    
+        }, {
+            key: 'traf',
+            value: function traf(track, baseMediaDecodeTime) {
+                var trackId = track.id;
+    
+                // Track fragment header box
+                var tfhd = MP4.box(MP4.types.tfhd, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) & flags
+                trackId >>> 24 & 0xFF, // track_ID
+                trackId >>> 16 & 0xFF, trackId >>> 8 & 0xFF, trackId & 0xFF]));
+                // Track Fragment Decode Time
+                var tfdt = MP4.box(MP4.types.tfdt, new Uint8Array([0x00, 0x00, 0x00, 0x00, // version(0) & flags
+                baseMediaDecodeTime >>> 24 & 0xFF, // baseMediaDecodeTime: int32
+                baseMediaDecodeTime >>> 16 & 0xFF, baseMediaDecodeTime >>> 8 & 0xFF, baseMediaDecodeTime & 0xFF]));
+                var sdtp = MP4.sdtp(track);
+                var trun = MP4.trun(track, sdtp.byteLength + 16 + 16 + 8 + 16 + 8 + 8);
+    
+                return MP4.box(MP4.types.traf, tfhd, tfdt, trun, sdtp);
+            }
+    
+            // Sample Dependency Type box
+    
+        }, {
+            key: 'sdtp',
+            value: function sdtp(track) {
+                var samples = track.samples || [];
+                var sampleCount = samples.length;
+                var data = new Uint8Array(4 + sampleCount);
+                // 0~4 bytes: version(0) & flags
+                for (var i = 0; i < sampleCount; i++) {
+                    var flags = samples[i].flags;
+                    data[i + 4] = flags.isLeading << 6 | // is_leading: 2 (bit)
+                    flags.dependsOn << 4 // sample_depends_on
+                    | flags.isDependedOn << 2 // sample_is_depended_on
+                    | flags.hasRedundancy; // sample_has_redundancy
+                }
+                return MP4.box(MP4.types.sdtp, data);
+            }
+    
+            // Track fragment run box
+    
+        }, {
+            key: 'trun',
+            value: function trun(track, offset) {
+                var samples = track.samples || [];
+                var sampleCount = samples.length;
+                var dataSize = 12 + 16 * sampleCount;
+                var data = new Uint8Array(dataSize);
+                offset += 8 + dataSize;
+    
+                data.set([0x00, 0x00, 0x0F, 0x01, // version(0) & flags
+                sampleCount >>> 24 & 0xFF, // sample_count
+                sampleCount >>> 16 & 0xFF, sampleCount >>> 8 & 0xFF, sampleCount & 0xFF, offset >>> 24 & 0xFF, // data_offset
+                offset >>> 16 & 0xFF, offset >>> 8 & 0xFF, offset & 0xFF], 0);
+    
+                for (var i = 0; i < sampleCount; i++) {
+                    var duration = samples[i].duration;
+                    var size = samples[i].size;
+                    var flags = samples[i].flags;
+                    var cts = samples[i].cts;
+                    data.set([duration >>> 24 & 0xFF, // sample_duration
+                    duration >>> 16 & 0xFF, duration >>> 8 & 0xFF, duration & 0xFF, size >>> 24 & 0xFF, // sample_size
+                    size >>> 16 & 0xFF, size >>> 8 & 0xFF, size & 0xFF, flags.isLeading << 2 | flags.dependsOn, // sample_flags
+                    flags.isDependedOn << 6 | flags.hasRedundancy << 4 | flags.isNonSync, 0x00, 0x00, // sample_degradation_priority
+                    cts >>> 24 & 0xFF, // sample_composition_time_offset
+                    cts >>> 16 & 0xFF, cts >>> 8 & 0xFF, cts & 0xFF], 12 + 16 * i);
+                }
+                return MP4.box(MP4.types.trun, data);
+            }
+        }, {
+            key: 'mdat',
+            value: function mdat(data) {
+                return MP4.box(MP4.types.mdat, data);
+            }
+        }]);
+    
+        return MP4;
+    }();
+    
+    MP4.init();
+    
+    exports.default = MP4;
+    
+    },{}],38:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _logger = _dereq_('../utils/logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    var _mp4Generator = _dereq_('./mp4-generator.js');
+    
+    var _mp4Generator2 = _interopRequireDefault(_mp4Generator);
+    
+    var _aacSilent = _dereq_('./aac-silent.js');
+    
+    var _aacSilent2 = _interopRequireDefault(_aacSilent);
+    
+    var _browser = _dereq_('../utils/browser.js');
+    
+    var _browser2 = _interopRequireDefault(_browser);
+    
+    var _mediaSegmentInfo = _dereq_('../core/media-segment-info.js');
+    
+    var _exception = _dereq_('../utils/exception.js');
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    // Fragmented mp4 remuxer
+    var MP4Remuxer = function () {
+        function MP4Remuxer(config) {
+            _classCallCheck(this, MP4Remuxer);
+    
+            this.TAG = 'MP4Remuxer';
+    
+            this._config = config;
+            this._isLive = config.isLive === true ? true : false;
+    
+            this._dtsBase = -1;
+            this._dtsBaseInited = false;
+            this._audioDtsBase = Infinity;
+            this._videoDtsBase = Infinity;
+            this._audioNextDts = undefined;
+            this._videoNextDts = undefined;
+            this._audioStashedLastSample = null;
+            this._videoStashedLastSample = null;
+    
+            this._audioMeta = null;
+            this._videoMeta = null;
+    
+            this._audioSegmentInfoList = new _mediaSegmentInfo.MediaSegmentInfoList('audio');
+            this._videoSegmentInfoList = new _mediaSegmentInfo.MediaSegmentInfoList('video');
+    
+            this._onInitSegment = null;
+            this._onMediaSegment = null;
+    
+            // Workaround for chrome < 50: Always force first sample as a Random Access Point in media segment
+            // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412
+            this._forceFirstIDR = _browser2.default.chrome && (_browser2.default.version.major < 50 || _browser2.default.version.major === 50 && _browser2.default.version.build < 2661) ? true : false;
+    
+            // Workaround for IE11/Edge: Fill silent aac frame after keyframe-seeking
+            // Make audio beginDts equals with video beginDts, in order to fix seek freeze
+            this._fillSilentAfterSeek = _browser2.default.msedge || _browser2.default.msie;
+    
+            // While only FireFox supports 'audio/mp4, codecs="mp3"', use 'audio/mpeg' for chrome, safari, ...
+            this._mp3UseMpegAudio = !_browser2.default.firefox;
+    
+            this._fillAudioTimestampGap = this._config.fixAudioTimestampGap;
+        }
+    
+        _createClass(MP4Remuxer, [{
+            key: 'destroy',
+            value: function destroy() {
+                this._dtsBase = -1;
+                this._dtsBaseInited = false;
+                this._audioMeta = null;
+                this._videoMeta = null;
+                this._audioSegmentInfoList.clear();
+                this._audioSegmentInfoList = null;
+                this._videoSegmentInfoList.clear();
+                this._videoSegmentInfoList = null;
+                this._onInitSegment = null;
+                this._onMediaSegment = null;
+            }
+        }, {
+            key: 'bindDataSource',
+            value: function bindDataSource(producer) {
+                producer.onDataAvailable = this.remux.bind(this);
+                producer.onTrackMetadata = this._onTrackMetadataReceived.bind(this);
+                return this;
+            }
+    
+            /* prototype: function onInitSegment(type: string, initSegment: ArrayBuffer): void
+               InitSegment: {
+                   type: string,
+                   data: ArrayBuffer,
+                   codec: string,
+                   container: string
+               }
+            */
+    
+        }, {
+            key: 'insertDiscontinuity',
+            value: function insertDiscontinuity() {
+                this._audioNextDts = this._videoNextDts = undefined;
+            }
+        }, {
+            key: 'seek',
+            value: function seek(originalDts) {
+                this._audioStashedLastSample = null;
+                this._videoStashedLastSample = null;
+                this._videoSegmentInfoList.clear();
+                this._audioSegmentInfoList.clear();
+            }
+        }, {
+            key: 'remux',
+            value: function remux(audioTrack, videoTrack) {
+                if (!this._onMediaSegment) {
+                    throw new _exception.IllegalStateException('MP4Remuxer: onMediaSegment callback must be specificed!');
+                }
+                if (!this._dtsBaseInited) {
+                    this._calculateDtsBase(audioTrack, videoTrack);
+                }
+                this._remuxVideo(videoTrack);
+                this._remuxAudio(audioTrack);
+            }
+        }, {
+            key: '_onTrackMetadataReceived',
+            value: function _onTrackMetadataReceived(type, metadata) {
+                var metabox = null;
+    
+                var container = 'mp4';
+                var codec = metadata.codec;
+    
+                if (type === 'audio') {
+                    this._audioMeta = metadata;
+                    if (metadata.codec === 'mp3' && this._mp3UseMpegAudio) {
+                        // 'audio/mpeg' for MP3 audio track
+                        container = 'mpeg';
+                        codec = '';
+                        metabox = new Uint8Array();
+                    } else {
+                        // 'audio/mp4, codecs="codec"'
+                        metabox = _mp4Generator2.default.generateInitSegment(metadata);
+                    }
+                } else if (type === 'video') {
+                    this._videoMeta = metadata;
+                    metabox = _mp4Generator2.default.generateInitSegment(metadata);
+                } else {
+                    return;
+                }
+    
+                // dispatch metabox (Initialization Segment)
+                if (!this._onInitSegment) {
+                    throw new _exception.IllegalStateException('MP4Remuxer: onInitSegment callback must be specified!');
+                }
+                this._onInitSegment(type, {
+                    type: type,
+                    data: metabox.buffer,
+                    codec: codec,
+                    container: type + '/' + container,
+                    mediaDuration: metadata.duration // in timescale 1000 (milliseconds)
+                });
+            }
+        }, {
+            key: '_calculateDtsBase',
+            value: function _calculateDtsBase(audioTrack, videoTrack) {
+                if (this._dtsBaseInited) {
+                    return;
+                }
+    
+                if (audioTrack.samples && audioTrack.samples.length) {
+                    this._audioDtsBase = audioTrack.samples[0].dts;
+                }
+                if (videoTrack.samples && videoTrack.samples.length) {
+                    this._videoDtsBase = videoTrack.samples[0].dts;
+                }
+    
+                this._dtsBase = Math.min(this._audioDtsBase, this._videoDtsBase);
+                this._dtsBaseInited = true;
+            }
+        }, {
+            key: 'flushStashedSamples',
+            value: function flushStashedSamples() {
+                var videoSample = this._videoStashedLastSample;
+                var audioSample = this._audioStashedLastSample;
+    
+                var videoTrack = {
+                    type: 'video',
+                    id: 1,
+                    sequenceNumber: 0,
+                    samples: [],
+                    length: 0
+                };
+    
+                if (videoSample != null) {
+                    videoTrack.samples.push(videoSample);
+                    videoTrack.length = videoSample.length;
+                }
+    
+                var audioTrack = {
+                    type: 'audio',
+                    id: 2,
+                    sequenceNumber: 0,
+                    samples: [],
+                    length: 0
+                };
+    
+                if (audioSample != null) {
+                    audioTrack.samples.push(audioSample);
+                    audioTrack.length = audioSample.length;
+                }
+    
+                this._videoStashedLastSample = null;
+                this._audioStashedLastSample = null;
+    
+                this._remuxVideo(videoTrack, true);
+                this._remuxAudio(audioTrack, true);
+            }
+        }, {
+            key: '_remuxAudio',
+            value: function _remuxAudio(audioTrack, force) {
+                if (this._audioMeta == null) {
+                    return;
+                }
+    
+                var track = audioTrack;
+                var samples = track.samples;
+                var dtsCorrection = undefined;
+                var firstDts = -1,
+                    lastDts = -1,
+                    lastPts = -1;
+                var refSampleDuration = this._audioMeta.refSampleDuration;
+    
+                var mpegRawTrack = this._audioMeta.codec === 'mp3' && this._mp3UseMpegAudio;
+                var firstSegmentAfterSeek = this._dtsBaseInited && this._audioNextDts === undefined;
+    
+                var insertPrefixSilentFrame = false;
+    
+                if (!samples || samples.length === 0) {
+                    return;
+                }
+                if (samples.length === 1 && !force) {
+                    // If [sample count in current batch] === 1 && (force != true)
+                    // Ignore and keep in demuxer's queue
+                    return;
+                } // else if (force === true) do remux
+    
+                var offset = 0;
+                var mdatbox = null;
+                var mdatBytes = 0;
+    
+                // calculate initial mdat size
+                if (mpegRawTrack) {
+                    // for raw mpeg buffer
+                    offset = 0;
+                    mdatBytes = track.length;
+                } else {
+                    // for fmp4 mdat box
+                    offset = 8; // size + type
+                    mdatBytes = 8 + track.length;
+                }
+    
+                var lastSample = null;
+    
+                // Pop the lastSample and waiting for stash
+                if (samples.length > 1) {
+                    lastSample = samples.pop();
+                    mdatBytes -= lastSample.length;
+                }
+    
+                // Insert [stashed lastSample in the previous batch] to the front
+                if (this._audioStashedLastSample != null) {
+                    var sample = this._audioStashedLastSample;
+                    this._audioStashedLastSample = null;
+                    samples.unshift(sample);
+                    mdatBytes += sample.length;
+                }
+    
+                // Stash the lastSample of current batch, waiting for next batch
+                if (lastSample != null) {
+                    this._audioStashedLastSample = lastSample;
+                }
+    
+                var firstSampleOriginalDts = samples[0].dts - this._dtsBase;
+    
+                // calculate dtsCorrection
+                if (this._audioNextDts) {
+                    dtsCorrection = firstSampleOriginalDts - this._audioNextDts;
+                } else {
+                    // this._audioNextDts == undefined
+                    if (this._audioSegmentInfoList.isEmpty()) {
+                        dtsCorrection = 0;
+                        if (this._fillSilentAfterSeek && !this._videoSegmentInfoList.isEmpty()) {
+                            if (this._audioMeta.originalCodec !== 'mp3') {
+                                insertPrefixSilentFrame = true;
+                            }
+                        }
+                    } else {
+                        var _lastSample = this._audioSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);
+                        if (_lastSample != null) {
+                            var distance = firstSampleOriginalDts - (_lastSample.originalDts + _lastSample.duration);
+                            if (distance <= 3) {
+                                distance = 0;
+                            }
+                            var expectedDts = _lastSample.dts + _lastSample.duration + distance;
+                            dtsCorrection = firstSampleOriginalDts - expectedDts;
+                        } else {
+                            // lastSample == null, cannot found
+                            dtsCorrection = 0;
+                        }
+                    }
+                }
+    
+                if (insertPrefixSilentFrame) {
+                    // align audio segment beginDts to match with current video segment's beginDts
+                    var firstSampleDts = firstSampleOriginalDts - dtsCorrection;
+                    var videoSegment = this._videoSegmentInfoList.getLastSegmentBefore(firstSampleOriginalDts);
+                    if (videoSegment != null && videoSegment.beginDts < firstSampleDts) {
+                        var silentUnit = _aacSilent2.default.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);
+                        if (silentUnit) {
+                            var dts = videoSegment.beginDts;
+                            var silentFrameDuration = firstSampleDts - videoSegment.beginDts;
+                            _logger2.default.v(this.TAG, 'InsertPrefixSilentAudio: dts: ' + dts + ', duration: ' + silentFrameDuration);
+                            samples.unshift({ unit: silentUnit, dts: dts, pts: dts });
+                            mdatBytes += silentUnit.byteLength;
+                        } // silentUnit == null: Cannot generate, skip
+                    } else {
+                        insertPrefixSilentFrame = false;
+                    }
+                }
+    
+                var mp4Samples = [];
+    
+                // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples
+                for (var i = 0; i < samples.length; i++) {
+                    var _sample = samples[i];
+                    var unit = _sample.unit;
+                    var originalDts = _sample.dts - this._dtsBase;
+                    var _dts = originalDts - dtsCorrection;
+    
+                    if (firstDts === -1) {
+                        firstDts = _dts;
+                    }
+    
+                    var sampleDuration = 0;
+    
+                    if (i !== samples.length - 1) {
+                        var nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;
+                        sampleDuration = nextDts - _dts;
+                    } else {
+                        // the last sample
+                        if (lastSample != null) {
+                            // use stashed sample's dts to calculate sample duration
+                            var _nextDts = lastSample.dts - this._dtsBase - dtsCorrection;
+                            sampleDuration = _nextDts - _dts;
+                        } else if (mp4Samples.length >= 1) {
+                            // use second last sample duration
+                            sampleDuration = mp4Samples[mp4Samples.length - 1].duration;
+                        } else {
+                            // the only one sample, use reference sample duration
+                            sampleDuration = Math.floor(refSampleDuration);
+                        }
+                    }
+    
+                    var needFillSilentFrames = false;
+                    var silentFrames = null;
+    
+                    // Silent frame generation, if large timestamp gap detected && config.fixAudioTimestampGap
+                    if (sampleDuration > refSampleDuration * 1.5 && this._audioMeta.codec !== 'mp3' && this._fillAudioTimestampGap && !_browser2.default.safari) {
+                        // We need to insert silent frames to fill timestamp gap
+                        needFillSilentFrames = true;
+                        var delta = Math.abs(sampleDuration - refSampleDuration);
+                        var frameCount = Math.ceil(delta / refSampleDuration);
+                        var currentDts = _dts + refSampleDuration; // Notice: in float
+    
+                        _logger2.default.w(this.TAG, 'Large audio timestamp gap detected, may cause AV sync to drift. ' + 'Silent frames will be generated to avoid unsync.\n' + ('dts: ' + (_dts + sampleDuration) + ' ms, expected: ' + (_dts + Math.round(refSampleDuration)) + ' ms, ') + ('delta: ' + Math.round(delta) + ' ms, generate: ' + frameCount + ' frames'));
+    
+                        var _silentUnit = _aacSilent2.default.getSilentFrame(this._audioMeta.originalCodec, this._audioMeta.channelCount);
+                        if (_silentUnit == null) {
+                            _logger2.default.w(this.TAG, 'Unable to generate silent frame for ' + (this._audioMeta.originalCodec + ' with ' + this._audioMeta.channelCount + ' channels, repeat last frame'));
+                            // Repeat last frame
+                            _silentUnit = unit;
+                        }
+                        silentFrames = [];
+    
+                        for (var j = 0; j < frameCount; j++) {
+                            var intDts = Math.round(currentDts); // round to integer
+                            if (silentFrames.length > 0) {
+                                // Set previous frame sample duration
+                                var previousFrame = silentFrames[silentFrames.length - 1];
+                                previousFrame.duration = intDts - previousFrame.dts;
+                            }
+                            var frame = {
+                                dts: intDts,
+                                pts: intDts,
+                                cts: 0,
+                                unit: _silentUnit,
+                                size: _silentUnit.byteLength,
+                                duration: 0, // wait for next sample
+                                originalDts: originalDts,
+                                flags: {
+                                    isLeading: 0,
+                                    dependsOn: 1,
+                                    isDependedOn: 0,
+                                    hasRedundancy: 0
+                                }
+                            };
+                            silentFrames.push(frame);
+                            mdatBytes += frame.size;
+                            currentDts += refSampleDuration;
+                        }
+    
+                        // last frame: align end time to next frame dts
+                        var lastFrame = silentFrames[silentFrames.length - 1];
+                        lastFrame.duration = _dts + sampleDuration - lastFrame.dts;
+    
+                        // silentFrames.forEach((frame) => {
+                        //     Log.w(this.TAG, `SilentAudio: dts: ${frame.dts}, duration: ${frame.duration}`);
+                        // });
+    
+                        // Set correct sample duration for current frame
+                        sampleDuration = Math.round(refSampleDuration);
+                    }
+    
+                    mp4Samples.push({
+                        dts: _dts,
+                        pts: _dts,
+                        cts: 0,
+                        unit: _sample.unit,
+                        size: _sample.unit.byteLength,
+                        duration: sampleDuration,
+                        originalDts: originalDts,
+                        flags: {
+                            isLeading: 0,
+                            dependsOn: 1,
+                            isDependedOn: 0,
+                            hasRedundancy: 0
+                        }
+                    });
+    
+                    if (needFillSilentFrames) {
+                        // Silent frames should be inserted after wrong-duration frame
+                        mp4Samples.push.apply(mp4Samples, silentFrames);
+                    }
+                }
+    
+                // allocate mdatbox
+                if (mpegRawTrack) {
+                    // allocate for raw mpeg buffer
+                    mdatbox = new Uint8Array(mdatBytes);
+                } else {
+                    // allocate for fmp4 mdat box
+                    mdatbox = new Uint8Array(mdatBytes);
+                    // size field
+                    mdatbox[0] = mdatBytes >>> 24 & 0xFF;
+                    mdatbox[1] = mdatBytes >>> 16 & 0xFF;
+                    mdatbox[2] = mdatBytes >>> 8 & 0xFF;
+                    mdatbox[3] = mdatBytes & 0xFF;
+                    // type field (fourCC)
+                    mdatbox.set(_mp4Generator2.default.types.mdat, 4);
+                }
+    
+                // Write samples into mdatbox
+                for (var _i = 0; _i < mp4Samples.length; _i++) {
+                    var _unit = mp4Samples[_i].unit;
+                    mdatbox.set(_unit, offset);
+                    offset += _unit.byteLength;
+                }
+    
+                var latest = mp4Samples[mp4Samples.length - 1];
+                lastDts = latest.dts + latest.duration;
+                this._audioNextDts = lastDts;
+    
+                // fill media segment info & add to info list
+                var info = new _mediaSegmentInfo.MediaSegmentInfo();
+                info.beginDts = firstDts;
+                info.endDts = lastDts;
+                info.beginPts = firstDts;
+                info.endPts = lastDts;
+                info.originalBeginDts = mp4Samples[0].originalDts;
+                info.originalEndDts = latest.originalDts + latest.duration;
+                info.firstSample = new _mediaSegmentInfo.SampleInfo(mp4Samples[0].dts, mp4Samples[0].pts, mp4Samples[0].duration, mp4Samples[0].originalDts, false);
+                info.lastSample = new _mediaSegmentInfo.SampleInfo(latest.dts, latest.pts, latest.duration, latest.originalDts, false);
+                if (!this._isLive) {
+                    this._audioSegmentInfoList.append(info);
+                }
+    
+                track.samples = mp4Samples;
+                track.sequenceNumber++;
+    
+                var moofbox = null;
+    
+                if (mpegRawTrack) {
+                    // Generate empty buffer, because useless for raw mpeg
+                    moofbox = new Uint8Array();
+                } else {
+                    // Generate moof for fmp4 segment
+                    moofbox = _mp4Generator2.default.moof(track, firstDts);
+                }
+    
+                track.samples = [];
+                track.length = 0;
+    
+                var segment = {
+                    type: 'audio',
+                    data: this._mergeBoxes(moofbox, mdatbox).buffer,
+                    sampleCount: mp4Samples.length,
+                    info: info
+                };
+    
+                if (mpegRawTrack && firstSegmentAfterSeek) {
+                    // For MPEG audio stream in MSE, if seeking occurred, before appending new buffer
+                    // We need explicitly set timestampOffset to the desired point in timeline for mpeg SourceBuffer.
+                    segment.timestampOffset = firstDts;
+                }
+    
+                this._onMediaSegment('audio', segment);
+            }
+        }, {
+            key: '_remuxVideo',
+            value: function _remuxVideo(videoTrack, force) {
+                if (this._videoMeta == null) {
+                    return;
+                }
+    
+                var track = videoTrack;
+                var samples = track.samples;
+                var dtsCorrection = undefined;
+                var firstDts = -1,
+                    lastDts = -1;
+                var firstPts = -1,
+                    lastPts = -1;
+    
+                if (!samples || samples.length === 0) {
+                    return;
+                }
+                if (samples.length === 1 && !force) {
+                    // If [sample count in current batch] === 1 && (force != true)
+                    // Ignore and keep in demuxer's queue
+                    return;
+                } // else if (force === true) do remux
+    
+                var offset = 8;
+                var mdatbox = null;
+                var mdatBytes = 8 + videoTrack.length;
+    
+                var lastSample = null;
+    
+                // Pop the lastSample and waiting for stash
+                if (samples.length > 1) {
+                    lastSample = samples.pop();
+                    mdatBytes -= lastSample.length;
+                }
+    
+                // Insert [stashed lastSample in the previous batch] to the front
+                if (this._videoStashedLastSample != null) {
+                    var sample = this._videoStashedLastSample;
+                    this._videoStashedLastSample = null;
+                    samples.unshift(sample);
+                    mdatBytes += sample.length;
+                }
+    
+                // Stash the lastSample of current batch, waiting for next batch
+                if (lastSample != null) {
+                    this._videoStashedLastSample = lastSample;
+                }
+    
+                var firstSampleOriginalDts = samples[0].dts - this._dtsBase;
+    
+                // calculate dtsCorrection
+                if (this._videoNextDts) {
+                    dtsCorrection = firstSampleOriginalDts - this._videoNextDts;
+                } else {
+                    // this._videoNextDts == undefined
+                    if (this._videoSegmentInfoList.isEmpty()) {
+                        dtsCorrection = 0;
+                    } else {
+                        var _lastSample2 = this._videoSegmentInfoList.getLastSampleBefore(firstSampleOriginalDts);
+                        if (_lastSample2 != null) {
+                            var distance = firstSampleOriginalDts - (_lastSample2.originalDts + _lastSample2.duration);
+                            if (distance <= 3) {
+                                distance = 0;
+                            }
+                            var expectedDts = _lastSample2.dts + _lastSample2.duration + distance;
+                            dtsCorrection = firstSampleOriginalDts - expectedDts;
+                        } else {
+                            // lastSample == null, cannot found
+                            dtsCorrection = 0;
+                        }
+                    }
+                }
+    
+                var info = new _mediaSegmentInfo.MediaSegmentInfo();
+                var mp4Samples = [];
+    
+                // Correct dts for each sample, and calculate sample duration. Then output to mp4Samples
+                for (var i = 0; i < samples.length; i++) {
+                    var _sample2 = samples[i];
+                    var originalDts = _sample2.dts - this._dtsBase;
+                    var isKeyframe = _sample2.isKeyframe;
+                    var dts = originalDts - dtsCorrection;
+                    var cts = _sample2.cts;
+                    var pts = dts + cts;
+    
+                    if (firstDts === -1) {
+                        firstDts = dts;
+                        firstPts = pts;
+                    }
+    
+                    var sampleDuration = 0;
+    
+                    if (i !== samples.length - 1) {
+                        var nextDts = samples[i + 1].dts - this._dtsBase - dtsCorrection;
+                        sampleDuration = nextDts - dts;
+                    } else {
+                        // the last sample
+                        if (lastSample != null) {
+                            // use stashed sample's dts to calculate sample duration
+                            var _nextDts2 = lastSample.dts - this._dtsBase - dtsCorrection;
+                            sampleDuration = _nextDts2 - dts;
+                        } else if (mp4Samples.length >= 1) {
+                            // use second last sample duration
+                            sampleDuration = mp4Samples[mp4Samples.length - 1].duration;
+                        } else {
+                            // the only one sample, use reference sample duration
+                            sampleDuration = Math.floor(this._videoMeta.refSampleDuration);
+                        }
+                    }
+    
+                    if (isKeyframe) {
+                        var syncPoint = new _mediaSegmentInfo.SampleInfo(dts, pts, sampleDuration, _sample2.dts, true);
+                        syncPoint.fileposition = _sample2.fileposition;
+                        info.appendSyncPoint(syncPoint);
+                    }
+    
+                    mp4Samples.push({
+                        dts: dts,
+                        pts: pts,
+                        cts: cts,
+                        units: _sample2.units,
+                        size: _sample2.length,
+                        isKeyframe: isKeyframe,
+                        duration: sampleDuration,
+                        originalDts: originalDts,
+                        flags: {
+                            isLeading: 0,
+                            dependsOn: isKeyframe ? 2 : 1,
+                            isDependedOn: isKeyframe ? 1 : 0,
+                            hasRedundancy: 0,
+                            isNonSync: isKeyframe ? 0 : 1
+                        }
+                    });
+                }
+    
+                // allocate mdatbox
+                mdatbox = new Uint8Array(mdatBytes);
+                mdatbox[0] = mdatBytes >>> 24 & 0xFF;
+                mdatbox[1] = mdatBytes >>> 16 & 0xFF;
+                mdatbox[2] = mdatBytes >>> 8 & 0xFF;
+                mdatbox[3] = mdatBytes & 0xFF;
+                mdatbox.set(_mp4Generator2.default.types.mdat, 4);
+    
+                // Write samples into mdatbox
+                for (var _i2 = 0; _i2 < mp4Samples.length; _i2++) {
+                    var units = mp4Samples[_i2].units;
+                    while (units.length) {
+                        var unit = units.shift();
+                        var data = unit.data;
+                        mdatbox.set(data, offset);
+                        offset += data.byteLength;
+                    }
+                }
+    
+                var latest = mp4Samples[mp4Samples.length - 1];
+                lastDts = latest.dts + latest.duration;
+                lastPts = latest.pts + latest.duration;
+                this._videoNextDts = lastDts;
+    
+                // fill media segment info & add to info list
+                info.beginDts = firstDts;
+                info.endDts = lastDts;
+                info.beginPts = firstPts;
+                info.endPts = lastPts;
+                info.originalBeginDts = mp4Samples[0].originalDts;
+                info.originalEndDts = latest.originalDts + latest.duration;
+                info.firstSample = new _mediaSegmentInfo.SampleInfo(mp4Samples[0].dts, mp4Samples[0].pts, mp4Samples[0].duration, mp4Samples[0].originalDts, mp4Samples[0].isKeyframe);
+                info.lastSample = new _mediaSegmentInfo.SampleInfo(latest.dts, latest.pts, latest.duration, latest.originalDts, latest.isKeyframe);
+                if (!this._isLive) {
+                    this._videoSegmentInfoList.append(info);
+                }
+    
+                track.samples = mp4Samples;
+                track.sequenceNumber++;
+    
+                // workaround for chrome < 50: force first sample as a random access point
+                // see https://bugs.chromium.org/p/chromium/issues/detail?id=229412
+                if (this._forceFirstIDR) {
+                    var flags = mp4Samples[0].flags;
+                    flags.dependsOn = 2;
+                    flags.isNonSync = 0;
+                }
+    
+                var moofbox = _mp4Generator2.default.moof(track, firstDts);
+                track.samples = [];
+                track.length = 0;
+    
+                this._onMediaSegment('video', {
+                    type: 'video',
+                    data: this._mergeBoxes(moofbox, mdatbox).buffer,
+                    sampleCount: mp4Samples.length,
+                    info: info
+                });
+            }
+        }, {
+            key: '_mergeBoxes',
+            value: function _mergeBoxes(moof, mdat) {
+                var result = new Uint8Array(moof.byteLength + mdat.byteLength);
+                result.set(moof, 0);
+                result.set(mdat, moof.byteLength);
+                return result;
+            }
+        }, {
+            key: 'onInitSegment',
+            get: function get() {
+                return this._onInitSegment;
+            },
+            set: function set(callback) {
+                this._onInitSegment = callback;
+            }
+    
+            /* prototype: function onMediaSegment(type: string, mediaSegment: MediaSegment): void
+               MediaSegment: {
+                   type: string,
+                   data: ArrayBuffer,
+                   sampleCount: int32
+                   info: MediaSegmentInfo
+               }
+            */
+    
+        }, {
+            key: 'onMediaSegment',
+            get: function get() {
+                return this._onMediaSegment;
+            },
+            set: function set(callback) {
+                this._onMediaSegment = callback;
+            }
+        }]);
+    
+        return MP4Remuxer;
+    }();
+    
+    exports.default = MP4Remuxer;
+    
+    },{"../core/media-segment-info.js":8,"../utils/browser.js":39,"../utils/exception.js":40,"../utils/logger.js":41,"./aac-silent.js":36,"./mp4-generator.js":37}],39:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var Browser = {};
+    
+    function detect() {
+        // modified from jquery-browser-plugin
+    
+        var ua = self.navigator.userAgent.toLowerCase();
+    
+        var match = /(edge)\/([\w.]+)/.exec(ua) || /(opr)[\/]([\w.]+)/.exec(ua) || /(chrome)[ \/]([\w.]+)/.exec(ua) || /(iemobile)[\/]([\w.]+)/.exec(ua) || /(version)(applewebkit)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+).*(version)[ \/]([\w.]+).*(safari)[ \/]([\w.]+)/.exec(ua) || /(webkit)[ \/]([\w.]+)/.exec(ua) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || /(msie) ([\w.]+)/.exec(ua) || ua.indexOf('trident') >= 0 && /(rv)(?::| )([\w.]+)/.exec(ua) || ua.indexOf('compatible') < 0 && /(firefox)[ \/]([\w.]+)/.exec(ua) || [];
+    
+        var platform_match = /(ipad)/.exec(ua) || /(ipod)/.exec(ua) || /(windows phone)/.exec(ua) || /(iphone)/.exec(ua) || /(kindle)/.exec(ua) || /(android)/.exec(ua) || /(windows)/.exec(ua) || /(mac)/.exec(ua) || /(linux)/.exec(ua) || /(cros)/.exec(ua) || [];
+    
+        var matched = {
+            browser: match[5] || match[3] || match[1] || '',
+            version: match[2] || match[4] || '0',
+            majorVersion: match[4] || match[2] || '0',
+            platform: platform_match[0] || ''
+        };
+    
+        var browser = {};
+        if (matched.browser) {
+            browser[matched.browser] = true;
+    
+            var versionArray = matched.majorVersion.split('.');
+            browser.version = {
+                major: parseInt(matched.majorVersion, 10),
+                string: matched.version
+            };
+            if (versionArray.length > 1) {
+                browser.version.minor = parseInt(versionArray[1], 10);
+            }
+            if (versionArray.length > 2) {
+                browser.version.build = parseInt(versionArray[2], 10);
+            }
+        }
+    
+        if (matched.platform) {
+            browser[matched.platform] = true;
+        }
+    
+        if (browser.chrome || browser.opr || browser.safari) {
+            browser.webkit = true;
+        }
+    
+        // MSIE. IE11 has 'rv' identifer
+        if (browser.rv || browser.iemobile) {
+            if (browser.rv) {
+                delete browser.rv;
+            }
+            var msie = 'msie';
+            matched.browser = msie;
+            browser[msie] = true;
+        }
+    
+        // Microsoft Edge
+        if (browser.edge) {
+            delete browser.edge;
+            var msedge = 'msedge';
+            matched.browser = msedge;
+            browser[msedge] = true;
+        }
+    
+        // Opera 15+
+        if (browser.opr) {
+            var opera = 'opera';
+            matched.browser = opera;
+            browser[opera] = true;
+        }
+    
+        // Stock android browsers are marked as Safari
+        if (browser.safari && browser.android) {
+            var android = 'android';
+            matched.browser = android;
+            browser[android] = true;
+        }
+    
+        browser.name = matched.browser;
+        browser.platform = matched.platform;
+    
+        for (var key in Browser) {
+            if (Browser.hasOwnProperty(key)) {
+                delete Browser[key];
+            }
+        }
+        Object.assign(Browser, browser);
+    }
+    
+    detect();
+    
+    exports.default = Browser;
+    
+    },{}],40:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
+    
+    function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var RuntimeException = exports.RuntimeException = function () {
+        function RuntimeException(message) {
+            _classCallCheck(this, RuntimeException);
+    
+            this._message = message;
+        }
+    
+        _createClass(RuntimeException, [{
+            key: 'toString',
+            value: function toString() {
+                return this.name + ': ' + this.message;
+            }
+        }, {
+            key: 'name',
+            get: function get() {
+                return 'RuntimeException';
+            }
+        }, {
+            key: 'message',
+            get: function get() {
+                return this._message;
+            }
+        }]);
+    
+        return RuntimeException;
+    }();
+    
+    var IllegalStateException = exports.IllegalStateException = function (_RuntimeException) {
+        _inherits(IllegalStateException, _RuntimeException);
+    
+        function IllegalStateException(message) {
+            _classCallCheck(this, IllegalStateException);
+    
+            return _possibleConstructorReturn(this, (IllegalStateException.__proto__ || Object.getPrototypeOf(IllegalStateException)).call(this, message));
+        }
+    
+        _createClass(IllegalStateException, [{
+            key: 'name',
+            get: function get() {
+                return 'IllegalStateException';
+            }
+        }]);
+    
+        return IllegalStateException;
+    }(RuntimeException);
+    
+    var InvalidArgumentException = exports.InvalidArgumentException = function (_RuntimeException2) {
+        _inherits(InvalidArgumentException, _RuntimeException2);
+    
+        function InvalidArgumentException(message) {
+            _classCallCheck(this, InvalidArgumentException);
+    
+            return _possibleConstructorReturn(this, (InvalidArgumentException.__proto__ || Object.getPrototypeOf(InvalidArgumentException)).call(this, message));
+        }
+    
+        _createClass(InvalidArgumentException, [{
+            key: 'name',
+            get: function get() {
+                return 'InvalidArgumentException';
+            }
+        }]);
+    
+        return InvalidArgumentException;
+    }(RuntimeException);
+    
+    var NotImplementedException = exports.NotImplementedException = function (_RuntimeException3) {
+        _inherits(NotImplementedException, _RuntimeException3);
+    
+        function NotImplementedException(message) {
+            _classCallCheck(this, NotImplementedException);
+    
+            return _possibleConstructorReturn(this, (NotImplementedException.__proto__ || Object.getPrototypeOf(NotImplementedException)).call(this, message));
+        }
+    
+        _createClass(NotImplementedException, [{
+            key: 'name',
+            get: function get() {
+                return 'NotImplementedException';
+            }
+        }]);
+    
+        return NotImplementedException;
+    }(RuntimeException);
+    
+    },{}],41:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _events = _dereq_('events');
+    
+    var _events2 = _interopRequireDefault(_events);
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    var Log = function () {
+        function Log() {
+            _classCallCheck(this, Log);
+        }
+    
+        _createClass(Log, null, [{
+            key: 'e',
+            value: function e(tag, msg) {
+                if (!tag || Log.FORCE_GLOBAL_TAG) tag = Log.GLOBAL_TAG;
+    
+                var str = '[' + tag + '] > ' + msg;
+    
+                if (Log.ENABLE_CALLBACK) {
+                    Log.emitter.emit('log', 'error', str);
+                }
+    
+                if (!Log.ENABLE_ERROR) {
+                    return;
+                }
+    
+                if (console.error) {
+                    console.error(str);
+                } else if (console.warn) {
+                    console.warn(str);
+                } else {
+                    //console.log(str);
+                }
+            }
+        }, {
+            key: 'i',
+            value: function i(tag, msg) {
+                if (!tag || Log.FORCE_GLOBAL_TAG) tag = Log.GLOBAL_TAG;
+    
+                var str = '[' + tag + '] > ' + msg;
+    
+                if (Log.ENABLE_CALLBACK) {
+                    Log.emitter.emit('log', 'info', str);
+                }
+    
+                if (!Log.ENABLE_INFO) {
+                    return;
+                }
+    
+                if (console.info) {
+                    console.info(str);
+                } else {
+                    //console.log(str);
+                }
+            }
+        }, {
+            key: 'w',
+            value: function w(tag, msg) {
+                if (!tag || Log.FORCE_GLOBAL_TAG) tag = Log.GLOBAL_TAG;
+    
+                var str = '[' + tag + '] > ' + msg;
+    
+                if (Log.ENABLE_CALLBACK) {
+                    Log.emitter.emit('log', 'warn', str);
+                }
+    
+                if (!Log.ENABLE_WARN) {
+                    return;
+                }
+    
+                if (console.warn) {
+                    console.warn(str);
+                } else {
+                    //console.log(str);
+                }
+            }
+        }, {
+            key: 'd',
+            value: function d(tag, msg) {
+                if (!tag || Log.FORCE_GLOBAL_TAG) tag = Log.GLOBAL_TAG;
+    
+                var str = '[' + tag + '] > ' + msg;
+    
+                if (Log.ENABLE_CALLBACK) {
+                    Log.emitter.emit('log', 'debug', str);
+                }
+    
+                if (!Log.ENABLE_DEBUG) {
+                    return;
+                }
+    
+                if (console.debug) {
+                    console.debug(str);
+                } else {
+                    //console.log(str);
+                }
+            }
+        }, {
+            key: 'v',
+            value: function v(tag, msg) {
+                if (!tag || Log.FORCE_GLOBAL_TAG) tag = Log.GLOBAL_TAG;
+    
+                var str = '[' + tag + '] > ' + msg;
+    
+                if (Log.ENABLE_CALLBACK) {
+                    Log.emitter.emit('log', 'verbose', str);
+                }
+    
+                if (!Log.ENABLE_VERBOSE) {
+                    return;
+                }
+    
+                //console.log(str);
+            }
+        }]);
+    
+        return Log;
+    }();
+    
+    Log.GLOBAL_TAG = 'flv.js';
+    Log.FORCE_GLOBAL_TAG = false;
+    Log.ENABLE_ERROR = true;
+    Log.ENABLE_INFO = true;
+    Log.ENABLE_WARN = true;
+    Log.ENABLE_DEBUG = true;
+    Log.ENABLE_VERBOSE = true;
+    
+    Log.ENABLE_CALLBACK = false;
+    
+    Log.emitter = new _events2.default();
+    
+    exports.default = Log;
+    
+    },{"events":2}],42:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); /*
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Copyright (C) 2016 Bilibili. All Rights Reserved.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * @author zheng qian <xqq@xqq.im>
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Licensed under the Apache License, Version 2.0 (the "License");
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * you may not use this file except in compliance with the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * You may obtain a copy of the License at
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *     http://www.apache.org/licenses/LICENSE-2.0
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          *
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * Unless required by applicable law or agreed to in writing, software
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * distributed under the License is distributed on an "AS IS" BASIS,
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * See the License for the specific language governing permissions and
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          * limitations under the License.
+                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          */
+    
+    var _events = _dereq_('events');
+    
+    var _events2 = _interopRequireDefault(_events);
+    
+    var _logger = _dereq_('./logger.js');
+    
+    var _logger2 = _interopRequireDefault(_logger);
+    
+    function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    var LoggingControl = function () {
+        function LoggingControl() {
+            _classCallCheck(this, LoggingControl);
+        }
+    
+        _createClass(LoggingControl, null, [{
+            key: 'getConfig',
+            value: function getConfig() {
+                return {
+                    globalTag: _logger2.default.GLOBAL_TAG,
+                    forceGlobalTag: _logger2.default.FORCE_GLOBAL_TAG,
+                    enableVerbose: _logger2.default.ENABLE_VERBOSE,
+                    enableDebug: _logger2.default.ENABLE_DEBUG,
+                    enableInfo: _logger2.default.ENABLE_INFO,
+                    enableWarn: _logger2.default.ENABLE_WARN,
+                    enableError: _logger2.default.ENABLE_ERROR,
+                    enableCallback: _logger2.default.ENABLE_CALLBACK
+                };
+            }
+        }, {
+            key: 'applyConfig',
+            value: function applyConfig(config) {
+                _logger2.default.GLOBAL_TAG = config.globalTag;
+                _logger2.default.FORCE_GLOBAL_TAG = config.forceGlobalTag;
+                _logger2.default.ENABLE_VERBOSE = config.enableVerbose;
+                _logger2.default.ENABLE_DEBUG = config.enableDebug;
+                _logger2.default.ENABLE_INFO = config.enableInfo;
+                _logger2.default.ENABLE_WARN = config.enableWarn;
+                _logger2.default.ENABLE_ERROR = config.enableError;
+                _logger2.default.ENABLE_CALLBACK = config.enableCallback;
+            }
+        }, {
+            key: '_notifyChange',
+            value: function _notifyChange() {
+                var emitter = LoggingControl.emitter;
+    
+                if (emitter.listenerCount('change') > 0) {
+                    var config = LoggingControl.getConfig();
+                    emitter.emit('change', config);
+                }
+            }
+        }, {
+            key: 'registerListener',
+            value: function registerListener(listener) {
+                LoggingControl.emitter.addListener('change', listener);
+            }
+        }, {
+            key: 'removeListener',
+            value: function removeListener(listener) {
+                LoggingControl.emitter.removeListener('change', listener);
+            }
+        }, {
+            key: 'addLogListener',
+            value: function addLogListener(listener) {
+                _logger2.default.emitter.addListener('log', listener);
+                if (_logger2.default.emitter.listenerCount('log') > 0) {
+                    _logger2.default.ENABLE_CALLBACK = true;
+                    LoggingControl._notifyChange();
+                }
+            }
+        }, {
+            key: 'removeLogListener',
+            value: function removeLogListener(listener) {
+                _logger2.default.emitter.removeListener('log', listener);
+                if (_logger2.default.emitter.listenerCount('log') === 0) {
+                    _logger2.default.ENABLE_CALLBACK = false;
+                    LoggingControl._notifyChange();
+                }
+            }
+        }, {
+            key: 'forceGlobalTag',
+            get: function get() {
+                return _logger2.default.FORCE_GLOBAL_TAG;
+            },
+            set: function set(enable) {
+                _logger2.default.FORCE_GLOBAL_TAG = enable;
+                LoggingControl._notifyChange();
+            }
+        }, {
+            key: 'globalTag',
+            get: function get() {
+                return _logger2.default.GLOBAL_TAG;
+            },
+            set: function set(tag) {
+                _logger2.default.GLOBAL_TAG = tag;
+                LoggingControl._notifyChange();
+            }
+        }, {
+            key: 'enableAll',
+            get: function get() {
+                return _logger2.default.ENABLE_VERBOSE && _logger2.default.ENABLE_DEBUG && _logger2.default.ENABLE_INFO && _logger2.default.ENABLE_WARN && _logger2.default.ENABLE_ERROR;
+            },
+            set: function set(enable) {
+                _logger2.default.ENABLE_VERBOSE = enable;
+                _logger2.default.ENABLE_DEBUG = enable;
+                _logger2.default.ENABLE_INFO = enable;
+                _logger2.default.ENABLE_WARN = enable;
+                _logger2.default.ENABLE_ERROR = enable;
+                LoggingControl._notifyChange();
+            }
+        }, {
+            key: 'enableDebug',
+            get: function get() {
+                return _logger2.default.ENABLE_DEBUG;
+            },
+            set: function set(enable) {
+                _logger2.default.ENABLE_DEBUG = enable;
+                LoggingControl._notifyChange();
+            }
+        }, {
+            key: 'enableVerbose',
+            get: function get() {
+                return _logger2.default.ENABLE_VERBOSE;
+            },
+            set: function set(enable) {
+                _logger2.default.ENABLE_VERBOSE = enable;
+                LoggingControl._notifyChange();
+            }
+        }, {
+            key: 'enableInfo',
+            get: function get() {
+                return _logger2.default.ENABLE_INFO;
+            },
+            set: function set(enable) {
+                _logger2.default.ENABLE_INFO = enable;
+                LoggingControl._notifyChange();
+            }
+        }, {
+            key: 'enableWarn',
+            get: function get() {
+                return _logger2.default.ENABLE_WARN;
+            },
+            set: function set(enable) {
+                _logger2.default.ENABLE_WARN = enable;
+                LoggingControl._notifyChange();
+            }
+        }, {
+            key: 'enableError',
+            get: function get() {
+                return _logger2.default.ENABLE_ERROR;
+            },
+            set: function set(enable) {
+                _logger2.default.ENABLE_ERROR = enable;
+                LoggingControl._notifyChange();
+            }
+        }]);
+    
+        return LoggingControl;
+    }();
+    
+    LoggingControl.emitter = new _events2.default();
+    
+    exports.default = LoggingControl;
+    
+    },{"./logger.js":41,"events":2}],43:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    
+    var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
+    
+    function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+    
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    var Polyfill = function () {
+        function Polyfill() {
+            _classCallCheck(this, Polyfill);
+        }
+    
+        _createClass(Polyfill, null, [{
+            key: 'install',
+            value: function install() {
+                // ES6 Object.setPrototypeOf
+                Object.setPrototypeOf = Object.setPrototypeOf || function (obj, proto) {
+                    obj.__proto__ = proto;
+                    return obj;
+                };
+    
+                // ES6 Object.assign
+                Object.assign = Object.assign || function (target) {
+                    if (target === undefined || target === null) {
+                        throw new TypeError('Cannot convert undefined or null to object');
+                    }
+    
+                    var output = Object(target);
+                    for (var i = 1; i < arguments.length; i++) {
+                        var source = arguments[i];
+                        if (source !== undefined && source !== null) {
+                            for (var key in source) {
+                                if (source.hasOwnProperty(key)) {
+                                    output[key] = source[key];
+                                }
+                            }
+                        }
+                    }
+                    return output;
+                };
+    
+                // ES6 Promise (missing support in IE11)
+                if (typeof self.Promise !== 'function') {
+                    _dereq_('es6-promise').polyfill();
+                }
+            }
+        }]);
+    
+        return Polyfill;
+    }();
+    
+    Polyfill.install();
+    
+    exports.default = Polyfill;
+    
+    },{"es6-promise":1}],44:[function(_dereq_,module,exports){
+    'use strict';
+    
+    Object.defineProperty(exports, "__esModule", {
+        value: true
+    });
+    /*
+     * Copyright (C) 2016 Bilibili. All Rights Reserved.
+     *
+     * This file is derived from C++ project libWinTF8 (https://github.com/m13253/libWinTF8)
+     * @author zheng qian <xqq@xqq.im>
+     *
+     * Licensed under the Apache License, Version 2.0 (the "License");
+     * you may not use this file except in compliance with the License.
+     * You may obtain a copy of the License at
+     *
+     *     http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing, software
+     * distributed under the License is distributed on an "AS IS" BASIS,
+     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+     * See the License for the specific language governing permissions and
+     * limitations under the License.
+     */
+    
+    function checkContinuation(uint8array, start, checkLength) {
+        var array = uint8array;
+        if (start + checkLength < array.length) {
+            while (checkLength--) {
+                if ((array[++start] & 0xC0) !== 0x80) return false;
+            }
+            return true;
+        } else {
+            return false;
+        }
+    }
+    
+    function decodeUTF8(uint8array) {
+        var out = [];
+        var input = uint8array;
+        var i = 0;
+        var length = uint8array.length;
+    
+        while (i < length) {
+            if (input[i] < 0x80) {
+                out.push(String.fromCharCode(input[i]));
+                ++i;
+                continue;
+            } else if (input[i] < 0xC0) {
+                // fallthrough
+            } else if (input[i] < 0xE0) {
+                if (checkContinuation(input, i, 1)) {
+                    var ucs4 = (input[i] & 0x1F) << 6 | input[i + 1] & 0x3F;
+                    if (ucs4 >= 0x80) {
+                        out.push(String.fromCharCode(ucs4 & 0xFFFF));
+                        i += 2;
+                        continue;
+                    }
+                }
+            } else if (input[i] < 0xF0) {
+                if (checkContinuation(input, i, 2)) {
+                    var _ucs = (input[i] & 0xF) << 12 | (input[i + 1] & 0x3F) << 6 | input[i + 2] & 0x3F;
+                    if (_ucs >= 0x800 && (_ucs & 0xF800) !== 0xD800) {
+                        out.push(String.fromCharCode(_ucs & 0xFFFF));
+                        i += 3;
+                        continue;
+                    }
+                }
+            } else if (input[i] < 0xF8) {
+                if (checkContinuation(input, i, 3)) {
+                    var _ucs2 = (input[i] & 0x7) << 18 | (input[i + 1] & 0x3F) << 12 | (input[i + 2] & 0x3F) << 6 | input[i + 3] & 0x3F;
+                    if (_ucs2 > 0x10000 && _ucs2 < 0x110000) {
+                        _ucs2 -= 0x10000;
+                        out.push(String.fromCharCode(_ucs2 >>> 10 | 0xD800));
+                        out.push(String.fromCharCode(_ucs2 & 0x3FF | 0xDC00));
+                        i += 4;
+                        continue;
+                    }
+                }
+            }
+            out.push(String.fromCharCode(0xFFFD));
+            ++i;
+        }
+    
+        return out.join('');
+    }
+    
+    exports.default = decodeUTF8;
+    
+    },{}]},{},[21])(21)
+    });
+    
+    //# sourceMappingURL=flv.js.map
\ No newline at end of file
diff --git a/mobile/lib/fsize.js b/mobile/lib/fsize.js
new file mode 100644
index 0000000..426e5b6
--- /dev/null
+++ b/mobile/lib/fsize.js
@@ -0,0 +1,13 @@
+/*function setRemFontSize(baseSize, baseWidth) {
+ var baseSize = baseSize || 37.5,
+ baseWidth = baseWidth || 375,
+ clientWidth = document.documentElement.clientWidth <= 480 ? document.documentElement.clientWidth : 480;
+ document.getElementsByTagName('html')[0].style.fontSize = clientWidth * baseSize / baseWidth + 'px'
+ }
+ setRemFontSize();
+ window.addEventListener("resize", function() {
+ setTimeout(function() {
+ setRemFontSize();
+ }, 200)
+ });*/
+!function(e,t){function i(){var t=n.getBoundingClientRect().width;t/m>540&&(t=540*m);var i=t/10;n.style.fontSize=i+"px",d.rem=e.rem=i}var a,r=e.document,n=r.documentElement,o=r.querySelector('meta[name="viewport"]'),l=r.querySelector('meta[name="flexible"]'),m=0,s=0,d=t.flexible||(t.flexible={});if(o){console.warn("将根据已有的meta标签来设置缩放比例");var p=o.getAttribute("content").match(/initial\-scale=([\d\.]+)/);p&&(s=parseFloat(p[1]),m=parseInt(1/s))}else if(l){var c=l.getAttribute("content");if(c){var u=c.match(/initial\-dpr=([\d\.]+)/),f=c.match(/maximum\-dpr=([\d\.]+)/);u&&(m=parseFloat(u[1]),s=parseFloat((1/m).toFixed(2))),f&&(m=parseFloat(f[1]),s=parseFloat((1/m).toFixed(2)))}}if(!m&&!s){var v=(e.navigator.appVersion.match(/android/gi),e.navigator.appVersion.match(/iphone/gi)),h=e.devicePixelRatio;m=v?h>=3&&(!m||m>=3)?3:h>=2&&(!m||m>=2)?2:1:1,s=1/m}if(n.setAttribute("data-dpr",m),!o)if(o=r.createElement("meta"),o.setAttribute("name","viewport"),o.setAttribute("content","initial-scale="+s+", maximum-scale="+s+", minimum-scale="+s+", user-scalable=no"),n.firstElementChild)n.firstElementChild.appendChild(o);else{var x=r.createElement("div");x.appendChild(o),r.write(x.innerHTML)}e.addEventListener("resize",function(){clearTimeout(a),a=setTimeout(i,300)},!1),e.addEventListener("pageshow",function(e){e.persisted&&(clearTimeout(a),a=setTimeout(i,300))},!1),"complete"===r.readyState?r.body.style.fontSize=12*m+"px":r.addEventListener("DOMContentLoaded",function(e){r.body.style.fontSize=12*m+"px"},!1),i(),d.dpr=e.dpr=m,d.refreshRem=i,d.rem2px=function(e){var t=parseFloat(e)*this.rem;return"string"==typeof e&&e.match(/rem$/)&&(t+="px"),t},d.px2rem=function(e){var t=parseFloat(e)/this.rem;return"string"==typeof e&&e.match(/px$/)&&(t+="rem"),t}}(window,window.lib||(window.lib={}));
\ No newline at end of file
diff --git a/mobile/lib/jquery-3.1.1.min.js b/mobile/lib/jquery-3.1.1.min.js
new file mode 100644
index 0000000..4c5be4c
--- /dev/null
+++ b/mobile/lib/jquery-3.1.1.min.js
@@ -0,0 +1,4 @@
+/*! jQuery v3.1.1 | (c) jQuery Foundation | jquery.org/license */
+!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.1.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c<b?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:h,sort:c.sort,splice:c.splice},r.extend=r.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||r.isFunction(g)||(g={}),h===i&&(g=this,h--);h<i;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(r.isPlainObject(d)||(e=r.isArray(d)))?(e?(e=!1,f=c&&r.isArray(c)?c:[]):f=c&&r.isPlainObject(c)?c:{},g[b]=r.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},r.extend({expando:"jQuery"+(q+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===r.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=r.type(a);return("number"===b||"string"===b)&&!isNaN(a-parseFloat(a))},isPlainObject:function(a){var b,c;return!(!a||"[object Object]"!==k.call(a))&&(!(b=e(a))||(c=l.call(b,"constructor")&&b.constructor,"function"==typeof c&&m.call(c)===n))},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?j[k.call(a)]||"object":typeof a},globalEval:function(a){p(a)},camelCase:function(a){return a.replace(t,"ms-").replace(u,v)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(w(a)){for(c=a.length;d<c;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(s,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(w(Object(a))?r.merge(c,"string"==typeof a?[a]:a):h.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:i.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;d<c;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;f<g;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,f=0,h=[];if(w(a))for(d=a.length;f<d;f++)e=b(a[f],f,c),null!=e&&h.push(e);else for(f in a)e=b(a[f],f,c),null!=e&&h.push(e);return g.apply([],h)},guid:1,proxy:function(a,b){var c,d,e;if("string"==typeof b&&(c=a[b],b=a,a=c),r.isFunction(a))return d=f.call(arguments,2),e=function(){return a.apply(b||this,d.concat(f.call(arguments)))},e.guid=a.guid=a.guid||r.guid++,e},now:Date.now,support:o}),"function"==typeof Symbol&&(r.fn[Symbol.iterator]=c[Symbol.iterator]),r.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){j["[object "+b+"]"]=b.toLowerCase()});function w(a){var b=!!a&&"length"in a&&a.length,c=r.type(a);return"function"!==c&&!r.isWindow(a)&&("array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\0-\\xa0])+",M="\\["+K+"*("+L+")(?:"+K+"*([*^$|!~]?=)"+K+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+L+"))|)"+K+"*\\]",N=":("+L+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+M+")*)|.*)\\)|)",O=new RegExp(K+"+","g"),P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="<a id='"+u+"'></a><select id='"+u+"-\r\\' msallowcapture=''><option selected=''></option></select>",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c<b;c+=2)a.push(c);return a}),odd:pa(function(a,b){for(var c=1;c<b;c+=2)a.push(c);return a}),lt:pa(function(a,b,c){for(var d=c<0?c+b:c;--d>=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d<b;)a.push(d);return a})}},d.pseudos.nth=d.pseudos.eq;for(b in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})d.pseudos[b]=ma(b);for(b in{submit:!0,reset:!0})d.pseudos[b]=na(b);function ra(){}ra.prototype=d.filters=d.pseudos,d.setFilters=new ra,g=ga.tokenize=function(a,b){var c,e,f,g,h,i,j,k=z[a+" "];if(k)return b?0:k.slice(0);h=a,i=[],j=d.preFilter;while(h){c&&!(e=Q.exec(h))||(e&&(h=h.slice(e[0].length)||h),i.push(f=[])),c=!1,(e=R.exec(h))&&(c=e.shift(),f.push({value:c,type:e[0].replace(P," ")}),h=h.slice(c.length));for(g in d.filter)!(e=V[g].exec(h))||j[g]&&!(e=j[g](e))||(c=e.shift(),f.push({value:c,type:g,matches:e}),h=h.slice(c.length));if(!c)break}return b?h.length:h?ga.error(a):z(a,i).slice(0)};function sa(a){for(var b=0,c=a.length,d="";b<c;b++)d+=a[b].value;return d}function ta(a,b,c){var d=b.dir,e=b.next,f=e||d,g=c&&"parentNode"===f,h=x++;return b.first?function(b,c,e){while(b=b[d])if(1===b.nodeType||g)return a(b,c,e);return!1}:function(b,c,i){var j,k,l,m=[w,h];if(i){while(b=b[d])if((1===b.nodeType||g)&&a(b,c,i))return!0}else while(b=b[d])if(1===b.nodeType||g)if(l=b[u]||(b[u]={}),k=l[b.uniqueID]||(l[b.uniqueID]={}),e&&e===b.nodeName.toLowerCase())b=b[d]||b;else{if((j=k[f])&&j[0]===w&&j[1]===h)return m[2]=j[2];if(k[f]=m,m[2]=a(b,c,i))return!0}return!1}}function ua(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d<e;d++)ga(a,b[d],c);return c}function wa(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;h<i;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function xa(a,b,c,d,e,f){return d&&!d[u]&&(d=xa(d)),e&&!e[u]&&(e=xa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||va(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:wa(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=wa(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i<f;i++)if(c=d.relative[a[i].type])m=[ta(ua(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;e<f;e++)if(d.relative[a[e].type])break;return xa(i>1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i<e&&ya(a.slice(i,e)),e<f&&ya(a=a.slice(e)),e<f&&sa(a))}m.push(c)}return ua(m)}function za(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="<a href='#'></a>","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="<input/>",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext,B=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,C=/^.[^:#\[\.,]*$/;function D(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):C.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b<d;b++)if(r.contains(e[b],this))return!0}));for(c=this.pushStack([]),b=0;b<d;b++)r.find(a,e[b],c);return d>1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(D(this,a||[],!1))},not:function(a){return this.pushStack(D(this,a||[],!0))},is:function(a){return!!D(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var E,F=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,G=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||E,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:F.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),B.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};G.prototype=r.fn,E=r(d);var H=/^(?:parents|prev(?:Until|All))/,I={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a<c;a++)if(r.contains(this,b[a]))return!0})},closest:function(a,b){var c,d=0,e=this.length,f=[],g="string"!=typeof a&&r(a);if(!A.test(a))for(;d<e;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function J(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return J(a,"nextSibling")},prev:function(a){return J(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return a.contentDocument||r.merge([],a.childNodes)}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(I[a]||r.uniqueSort(e),H.test(a)&&e.reverse()),this.pushStack(e)}});var K=/[^\x20\t\r\n\f]+/g;function L(a){var b={};return r.each(a.match(K)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?L(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h<f.length)f[h].apply(c[0],c[1])===!1&&a.stopOnFalse&&(h=f.length,c=!1)}a.memory||(c=!1),b=!1,e&&(f=c?[]:"")},j={add:function(){return f&&(c&&!b&&(h=f.length-1,g.push(c)),function d(b){r.each(b,function(b,c){r.isFunction(c)?a.unique&&j.has(c)||f.push(c):c&&c.length&&"string"!==r.type(c)&&d(c)})}(arguments),c&&!b&&i()),this},remove:function(){return r.each(arguments,function(a,b){var c;while((c=r.inArray(b,f,c))>-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function M(a){return a}function N(a){throw a}function O(a,b,c){var d;try{a&&r.isFunction(d=a.promise)?d.call(a).done(b).fail(c):a&&r.isFunction(d=a.then)?d.call(a,b,c):b.call(void 0,a)}catch(a){c.call(void 0,a)}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b<f)){if(a=d.apply(h,i),a===c.promise())throw new TypeError("Thenable self-resolution");j=a&&("object"==typeof a||"function"==typeof a)&&a.then,r.isFunction(j)?e?j.call(a,g(f,c,M,e),g(f,c,N,e)):(f++,j.call(a,g(f,c,M,e),g(f,c,N,e),g(f,c,M,c.notifyWith))):(d!==M&&(h=void 0,i=[a]),(e||c.resolveWith)(h,i))}},k=e?j:function(){try{j()}catch(a){r.Deferred.exceptionHook&&r.Deferred.exceptionHook(a,k.stackTrace),b+1>=f&&(d!==N&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:M,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:M)),c[2][3].add(g(0,a,r.isFunction(d)?d:N))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(O(a,g.done(h(c)).resolve,g.reject),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)O(e[c],h(c),g.reject);return g.promise()}});var P=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&P.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var Q=r.Deferred();r.fn.ready=function(a){return Q.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,holdReady:function(a){a?r.readyWait++:r.ready(!0)},ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||Q.resolveWith(d,[r]))}}),r.ready.then=Q.then;function R(){d.removeEventListener("DOMContentLoaded",R),
+a.removeEventListener("load",R),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",R),a.addEventListener("load",R));var S=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)S(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h<i;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},T=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function U(){this.expando=r.expando+U.uid++}U.uid=1,U.prototype={cache:function(a){var b=a[this.expando];return b||(b={},T(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[r.camelCase(b)]=c;else for(d in b)e[r.camelCase(d)]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][r.camelCase(b)]},access:function(a,b,c){return void 0===b||b&&"string"==typeof b&&void 0===c?this.get(a,b):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d=a[this.expando];if(void 0!==d){if(void 0!==b){r.isArray(b)?b=b.map(r.camelCase):(b=r.camelCase(b),b=b in d?[b]:b.match(K)||[]),c=b.length;while(c--)delete d[b[c]]}(void 0===b||r.isEmptyObject(d))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!r.isEmptyObject(b)}};var V=new U,W=new U,X=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Y=/[A-Z]/g;function Z(a){return"true"===a||"false"!==a&&("null"===a?null:a===+a+""?+a:X.test(a)?JSON.parse(a):a)}function $(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Y,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c=Z(c)}catch(e){}W.set(a,b,c)}else c=void 0;return c}r.extend({hasData:function(a){return W.hasData(a)||V.hasData(a)},data:function(a,b,c){return W.access(a,b,c)},removeData:function(a,b){W.remove(a,b)},_data:function(a,b,c){return V.access(a,b,c)},_removeData:function(a,b){V.remove(a,b)}}),r.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=W.get(f),1===f.nodeType&&!V.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=r.camelCase(d.slice(5)),$(f,d,e[d])));V.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){W.set(this,a)}):S(this,function(b){var c;if(f&&void 0===b){if(c=W.get(f,a),void 0!==c)return c;if(c=$(f,a),void 0!==c)return c}else this.each(function(){W.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){W.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=V.get(a,b),c&&(!d||r.isArray(c)?d=V.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return V.get(a,c)||V.access(a,c,{empty:r.Callbacks("once memory").add(function(){V.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length<c?r.queue(this[0],a):void 0===b?this:this.each(function(){var c=r.queue(this,a,b);r._queueHooks(this,a),"fx"===a&&"inprogress"!==c[0]&&r.dequeue(this,a)})},dequeue:function(a){return this.each(function(){r.dequeue(this,a)})},clearQueue:function(a){return this.queue(a||"fx",[])},promise:function(a,b){var c,d=1,e=r.Deferred(),f=this,g=this.length,h=function(){--d||e.resolveWith(f,[f])};"string"!=typeof a&&(b=a,a=void 0),a=a||"fx";while(g--)c=V.get(f[g],a+"queueHooks"),c&&c.empty&&(d++,c.empty.add(h));return h(),e.promise(b)}});var _=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,aa=new RegExp("^(?:([+-])=|)("+_+")([a-z%]*)$","i"),ba=["Top","Right","Bottom","Left"],ca=function(a,b){return a=b||a,"none"===a.style.display||""===a.style.display&&r.contains(a.ownerDocument,a)&&"none"===r.css(a,"display")},da=function(a,b,c,d){var e,f,g={};for(f in b)g[f]=a.style[f],a.style[f]=b[f];e=c.apply(a,d||[]);for(f in b)a.style[f]=g[f];return e};function ea(a,b,c,d){var e,f=1,g=20,h=d?function(){return d.cur()}:function(){return r.css(a,b,"")},i=h(),j=c&&c[3]||(r.cssNumber[b]?"":"px"),k=(r.cssNumber[b]||"px"!==j&&+i)&&aa.exec(r.css(a,b));if(k&&k[3]!==j){j=j||k[3],c=c||[],k=+i||1;do f=f||".5",k/=f,r.style(a,b,k+j);while(f!==(f=h()/i)&&1!==f&&--g)}return c&&(k=+k||+i||0,e=c[1]?k+(c[1]+1)*c[2]:+c[2],d&&(d.unit=j,d.start=k,d.end=e)),e}var fa={};function ga(a){var b,c=a.ownerDocument,d=a.nodeName,e=fa[d];return e?e:(b=c.body.appendChild(c.createElement(d)),e=r.css(b,"display"),b.parentNode.removeChild(b),"none"===e&&(e="block"),fa[d]=e,e)}function ha(a,b){for(var c,d,e=[],f=0,g=a.length;f<g;f++)d=a[f],d.style&&(c=d.style.display,b?("none"===c&&(e[f]=V.get(d,"display")||null,e[f]||(d.style.display="")),""===d.style.display&&ca(d)&&(e[f]=ga(d))):"none"!==c&&(e[f]="none",V.set(d,"display",c)));for(f=0;f<g;f++)null!=e[f]&&(a[f].style.display=e[f]);return a}r.fn.extend({show:function(){return ha(this,!0)},hide:function(){return ha(this)},toggle:function(a){return"boolean"==typeof a?a?this.show():this.hide():this.each(function(){ca(this)?r(this).show():r(this).hide()})}});var ia=/^(?:checkbox|radio)$/i,ja=/<([a-z][^\/\0>\x20\t\r\n\f]+)/i,ka=/^$|\/(?:java|ecma)script/i,la={option:[1,"<select multiple='multiple'>","</select>"],thead:[1,"<table>","</table>"],col:[2,"<table><colgroup>","</colgroup></table>"],tr:[2,"<table><tbody>","</tbody></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:[0,"",""]};la.optgroup=la.option,la.tbody=la.tfoot=la.colgroup=la.caption=la.thead,la.th=la.td;function ma(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&r.nodeName(a,b)?r.merge([a],c):c}function na(a,b){for(var c=0,d=a.length;c<d;c++)V.set(a[c],"globalEval",!b||V.get(b[c],"globalEval"))}var oa=/<|&#?\w+;/;function pa(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],n=0,o=a.length;n<o;n++)if(f=a[n],f||0===f)if("object"===r.type(f))r.merge(m,f.nodeType?[f]:f);else if(oa.test(f)){g=g||l.appendChild(b.createElement("div")),h=(ja.exec(f)||["",""])[1].toLowerCase(),i=la[h]||la._default,g.innerHTML=i[1]+r.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;r.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",n=0;while(f=m[n++])if(d&&r.inArray(f,d)>-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=ma(l.appendChild(f),"script"),j&&na(g),c){k=0;while(f=g[k++])ka.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="<textarea>x</textarea>",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var qa=d.documentElement,ra=/^key/,sa=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ta=/^([^.]*)(?:\.(.+)|)/;function ua(){return!0}function va(){return!1}function wa(){try{return d.activeElement}catch(a){}}function xa(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)xa(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=va;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(qa,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(K)||[""],j=b.length;while(j--)h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=V.hasData(a)&&V.get(a);if(q&&(i=q.events)){b=(b||"").match(K)||[""],j=b.length;while(j--)if(h=ta.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&V.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(V.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c<arguments.length;c++)i[c]=arguments[c];if(b.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,b)!==!1){h=r.event.handlers.call(this,b,j),c=0;while((f=h[c++])&&!b.isPropagationStopped()){b.currentTarget=f.elem,d=0;while((g=f.handlers[d++])&&!b.isImmediatePropagationStopped())b.rnamespace&&!b.rnamespace.test(g.namespace)||(b.handleObj=g,b.data=g.data,e=((r.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(b.result=e)===!1&&(b.preventDefault(),b.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,b),b.result}},handlers:function(a,b){var c,d,e,f,g,h=[],i=b.delegateCount,j=a.target;if(i&&j.nodeType&&!("click"===a.type&&a.button>=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c<i;c++)d=b[c],e=d.selector+" ",void 0===g[e]&&(g[e]=d.needsContext?r(e,this).index(j)>-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i<b.length&&h.push({elem:j,handlers:b.slice(i)}),h},addProp:function(a,b){Object.defineProperty(r.Event.prototype,a,{enumerable:!0,configurable:!0,get:r.isFunction(b)?function(){if(this.originalEvent)return b(this.originalEvent)}:function(){if(this.originalEvent)return this.originalEvent[a]},set:function(b){Object.defineProperty(this,a,{enumerable:!0,configurable:!0,writable:!0,value:b})}})},fix:function(a){return a[r.expando]?a:new r.Event(a)},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==wa()&&this.focus)return this.focus(),!1},delegateType:"focusin"},blur:{trigger:function(){if(this===wa()&&this.blur)return this.blur(),!1},delegateType:"focusout"},click:{trigger:function(){if("checkbox"===this.type&&this.click&&r.nodeName(this,"input"))return this.click(),!1},_default:function(a){return r.nodeName(a.target,"a")}},beforeunload:{postDispatch:function(a){void 0!==a.result&&a.originalEvent&&(a.originalEvent.returnValue=a.result)}}}},r.removeEvent=function(a,b,c){a.removeEventListener&&a.removeEventListener(b,c)},r.Event=function(a,b){return this instanceof r.Event?(a&&a.type?(this.originalEvent=a,this.type=a.type,this.isDefaultPrevented=a.defaultPrevented||void 0===a.defaultPrevented&&a.returnValue===!1?ua:va,this.target=a.target&&3===a.target.nodeType?a.target.parentNode:a.target,this.currentTarget=a.currentTarget,this.relatedTarget=a.relatedTarget):this.type=a,b&&r.extend(this,b),this.timeStamp=a&&a.timeStamp||r.now(),void(this[r.expando]=!0)):new r.Event(a,b)},r.Event.prototype={constructor:r.Event,isDefaultPrevented:va,isPropagationStopped:va,isImmediatePropagationStopped:va,isSimulated:!1,preventDefault:function(){var a=this.originalEvent;this.isDefaultPrevented=ua,a&&!this.isSimulated&&a.preventDefault()},stopPropagation:function(){var a=this.originalEvent;this.isPropagationStopped=ua,a&&!this.isSimulated&&a.stopPropagation()},stopImmediatePropagation:function(){var a=this.originalEvent;this.isImmediatePropagationStopped=ua,a&&!this.isSimulated&&a.stopImmediatePropagation(),this.stopPropagation()}},r.each({altKey:!0,bubbles:!0,cancelable:!0,changedTouches:!0,ctrlKey:!0,detail:!0,eventPhase:!0,metaKey:!0,pageX:!0,pageY:!0,shiftKey:!0,view:!0,"char":!0,charCode:!0,key:!0,keyCode:!0,button:!0,buttons:!0,clientX:!0,clientY:!0,offsetX:!0,offsetY:!0,pointerId:!0,pointerType:!0,screenX:!0,screenY:!0,targetTouches:!0,toElement:!0,touches:!0,which:function(a){var b=a.button;return null==a.which&&ra.test(a.type)?null!=a.charCode?a.charCode:a.keyCode:!a.which&&void 0!==b&&sa.test(a.type)?1&b?1:2&b?3:4&b?2:0:a.which}},r.event.addProp),r.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(a,b){r.event.special[a]={delegateType:b,bindType:b,handle:function(a){var c,d=this,e=a.relatedTarget,f=a.handleObj;return e&&(e===d||r.contains(d,e))||(a.type=f.origType,c=f.handler.apply(this,arguments),a.type=b),c}}}),r.fn.extend({on:function(a,b,c,d){return xa(this,a,b,c,d)},one:function(a,b,c,d){return xa(this,a,b,c,d,1)},off:function(a,b,c){var d,e;if(a&&a.preventDefault&&a.handleObj)return d=a.handleObj,r(a.delegateTarget).off(d.namespace?d.origType+"."+d.namespace:d.origType,d.selector,d.handler),this;if("object"==typeof a){for(e in a)this.off(e,b,a[e]);return this}return b!==!1&&"function"!=typeof b||(c=b,b=void 0),c===!1&&(c=va),this.each(function(){r.event.remove(this,a,c,b)})}});var ya=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,za=/<script|<style|<link/i,Aa=/checked\s*(?:[^=]|=\s*.checked.)/i,Ba=/^true\/(.*)/,Ca=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;function Da(a,b){return r.nodeName(a,"table")&&r.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a:a}function Ea(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Fa(a){var b=Ba.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ga(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(V.hasData(a)&&(f=V.access(a),g=V.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c<d;c++)r.event.add(b,e,j[e][c])}W.hasData(a)&&(h=W.access(a),i=r.extend({},h),W.set(b,i))}}function Ha(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ia.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function Ia(a,b,c,d){b=g.apply([],b);var e,f,h,i,j,k,l=0,m=a.length,n=m-1,q=b[0],s=r.isFunction(q);if(s||m>1&&"string"==typeof q&&!o.checkClone&&Aa.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ia(f,b,c,d)});if(m&&(e=pa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(ma(e,"script"),Ea),i=h.length;l<m;l++)j=e,l!==n&&(j=r.clone(j,!0,!0),i&&r.merge(h,ma(j,"script"))),c.call(a[l],j,l);if(i)for(k=h[h.length-1].ownerDocument,r.map(h,Fa),l=0;l<i;l++)j=h[l],ka.test(j.type||"")&&!V.access(j,"globalEval")&&r.contains(k,j)&&(j.src?r._evalUrl&&r._evalUrl(j.src):p(j.textContent.replace(Ca,""),k))}return a}function Ja(a,b,c){for(var d,e=b?r.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||r.cleanData(ma(d)),d.parentNode&&(c&&r.contains(d.ownerDocument,d)&&na(ma(d,"script")),d.parentNode.removeChild(d));return a}r.extend({htmlPrefilter:function(a){return a.replace(ya,"<$1></$2>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=ma(h),f=ma(a),d=0,e=f.length;d<e;d++)Ha(f[d],g[d]);if(b)if(c)for(f=f||ma(a),g=g||ma(h),d=0,e=f.length;d<e;d++)Ga(f[d],g[d]);else Ga(a,h);return g=ma(h,"script"),g.length>0&&na(g,!i&&ma(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(T(c)){if(b=c[V.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[V.expando]=void 0}c[W.expando]&&(c[W.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ja(this,a,!0)},remove:function(a){return Ja(this,a)},text:function(a){return S(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.appendChild(a)}})},prepend:function(){return Ia(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Da(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ia(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(ma(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return S(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!za.test(a)&&!la[(ja.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c<d;c++)b=this[c]||{},1===b.nodeType&&(r.cleanData(ma(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return Ia(this,arguments,function(b){var c=this.parentNode;r.inArray(this,a)<0&&(r.cleanData(ma(this)),c&&c.replaceChild(b,this))},a)}}),r.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){r.fn[a]=function(a){for(var c,d=[],e=r(a),f=e.length-1,g=0;g<=f;g++)c=g===f?this:this.clone(!0),r(e[g])[b](c),h.apply(d,c.get());return this.pushStack(d)}});var Ka=/^margin/,La=new RegExp("^("+_+")(?!px)[a-z%]+$","i"),Ma=function(b){var c=b.ownerDocument.defaultView;return c&&c.opener||(c=a),c.getComputedStyle(b)};!function(){function b(){if(i){i.style.cssText="box-sizing:border-box;position:relative;display:block;margin:auto;border:1px;padding:1px;top:1%;width:50%",i.innerHTML="",qa.appendChild(h);var b=a.getComputedStyle(i);c="1%"!==b.top,g="2px"===b.marginLeft,e="4px"===b.width,i.style.marginRight="50%",f="4px"===b.marginRight,qa.removeChild(h),i=null}}var c,e,f,g,h=d.createElement("div"),i=d.createElement("div");i.style&&(i.style.backgroundClip="content-box",i.cloneNode(!0).style.backgroundClip="",o.clearCloneStyle="content-box"===i.style.backgroundClip,h.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",h.appendChild(i),r.extend(o,{pixelPosition:function(){return b(),c},boxSizingReliable:function(){return b(),e},pixelMarginRight:function(){return b(),f},reliableMarginLeft:function(){return b(),g}}))}();function Na(a,b,c){var d,e,f,g,h=a.style;return c=c||Ma(a),c&&(g=c.getPropertyValue(b)||c[b],""!==g||r.contains(a.ownerDocument,a)||(g=r.style(a,b)),!o.pixelMarginRight()&&La.test(g)&&Ka.test(b)&&(d=h.width,e=h.minWidth,f=h.maxWidth,h.minWidth=h.maxWidth=h.width=g,g=c.width,h.width=d,h.minWidth=e,h.maxWidth=f)),void 0!==g?g+"":g}function Oa(a,b){return{get:function(){return a()?void delete this.get:(this.get=b).apply(this,arguments)}}}var Pa=/^(none|table(?!-c[ea]).+)/,Qa={position:"absolute",visibility:"hidden",display:"block"},Ra={letterSpacing:"0",fontWeight:"400"},Sa=["Webkit","Moz","ms"],Ta=d.createElement("div").style;function Ua(a){if(a in Ta)return a;var b=a[0].toUpperCase()+a.slice(1),c=Sa.length;while(c--)if(a=Sa[c]+b,a in Ta)return a}function Va(a,b,c){var d=aa.exec(b);return d?Math.max(0,d[2]-(c||0))+(d[3]||"px"):b}function Wa(a,b,c,d,e){var f,g=0;for(f=c===(d?"border":"content")?4:"width"===b?1:0;f<4;f+=2)"margin"===c&&(g+=r.css(a,c+ba[f],!0,e)),d?("content"===c&&(g-=r.css(a,"padding"+ba[f],!0,e)),"margin"!==c&&(g-=r.css(a,"border"+ba[f]+"Width",!0,e))):(g+=r.css(a,"padding"+ba[f],!0,e),"padding"!==c&&(g+=r.css(a,"border"+ba[f]+"Width",!0,e)));return g}function Xa(a,b,c){var d,e=!0,f=Ma(a),g="border-box"===r.css(a,"boxSizing",!1,f);if(a.getClientRects().length&&(d=a.getBoundingClientRect()[b]),d<=0||null==d){if(d=Na(a,b,f),(d<0||null==d)&&(d=a.style[b]),La.test(d))return d;e=g&&(o.boxSizingReliable()||d===a.style[b]),d=parseFloat(d)||0}return d+Wa(a,b,c||(g?"border":"content"),e,f)+"px"}r.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=Na(a,"opacity");return""===c?"1":c}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":"cssFloat"},style:function(a,b,c,d){if(a&&3!==a.nodeType&&8!==a.nodeType&&a.style){var e,f,g,h=r.camelCase(b),i=a.style;return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],void 0===c?g&&"get"in g&&void 0!==(e=g.get(a,!1,d))?e:i[b]:(f=typeof c,"string"===f&&(e=aa.exec(c))&&e[1]&&(c=ea(a,b,e),f="number"),null!=c&&c===c&&("number"===f&&(c+=e&&e[3]||(r.cssNumber[h]?"":"px")),o.clearCloneStyle||""!==c||0!==b.indexOf("background")||(i[b]="inherit"),g&&"set"in g&&void 0===(c=g.set(a,c,d))||(i[b]=c)),void 0)}},css:function(a,b,c,d){var e,f,g,h=r.camelCase(b);return b=r.cssProps[h]||(r.cssProps[h]=Ua(h)||h),g=r.cssHooks[b]||r.cssHooks[h],g&&"get"in g&&(e=g.get(a,!0,c)),void 0===e&&(e=Na(a,b,d)),"normal"===e&&b in Ra&&(e=Ra[b]),""===c||c?(f=parseFloat(e),c===!0||isFinite(f)?f||0:e):e}}),r.each(["height","width"],function(a,b){r.cssHooks[b]={get:function(a,c,d){if(c)return!Pa.test(r.css(a,"display"))||a.getClientRects().length&&a.getBoundingClientRect().width?Xa(a,b,d):da(a,Qa,function(){return Xa(a,b,d)})},set:function(a,c,d){var e,f=d&&Ma(a),g=d&&Wa(a,b,d,"border-box"===r.css(a,"boxSizing",!1,f),f);return g&&(e=aa.exec(c))&&"px"!==(e[3]||"px")&&(a.style[b]=c,c=r.css(a,b)),Va(a,c,g)}}}),r.cssHooks.marginLeft=Oa(o.reliableMarginLeft,function(a,b){if(b)return(parseFloat(Na(a,"marginLeft"))||a.getBoundingClientRect().left-da(a,{marginLeft:0},function(){return a.getBoundingClientRect().left}))+"px"}),r.each({margin:"",padding:"",border:"Width"},function(a,b){r.cssHooks[a+b]={expand:function(c){for(var d=0,e={},f="string"==typeof c?c.split(" "):[c];d<4;d++)e[a+ba[d]+b]=f[d]||f[d-2]||f[0];return e}},Ka.test(a)||(r.cssHooks[a+b].set=Va)}),r.fn.extend({css:function(a,b){return S(this,function(a,b,c){var d,e,f={},g=0;if(r.isArray(b)){for(d=Ma(a),e=b.length;g<e;g++)f[b[g]]=r.css(a,b[g],!1,d);return f}return void 0!==c?r.style(a,b,c):r.css(a,b)},a,b,arguments.length>1)}});function Ya(a,b,c,d,e){return new Ya.prototype.init(a,b,c,d,e)}r.Tween=Ya,Ya.prototype={constructor:Ya,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=Ya.propHooks[this.prop];return a&&a.get?a.get(this):Ya.propHooks._default.get(this)},run:function(a){var b,c=Ya.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):Ya.propHooks._default.set(this),this}},Ya.prototype.init.prototype=Ya.prototype,Ya.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},Ya.propHooks.scrollTop=Ya.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=Ya.prototype.init,r.fx.step={};var Za,$a,_a=/^(?:toggle|show|hide)$/,ab=/queueHooks$/;function bb(){$a&&(a.requestAnimationFrame(bb),r.fx.tick())}function cb(){return a.setTimeout(function(){Za=void 0}),Za=r.now()}function db(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ba[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function eb(a,b,c){for(var d,e=(hb.tweeners[b]||[]).concat(hb.tweeners["*"]),f=0,g=e.length;f<g;f++)if(d=e[f].call(c,b,a))return d}function fb(a,b,c){var d,e,f,g,h,i,j,k,l="width"in b||"height"in b,m=this,n={},o=a.style,p=a.nodeType&&ca(a),q=V.get(a,"fxshow");c.queue||(g=r._queueHooks(a,"fx"),null==g.unqueued&&(g.unqueued=0,h=g.empty.fire,g.empty.fire=function(){g.unqueued||h()}),g.unqueued++,m.always(function(){m.always(function(){g.unqueued--,r.queue(a,"fx").length||g.empty.fire()})}));for(d in b)if(e=b[d],_a.test(e)){if(delete b[d],f=f||"toggle"===e,e===(p?"hide":"show")){if("show"!==e||!q||void 0===q[d])continue;p=!0}n[d]=q&&q[d]||r.style(a,d)}if(i=!r.isEmptyObject(b),i||!r.isEmptyObject(n)){l&&1===a.nodeType&&(c.overflow=[o.overflow,o.overflowX,o.overflowY],j=q&&q.display,null==j&&(j=V.get(a,"display")),k=r.css(a,"display"),"none"===k&&(j?k=j:(ha([a],!0),j=a.style.display||j,k=r.css(a,"display"),ha([a]))),("inline"===k||"inline-block"===k&&null!=j)&&"none"===r.css(a,"float")&&(i||(m.done(function(){o.display=j}),null==j&&(k=o.display,j="none"===k?"":k)),o.display="inline-block")),c.overflow&&(o.overflow="hidden",m.always(function(){o.overflow=c.overflow[0],o.overflowX=c.overflow[1],o.overflowY=c.overflow[2]})),i=!1;for(d in n)i||(q?"hidden"in q&&(p=q.hidden):q=V.access(a,"fxshow",{display:j}),f&&(q.hidden=!p),p&&ha([a],!0),m.done(function(){p||ha([a]),V.remove(a,"fxshow");for(d in n)r.style(a,d,n[d])})),i=eb(p?q[d]:0,d,m),d in q||(q[d]=i.start,p&&(i.end=i.start,i.start=0))}}function gb(a,b){var c,d,e,f,g;for(c in a)if(d=r.camelCase(c),e=b[d],f=a[c],r.isArray(f)&&(e=f[1],f=a[c]=f[0]),c!==d&&(a[d]=f,delete a[c]),g=r.cssHooks[d],g&&"expand"in g){f=g.expand(f),delete a[d];for(c in f)c in a||(a[c]=f[c],b[c]=e)}else b[d]=e}function hb(a,b,c){var d,e,f=0,g=hb.prefilters.length,h=r.Deferred().always(function(){delete i.elem}),i=function(){if(e)return!1;for(var b=Za||cb(),c=Math.max(0,j.startTime+j.duration-b),d=c/j.duration||0,f=1-d,g=0,i=j.tweens.length;g<i;g++)j.tweens[g].run(f);return h.notifyWith(a,[j,f,c]),f<1&&i?c:(h.resolveWith(a,[j]),!1)},j=h.promise({elem:a,props:r.extend({},b),opts:r.extend(!0,{specialEasing:{},easing:r.easing._default},c),originalProperties:b,originalOptions:c,startTime:Za||cb(),duration:c.duration,tweens:[],createTween:function(b,c){var d=r.Tween(a,j.opts,b,c,j.opts.specialEasing[b]||j.opts.easing);return j.tweens.push(d),d},stop:function(b){var c=0,d=b?j.tweens.length:0;if(e)return this;for(e=!0;c<d;c++)j.tweens[c].run(1);return b?(h.notifyWith(a,[j,1,0]),h.resolveWith(a,[j,b])):h.rejectWith(a,[j,b]),this}}),k=j.props;for(gb(k,j.opts.specialEasing);f<g;f++)if(d=hb.prefilters[f].call(j,a,k,j.opts))return r.isFunction(d.stop)&&(r._queueHooks(j.elem,j.opts.queue).stop=r.proxy(d.stop,d)),d;return r.map(k,eb,j),r.isFunction(j.opts.start)&&j.opts.start.call(a,j),r.fx.timer(r.extend(i,{elem:a,anim:j,queue:j.opts.queue})),j.progress(j.opts.progress).done(j.opts.done,j.opts.complete).fail(j.opts.fail).always(j.opts.always)}r.Animation=r.extend(hb,{tweeners:{"*":[function(a,b){var c=this.createTween(a,b);return ea(c.elem,a,aa.exec(b),c),c}]},tweener:function(a,b){r.isFunction(a)?(b=a,a=["*"]):a=a.match(K);for(var c,d=0,e=a.length;d<e;d++)c=a[d],hb.tweeners[c]=hb.tweeners[c]||[],hb.tweeners[c].unshift(b)},prefilters:[fb],prefilter:function(a,b){b?hb.prefilters.unshift(a):hb.prefilters.push(a)}}),r.speed=function(a,b,c){var e=a&&"object"==typeof a?r.extend({},a):{complete:c||!c&&b||r.isFunction(a)&&a,duration:a,easing:c&&b||b&&!r.isFunction(b)&&b};return r.fx.off||d.hidden?e.duration=0:"number"!=typeof e.duration&&(e.duration in r.fx.speeds?e.duration=r.fx.speeds[e.duration]:e.duration=r.fx.speeds._default),null!=e.queue&&e.queue!==!0||(e.queue="fx"),e.old=e.complete,e.complete=function(){r.isFunction(e.old)&&e.old.call(this),e.queue&&r.dequeue(this,e.queue)},e},r.fn.extend({fadeTo:function(a,b,c,d){return this.filter(ca).css("opacity",0).show().end().animate({opacity:b},a,c,d)},animate:function(a,b,c,d){var e=r.isEmptyObject(a),f=r.speed(b,c,d),g=function(){var b=hb(this,r.extend({},a),f);(e||V.get(this,"finish"))&&b.stop(!0)};return g.finish=g,e||f.queue===!1?this.each(g):this.queue(f.queue,g)},stop:function(a,b,c){var d=function(a){var b=a.stop;delete a.stop,b(c)};return"string"!=typeof a&&(c=b,b=a,a=void 0),b&&a!==!1&&this.queue(a||"fx",[]),this.each(function(){var b=!0,e=null!=a&&a+"queueHooks",f=r.timers,g=V.get(this);if(e)g[e]&&g[e].stop&&d(g[e]);else for(e in g)g[e]&&g[e].stop&&ab.test(e)&&d(g[e]);for(e=f.length;e--;)f[e].elem!==this||null!=a&&f[e].queue!==a||(f[e].anim.stop(c),b=!1,f.splice(e,1));!b&&c||r.dequeue(this,a)})},finish:function(a){return a!==!1&&(a=a||"fx"),this.each(function(){var b,c=V.get(this),d=c[a+"queue"],e=c[a+"queueHooks"],f=r.timers,g=d?d.length:0;for(c.finish=!0,r.queue(this,a,[]),e&&e.stop&&e.stop.call(this,!0),b=f.length;b--;)f[b].elem===this&&f[b].queue===a&&(f[b].anim.stop(!0),f.splice(b,1));for(b=0;b<g;b++)d[b]&&d[b].finish&&d[b].finish.call(this);delete c.finish})}}),r.each(["toggle","show","hide"],function(a,b){var c=r.fn[b];r.fn[b]=function(a,d,e){return null==a||"boolean"==typeof a?c.apply(this,arguments):this.animate(db(b,!0),a,d,e)}}),r.each({slideDown:db("show"),slideUp:db("hide"),slideToggle:db("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(a,b){r.fn[a]=function(a,c,d){return this.animate(b,a,c,d)}}),r.timers=[],r.fx.tick=function(){var a,b=0,c=r.timers;for(Za=r.now();b<c.length;b++)a=c[b],a()||c[b]!==a||c.splice(b--,1);c.length||r.fx.stop(),Za=void 0},r.fx.timer=function(a){r.timers.push(a),a()?r.fx.start():r.timers.pop()},r.fx.interval=13,r.fx.start=function(){$a||($a=a.requestAnimationFrame?a.requestAnimationFrame(bb):a.setInterval(r.fx.tick,r.fx.interval))},r.fx.stop=function(){a.cancelAnimationFrame?a.cancelAnimationFrame($a):a.clearInterval($a),$a=null},r.fx.speeds={slow:600,fast:200,_default:400},r.fn.delay=function(b,c){return b=r.fx?r.fx.speeds[b]||b:b,c=c||"fx",this.queue(c,function(c,d){var e=a.setTimeout(c,b);d.stop=function(){a.clearTimeout(e)}})},function(){var a=d.createElement("input"),b=d.createElement("select"),c=b.appendChild(d.createElement("option"));a.type="checkbox",o.checkOn=""!==a.value,o.optSelected=c.selected,a=d.createElement("input"),a.value="t",a.type="radio",o.radioValue="t"===a.value}();var ib,jb=r.expr.attrHandle;r.fn.extend({attr:function(a,b){return S(this,r.attr,a,b,arguments.length>1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?ib:void 0)),
+void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b),null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&r.nodeName(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(K);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),ib={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=jb[b]||r.find.attr;jb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=jb[g],jb[g]=e,e=null!=c(a,b,d)?g:null,jb[g]=f),e}});var kb=/^(?:input|select|textarea|button)$/i,lb=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return S(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):kb.test(a.nodeName)||lb.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function mb(a){var b=a.match(K)||[];return b.join(" ")}function nb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,nb(this)))});if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,nb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(K)||[];while(c=this[i++])if(e=nb(c),d=1===c.nodeType&&" "+mb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=mb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,nb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(K)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=nb(this),b&&V.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":V.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+mb(nb(c))+" ").indexOf(b)>-1)return!0;return!1}});var ob=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":r.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(ob,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:mb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d<i;d++)if(c=e[d],(c.selected||d===f)&&!c.disabled&&(!c.parentNode.disabled||!r.nodeName(c.parentNode,"optgroup"))){if(b=r(c).val(),g)return b;h.push(b)}return h},set:function(a,b){var c,d,e=a.options,f=r.makeArray(b),g=e.length;while(g--)d=e[g],(d.selected=r.inArray(r.valHooks.option.get(d),f)>-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(r.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var pb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!pb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,pb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(V.get(h,"events")||{})[b.type]&&V.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&T(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!T(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=V.access(d,b);e||d.addEventListener(a,c,!0),V.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=V.access(d,b)-1;e?V.access(d,b,e):(d.removeEventListener(a,c,!0),V.remove(d,b))}}});var qb=a.location,rb=r.now(),sb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var tb=/\[\]$/,ub=/\r?\n/g,vb=/^(?:submit|button|image|reset|file)$/i,wb=/^(?:input|select|textarea|keygen)/i;function xb(a,b,c,d){var e;if(r.isArray(b))r.each(b,function(b,e){c||tb.test(a)?d(a,e):xb(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)xb(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(r.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)xb(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&wb.test(this.nodeName)&&!vb.test(a)&&(this.checked||!ia.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:r.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(ub,"\r\n")}}):{name:b.name,value:c.replace(ub,"\r\n")}}).get()}});var yb=/%20/g,zb=/#.*$/,Ab=/([?&])_=[^&]*/,Bb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Cb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Db=/^(?:GET|HEAD)$/,Eb=/^\/\//,Fb={},Gb={},Hb="*/".concat("*"),Ib=d.createElement("a");Ib.href=qb.href;function Jb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(K)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Kb(a,b,c,d){var e={},f=a===Gb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Lb(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Mb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Nb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:qb.href,type:"GET",isLocal:Cb.test(qb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Hb,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Lb(Lb(a,r.ajaxSettings),b):Lb(r.ajaxSettings,a)},ajaxPrefilter:Jb(Fb),ajaxTransport:Jb(Gb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Bb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||qb.href)+"").replace(Eb,qb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(K)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Ib.protocol+"//"+Ib.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Kb(Fb,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Db.test(o.type),f=o.url.replace(zb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(yb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(sb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Ab,"$1"),n=(sb.test(f)?"&":"?")+"_="+rb++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Hb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Kb(Gb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Mb(o,y,d)),v=Nb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Ob={0:200,1223:204},Pb=r.ajaxSettings.xhr();o.cors=!!Pb&&"withCredentials"in Pb,o.ajax=Pb=!!Pb,r.ajaxTransport(function(b){var c,d;if(o.cors||Pb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Ob[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r("<script>").prop({charset:a.scriptCharset,src:a.url}).on("load error",c=function(a){b.remove(),c=null,a&&f("error"===a.type?404:200,a.type)}),d.head.appendChild(b[0])},abort:function(){c&&c()}}}});var Qb=[],Rb=/(=)\?(?=&|$)|\?\?/;r.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var a=Qb.pop()||r.expando+"_"+rb++;return this[a]=!0,a}}),r.ajaxPrefilter("json jsonp",function(b,c,d){var e,f,g,h=b.jsonp!==!1&&(Rb.test(b.url)?"url":"string"==typeof b.data&&0===(b.contentType||"").indexOf("application/x-www-form-urlencoded")&&Rb.test(b.data)&&"data");if(h||"jsonp"===b.dataTypes[0])return e=b.jsonpCallback=r.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,h?b[h]=b[h].replace(Rb,"$1"+e):b.jsonp!==!1&&(b.url+=(sb.test(b.url)?"&":"?")+b.jsonp+"="+e),b.converters["script json"]=function(){return g||r.error(e+" was not called"),g[0]},b.dataTypes[0]="json",f=a[e],a[e]=function(){g=arguments},d.always(function(){void 0===f?r(a).removeProp(e):a[e]=f,b[e]&&(b.jsonpCallback=c.jsonpCallback,Qb.push(e)),g&&r.isFunction(f)&&f(g[0]),g=f=void 0}),"script"}),o.createHTMLDocument=function(){var a=d.implementation.createHTMLDocument("").body;return a.innerHTML="<form></form><form></form>",2===a.childNodes.length}(),r.parseHTML=function(a,b,c){if("string"!=typeof a)return[];"boolean"==typeof b&&(c=b,b=!1);var e,f,g;return b||(o.createHTMLDocument?(b=d.implementation.createHTMLDocument(""),e=b.createElement("base"),e.href=d.location.href,b.head.appendChild(e)):b=d),f=B.exec(a),g=!c&&[],f?[b.createElement(f[1])]:(f=pa([a],b,g),g&&g.length&&r(g).remove(),r.merge([],f.childNodes))},r.fn.load=function(a,b,c){var d,e,f,g=this,h=a.indexOf(" ");return h>-1&&(d=mb(a.slice(h)),a=a.slice(0,h)),r.isFunction(b)?(c=b,b=void 0):b&&"object"==typeof b&&(e="POST"),g.length>0&&r.ajax({url:a,type:e||"GET",dataType:"html",data:b}).done(function(a){f=arguments,g.html(d?r("<div>").append(r.parseHTML(a)).find(d):a)}).always(c&&function(a,b){g.each(function(){c.apply(this,f||[a.responseText,b,a])})}),this},r.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(a,b){r.fn[b]=function(a){return this.on(b,a)}}),r.expr.pseudos.animated=function(a){return r.grep(r.timers,function(b){return a===b.elem}).length};function Sb(a){return r.isWindow(a)?a:9===a.nodeType&&a.defaultView}r.offset={setOffset:function(a,b,c){var d,e,f,g,h,i,j,k=r.css(a,"position"),l=r(a),m={};"static"===k&&(a.style.position="relative"),h=l.offset(),f=r.css(a,"top"),i=r.css(a,"left"),j=("absolute"===k||"fixed"===k)&&(f+i).indexOf("auto")>-1,j?(d=l.position(),g=d.top,e=d.left):(g=parseFloat(f)||0,e=parseFloat(i)||0),r.isFunction(b)&&(b=b.call(a,c,r.extend({},h))),null!=b.top&&(m.top=b.top-h.top+g),null!=b.left&&(m.left=b.left-h.left+e),"using"in b?b.using.call(a,m):l.css(m)}},r.fn.extend({offset:function(a){if(arguments.length)return void 0===a?this:this.each(function(b){r.offset.setOffset(this,a,b)});var b,c,d,e,f=this[0];if(f)return f.getClientRects().length?(d=f.getBoundingClientRect(),d.width||d.height?(e=f.ownerDocument,c=Sb(e),b=e.documentElement,{top:d.top+c.pageYOffset-b.clientTop,left:d.left+c.pageXOffset-b.clientLeft}):d):{top:0,left:0}},position:function(){if(this[0]){var a,b,c=this[0],d={top:0,left:0};return"fixed"===r.css(c,"position")?b=c.getBoundingClientRect():(a=this.offsetParent(),b=this.offset(),r.nodeName(a[0],"html")||(d=a.offset()),d={top:d.top+r.css(a[0],"borderTopWidth",!0),left:d.left+r.css(a[0],"borderLeftWidth",!0)}),{top:b.top-d.top-r.css(c,"marginTop",!0),left:b.left-d.left-r.css(c,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var a=this.offsetParent;while(a&&"static"===r.css(a,"position"))a=a.offsetParent;return a||qa})}}),r.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,b){var c="pageYOffset"===b;r.fn[a]=function(d){return S(this,function(a,d,e){var f=Sb(a);return void 0===e?f?f[b]:a[d]:void(f?f.scrollTo(c?f.pageXOffset:e,c?e:f.pageYOffset):a[d]=e)},a,d,arguments.length)}}),r.each(["top","left"],function(a,b){r.cssHooks[b]=Oa(o.pixelPosition,function(a,c){if(c)return c=Na(a,b),La.test(c)?r(a).position()[b]+"px":c})}),r.each({Height:"height",Width:"width"},function(a,b){r.each({padding:"inner"+a,content:b,"":"outer"+a},function(c,d){r.fn[d]=function(e,f){var g=arguments.length&&(c||"boolean"!=typeof e),h=c||(e===!0||f===!0?"margin":"border");return S(this,function(b,c,e){var f;return r.isWindow(b)?0===d.indexOf("outer")?b["inner"+a]:b.document.documentElement["client"+a]:9===b.nodeType?(f=b.documentElement,Math.max(b.body["scroll"+a],f["scroll"+a],b.body["offset"+a],f["offset"+a],f["client"+a])):void 0===e?r.css(b,c,h):r.style(b,c,e,h)},b,g?e:void 0,g)}})}),r.fn.extend({bind:function(a,b,c){return this.on(a,null,b,c)},unbind:function(a,b){return this.off(a,null,b)},delegate:function(a,b,c,d){return this.on(b,a,c,d)},undelegate:function(a,b,c){return 1===arguments.length?this.off(a,"**"):this.off(b,a||"**",c)}}),r.parseJSON=JSON.parse,"function"==typeof define&&define.amd&&define("jquery",[],function(){return r});var Tb=a.jQuery,Ub=a.$;return r.noConflict=function(b){return a.$===r&&(a.$=Ub),b&&a.jQuery===r&&(a.jQuery=Tb),r},b||(a.jQuery=a.$=r),r});
diff --git a/mobile/lib/liMarquee.js b/mobile/lib/liMarquee.js
new file mode 100644
index 0000000..88d46ca
--- /dev/null
+++ b/mobile/lib/liMarquee.js
@@ -0,0 +1,1309 @@
+/*
+ * jQuery liMarquee v 4.6
+ *
+ * Copyright 2013, Linnik Yura | LI MASS CODE | http://masscode.ru
+ * http://masscode.ru/index.php/k2/item/44-limarquee
+ * Free to use
+ *
+ * Last Update 20.11.2014
+ */
+(function ($) {
+	var methods = {
+		init: function (options) {
+			var p = {
+				direction: 'left', //Указывает направление движения содержимого контейнера (left | right | up | down)
+				loop: -1, //Задает, сколько раз будет прокручиваться содержимое. "-1" для бесконечного воспроизведения движения
+				scrolldelay: 0, //Величина задержки в миллисекундах между движениями
+				scrollamount: 50, //Скорость движения контента (px/sec)
+				circular: true, //Если "true" - строка непрерывная 
+				drag: true, //Если "true" - включено перетаскивание строки
+				runshort: true, //Если "true" - короткая строка тоже "бегает", "false" - стоит на месте
+				hoverstop: true, //true - строка останавливается при наведении курсора мыши, false - строка не останавливается
+				inverthover: false, //false - стандартное поведение. Если "true" - строка начинает движение только при наведении курсора
+				xml: false //Путь к xml файлу с нужным текстом
+			};
+			if (options) {
+				$.extend(p, options);
+			}
+
+			return this.each(function () {
+				var enterEvent = 'mouseenter';
+				var leaveEvent = 'mouseleave';
+				if(p.inverthover){
+					enterEvent = 'mouseleave';
+					leaveEvent = 'mouseenter';	
+				}
+				
+								
+				var
+					loop = p.loop,
+					strWrap = $(this).addClass('str_wrap').data({scrollamount:p.scrollamount}),
+					fMove = false;
+					
+				
+				
+				var strWrapStyle = strWrap.attr('style'); 
+				
+				if(strWrapStyle){
+					var wrapStyleArr = strWrapStyle.split(';');
+					var startHeight = false;
+					for(var i=0; i < wrapStyleArr.length; i++){
+						var str = $.trim(wrapStyleArr[i]);					
+						var tested =  str.search(/^height/g);
+						if(tested != -1){
+							startHeight = parseFloat(strWrap.css('height'));
+						}
+					}
+				}
+
+				var code = function () {
+					
+					strWrap.off('mouseleave');
+					strWrap.off('mouseenter');
+					strWrap.off('mousemove');
+					strWrap.off('mousedown');
+					strWrap.off('mouseup');
+
+					
+					if(!$('.str_move',strWrap).length){
+						strWrap.wrapInner($('<div>').addClass('str_move'));
+					}
+					
+					var
+					strMove = $('.str_move', strWrap).addClass('str_origin'),
+					strMoveClone = strMove.clone().removeClass('str_origin').addClass('str_move_clone'),
+					time = 0;
+
+					if (!p.hoverstop) {
+						strWrap.addClass('noStop');
+					}
+
+					var circCloneHor = function(){
+						strMoveClone.clone().css({
+							left:'100%',
+							right:'auto',							
+							width: strMove.width()
+						}).appendTo(strMove);
+						strMoveClone.css({
+							right: '100%',
+							left:'auto',
+							width: strMove.width()
+						}).appendTo(strMove);
+					}
+					
+					var circCloneVert = function(){
+						strMoveClone.clone().css({
+							top: '100%',
+							bottom:'auto',
+							height: strMove.height()
+						}).appendTo(strMove);
+						strMoveClone.css({
+							bottom: '100%',
+							top:'auto',
+							height:strMove.height()
+						}).appendTo(strMove);
+					}
+					
+					
+					
+					if (p.direction == 'left') {
+						strWrap.height(strMove.outerHeight())
+						if (strMove.width() > strWrap.width()) {
+							var leftPos = -strMove.width();
+							
+							if (p.circular) {
+								
+								if (!p.xml) {
+									circCloneHor()
+									leftPos = -(strMove.width() + (strMove.width() - strWrap.width()));
+								}
+							}
+							if (p.xml) {
+								strMove.css({
+									left:strWrap.width()	
+								})
+							}
+							var
+							strMoveLeft = strWrap.width(),
+								k1 = 0,
+								timeFunc1 = function () {
+									var
+									fullS = Math.abs(leftPos),
+										time = (fullS / strWrap.data('scrollamount')) * 1000;
+									if (parseFloat(strMove.css('left')) != 0) {
+										fullS = (fullS + strWrap.width());
+										time = (fullS - (strWrap.width() - parseFloat(strMove.css('left')))) / strWrap.data('scrollamount') * 1000;
+									}
+									return time;
+								},
+								moveFuncId1 = false,
+								moveFunc1 = function () {
+									if (loop != 0) {
+										strMove.stop(true).animate({
+											left: leftPos
+										}, timeFunc1(), 'linear', function () {
+											$(this).css({
+												left: strWrap.width()
+											});
+											if (loop == -1) {
+												moveFuncId1 = setTimeout(moveFunc1, p.scrolldelay);
+											} else {
+												loop--;
+												moveFuncId1 = setTimeout(moveFunc1, p.scrolldelay);
+											}
+										});
+									}
+								};
+								strWrap.data({
+									moveId: moveFuncId1	,
+									moveF : moveFunc1
+								})
+								if(!p.inverthover){
+									moveFunc1();
+								}
+							
+							if (p.hoverstop) {
+								strWrap.on(enterEvent, function () {
+									$(this).addClass('str_active');
+									clearTimeout(moveFuncId1);
+									strMove.stop(true);
+								}).on(leaveEvent, function () {
+									$(this).removeClass('str_active');
+									$(this).off('mousemove');
+									moveFunc1();
+								});
+
+								if (p.drag) {
+									strWrap.on('mousedown', function (e) {
+										if(p.inverthover){
+											strMove.stop(true);
+										}
+										//drag
+										var dragLeft;
+										var dir = 1;
+										var newX;
+										var oldX = e.clientX;
+										//drag
+										
+										strMoveLeft = strMove.position().left;
+										k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
+										
+										
+										
+										$(this).on('mousemove', function (e) {
+											fMove = true;
+											
+											//drag
+											newX = e.clientX;
+											if(newX > oldX){
+												dir = 1
+											}else{
+												dir = -1
+											}
+											oldX = newX	
+											dragLeft = k1 + (e.clientX - strWrap.offset().left);
+											
+											if (!p.circular) {
+												if(dragLeft < -strMove.width() && dir < 0){
+													dragLeft = strWrap.width();
+													strMoveLeft = strMove.position().left;
+													k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+												if(dragLeft > strWrap.width() && dir > 0){
+													dragLeft = -strMove.width();
+													strMoveLeft = strMove.position().left;
+													k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+											}else{
+												if(dragLeft < -strMove.width() && dir < 0){
+													dragLeft = 0;
+													strMoveLeft = strMove.position().left;
+													k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+												if(dragLeft > 0 && dir > 0){
+													dragLeft = -strMove.width();
+													strMoveLeft = strMove.position().left;
+													k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+	
+											}
+											
+											
+											strMove.stop(true).css({
+												left: dragLeft
+											});
+											//drag
+											
+										
+											
+										}).on('mouseup', function () {
+											$(this).off('mousemove');
+											if(p.inverthover){
+												strMove.trigger('mouseenter')
+											}
+											setTimeout(function () {                             
+												fMove = false
+											}, 50)
+											
+										});
+										return false;
+									})
+									.on('click', function () {
+										if (fMove) {
+											return false
+										}
+									});
+								} else {
+									strWrap.addClass('no_drag');
+								};
+							}
+						} else {
+							if (p.runshort) {
+								strMove.css({
+									left: strWrap.width()
+								});
+								var
+								strMoveLeft = strWrap.width(),
+									k1 = 0,
+									timeFunc = function () {
+										time = (strMove.width() + strMove.position().left) / strWrap.data('scrollamount') * 1000;
+										return time;
+									};
+								var moveFunc = function () {
+									var leftPos = -strMove.width();
+									strMove.animate({
+										left: leftPos
+									}, timeFunc(), 'linear', function () {
+										$(this).css({
+											left: strWrap.width()
+										});
+										if (loop == -1) {
+											setTimeout(moveFunc, p.scrolldelay);
+										} else {
+											loop--;
+											setTimeout(moveFunc, p.scrolldelay);
+										}
+									});
+								};
+								strWrap.data({
+									moveF : moveFunc
+								})
+								if(!p.inverthover){
+									moveFunc();
+								}
+								if (p.hoverstop) {
+									strWrap.on(enterEvent, function () {
+										$(this).addClass('str_active');
+										strMove.stop(true);
+									}).on(leaveEvent, function () {
+										$(this).removeClass('str_active');
+										$(this).off('mousemove');
+										moveFunc();
+									});
+
+									if (p.drag) {
+										strWrap.on('mousedown', function (e) {
+											if(p.inverthover){
+												strMove.stop(true);
+											}
+											
+											//drag
+											var dragLeft;
+											var dir = 1;
+											var newX;
+											var oldX = e.clientX;
+											//drag
+											
+											strMoveLeft = strMove.position().left;
+											k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
+											$(this).on('mousemove', function (e) {
+												fMove = true;
+												
+												
+												//drag
+												newX = e.clientX;
+												if(newX > oldX){
+													dir = 1
+												}else{
+													dir = -1
+												}
+												oldX = newX	
+												dragLeft = k1 + (e.clientX - strWrap.offset().left);
+												
+												if(dragLeft < -strMove.width() && dir < 0){
+													dragLeft = strWrap.width();
+													strMoveLeft = strMove.position().left;
+													k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+												if(dragLeft > strWrap.width() && dir > 0){
+													dragLeft = -strMove.width();
+													strMoveLeft = strMove.position().left;
+													k1 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+												
+												
+												strMove.stop(true).css({
+													left: dragLeft
+												});
+												
+												
+												
+											}).on('mouseup', function () {
+												if(p.inverthover){
+													strMove.trigger('mouseenter')
+												}
+												$(this).off('mousemove');
+												setTimeout(function () {                             
+													fMove = false
+												}, 50)
+											});
+											return false;
+										})
+										.on('click', function () {
+											if (fMove) {
+												return false
+											}
+										});
+									} else {
+										strWrap.addClass('no_drag');
+									};
+								}
+							} else {
+								strWrap.addClass('str_static');
+							}
+						};
+					};
+					if (p.direction == 'right') {
+						strWrap.height(strMove.outerHeight())
+						strWrap.addClass('str_right');
+						strMove.css({
+							left: -strMove.width(),
+							right: 'auto'
+						})
+						
+						if (strMove.width() > strWrap.width()) {
+							var leftPos = strWrap.width();
+							strMove.css({
+								left: 0
+							})
+							if (p.circular) {
+								if (!p.xml) {
+									circCloneHor()
+									//Определяем крайнюю точку
+									leftPos = strMove.width();
+								}
+							}
+							
+							var
+							k2 = 0;
+							timeFunc = function () {
+								var
+								fullS = strWrap.width(), //крайняя точка
+									time = (fullS / strWrap.data('scrollamount')) * 1000; //время
+								if (parseFloat(strMove.css('left')) != 0) {
+									fullS = (strMove.width() + strWrap.width());
+									time = (fullS - (strMove.width() + parseFloat(strMove.css('left')))) / strWrap.data('scrollamount') * 1000;
+								}
+								return time;
+							};
+							var moveFunc = function () {
+
+								if (loop != 0) {
+									strMove.animate({
+										left: leftPos
+									}, timeFunc(), 'linear', function () {
+										$(this).css({
+											left: -strMove.width()
+										});
+										if (loop == -1) {
+											setTimeout(moveFunc, p.scrolldelay);
+										} else {
+											loop--;
+											setTimeout(moveFunc, p.scrolldelay);
+										};
+									});
+								};
+							};
+							strWrap.data({
+								moveF : moveFunc
+							})
+					
+							if(!p.inverthover){
+								moveFunc();
+							}
+							if (p.hoverstop) {
+								strWrap.on(enterEvent, function () {
+									$(this).addClass('str_active');
+									strMove.stop(true);
+								}).on(leaveEvent, function () {
+									$(this).removeClass('str_active');
+									$(this).off('mousemove');
+									moveFunc();
+								});
+
+								if (p.drag) {
+									
+									strWrap.on('mousedown', function (e) {
+										if(p.inverthover){
+											strMove.stop(true);
+										}
+										
+										
+										//drag
+										var dragLeft;
+										var dir = 1;
+										var newX;
+										var oldX = e.clientX;
+										//drag
+										
+										strMoveLeft = strMove.position().left;
+										k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
+										$(this).on('mousemove', function (e) {
+											
+											fMove = true;
+											
+											//drag
+											newX = e.clientX;
+											if(newX > oldX){
+												dir = 1
+											}else{
+												dir = -1
+											}
+											oldX = newX	
+											dragLeft = k2 + (e.clientX - strWrap.offset().left);
+
+
+											if (!p.circular) {
+
+												if(dragLeft < -strMove.width() && dir < 0){
+													dragLeft = strWrap.width();
+													strMoveLeft = strMove.position().left;
+													k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+												if(dragLeft > strWrap.width() && dir > 0){
+													dragLeft = -strMove.width();
+													strMoveLeft = strMove.position().left;
+													k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+											}else{
+												if(dragLeft < -strMove.width() && dir < 0){
+													dragLeft = 0;
+													strMoveLeft = strMove.position().left;
+													k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+												if(dragLeft > 0 && dir > 0){
+													dragLeft = -strMove.width();
+													strMoveLeft = strMove.position().left;
+													k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+	
+											}
+											
+											strMove.stop(true).css({
+												left: dragLeft
+											});
+											
+
+										}).on('mouseup', function () {
+											if(p.inverthover){
+												strMove.trigger('mouseenter')
+											}
+											$(this).off('mousemove');
+											setTimeout(function () {                             
+												fMove = false
+											}, 50)
+										});
+										return false;
+									})
+									.on('click', function () {
+										if (fMove) {
+											return false
+										}
+									});
+								} else {
+									strWrap.addClass('no_drag');
+								};
+							}
+						} else {
+														
+							if (p.runshort) {
+								
+								var k2 = 0;
+								var timeFunc = function () {
+									time = (strWrap.width() - strMove.position().left) / strWrap.data('scrollamount') * 1000;
+									return time;
+								};
+								var moveFunc = function () {
+									var leftPos = strWrap.width();
+									strMove.animate({
+										left: leftPos
+									}, timeFunc(), 'linear', function () {
+										$(this).css({
+											left: -strMove.width()
+										});
+										if (loop == -1) {
+											setTimeout(moveFunc, p.scrolldelay);
+										} else {
+											loop--;
+											setTimeout(moveFunc, p.scrolldelay);
+										};
+									});
+								};
+
+								strWrap.data({
+									moveF : moveFunc
+								})
+
+								if(!p.inverthover){
+									moveFunc();
+								}
+								if (p.hoverstop) {
+									strWrap.on(enterEvent, function () {
+										$(this).addClass('str_active');
+										strMove.stop(true);
+									}).on(leaveEvent, function () {
+										$(this).removeClass('str_active');
+										$(this).off('mousemove');
+										moveFunc();
+									});
+
+									if (p.drag) {
+										strWrap.on('mousedown', function (e) {
+											if(p.inverthover){
+												strMove.stop(true);
+											}
+											
+											//drag
+											var dragLeft;
+											var dir = 1;
+											var newX;
+											var oldX = e.clientX;
+											//drag
+											
+											strMoveLeft = strMove.position().left;
+											k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
+											$(this).on('mousemove', function (e) {
+												fMove = true;
+												
+												
+												
+												//drag
+												newX = e.clientX;
+												if(newX > oldX){
+													dir = 1
+												}else{
+													dir = -1
+												}
+												oldX = newX	
+												dragLeft = k2 + (e.clientX - strWrap.offset().left);
+												
+												if(dragLeft < -strMove.width() && dir < 0){
+													dragLeft = strWrap.width();
+													strMoveLeft = strMove.position().left;
+													k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+												if(dragLeft > strWrap.width() && dir > 0){
+													dragLeft = -strMove.width();
+													strMoveLeft = strMove.position().left;
+													k2 = strMoveLeft - (e.clientX - strWrap.offset().left);
+												}
+
+												strMove.stop(true).css({
+													left:dragLeft
+												});
+												
+											}).on('mouseup', function () {
+												if(p.inverthover){
+													strMove.trigger('mouseenter')
+												}
+												$(this).off('mousemove');
+												setTimeout(function () {                             
+													fMove = false
+												}, 50)
+											});
+											return false;
+										})
+										.on('click', function () {
+											if (fMove) {
+												return false
+											}
+										});
+									} else {
+										strWrap.addClass('no_drag');
+									};
+								}
+							} else {
+								strWrap.addClass('str_static');
+							}
+						};
+					};
+					if (p.direction == 'up') {
+						strWrap.addClass('str_vertical');
+						
+						if (strMove.height() > strWrap.height()) {
+							var topPos = -strMove.height();
+							if (p.circular) {
+								if (!p.xml) {
+									circCloneVert();									
+									topPos = -(strMove.height() + (strMove.height() - strWrap.height()));
+								}
+							}
+							if (p.xml) {
+								strMove.css({
+									top:strWrap.height()	
+								})
+							}
+							var
+							k2 = 0;
+							timeFunc = function () {
+								var
+								fullS = Math.abs(topPos),
+									time = (fullS / strWrap.data('scrollamount')) * 1000;
+								if (parseFloat(strMove.css('top')) != 0) {
+									fullS = (fullS + strWrap.height());
+									time = (fullS - (strWrap.height() - parseFloat(strMove.css('top')))) / strWrap.data('scrollamount') * 1000;
+								}
+								
+								return time;
+							};
+							var moveFunc = function () {
+								if (loop != 0) {
+									strMove.animate({
+										top: topPos
+									}, timeFunc(), 'linear', function () {
+										$(this).css({
+											top: strWrap.height()
+										});
+										if (loop == -1) {
+											setTimeout(moveFunc, p.scrolldelay);
+										} else {
+											loop--;
+											setTimeout(moveFunc, p.scrolldelay);
+										};
+									});
+								};
+							};
+							
+							strWrap.data({
+								moveF : moveFunc
+							})
+							
+							if(!p.inverthover){
+								moveFunc();
+							}
+							if (p.hoverstop) {
+								strWrap.on(enterEvent, function () {
+									$(this).addClass('str_active');
+									strMove.stop(true);
+								}).on(leaveEvent, function () {
+									$(this).removeClass('str_active');
+									$(this).off('mousemove');
+									moveFunc();
+								});
+
+								if (p.drag) {
+									strWrap.on('mousedown', function (e) {
+										if(p.inverthover){
+											strMove.stop(true);
+										}
+										
+										//drag
+										var dragTop;
+										var dir = 1;
+										var newY;
+										var oldY = e.clientY;
+										//drag
+										
+										
+										strMoveTop = strMove.position().top;
+										k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+										$(this).on('mousemove', function (e) {
+											
+											fMove = true;
+
+											//drag
+											newY = e.clientY;
+											if(newY > oldY){
+												dir = 1
+											}else{
+												if(newY < oldY){
+													dir = -1
+												}
+											}
+											oldY = newY	
+											dragTop = k2 + e.clientY - strWrap.offset().top;
+
+
+											if (!p.circular){
+												if(dragTop < -strMove.height() && dir < 0){
+													dragTop = strWrap.height();
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}
+												if(dragTop > strWrap.height() && dir > 0){
+													dragTop = -strMove.height();
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}	
+											}else{
+												if(dragTop < -strMove.height() && dir < 0){
+													dragTop = 0;
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}
+												if(dragTop > 0 && dir > 0){
+													dragTop = -strMove.height();
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}
+											}
+
+
+											strMove.stop(true).css({
+												top: dragTop
+											});
+											//drag
+											
+											
+											
+											
+											
+											
+											
+											
+											
+											
+											
+											
+										}).on('mouseup', function () {
+											if(p.inverthover){
+												strMove.trigger('mouseenter')
+											}
+											$(this).off('mousemove');
+											setTimeout(function () {                             
+												fMove = false
+											}, 50)
+										});
+										return false;
+									})
+									.on('click', function () {
+										if (fMove) {
+											return false
+										}
+									});
+								} else {
+									strWrap.addClass('no_drag');
+								};
+							}
+						} else {
+							if (p.runshort) {
+								strMove.css({
+									top: strWrap.height()
+								});
+								var k2 = 0;
+								var timeFunc = function () {
+									
+									time = (strMove.height() + strMove.position().top) / strWrap.data('scrollamount') * 1000;
+									
+									return time;
+								};
+								var moveFunc = function () {
+									var topPos = -strMove.height();
+									strMove.animate({
+										top: topPos
+									}, timeFunc(), 'linear', function () {
+										$(this).css({
+											top: strWrap.height()
+										});
+										if (loop == -1) {
+											setTimeout(moveFunc, p.scrolldelay);
+										} else {
+											loop--;
+											setTimeout(moveFunc, p.scrolldelay);
+										};
+									});
+								};
+								strWrap.data({
+									moveF : moveFunc
+								})
+								if(!p.inverthover){
+									moveFunc();
+								}
+								if (p.hoverstop) {
+									strWrap.on(enterEvent, function () {
+										$(this).addClass('str_active');
+										strMove.stop(true);
+									}).on(leaveEvent, function () {
+										$(this).removeClass('str_active');
+										$(this).off('mousemove');
+										moveFunc();
+									});
+
+									if (p.drag) {
+										strWrap.on('mousedown', function (e) {
+											if(p.inverthover){
+												strMove.stop(true);
+											}
+											
+											//drag
+											var dragTop;
+											var dir = 1;
+											var newY;
+											var oldY = e.clientY;
+											//drag
+											
+											strMoveTop = strMove.position().top;
+											k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+											$(this).on('mousemove', function (e) {
+												
+												
+												fMove = true;
+
+												//drag
+												newY = e.clientY;
+												if(newY > oldY){
+													dir = 1
+												}else{
+													if(newY < oldY){
+														dir = -1
+													}
+												}
+												oldY = newY	
+												dragTop = k2 + e.clientY - strWrap.offset().top;
+												
+												if(dragTop < -strMove.height() && dir < 0){
+													dragTop = strWrap.height();
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}
+												if(dragTop > strWrap.height() && dir > 0){
+													dragTop = -strMove.height();
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}	
+												//*drag
+												
+												strMove.stop(true).css({
+													top: dragTop
+												});
+												
+												
+											}).on('mouseup', function () {
+												if(p.inverthover){
+													strMove.trigger('mouseenter')
+												}
+												$(this).off('mousemove');
+												setTimeout(function () {                             
+													fMove = false
+												}, 50)
+											});
+											return false;
+										})
+										.on('click', function () {
+											if (fMove) {
+												return false
+											}
+										});
+									} else {
+										strWrap.addClass('no_drag');
+									};
+								}
+							} else {
+								strWrap.addClass('str_static');
+							}
+						};
+					};
+					if (p.direction == 'down') {
+
+						strWrap.addClass('str_vertical').addClass('str_down');
+						strMove.css({
+							top: -strMove.height(),
+							bottom: 'auto'
+						})
+						if (strMove.height() > strWrap.height()) {
+							var topPos = strWrap.height();
+							if (p.circular) {
+								if (!p.xml) {
+									circCloneVert();									
+									topPos = strMove.height();
+								}
+							}
+							if (p.xml) {
+								strMove.css({
+									top:-strMove.height()
+								})
+							}
+							var
+							k2 = 0;
+							timeFunc = function () {
+								var
+								fullS = strWrap.height(), //крайняя точка
+									time = (fullS / strWrap.data('scrollamount')) * 1000; //время
+
+								if (parseFloat(strMove.css('top')) != 0) {
+									fullS = (strMove.height() + strWrap.height());
+									time = (fullS - (strMove.height() + parseFloat(strMove.css('top')))) / strWrap.data('scrollamount') * 1000;
+								}
+								return time;
+							};
+							var moveFunc = function () {
+
+								if (loop != 0) {
+									strMove.animate({
+										top: topPos
+									}, timeFunc(), 'linear', function () {
+										$(this).css({
+											top: -strMove.height()
+										});
+										if (loop == -1) {
+
+											setTimeout(moveFunc, p.scrolldelay);
+										} else {
+											loop--;
+											setTimeout(moveFunc, p.scrolldelay);
+										};
+									});
+								};
+							};
+							strWrap.data({
+								moveF : moveFunc
+							})
+							if(!p.inverthover){
+								moveFunc();
+							}
+							if (p.hoverstop) {
+								strWrap.on(enterEvent, function () {
+									$(this).addClass('str_active');
+									strMove.stop(true);
+								}).on(leaveEvent, function () {
+									$(this).removeClass('str_active');
+									$(this).off('mousemove');
+									moveFunc();
+								});
+
+								if (p.drag) {
+									strWrap.on('mousedown', function (e) {
+										if(p.inverthover){
+											strMove.stop(true);
+										}
+										
+										//drag
+										var dragTop;
+										var dir = 1;
+										var newY;
+										var oldY = e.clientY;
+										//drag
+										
+										
+										strMoveTop = strMove.position().top;
+										k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+										$(this).on('mousemove', function (e) {
+											
+											fMove = true;
+											
+											//drag
+											newY = e.clientY;
+											if(newY > oldY){
+												dir = 1
+											}else{
+												if(newY < oldY){
+													dir = -1
+												}
+											}
+											oldY = newY	
+											dragTop = k2 + e.clientY - strWrap.offset().top;
+
+
+											if (!p.circular){
+												if(dragTop < -strMove.height() && dir < 0){
+													dragTop = strWrap.height();
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}
+												if(dragTop > strWrap.height() && dir > 0){
+													dragTop = -strMove.height();
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}	
+											}else{
+												if(dragTop < -strMove.height() && dir < 0){
+													dragTop = 0;
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}
+												if(dragTop > 0 && dir > 0){
+													dragTop = -strMove.height();
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}
+											}
+
+
+											strMove.stop(true).css({
+												top: dragTop
+											});
+											//drag
+
+
+
+										}).on('mouseup', function () {
+											if(p.inverthover){
+												strMove.trigger('mouseenter')
+											}
+											$(this).off('mousemove');
+											setTimeout(function () {                             
+												fMove = false
+											}, 50)
+										});
+										return false;
+									})
+									.on('click', function () {
+										if (fMove) {
+											return false
+										}
+									});
+								} else {
+									strWrap.addClass('no_drag');
+								};
+							}
+						} else {
+							if (p.runshort) {
+								var k2 = 0;
+								var timeFunc = function () {
+									time = (strWrap.height() - strMove.position().top) / strWrap.data('scrollamount') * 1000;
+									return time;
+								};
+								var moveFunc = function () {
+									var topPos = strWrap.height();
+									strMove.animate({
+										top: topPos
+									}, timeFunc(), 'linear', function () {
+										$(this).css({
+											top: -strMove.height()
+										});
+										if (loop == -1) {
+											setTimeout(moveFunc, p.scrolldelay);
+										} else {
+											loop--;
+											setTimeout(moveFunc, p.scrolldelay);
+										};
+									});
+								};
+								strWrap.data({
+									moveF : moveFunc
+								})
+								if(!p.inverthover){
+									moveFunc();
+								}
+								if (p.hoverstop) {
+									strWrap.on(enterEvent, function () {
+										$(this).addClass('str_active');
+										strMove.stop(true);
+									}).on(leaveEvent, function () {
+										$(this).removeClass('str_active');
+										$(this).off('mousemove');
+										moveFunc();
+									});
+
+									if (p.drag) {
+										strWrap.on('mousedown', function (e) {
+											if(p.inverthover){
+												strMove.stop(true);
+											}
+											
+											//drag
+											var dragTop;
+											var dir = 1;
+											var newY;
+											var oldY = e.clientY;
+											//drag
+											
+											strMoveTop = strMove.position().top;
+											k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+											$(this).on('mousemove', function (e) {
+												fMove = true;
+
+												//drag
+												newY = e.clientY;
+												if(newY > oldY){
+													dir = 1
+												}else{
+													if(newY < oldY){
+														dir = -1
+													}
+												}
+												oldY = newY	
+												dragTop = k2 + e.clientY - strWrap.offset().top;
+	
+	
+												if(dragTop < -strMove.height() && dir < 0){
+													dragTop = strWrap.height();
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}
+												if(dragTop > strWrap.height() && dir > 0){
+													dragTop = -strMove.height();
+													strMoveTop = strMove.position().top;
+													k2 = strMoveTop - (e.clientY - strWrap.offset().top);
+												}	
+												//*drag
+												
+												strMove.stop(true).css({
+													top: dragTop
+												});
+												
+												
+												
+												
+												
+												
+												
+												
+											}).on('mouseup', function () {
+												if(p.inverthover){
+													strMove.trigger('mouseenter')
+												}
+												$(this).off('mousemove');
+												setTimeout(function () {                             
+													fMove = false
+												}, 50)
+											})
+											return false;
+										})
+										.on('click', function () {
+											if (fMove) {
+												return false
+											}
+										});
+									} else {
+										strWrap.addClass('no_drag');
+									};
+								}
+							} else {
+								strWrap.addClass('str_static');
+							}
+						};
+					};
+					
+					
+					
+					
+				}
+				if (p.xml) {
+					$.ajax({
+						url: p.xml,
+						dataType: "xml",
+						success: function (xml) {
+							var xmlTextEl = $(xml).find('text');
+							var xmlTextLength = xmlTextEl.length;
+							for(var i = 0; i < xmlTextLength; i++){
+								var xmlElActive = xmlTextEl.eq(i);
+								var xmlElContent = xmlElActive.text();
+								var xmlItemEl = $('<span>').text(xmlElContent).appendTo(strWrap);
+								
+								if(p.direction == 'left' || p.direction == 'right'){
+									xmlItemEl.css({display:'inline-block',textAlign:'right'});	
+									if(i > 0){
+										xmlItemEl.css({width:strWrap.width()+xmlItemEl.width()});	
+									}
+								}
+								if(p.direction == 'down' || p.direction == 'up'){
+									xmlItemEl.css({display:'block',textAlign:'left'});	
+										if(i > 0){
+											xmlItemEl.css({paddingTop:strWrap.height()});
+										}
+								}
+								
+							}
+							code();
+						}
+					});
+				} else {
+					code();
+				}
+				strWrap.data({
+					ini:code,
+					startheight: startHeight	
+				})
+				
+				
+				
+				
+			});
+		},
+		update: function () {
+			var el = $(this);
+			var str_origin = $('.str_origin',el);
+			var str_move_clone = $('.str_move_clone',el);
+			str_origin.stop(true);
+			str_move_clone.remove();
+			el.data('ini')();
+		},
+		destroy: function () {
+			
+			var el = $(this);
+			var elMove = $('.str_move',el);
+			var startHeight = el.data('startheight');
+			
+			$('.str_move_clone',el).remove();
+			el.off('mouseenter');
+			el.off('mousedown');
+			el.off('mouseup');
+			el.off('mouseleave');
+			el.off('mousemove');
+			el.removeClass('noStop').removeClass('str_vertical').removeClass('str_active').removeClass('no_drag').removeClass('str_static').removeClass('str_right').removeClass('str_down');
+			
+			var elStyle = el.attr('style'); 
+			if(elStyle){
+				var styleArr = elStyle.split(';');
+				for(var i=0; i < styleArr.length; i++){
+					var str = $.trim(styleArr[i]);
+					var tested =  str.search(/^height/g);
+					if(tested != -1){
+						styleArr[i] = '';	
+					}
+				}
+				var newArr = styleArr.join(';');
+				var newStyle =  newArr.replace(/;+/g,';')
+			
+				if(newStyle == ';'){
+					el.removeAttr('style');	
+				}else{
+					el.attr('style',newStyle);	
+				}
+				
+				if(startHeight){
+					el.css({height:startHeight})	
+				}
+			}
+			elMove.stop(true);
+
+			if(elMove.length){
+				var context = elMove.html();
+				elMove.remove();
+				el.html(context);
+			}
+	
+		},
+		pause: function(){	
+			var el = $(this);
+			var elMove = $('.str_move',el);
+			elMove.stop(true);
+		}, 
+		play: function(){
+			var el = $(this);
+			$(this).off('mousemove');
+			el.data('moveF')();	
+		}
+		
+	};
+	$.fn.liMarquee = function (method) {
+		if (methods[method]) {
+			return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+		} else if (typeof method === 'object' || !method) {
+			return methods.init.apply(this, arguments);
+		} else {
+			$.error('Метод ' + method + ' в jQuery.liMarquee не существует');
+		}
+	};
+})(jQuery);
\ No newline at end of file
diff --git a/mobile/lib/lottie-player.js b/mobile/lib/lottie-player.js
new file mode 100644
index 0000000..ad80bcd
--- /dev/null
+++ b/mobile/lib/lottie-player.js
@@ -0,0 +1,238 @@
+parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"uWh2":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.isDirective=exports.directive=void 0;const e=new WeakMap,t=t=>(...s)=>{const i=t(...s);return e.set(i,!0),i};exports.directive=t;const s=t=>"function"==typeof t&&e.has(t);exports.isDirective=s;
+},{}],"2ytx":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.removeNodes=exports.reparentNodes=exports.isCEPolyfill=void 0;const e=void 0!==window.customElements&&void 0!==window.customElements.polyfillWrapFlushCallback;exports.isCEPolyfill=e;const o=(e,o,l=null,s=null)=>{let t=o;for(;t!==l;){const o=t.nextSibling;e.insertBefore(t,s),t=o}};exports.reparentNodes=o;const l=(e,o,l=null)=>{let s=o;for(;s!==l;){const o=s.nextSibling;e.removeChild(s),s=o}};exports.removeNodes=l;
+},{}],"pnLb":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.nothing=exports.noChange=void 0;const e={};exports.noChange=e;const o={};exports.nothing=o;
+},{}],"Av0K":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.lastAttributeNameRegex=exports.createMarker=exports.isTemplatePartActive=exports.Template=exports.boundAttributeSuffix=exports.markerRegex=exports.nodeMarker=exports.marker=void 0;const e=`{{lit-${String(Math.random()).slice(2)}}}`;exports.marker=e;const t=`\x3c!--${e}--\x3e`;exports.nodeMarker=t;const r=new RegExp(`${e}|${t}`);exports.markerRegex=r;const s="$lit$";exports.boundAttributeSuffix=s;class o{constructor(t,o){this.parts=[],this.element=o;let n=-1,i=0;const p=[],d=o=>{const c=o.content,l=document.createTreeWalker(c,133,null,!1);let u=0;for(;l.nextNode();){n++;const o=l.currentNode;if(1===o.nodeType){if(o.hasAttributes()){const x=o.attributes;let p=0;for(let t=0;t<x.length;t++)x[t].value.indexOf(e)>=0&&p++;for(;p-- >0;){const e=t.strings[i],x=a.exec(e)[2],p=x.toLowerCase()+s,d=o.getAttribute(p).split(r);this.parts.push({type:"attribute",index:n,name:x,strings:d}),o.removeAttribute(p),i+=d.length-1}}"TEMPLATE"===o.tagName&&d(o)}else if(3===o.nodeType){const t=o.data;if(t.indexOf(e)>=0){const e=o.parentNode,s=t.split(r),a=s.length-1;for(let t=0;t<a;t++)e.insertBefore(""===s[t]?x():document.createTextNode(s[t]),o),this.parts.push({type:"node",index:++n});""===s[a]?(e.insertBefore(x(),o),p.push(o)):o.data=s[a],i+=a}}else if(8===o.nodeType)if(o.data===e){const e=o.parentNode;null!==o.previousSibling&&n!==u||(n++,e.insertBefore(x(),o)),u=n,this.parts.push({type:"node",index:n}),null===o.nextSibling?o.data="":(p.push(o),n--),i++}else{let t=-1;for(;-1!==(t=o.data.indexOf(e,t+1));)this.parts.push({type:"node",index:-1})}}};d(o);for(const e of p)e.parentNode.removeChild(e)}}exports.Template=o;const n=e=>-1!==e.index;exports.isTemplatePartActive=n;const x=()=>document.createComment("");exports.createMarker=x;const a=/([ \x09\x0a\x0c\x0d])([^\0-\x1F\x7F-\x9F \x09\x0a\x0c\x0d"'>=\/]+)([ \x09\x0a\x0c\x0d]*=[ \x09\x0a\x0c\x0d]*(?:[^ \x09\x0a\x0c\x0d"'`<>=]*|"[^"]*|'[^']*))$/;exports.lastAttributeNameRegex=a;
+},{}],"bn5t":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.TemplateInstance=void 0;var e=require("./dom.js"),t=require("./template.js");class s{constructor(e,t,s){this._parts=[],this.template=e,this.processor=t,this.options=s}update(e){let t=0;for(const s of this._parts)void 0!==s&&s.setValue(e[t]),t++;for(const s of this._parts)void 0!==s&&s.commit()}_clone(){const s=e.isCEPolyfill?this.template.element.content.cloneNode(!0):document.importNode(this.template.element.content,!0),o=this.template.parts;let i=0,n=0;const r=e=>{const s=document.createTreeWalker(e,133,null,!1);let l=s.nextNode();for(;i<o.length&&null!==l;){const e=o[i];if((0,t.isTemplatePartActive)(e))if(n===e.index){if("node"===e.type){const e=this.processor.handleTextExpression(this.options);e.insertAfterNode(l.previousSibling),this._parts.push(e)}else this._parts.push(...this.processor.handleAttributeExpressions(l,e.name,e.strings,this.options));i++}else n++,"TEMPLATE"===l.nodeName&&r(l.content),l=s.nextNode();else this._parts.push(void 0),i++}};return r(s),e.isCEPolyfill&&(document.adoptNode(s),customElements.upgrade(s)),s}}exports.TemplateInstance=s;
+},{"./dom.js":"2ytx","./template.js":"Av0K"}],"cVNN":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.SVGTemplateResult=exports.TemplateResult=void 0;var e=require("./dom.js"),t=require("./template.js");class s{constructor(e,t,s,r){this.strings=e,this.values=t,this.type=s,this.processor=r}getHTML(){const e=this.strings.length-1;let s="";for(let r=0;r<e;r++){const e=this.strings[r],l=t.lastAttributeNameRegex.exec(e);s+=l?e.substr(0,l.index)+l[1]+l[2]+t.boundAttributeSuffix+l[3]+t.marker:e+t.nodeMarker}return s+this.strings[e]}getTemplateElement(){const e=document.createElement("template");return e.innerHTML=this.getHTML(),e}}exports.TemplateResult=s;class r extends s{getHTML(){return`<svg>${super.getHTML()}</svg>`}getTemplateElement(){const t=super.getTemplateElement(),s=t.content,r=s.firstChild;return s.removeChild(r),(0,e.reparentNodes)(s,r.firstChild),t}}exports.SVGTemplateResult=r;
+},{"./dom.js":"2ytx","./template.js":"Av0K"}],"atl2":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.EventPart=exports.PropertyPart=exports.PropertyCommitter=exports.BooleanAttributePart=exports.NodePart=exports.AttributePart=exports.AttributeCommitter=exports.isPrimitive=void 0;var t=require("./directive.js"),e=require("./dom.js"),i=require("./part.js"),s=require("./template-instance.js"),n=require("./template-result.js"),r=require("./template.js");const o=t=>null===t||!("object"==typeof t||"function"==typeof t);exports.isPrimitive=o;class a{constructor(t,e,i){this.dirty=!0,this.element=t,this.name=e,this.strings=i,this.parts=[];for(let s=0;s<i.length-1;s++)this.parts[s]=this._createPart()}_createPart(){return new h(this)}_getValue(){const t=this.strings,e=t.length-1;let i="";for(let s=0;s<e;s++){i+=t[s];const e=this.parts[s];if(void 0!==e){const t=e.value;if(null!=t&&(Array.isArray(t)||"string"!=typeof t&&t[Symbol.iterator]))for(const e of t)i+="string"==typeof e?e:String(e);else i+="string"==typeof t?t:String(t)}}return i+=t[e]}commit(){this.dirty&&(this.dirty=!1,this.element.setAttribute(this.name,this._getValue()))}}exports.AttributeCommitter=a;class h{constructor(t){this.value=void 0,this.committer=t}setValue(e){e===i.noChange||o(e)&&e===this.value||(this.value=e,(0,t.isDirective)(e)||(this.committer.dirty=!0))}commit(){for(;(0,t.isDirective)(this.value);){const t=this.value;this.value=i.noChange,t(this)}this.value!==i.noChange&&this.committer.commit()}}exports.AttributePart=h;class l{constructor(t){this.value=void 0,this._pendingValue=void 0,this.options=t}appendInto(t){this.startNode=t.appendChild((0,r.createMarker)()),this.endNode=t.appendChild((0,r.createMarker)())}insertAfterNode(t){this.startNode=t,this.endNode=t.nextSibling}appendIntoPart(t){t._insert(this.startNode=(0,r.createMarker)()),t._insert(this.endNode=(0,r.createMarker)())}insertAfterPart(t){t._insert(this.startNode=(0,r.createMarker)()),this.endNode=t.endNode,t.endNode=this.startNode}setValue(t){this._pendingValue=t}commit(){for(;(0,t.isDirective)(this._pendingValue);){const t=this._pendingValue;this._pendingValue=i.noChange,t(this)}const e=this._pendingValue;e!==i.noChange&&(o(e)?e!==this.value&&this._commitText(e):e instanceof n.TemplateResult?this._commitTemplateResult(e):e instanceof Node?this._commitNode(e):Array.isArray(e)||e[Symbol.iterator]?this._commitIterable(e):e===i.nothing?(this.value=i.nothing,this.clear()):this._commitText(e))}_insert(t){this.endNode.parentNode.insertBefore(t,this.endNode)}_commitNode(t){this.value!==t&&(this.clear(),this._insert(t),this.value=t)}_commitText(t){const e=this.startNode.nextSibling;t=null==t?"":t,e===this.endNode.previousSibling&&3===e.nodeType?e.data=t:this._commitNode(document.createTextNode("string"==typeof t?t:String(t))),this.value=t}_commitTemplateResult(t){const e=this.options.templateFactory(t);if(this.value instanceof s.TemplateInstance&&this.value.template===e)this.value.update(t.values);else{const i=new s.TemplateInstance(e,t.processor,this.options),n=i._clone();i.update(t.values),this._commitNode(n),this.value=i}}_commitIterable(t){Array.isArray(this.value)||(this.value=[],this.clear());const e=this.value;let i,s=0;for(const n of t)void 0===(i=e[s])&&(i=new l(this.options),e.push(i),0===s?i.appendIntoPart(this):i.insertAfterPart(e[s-1])),i.setValue(n),i.commit(),s++;s<e.length&&(e.length=s,this.clear(i&&i.endNode))}clear(t=this.startNode){(0,e.removeNodes)(this.startNode.parentNode,t.nextSibling,this.endNode)}}exports.NodePart=l;class u{constructor(t,e,i){if(this.value=void 0,this._pendingValue=void 0,2!==i.length||""!==i[0]||""!==i[1])throw new Error("Boolean attributes can only contain a single expression");this.element=t,this.name=e,this.strings=i}setValue(t){this._pendingValue=t}commit(){for(;(0,t.isDirective)(this._pendingValue);){const t=this._pendingValue;this._pendingValue=i.noChange,t(this)}if(this._pendingValue===i.noChange)return;const e=!!this._pendingValue;this.value!==e&&(e?this.element.setAttribute(this.name,""):this.element.removeAttribute(this.name)),this.value=e,this._pendingValue=i.noChange}}exports.BooleanAttributePart=u;class d extends a{constructor(t,e,i){super(t,e,i),this.single=2===i.length&&""===i[0]&&""===i[1]}_createPart(){return new c(this)}_getValue(){return this.single?this.parts[0].value:super._getValue()}commit(){this.dirty&&(this.dirty=!1,this.element[this.name]=this._getValue())}}exports.PropertyCommitter=d;class c extends h{}exports.PropertyPart=c;let p=!1;try{const t={get capture(){return p=!0,!1}};window.addEventListener("test",t,t),window.removeEventListener("test",t,t)}catch(g){}class m{constructor(t,e,i){this.value=void 0,this._pendingValue=void 0,this.element=t,this.eventName=e,this.eventContext=i,this._boundHandleEvent=(t=>this.handleEvent(t))}setValue(t){this._pendingValue=t}commit(){for(;(0,t.isDirective)(this._pendingValue);){const t=this._pendingValue;this._pendingValue=i.noChange,t(this)}if(this._pendingValue===i.noChange)return;const e=this._pendingValue,s=this.value,n=null==e||null!=s&&(e.capture!==s.capture||e.once!==s.once||e.passive!==s.passive),r=null!=e&&(null==s||n);n&&this.element.removeEventListener(this.eventName,this._boundHandleEvent,this._options),r&&(this._options=v(e),this.element.addEventListener(this.eventName,this._boundHandleEvent,this._options)),this.value=e,this._pendingValue=i.noChange}handleEvent(t){"function"==typeof this.value?this.value.call(this.eventContext||this.element,t):this.value.handleEvent(t)}}exports.EventPart=m;const v=t=>t&&(p?{capture:t.capture,passive:t.passive,once:t.once}:t.capture);
+},{"./directive.js":"uWh2","./dom.js":"2ytx","./part.js":"pnLb","./template-instance.js":"bn5t","./template-result.js":"cVNN","./template.js":"Av0K"}],"52LB":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.defaultTemplateProcessor=exports.DefaultTemplateProcessor=void 0;var e=require("./parts.js");class t{handleAttributeExpressions(t,r,s,o){const a=r[0];if("."===a){return new e.PropertyCommitter(t,r.slice(1),s).parts}return"@"===a?[new e.EventPart(t,r.slice(1),o.eventContext)]:"?"===a?[new e.BooleanAttributePart(t,r.slice(1),s)]:new e.AttributeCommitter(t,r,s).parts}handleTextExpression(t){return new e.NodePart(t)}}exports.DefaultTemplateProcessor=t;const r=new t;exports.defaultTemplateProcessor=r;
+},{"./parts.js":"atl2"}],"gbKZ":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.templateFactory=t,exports.templateCaches=void 0;var e=require("./template.js");function t(t){let s=r.get(t.type);void 0===s&&(s={stringsArray:new WeakMap,keyString:new Map},r.set(t.type,s));let n=s.stringsArray.get(t.strings);if(void 0!==n)return n;const a=t.strings.join(e.marker);return void 0===(n=s.keyString.get(a))&&(n=new e.Template(t,t.getTemplateElement()),s.keyString.set(a,n)),s.stringsArray.set(t.strings,n),n}const r=new Map;exports.templateCaches=r;
+},{"./template.js":"Av0K"}],"Fhpq":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.render=exports.parts=void 0;var e=require("./dom.js"),t=require("./parts.js"),r=require("./template-factory.js");const s=new WeakMap;exports.parts=s;const o=(o,a,p)=>{let d=s.get(a);void 0===d&&((0,e.removeNodes)(a,a.firstChild),s.set(a,d=new t.NodePart(Object.assign({templateFactory:r.templateFactory},p))),d.appendInto(a)),d.setValue(o),d.commit()};exports.render=o;
+},{"./dom.js":"2ytx","./parts.js":"atl2","./template-factory.js":"gbKZ"}],"SP/d":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"DefaultTemplateProcessor",{enumerable:!0,get:function(){return e.DefaultTemplateProcessor}}),Object.defineProperty(exports,"defaultTemplateProcessor",{enumerable:!0,get:function(){return e.defaultTemplateProcessor}}),Object.defineProperty(exports,"SVGTemplateResult",{enumerable:!0,get:function(){return t.SVGTemplateResult}}),Object.defineProperty(exports,"TemplateResult",{enumerable:!0,get:function(){return t.TemplateResult}}),Object.defineProperty(exports,"directive",{enumerable:!0,get:function(){return r.directive}}),Object.defineProperty(exports,"isDirective",{enumerable:!0,get:function(){return r.isDirective}}),Object.defineProperty(exports,"removeNodes",{enumerable:!0,get:function(){return n.removeNodes}}),Object.defineProperty(exports,"reparentNodes",{enumerable:!0,get:function(){return n.reparentNodes}}),Object.defineProperty(exports,"noChange",{enumerable:!0,get:function(){return o.noChange}}),Object.defineProperty(exports,"nothing",{enumerable:!0,get:function(){return o.nothing}}),Object.defineProperty(exports,"AttributeCommitter",{enumerable:!0,get:function(){return i.AttributeCommitter}}),Object.defineProperty(exports,"AttributePart",{enumerable:!0,get:function(){return i.AttributePart}}),Object.defineProperty(exports,"BooleanAttributePart",{enumerable:!0,get:function(){return i.BooleanAttributePart}}),Object.defineProperty(exports,"EventPart",{enumerable:!0,get:function(){return i.EventPart}}),Object.defineProperty(exports,"isPrimitive",{enumerable:!0,get:function(){return i.isPrimitive}}),Object.defineProperty(exports,"NodePart",{enumerable:!0,get:function(){return i.NodePart}}),Object.defineProperty(exports,"PropertyCommitter",{enumerable:!0,get:function(){return i.PropertyCommitter}}),Object.defineProperty(exports,"PropertyPart",{enumerable:!0,get:function(){return i.PropertyPart}}),Object.defineProperty(exports,"parts",{enumerable:!0,get:function(){return u.parts}}),Object.defineProperty(exports,"render",{enumerable:!0,get:function(){return u.render}}),Object.defineProperty(exports,"templateCaches",{enumerable:!0,get:function(){return p.templateCaches}}),Object.defineProperty(exports,"templateFactory",{enumerable:!0,get:function(){return p.templateFactory}}),Object.defineProperty(exports,"TemplateInstance",{enumerable:!0,get:function(){return a.TemplateInstance}}),Object.defineProperty(exports,"createMarker",{enumerable:!0,get:function(){return s.createMarker}}),Object.defineProperty(exports,"isTemplatePartActive",{enumerable:!0,get:function(){return s.isTemplatePartActive}}),Object.defineProperty(exports,"Template",{enumerable:!0,get:function(){return s.Template}}),exports.svg=exports.html=void 0;var e=require("./lib/default-template-processor.js"),t=require("./lib/template-result.js"),r=require("./lib/directive.js"),n=require("./lib/dom.js"),o=require("./lib/part.js"),i=require("./lib/parts.js"),u=require("./lib/render.js"),p=require("./lib/template-factory.js"),a=require("./lib/template-instance.js"),s=require("./lib/template.js");(window.litHtmlVersions||(window.litHtmlVersions=[])).push("1.0.0");const l=(r,...n)=>new t.TemplateResult(r,n,"html",e.defaultTemplateProcessor);exports.html=l;const c=(r,...n)=>new t.SVGTemplateResult(r,n,"svg",e.defaultTemplateProcessor);exports.svg=c;
+},{"./lib/default-template-processor.js":"52LB","./lib/template-result.js":"cVNN","./lib/directive.js":"uWh2","./lib/dom.js":"2ytx","./lib/part.js":"pnLb","./lib/parts.js":"atl2","./lib/render.js":"Fhpq","./lib/template-factory.js":"gbKZ","./lib/template-instance.js":"bn5t","./lib/template.js":"Av0K"}],"NXoq":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.removeNodesFromTemplate=n,exports.insertNodeIntoTemplate=l;var e=require("./template.js");const t=133;function n(e,n){const{element:{content:r},parts:l}=e,u=document.createTreeWalker(r,t,null,!1);let c=o(l),d=l[c],s=-1,i=0;const a=[];let p=null;for(;u.nextNode();){s++;const e=u.currentNode;for(e.previousSibling===p&&(p=null),n.has(e)&&(a.push(e),null===p&&(p=e)),null!==p&&i++;void 0!==d&&d.index===s;)d.index=null!==p?-1:d.index-i,d=l[c=o(l,c)]}a.forEach(e=>e.parentNode.removeChild(e))}const r=e=>{let n=11===e.nodeType?0:1;const r=document.createTreeWalker(e,t,null,!1);for(;r.nextNode();)n++;return n},o=(t,n=-1)=>{for(let r=n+1;r<t.length;r++){const n=t[r];if((0,e.isTemplatePartActive)(n))return r}return-1};function l(e,n,l=null){const{element:{content:u},parts:c}=e;if(null==l)return void u.appendChild(n);const d=document.createTreeWalker(u,t,null,!1);let s=o(c),i=0,a=-1;for(;d.nextNode();){for(a++,d.currentNode===l&&(i=r(n),l.parentNode.insertBefore(n,l));-1!==s&&c[s].index===a;){if(i>0){for(;-1!==s;)c[s].index+=i,s=o(c,s);return}s=o(c,s)}}}
+},{"./template.js":"Av0K"}],"eBH8":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),Object.defineProperty(exports,"html",{enumerable:!0,get:function(){return l.html}}),Object.defineProperty(exports,"svg",{enumerable:!0,get:function(){return l.svg}}),Object.defineProperty(exports,"TemplateResult",{enumerable:!0,get:function(){return l.TemplateResult}}),exports.render=void 0;var e=require("./dom.js"),t=require("./modify-template.js"),r=require("./render.js"),n=require("./template-factory.js"),o=require("./template-instance.js"),s=require("./template-result.js"),a=require("./template.js"),l=require("../lit-html.js");const i=(e,t)=>`${e}--${t}`;let d=!0;void 0===window.ShadyCSS?d=!1:void 0===window.ShadyCSS.prepareTemplateDom&&(console.warn("Incompatible ShadyCSS version detected.Please update to at least @webcomponents/webcomponentsjs@2.0.2 and@webcomponents/shadycss@1.3.1."),d=!1);const m=e=>t=>{const r=i(t.type,e);let o=n.templateCaches.get(r);void 0===o&&(o={stringsArray:new WeakMap,keyString:new Map},n.templateCaches.set(r,o));let s=o.stringsArray.get(t.strings);if(void 0!==s)return s;const l=t.strings.join(a.marker);if(void 0===(s=o.keyString.get(l))){const r=t.getTemplateElement();d&&window.ShadyCSS.prepareTemplateDom(r,e),s=new a.Template(t,r),o.keyString.set(l,s)}return o.stringsArray.set(t.strings,s),s},c=["html","svg"],p=e=>{c.forEach(r=>{const o=n.templateCaches.get(i(r,e));void 0!==o&&o.keyString.forEach(e=>{const{element:{content:r}}=e,n=new Set;Array.from(r.querySelectorAll("style")).forEach(e=>{n.add(e)}),(0,t.removeNodesFromTemplate)(e,n)})})},S=new Set,u=(e,r,n)=>{S.add(n);const o=e.querySelectorAll("style");if(0===o.length)return void window.ShadyCSS.prepareTemplateStyles(r.element,n);const s=document.createElement("style");for(let t=0;t<o.length;t++){const e=o[t];e.parentNode.removeChild(e),s.textContent+=e.textContent}if(p(n),(0,t.insertNodeIntoTemplate)(r,s,r.element.content.firstChild),window.ShadyCSS.prepareTemplateStyles(r.element,n),window.ShadyCSS.nativeShadow){const t=r.element.content.querySelector("style");e.insertBefore(t.cloneNode(!0),e.firstChild)}else{r.element.content.insertBefore(s,r.element.content.firstChild);const e=new Set;e.add(s),(0,t.removeNodesFromTemplate)(r,e)}},y=(t,n,a)=>{const l=a.scopeName,i=r.parts.has(n),c=n instanceof ShadowRoot&&d&&t instanceof s.TemplateResult,p=c&&!S.has(l),y=p?document.createDocumentFragment():n;if((0,r.render)(t,y,Object.assign({templateFactory:m(l)},a)),p){const t=r.parts.get(y);r.parts.delete(y),t.value instanceof o.TemplateInstance&&u(y,t.value.template,l),(0,e.removeNodes)(n,n.firstChild),n.appendChild(y),r.parts.set(n,t)}!i&&c&&window.ShadyCSS.styleElement(n.host)};exports.render=y;
+},{"./dom.js":"2ytx","./modify-template.js":"NXoq","./render.js":"Fhpq","./template-factory.js":"gbKZ","./template-instance.js":"bn5t","./template-result.js":"cVNN","./template.js":"Av0K","../lit-html.js":"SP/d"}],"fKvB":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.UpdatingElement=exports.notEqual=exports.defaultConverter=void 0,window.JSCompiler_renameProperty=((t,e)=>t);const t={toAttribute(t,e){switch(e){case Boolean:return t?"":null;case Object:case Array:return null==t?t:JSON.stringify(t)}return t},fromAttribute(t,e){switch(e){case Boolean:return null!==t;case Number:return null===t?null:Number(t);case Object:case Array:return JSON.parse(t)}return t}};exports.defaultConverter=t;const e=(t,e)=>e!==t&&(e==e||t==t);exports.notEqual=e;const r={attribute:!0,type:String,converter:t,reflect:!1,hasChanged:e},s=Promise.resolve(!0),i=1,a=4,o=8,n=16,p=32;class h extends HTMLElement{constructor(){super(),this._updateState=0,this._instanceProperties=void 0,this._updatePromise=s,this._hasConnectedResolver=void 0,this._changedProperties=new Map,this._reflectingProperties=void 0,this.initialize()}static get observedAttributes(){this.finalize();const t=[];return this._classProperties.forEach((e,r)=>{const s=this._attributeNameForProperty(r,e);void 0!==s&&(this._attributeToPropertyMap.set(s,r),t.push(s))}),t}static _ensureClassProperties(){if(!this.hasOwnProperty(JSCompiler_renameProperty("_classProperties",this))){this._classProperties=new Map;const t=Object.getPrototypeOf(this)._classProperties;void 0!==t&&t.forEach((t,e)=>this._classProperties.set(e,t))}}static createProperty(t,e=r){if(this._ensureClassProperties(),this._classProperties.set(t,e),e.noAccessor||this.prototype.hasOwnProperty(t))return;const s="symbol"==typeof t?Symbol():`__${t}`;Object.defineProperty(this.prototype,t,{get(){return this[s]},set(e){const r=this[t];this[s]=e,this._requestUpdate(t,r)},configurable:!0,enumerable:!0})}static finalize(){if(this.hasOwnProperty(JSCompiler_renameProperty("finalized",this))&&this.finalized)return;const t=Object.getPrototypeOf(this);if("function"==typeof t.finalize&&t.finalize(),this.finalized=!0,this._ensureClassProperties(),this._attributeToPropertyMap=new Map,this.hasOwnProperty(JSCompiler_renameProperty("properties",this))){const t=this.properties,e=[...Object.getOwnPropertyNames(t),..."function"==typeof Object.getOwnPropertySymbols?Object.getOwnPropertySymbols(t):[]];for(const r of e)this.createProperty(r,t[r])}}static _attributeNameForProperty(t,e){const r=e.attribute;return!1===r?void 0:"string"==typeof r?r:"string"==typeof t?t.toLowerCase():void 0}static _valueHasChanged(t,r,s=e){return s(t,r)}static _propertyValueFromAttribute(e,r){const s=r.type,i=r.converter||t,a="function"==typeof i?i:i.fromAttribute;return a?a(e,s):e}static _propertyValueToAttribute(e,r){if(void 0===r.reflect)return;const s=r.type,i=r.converter;return(i&&i.toAttribute||t.toAttribute)(e,s)}initialize(){this._saveInstanceProperties(),this._requestUpdate()}_saveInstanceProperties(){this.constructor._classProperties.forEach((t,e)=>{if(this.hasOwnProperty(e)){const t=this[e];delete this[e],this._instanceProperties||(this._instanceProperties=new Map),this._instanceProperties.set(e,t)}})}_applyInstanceProperties(){this._instanceProperties.forEach((t,e)=>this[e]=t),this._instanceProperties=void 0}connectedCallback(){this._updateState=this._updateState|p,this._hasConnectedResolver&&(this._hasConnectedResolver(),this._hasConnectedResolver=void 0)}disconnectedCallback(){}attributeChangedCallback(t,e,r){e!==r&&this._attributeToProperty(t,r)}_propertyToAttribute(t,e,s=r){const i=this.constructor,a=i._attributeNameForProperty(t,s);if(void 0!==a){const t=i._propertyValueToAttribute(e,s);if(void 0===t)return;this._updateState=this._updateState|o,null==t?this.removeAttribute(a):this.setAttribute(a,t),this._updateState=this._updateState&~o}}_attributeToProperty(t,e){if(this._updateState&o)return;const s=this.constructor,i=s._attributeToPropertyMap.get(t);if(void 0!==i){const t=s._classProperties.get(i)||r;this._updateState=this._updateState|n,this[i]=s._propertyValueFromAttribute(e,t),this._updateState=this._updateState&~n}}_requestUpdate(t,e){let s=!0;if(void 0!==t){const i=this.constructor,a=i._classProperties.get(t)||r;i._valueHasChanged(this[t],e,a.hasChanged)?(this._changedProperties.has(t)||this._changedProperties.set(t,e),!0!==a.reflect||this._updateState&n||(void 0===this._reflectingProperties&&(this._reflectingProperties=new Map),this._reflectingProperties.set(t,a))):s=!1}!this._hasRequestedUpdate&&s&&this._enqueueUpdate()}requestUpdate(t,e){return this._requestUpdate(t,e),this.updateComplete}async _enqueueUpdate(){let t,e;this._updateState=this._updateState|a;const r=this._updatePromise;this._updatePromise=new Promise((r,s)=>{t=r,e=s});try{await r}catch(s){}this._hasConnected||await new Promise(t=>this._hasConnectedResolver=t);try{const t=this.performUpdate();null!=t&&await t}catch(s){e(s)}t(!this._hasRequestedUpdate)}get _hasConnected(){return this._updateState&p}get _hasRequestedUpdate(){return this._updateState&a}get hasUpdated(){return this._updateState&i}performUpdate(){this._instanceProperties&&this._applyInstanceProperties();let t=!1;const e=this._changedProperties;try{(t=this.shouldUpdate(e))&&this.update(e)}catch(r){throw t=!1,r}finally{this._markUpdated()}t&&(this._updateState&i||(this._updateState=this._updateState|i,this.firstUpdated(e)),this.updated(e))}_markUpdated(){this._changedProperties=new Map,this._updateState=this._updateState&~a}get updateComplete(){return this._updatePromise}shouldUpdate(t){return!0}update(t){void 0!==this._reflectingProperties&&this._reflectingProperties.size>0&&(this._reflectingProperties.forEach((t,e)=>this._propertyToAttribute(e,this[e],t)),this._reflectingProperties=void 0)}updated(t){}firstUpdated(t){}}exports.UpdatingElement=h,h.finalized=!0;
+},{}],"4Fzp":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.property=i,exports.query=s,exports.queryAll=c,exports.eventOptions=exports.customElement=void 0;const e=(e,t)=>(window.customElements.define(e,t),t),t=(e,t)=>{const{kind:r,elements:n}=t;return{kind:r,elements:n,finisher(t){window.customElements.define(e,t)}}},r=r=>n=>"function"==typeof n?e(r,n):t(r,n);exports.customElement=r;const n=(e,t)=>"method"!==t.kind||!t.descriptor||"value"in t.descriptor?{kind:"field",key:Symbol(),placement:"own",descriptor:{},initializer(){"function"==typeof t.initializer&&(this[t.key]=t.initializer.call(this))},finisher(r){r.createProperty(t.key,e)}}:Object.assign({},t,{finisher(r){r.createProperty(t.key,e)}}),o=(e,t,r)=>{t.constructor.createProperty(r,e)};function i(e){return(t,r)=>void 0!==r?o(e,t,r):n(e,t)}function s(e){return(t,r)=>{const n={get(){return this.renderRoot.querySelector(e)},enumerable:!0,configurable:!0};return void 0!==r?u(n,t,r):p(n,t)}}function c(e){return(t,r)=>{const n={get(){return this.renderRoot.querySelectorAll(e)},enumerable:!0,configurable:!0};return void 0!==r?u(n,t,r):p(n,t)}}const u=(e,t,r)=>{Object.defineProperty(t,r,e)},p=(e,t)=>({kind:"method",placement:"prototype",key:t.key,descriptor:e}),l=(e,t)=>Object.assign({},t,{finisher(r){Object.assign(r.prototype[t.key],e)}}),d=(e,t,r)=>{Object.assign(t[r],e)},y=e=>(t,r)=>void 0!==r?d(e,t,r):l(e,t);exports.eventOptions=y;
+},{}],"ZFCR":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.css=exports.unsafeCSS=exports.CSSResult=exports.supportsAdoptingStyleSheets=void 0;const e="adoptedStyleSheets"in Document.prototype&&"replace"in CSSStyleSheet.prototype;exports.supportsAdoptingStyleSheets=e;const t=Symbol();class s{constructor(e,s){if(s!==t)throw new Error("CSSResult is not constructable. Use `unsafeCSS` or `css` instead.");this.cssText=e}get styleSheet(){return void 0===this._styleSheet&&(e?(this._styleSheet=new CSSStyleSheet,this._styleSheet.replaceSync(this.cssText)):this._styleSheet=null),this._styleSheet}toString(){return this.cssText}}exports.CSSResult=s;const o=e=>new s(String(e),t);exports.unsafeCSS=o;const r=e=>{if(e instanceof s)return e.cssText;throw new Error(`Value passed to 'css' function must be a 'css' function result: ${e}. Use 'unsafeCSS' to pass non-literal values, but\n            take care to ensure page security.`)},n=(e,...o)=>{const n=o.reduce((t,s,o)=>t+r(s)+e[o+1],e[0]);return new s(n,t)};exports.css=n;
+},{}],"+bhx":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0});var e={LitElement:!0,html:!0,svg:!0,TemplateResult:!0,SVGTemplateResult:!0};Object.defineProperty(exports,"html",{enumerable:!0,get:function(){return o.html}}),Object.defineProperty(exports,"svg",{enumerable:!0,get:function(){return o.svg}}),Object.defineProperty(exports,"TemplateResult",{enumerable:!0,get:function(){return o.TemplateResult}}),Object.defineProperty(exports,"SVGTemplateResult",{enumerable:!0,get:function(){return o.SVGTemplateResult}}),exports.LitElement=void 0;var t=require("lit-html"),r=require("lit-html/lib/shady-render.js"),s=require("./lib/updating-element.js");Object.keys(s).forEach(function(t){"default"!==t&&"__esModule"!==t&&(Object.prototype.hasOwnProperty.call(e,t)||Object.defineProperty(exports,t,{enumerable:!0,get:function(){return s[t]}}))});var n=require("./lib/decorators.js");Object.keys(n).forEach(function(t){"default"!==t&&"__esModule"!==t&&(Object.prototype.hasOwnProperty.call(e,t)||Object.defineProperty(exports,t,{enumerable:!0,get:function(){return n[t]}}))});var o=require("lit-html/lit-html.js"),i=require("./lib/css-tag.js");function l(e,t=[]){for(let r=0,s=e.length;r<s;r++){const s=e[r];Array.isArray(s)?l(s,t):t.push(s)}return t}Object.keys(i).forEach(function(t){"default"!==t&&"__esModule"!==t&&(Object.prototype.hasOwnProperty.call(e,t)||Object.defineProperty(exports,t,{enumerable:!0,get:function(){return i[t]}}))}),(window.litElementVersions||(window.litElementVersions=[])).push("2.0.1");const a=e=>e.flat?e.flat(1/0):l(e);class d extends s.UpdatingElement{static finalize(){super.finalize(),this._styles=this.hasOwnProperty(JSCompiler_renameProperty("styles",this))?this._getUniqueStyles():this._styles||[]}static _getUniqueStyles(){const e=this.styles,t=[];if(Array.isArray(e)){a(e).reduceRight((e,t)=>(e.add(t),e),new Set).forEach(e=>t.unshift(e))}else e&&t.push(e);return t}initialize(){super.initialize(),this.renderRoot=this.createRenderRoot(),window.ShadowRoot&&this.renderRoot instanceof window.ShadowRoot&&this.adoptStyles()}createRenderRoot(){return this.attachShadow({mode:"open"})}adoptStyles(){const e=this.constructor._styles;0!==e.length&&(void 0===window.ShadyCSS||window.ShadyCSS.nativeShadow?i.supportsAdoptingStyleSheets?this.renderRoot.adoptedStyleSheets=e.map(e=>e.styleSheet):this._needsShimAdoptedStyleSheets=!0:window.ShadyCSS.ScopingShim.prepareAdoptedCssText(e.map(e=>e.cssText),this.localName))}connectedCallback(){super.connectedCallback(),this.hasUpdated&&void 0!==window.ShadyCSS&&window.ShadyCSS.styleElement(this)}update(e){super.update(e);const r=this.render();r instanceof t.TemplateResult&&this.constructor.render(r,this.renderRoot,{scopeName:this.localName,eventContext:this}),this._needsShimAdoptedStyleSheets&&(this._needsShimAdoptedStyleSheets=!1,this.constructor._styles.forEach(e=>{const t=document.createElement("style");t.textContent=e.cssText,this.renderRoot.appendChild(t)}))}render(){}}exports.LitElement=d,d.finalized=!0,d.render=r.render;
+},{"lit-html":"SP/d","lit-html/lib/shady-render.js":"eBH8","./lib/updating-element.js":"fKvB","./lib/decorators.js":"4Fzp","lit-html/lit-html.js":"SP/d","./lib/css-tag.js":"ZFCR"}],"aqmj":[function(require,module,exports) {
+    var define;
+    var global = arguments[3];
+    var define,global=arguments[3];"undefined"!=typeof navigator&&function(t,e){"function"==typeof define&&define.amd?define(function(){return e(t)}):"object"==typeof module&&module.exports?module.exports=e(t):(t.lottie=e(t),t.bodymovin=t.lottie)}(window||{},function(window){"use strict";var svgNS="http://www.w3.org/2000/svg",locationHref="",initialDefaultFrame=-999999,subframeEnabled=!0,expressionsPlugin,isSafari=/^((?!chrome|android).)*safari/i.test(navigator.userAgent),cachedColors={},bm_rounder=Math.round,bm_rnd,bm_pow=Math.pow,bm_sqrt=Math.sqrt,bm_abs=Math.abs,bm_floor=Math.floor,bm_max=Math.max,bm_min=Math.min,blitter=10,BMMath={};function ProjectInterface(){return{}}!function(){var t,e=["abs","acos","acosh","asin","asinh","atan","atanh","atan2","ceil","cbrt","expm1","clz32","cos","cosh","exp","floor","fround","hypot","imul","log","log1p","log2","log10","max","min","pow","random","round","sign","sin","sinh","sqrt","tan","tanh","trunc","E","LN10","LN2","LOG10E","LOG2E","PI","SQRT1_2","SQRT2"],r=e.length;for(t=0;t<r;t+=1)BMMath[e[t]]=Math[e[t]]}(),BMMath.random=Math.random,BMMath.abs=function(t){if("object"===typeof t&&t.length){var e,r=createSizedArray(t.length),i=t.length;for(e=0;e<i;e+=1)r[e]=Math.abs(t[e]);return r}return Math.abs(t)};var defaultCurveSegments=150,degToRads=Math.PI/180,roundCorner=.5519;function roundValues(t){bm_rnd=t?Math.round:function(t){return t}}function styleDiv(t){t.style.position="absolute",t.style.top=0,t.style.left=0,t.style.display="block",t.style.transformOrigin=t.style.webkitTransformOrigin="0 0",t.style.backfaceVisibility=t.style.webkitBackfaceVisibility="visible",t.style.transformStyle=t.style.webkitTransformStyle=t.style.mozTransformStyle="preserve-3d"}function BMEnterFrameEvent(t,e,r,i){this.type=t,this.currentTime=e,this.totalTime=r,this.direction=i<0?-1:1}function BMCompleteEvent(t,e){this.type=t,this.direction=e<0?-1:1}function BMCompleteLoopEvent(t,e,r,i){this.type=t,this.currentLoop=r,this.totalLoops=e,this.direction=i<0?-1:1}function BMSegmentStartEvent(t,e,r){this.type=t,this.firstFrame=e,this.totalFrames=r}function BMDestroyEvent(t,e){this.type=t,this.target=e}roundValues(!1);var createElementID=(_count=0,function(){return"__lottie_element_"+ ++_count}),_count;function HSVtoRGB(t,e,r){var i,s,a,n,o,h,p,l;switch(h=r*(1-e),p=r*(1-(o=6*t-(n=Math.floor(6*t)))*e),l=r*(1-(1-o)*e),n%6){case 0:i=r,s=l,a=h;break;case 1:i=p,s=r,a=h;break;case 2:i=h,s=r,a=l;break;case 3:i=h,s=p,a=r;break;case 4:i=l,s=h,a=r;break;case 5:i=r,s=h,a=p}return[i,s,a]}function RGBtoHSV(t,e,r){var i,s=Math.max(t,e,r),a=Math.min(t,e,r),n=s-a,o=0===s?0:n/s,h=s/255;switch(s){case a:i=0;break;case t:i=e-r+n*(e<r?6:0),i/=6*n;break;case e:i=r-t+2*n,i/=6*n;break;case r:i=t-e+4*n,i/=6*n}return[i,o,h]}function addSaturationToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[1]+=e,r[1]>1?r[1]=1:r[1]<=0&&(r[1]=0),HSVtoRGB(r[0],r[1],r[2])}function addBrightnessToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[2]+=e,r[2]>1?r[2]=1:r[2]<0&&(r[2]=0),HSVtoRGB(r[0],r[1],r[2])}function addHueToRGB(t,e){var r=RGBtoHSV(255*t[0],255*t[1],255*t[2]);return r[0]+=e/360,r[0]>1?r[0]-=1:r[0]<0&&(r[0]+=1),HSVtoRGB(r[0],r[1],r[2])}var rgbToHex=function(){var t,e,r=[];for(t=0;t<256;t+=1)e=t.toString(16),r[t]=1==e.length?"0"+e:e;return function(t,e,i){return t<0&&(t=0),e<0&&(e=0),i<0&&(i=0),"#"+r[t]+r[e]+r[i]}}();function BaseEvent(){}BaseEvent.prototype={triggerEvent:function(t,e){if(this._cbs[t])for(var r=this._cbs[t].length,i=0;i<r;i++)this._cbs[t][i](e)},addEventListener:function(t,e){return this._cbs[t]||(this._cbs[t]=[]),this._cbs[t].push(e),function(){this.removeEventListener(t,e)}.bind(this)},removeEventListener:function(t,e){if(e){if(this._cbs[t]){for(var r=0,i=this._cbs[t].length;r<i;)this._cbs[t][r]===e&&(this._cbs[t].splice(r,1),r-=1,i-=1),r+=1;this._cbs[t].length||(this._cbs[t]=null)}}else this._cbs[t]=null}};var createTypedArray=function(){return"function"==typeof Uint8ClampedArray&&"function"==typeof Float32Array?function(t,e){return"float32"===t?new Float32Array(e):"int16"===t?new Int16Array(e):"uint8c"===t?new Uint8ClampedArray(e):void 0}:function(t,e){var r,i=0,s=[];switch(t){case"int16":case"uint8c":r=1;break;default:r=1.1}for(i=0;i<e;i+=1)s.push(r);return s}}();function createSizedArray(t){return Array.apply(null,{length:t})}function createNS(t){return document.createElementNS(svgNS,t)}function createTag(t){return document.createElement(t)}function DynamicPropertyContainer(){}DynamicPropertyContainer.prototype={addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&(this.dynamicProperties.push(t),this.container.addDynamicProperty(this),this._isAnimated=!0)},iterateDynamicProperties:function(){this._mdf=!1;var t,e=this.dynamicProperties.length;for(t=0;t<e;t+=1)this.dynamicProperties[t].getValue(),this.dynamicProperties[t]._mdf&&(this._mdf=!0)},initDynamicPropertyContainer:function(t){this.container=t,this.dynamicProperties=[],this._mdf=!1,this._isAnimated=!1}};var getBlendMode=(blendModeEnums={0:"source-over",1:"multiply",2:"screen",3:"overlay",4:"darken",5:"lighten",6:"color-dodge",7:"color-burn",8:"hard-light",9:"soft-light",10:"difference",11:"exclusion",12:"hue",13:"saturation",14:"color",15:"luminosity"},function(t){return blendModeEnums[t]||""}),blendModeEnums,Matrix=function(){var t=Math.cos,e=Math.sin,r=Math.tan,i=Math.round;function s(){return this.props[0]=1,this.props[1]=0,this.props[2]=0,this.props[3]=0,this.props[4]=0,this.props[5]=1,this.props[6]=0,this.props[7]=0,this.props[8]=0,this.props[9]=0,this.props[10]=1,this.props[11]=0,this.props[12]=0,this.props[13]=0,this.props[14]=0,this.props[15]=1,this}function a(r){if(0===r)return this;var i=t(r),s=e(r);return this._t(i,-s,0,0,s,i,0,0,0,0,1,0,0,0,0,1)}function n(r){if(0===r)return this;var i=t(r),s=e(r);return this._t(1,0,0,0,0,i,-s,0,0,s,i,0,0,0,0,1)}function o(r){if(0===r)return this;var i=t(r),s=e(r);return this._t(i,0,s,0,0,1,0,0,-s,0,i,0,0,0,0,1)}function h(r){if(0===r)return this;var i=t(r),s=e(r);return this._t(i,-s,0,0,s,i,0,0,0,0,1,0,0,0,0,1)}function p(t,e){return this._t(1,e,t,1,0,0)}function l(t,e){return this.shear(r(t),r(e))}function f(i,s){var a=t(s),n=e(s);return this._t(a,n,0,0,-n,a,0,0,0,0,1,0,0,0,0,1)._t(1,0,0,0,r(i),1,0,0,0,0,1,0,0,0,0,1)._t(a,-n,0,0,n,a,0,0,0,0,1,0,0,0,0,1)}function m(t,e,r){return r||0===r||(r=1),1===t&&1===e&&1===r?this:this._t(t,0,0,0,0,e,0,0,0,0,r,0,0,0,0,1)}function c(t,e,r,i,s,a,n,o,h,p,l,f,m,c,d,u){return this.props[0]=t,this.props[1]=e,this.props[2]=r,this.props[3]=i,this.props[4]=s,this.props[5]=a,this.props[6]=n,this.props[7]=o,this.props[8]=h,this.props[9]=p,this.props[10]=l,this.props[11]=f,this.props[12]=m,this.props[13]=c,this.props[14]=d,this.props[15]=u,this}function d(t,e,r){return r=r||0,0!==t||0!==e||0!==r?this._t(1,0,0,0,0,1,0,0,0,0,1,0,t,e,r,1):this}function u(t,e,r,i,s,a,n,o,h,p,l,f,m,c,d,u){var y=this.props;if(1===t&&0===e&&0===r&&0===i&&0===s&&1===a&&0===n&&0===o&&0===h&&0===p&&1===l&&0===f)return y[12]=y[12]*t+y[15]*m,y[13]=y[13]*a+y[15]*c,y[14]=y[14]*l+y[15]*d,y[15]=y[15]*u,this._identityCalculated=!1,this;var g=y[0],v=y[1],b=y[2],P=y[3],_=y[4],S=y[5],A=y[6],x=y[7],E=y[8],k=y[9],T=y[10],M=y[11],D=y[12],F=y[13],I=y[14],C=y[15];return y[0]=g*t+v*s+b*h+P*m,y[1]=g*e+v*a+b*p+P*c,y[2]=g*r+v*n+b*l+P*d,y[3]=g*i+v*o+b*f+P*u,y[4]=_*t+S*s+A*h+x*m,y[5]=_*e+S*a+A*p+x*c,y[6]=_*r+S*n+A*l+x*d,y[7]=_*i+S*o+A*f+x*u,y[8]=E*t+k*s+T*h+M*m,y[9]=E*e+k*a+T*p+M*c,y[10]=E*r+k*n+T*l+M*d,y[11]=E*i+k*o+T*f+M*u,y[12]=D*t+F*s+I*h+C*m,y[13]=D*e+F*a+I*p+C*c,y[14]=D*r+F*n+I*l+C*d,y[15]=D*i+F*o+I*f+C*u,this._identityCalculated=!1,this}function y(){return this._identityCalculated||(this._identity=!(1!==this.props[0]||0!==this.props[1]||0!==this.props[2]||0!==this.props[3]||0!==this.props[4]||1!==this.props[5]||0!==this.props[6]||0!==this.props[7]||0!==this.props[8]||0!==this.props[9]||1!==this.props[10]||0!==this.props[11]||0!==this.props[12]||0!==this.props[13]||0!==this.props[14]||1!==this.props[15]),this._identityCalculated=!0),this._identity}function g(t){for(var e=0;e<16;){if(t.props[e]!==this.props[e])return!1;e+=1}return!0}function v(t){var e;for(e=0;e<16;e+=1)t.props[e]=this.props[e]}function b(t){var e;for(e=0;e<16;e+=1)this.props[e]=t[e]}function P(t,e,r){return{x:t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],y:t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],z:t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}}function _(t,e,r){return t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12]}function S(t,e,r){return t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13]}function A(t,e,r){return t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]}function x(t){var e=this.props[0]*this.props[5]-this.props[1]*this.props[4],r=this.props[5]/e,i=-this.props[1]/e,s=-this.props[4]/e,a=this.props[0]/e,n=(this.props[4]*this.props[13]-this.props[5]*this.props[12])/e,o=-(this.props[0]*this.props[13]-this.props[1]*this.props[12])/e;return[t[0]*r+t[1]*s+n,t[0]*i+t[1]*a+o,0]}function E(t){var e,r=t.length,i=[];for(e=0;e<r;e+=1)i[e]=x(t[e]);return i}function k(t,e,r){var i=createTypedArray("float32",6);if(this.isIdentity())i[0]=t[0],i[1]=t[1],i[2]=e[0],i[3]=e[1],i[4]=r[0],i[5]=r[1];else{var s=this.props[0],a=this.props[1],n=this.props[4],o=this.props[5],h=this.props[12],p=this.props[13];i[0]=t[0]*s+t[1]*n+h,i[1]=t[0]*a+t[1]*o+p,i[2]=e[0]*s+e[1]*n+h,i[3]=e[0]*a+e[1]*o+p,i[4]=r[0]*s+r[1]*n+h,i[5]=r[0]*a+r[1]*o+p}return i}function T(t,e,r){return this.isIdentity()?[t,e,r]:[t*this.props[0]+e*this.props[4]+r*this.props[8]+this.props[12],t*this.props[1]+e*this.props[5]+r*this.props[9]+this.props[13],t*this.props[2]+e*this.props[6]+r*this.props[10]+this.props[14]]}function M(t,e){if(this.isIdentity())return t+","+e;var r=this.props;return Math.round(100*(t*r[0]+e*r[4]+r[12]))/100+","+Math.round(100*(t*r[1]+e*r[5]+r[13]))/100}function D(){for(var t=0,e=this.props,r="matrix3d(";t<16;)r+=i(1e4*e[t])/1e4,r+=15===t?")":",",t+=1;return r}function F(t){return t<1e-6&&t>0||t>-1e-6&&t<0?i(1e4*t)/1e4:t}function I(){var t=this.props;return"matrix("+F(t[0])+","+F(t[1])+","+F(t[4])+","+F(t[5])+","+F(t[12])+","+F(t[13])+")"}return function(){this.reset=s,this.rotate=a,this.rotateX=n,this.rotateY=o,this.rotateZ=h,this.skew=l,this.skewFromAxis=f,this.shear=p,this.scale=m,this.setTransform=c,this.translate=d,this.transform=u,this.applyToPoint=P,this.applyToX=_,this.applyToY=S,this.applyToZ=A,this.applyToPointArray=T,this.applyToTriplePoints=k,this.applyToPointStringified=M,this.toCSS=D,this.to2dCSS=I,this.clone=v,this.cloneFromProps=b,this.equals=g,this.inversePoints=E,this.inversePoint=x,this._t=this.transform,this.isIdentity=y,this._identity=!0,this._identityCalculated=!1,this.props=createTypedArray("float32",16),this.reset()}}();!function(t,e){var r,i=this,s=256,a=6,n="random",o=e.pow(s,a),h=e.pow(2,52),p=2*h,l=s-1;function f(t){var e,r=t.length,i=this,a=0,n=i.i=i.j=0,o=i.S=[];for(r||(t=[r++]);a<s;)o[a]=a++;for(a=0;a<s;a++)o[a]=o[n=l&n+t[a%r]+(e=o[a])],o[n]=e;i.g=function(t){for(var e,r=0,a=i.i,n=i.j,o=i.S;t--;)e=o[a=l&a+1],r=r*s+o[l&(o[a]=o[n=l&n+e])+(o[n]=e)];return i.i=a,i.j=n,r}}function m(t,e){return e.i=t.i,e.j=t.j,e.S=t.S.slice(),e}function c(t,e){for(var r,i=t+"",s=0;s<i.length;)e[l&s]=l&(r^=19*e[l&s])+i.charCodeAt(s++);return d(e)}function d(t){return String.fromCharCode.apply(0,t)}e["seed"+n]=function(l,u,y){var g=[],v=c(function t(e,r){var i,s=[],a=typeof e;if(r&&"object"==a)for(i in e)try{s.push(t(e[i],r-1))}catch(n){}return s.length?s:"string"==a?e:e+"\0"}((u=!0===u?{entropy:!0}:u||{}).entropy?[l,d(t)]:null===l?function(){try{if(r)return d(r.randomBytes(s));var e=new Uint8Array(s);return(i.crypto||i.msCrypto).getRandomValues(e),d(e)}catch(o){var a=i.navigator,n=a&&a.plugins;return[+new Date,i,n,i.screen,d(t)]}}():l,3),g),b=new f(g),P=function(){for(var t=b.g(a),e=o,r=0;t<h;)t=(t+r)*s,e*=s,r=b.g(1);for(;t>=p;)t/=2,e/=2,r>>>=1;return(t+r)/e};return P.int32=function(){return 0|b.g(4)},P.quick=function(){return b.g(4)/4294967296},P.double=P,c(d(b.S),t),(u.pass||y||function(t,r,i,s){return s&&(s.S&&m(s,b),t.state=function(){return m(b,{})}),i?(e[n]=t,r):t})(P,v,"global"in u?u.global:this==e,u.state)},c(e.random(),t)}([],BMMath);var BezierFactory=function(){var t={getBezierEasing:function(t,r,i,s,a){var n=a||("bez_"+t+"_"+r+"_"+i+"_"+s).replace(/\./g,"p");if(e[n])return e[n];var o=new c([t,r,i,s]);return e[n]=o,o}},e={};var r=4,i=1e-7,s=10,a=11,n=1/(a-1),o="function"==typeof Float32Array;function h(t,e){return 1-3*e+3*t}function p(t,e){return 3*e-6*t}function l(t){return 3*t}function f(t,e,r){return((h(e,r)*t+p(e,r))*t+l(e))*t}function m(t,e,r){return 3*h(e,r)*t*t+2*p(e,r)*t+l(e)}function c(t){this._p=t,this._mSampleValues=o?new Float32Array(a):new Array(a),this._precomputed=!1,this.get=this.get.bind(this)}return c.prototype={get:function(t){var e=this._p[0],r=this._p[1],i=this._p[2],s=this._p[3];return this._precomputed||this._precompute(),e===r&&i===s?t:0===t?0:1===t?1:f(this._getTForX(t),r,s)},_precompute:function(){var t=this._p[0],e=this._p[1],r=this._p[2],i=this._p[3];this._precomputed=!0,t===e&&r===i||this._calcSampleValues()},_calcSampleValues:function(){for(var t=this._p[0],e=this._p[2],r=0;r<a;++r)this._mSampleValues[r]=f(r*n,t,e)},_getTForX:function(t){for(var e=this._p[0],o=this._p[2],h=this._mSampleValues,p=0,l=1,c=a-1;l!==c&&h[l]<=t;++l)p+=n;var d=p+(t-h[--l])/(h[l+1]-h[l])*n,u=m(d,e,o);return u>=.001?function(t,e,i,s){for(var a=0;a<r;++a){var n=m(e,i,s);if(0===n)return e;e-=(f(e,i,s)-t)/n}return e}(t,d,e,o):0===u?d:function(t,e,r,a,n){var o,h,p=0;do{(o=f(h=e+(r-e)/2,a,n)-t)>0?r=h:e=h}while(Math.abs(o)>i&&++p<s);return h}(t,p,p+n,e,o)}},t}();function extendPrototype(t,e){var r,i,s=t.length;for(r=0;r<s;r+=1)for(var a in i=t[r].prototype)i.hasOwnProperty(a)&&(e.prototype[a]=i[a])}function getDescriptor(t,e){return Object.getOwnPropertyDescriptor(t,e)}function createProxyFunction(t){function e(){}return e.prototype=t,e}function bezFunction(){Math;function t(t,e,r,i,s,a){var n=t*i+e*s+r*a-s*i-a*t-r*e;return n>-.001&&n<.001}var e=function(t,e,r,i){var s,a,n,o,h,p,l=defaultCurveSegments,f=0,m=[],c=[],d=bezier_length_pool.newElement();for(n=r.length,s=0;s<l;s+=1){for(h=s/(l-1),p=0,a=0;a<n;a+=1)o=bm_pow(1-h,3)*t[a]+3*bm_pow(1-h,2)*h*r[a]+3*(1-h)*bm_pow(h,2)*i[a]+bm_pow(h,3)*e[a],m[a]=o,null!==c[a]&&(p+=bm_pow(m[a]-c[a],2)),c[a]=m[a];p&&(f+=p=bm_sqrt(p)),d.percents[s]=h,d.lengths[s]=f}return d.addedLength=f,d};function r(t){this.segmentLength=0,this.points=new Array(t)}function i(t,e){this.partialLength=t,this.point=e}var s,a=(s={},function(e,a,n,o){var h=(e[0]+"_"+e[1]+"_"+a[0]+"_"+a[1]+"_"+n[0]+"_"+n[1]+"_"+o[0]+"_"+o[1]).replace(/\./g,"p");if(!s[h]){var p,l,f,m,c,d,u,y=defaultCurveSegments,g=0,v=null;2===e.length&&(e[0]!=a[0]||e[1]!=a[1])&&t(e[0],e[1],a[0],a[1],e[0]+n[0],e[1]+n[1])&&t(e[0],e[1],a[0],a[1],a[0]+o[0],a[1]+o[1])&&(y=2);var b=new r(y);for(f=n.length,p=0;p<y;p+=1){for(u=createSizedArray(f),c=p/(y-1),d=0,l=0;l<f;l+=1)m=bm_pow(1-c,3)*e[l]+3*bm_pow(1-c,2)*c*(e[l]+n[l])+3*(1-c)*bm_pow(c,2)*(a[l]+o[l])+bm_pow(c,3)*a[l],u[l]=m,null!==v&&(d+=bm_pow(u[l]-v[l],2));g+=d=bm_sqrt(d),b.points[p]=new i(d,u),v=u}b.segmentLength=g,s[h]=b}return s[h]});function n(t,e){var r=e.percents,i=e.lengths,s=r.length,a=bm_floor((s-1)*t),n=t*e.addedLength,o=0;if(a===s-1||0===a||n===i[a])return r[a];for(var h=i[a]>n?-1:1,p=!0;p;)if(i[a]<=n&&i[a+1]>n?(o=(n-i[a])/(i[a+1]-i[a]),p=!1):a+=h,a<0||a>=s-1){if(a===s-1)return r[a];p=!1}return r[a]+(r[a+1]-r[a])*o}var o=createTypedArray("float32",8);return{getSegmentsLength:function(t){var r,i=segments_length_pool.newElement(),s=t.c,a=t.v,n=t.o,o=t.i,h=t._length,p=i.lengths,l=0;for(r=0;r<h-1;r+=1)p[r]=e(a[r],a[r+1],n[r],o[r+1]),l+=p[r].addedLength;return s&&h&&(p[r]=e(a[r],a[0],n[r],o[0]),l+=p[r].addedLength),i.totalLength=l,i},getNewSegment:function(t,e,r,i,s,a,h){var p,l=n(s=s<0?0:s>1?1:s,h),f=n(a=a>1?1:a,h),m=t.length,c=1-l,d=1-f,u=c*c*c,y=l*c*c*3,g=l*l*c*3,v=l*l*l,b=c*c*d,P=l*c*d+c*l*d+c*c*f,_=l*l*d+c*l*f+l*c*f,S=l*l*f,A=c*d*d,x=l*d*d+c*f*d+c*d*f,E=l*f*d+c*f*f+l*d*f,k=l*f*f,T=d*d*d,M=f*d*d+d*f*d+d*d*f,D=f*f*d+d*f*f+f*d*f,F=f*f*f;for(p=0;p<m;p+=1)o[4*p]=Math.round(1e3*(u*t[p]+y*r[p]+g*i[p]+v*e[p]))/1e3,o[4*p+1]=Math.round(1e3*(b*t[p]+P*r[p]+_*i[p]+S*e[p]))/1e3,o[4*p+2]=Math.round(1e3*(A*t[p]+x*r[p]+E*i[p]+k*e[p]))/1e3,o[4*p+3]=Math.round(1e3*(T*t[p]+M*r[p]+D*i[p]+F*e[p]))/1e3;return o},getPointInSegment:function(t,e,r,i,s,a){var o=n(s,a),h=1-o;return[Math.round(1e3*(h*h*h*t[0]+(o*h*h+h*o*h+h*h*o)*r[0]+(o*o*h+h*o*o+o*h*o)*i[0]+o*o*o*e[0]))/1e3,Math.round(1e3*(h*h*h*t[1]+(o*h*h+h*o*h+h*h*o)*r[1]+(o*o*h+h*o*o+o*h*o)*i[1]+o*o*o*e[1]))/1e3]},buildBezierData:a,pointOnLine2D:t,pointOnLine3D:function(e,r,i,s,a,n,o,h,p){if(0===i&&0===n&&0===p)return t(e,r,s,a,o,h);var l,f=Math.sqrt(Math.pow(s-e,2)+Math.pow(a-r,2)+Math.pow(n-i,2)),m=Math.sqrt(Math.pow(o-e,2)+Math.pow(h-r,2)+Math.pow(p-i,2)),c=Math.sqrt(Math.pow(o-s,2)+Math.pow(h-a,2)+Math.pow(p-n,2));return(l=f>m?f>c?f-m-c:c-m-f:c>m?c-m-f:m-f-c)>-1e-4&&l<1e-4}}}!function(){for(var t=0,e=["ms","moz","webkit","o"],r=0;r<e.length&&!window.requestAnimationFrame;++r)window.requestAnimationFrame=window[e[r]+"RequestAnimationFrame"],window.cancelAnimationFrame=window[e[r]+"CancelAnimationFrame"]||window[e[r]+"CancelRequestAnimationFrame"];window.requestAnimationFrame||(window.requestAnimationFrame=function(e,r){var i=(new Date).getTime(),s=Math.max(0,16-(i-t)),a=setTimeout(function(){e(i+s)},s);return t=i+s,a}),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(t){clearTimeout(t)})}();var bez=bezFunction();function dataFunctionManager(){function t(t,e){for(var r=0,i=e.length;r<i;){if(e[r].id===t)return e[r].layers.__used?JSON.parse(JSON.stringify(e[r].layers)):(e[r].layers.__used=!0,e[r].layers);r+=1}}function e(t){var i,s,a;for(i=t.length-1;i>=0;i-=1)if("sh"==t[i].ty){if(t[i].ks.k.i)r(t[i].ks.k);else for(a=t[i].ks.k.length,s=0;s<a;s+=1)t[i].ks.k[s].s&&r(t[i].ks.k[s].s[0]),t[i].ks.k[s].e&&r(t[i].ks.k[s].e[0]);!0}else"gr"==t[i].ty&&e(t[i].it)}function r(t){var e,r=t.i.length;for(e=0;e<r;e+=1)t.i[e][0]+=t.v[e][0],t.i[e][1]+=t.v[e][1],t.o[e][0]+=t.v[e][0],t.o[e][1]+=t.v[e][1]}function i(t,e){var r=e?e.split("."):[100,100,100];return t[0]>r[0]||!(r[0]>t[0])&&(t[1]>r[1]||!(r[1]>t[1])&&(t[2]>r[2]||!(r[2]>t[2])&&void 0))}var s,a=function(){var t=[4,4,14];function e(t){var e,r,i,s=t.length;for(e=0;e<s;e+=1)5===t[e].ty&&(r=t[e],i=void 0,i=r.t.d,r.t.d={k:[{s:i,t:0}]})}return function(r){if(i(t,r.v)&&(e(r.layers),r.assets)){var s,a=r.assets.length;for(s=0;s<a;s+=1)r.assets[s].layers&&e(r.assets[s].layers)}}}(),n=(s=[4,7,99],function(t){if(t.chars&&!i(s,t.v)){var e,a,n,o,h,p=t.chars.length;for(e=0;e<p;e+=1)if(t.chars[e].data&&t.chars[e].data.shapes)for(n=(h=t.chars[e].data.shapes[0].it).length,a=0;a<n;a+=1)(o=h[a].ks.k).__converted||(r(h[a].ks.k),o.__converted=!0)}}),o=function(){var t=[4,1,9];function e(t){var r,i,s,a=t.length;for(r=0;r<a;r+=1)if("gr"===t[r].ty)e(t[r].it);else if("fl"===t[r].ty||"st"===t[r].ty)if(t[r].c.k&&t[r].c.k[0].i)for(s=t[r].c.k.length,i=0;i<s;i+=1)t[r].c.k[i].s&&(t[r].c.k[i].s[0]/=255,t[r].c.k[i].s[1]/=255,t[r].c.k[i].s[2]/=255,t[r].c.k[i].s[3]/=255),t[r].c.k[i].e&&(t[r].c.k[i].e[0]/=255,t[r].c.k[i].e[1]/=255,t[r].c.k[i].e[2]/=255,t[r].c.k[i].e[3]/=255);else t[r].c.k[0]/=255,t[r].c.k[1]/=255,t[r].c.k[2]/=255,t[r].c.k[3]/=255}function r(t){var r,i=t.length;for(r=0;r<i;r+=1)4===t[r].ty&&e(t[r].shapes)}return function(e){if(i(t,e.v)&&(r(e.layers),e.assets)){var s,a=e.assets.length;for(s=0;s<a;s+=1)e.assets[s].layers&&r(e.assets[s].layers)}}}(),h=function(){var t=[4,4,18];function e(t){var r,i,s;for(r=t.length-1;r>=0;r-=1)if("sh"==t[r].ty){if(t[r].ks.k.i)t[r].ks.k.c=t[r].closed;else for(s=t[r].ks.k.length,i=0;i<s;i+=1)t[r].ks.k[i].s&&(t[r].ks.k[i].s[0].c=t[r].closed),t[r].ks.k[i].e&&(t[r].ks.k[i].e[0].c=t[r].closed);!0}else"gr"==t[r].ty&&e(t[r].it)}function r(t){var r,i,s,a,n,o,h=t.length;for(i=0;i<h;i+=1){if((r=t[i]).hasMask){var p=r.masksProperties;for(a=p.length,s=0;s<a;s+=1)if(p[s].pt.k.i)p[s].pt.k.c=p[s].cl;else for(o=p[s].pt.k.length,n=0;n<o;n+=1)p[s].pt.k[n].s&&(p[s].pt.k[n].s[0].c=p[s].cl),p[s].pt.k[n].e&&(p[s].pt.k[n].e[0].c=p[s].cl)}4===r.ty&&e(r.shapes)}}return function(e){if(i(t,e.v)&&(r(e.layers),e.assets)){var s,a=e.assets.length;for(s=0;s<a;s+=1)e.assets[s].layers&&r(e.assets[s].layers)}}}();var p={};return p.completeData=function(i,s){i.__complete||(o(i),a(i),n(i),h(i),function i(s,a,n){var o,h,p,l,f,m,c,d=s.length;for(h=0;h<d;h+=1)if("ks"in(o=s[h])&&!o.completed){if(o.completed=!0,o.tt&&(s[h-1].td=o.tt),o.hasMask){var u=o.masksProperties;for(l=u.length,p=0;p<l;p+=1)if(u[p].pt.k.i)r(u[p].pt.k);else for(m=u[p].pt.k.length,f=0;f<m;f+=1)u[p].pt.k[f].s&&r(u[p].pt.k[f].s[0]),u[p].pt.k[f].e&&r(u[p].pt.k[f].e[0])}0===o.ty?(o.layers=t(o.refId,a),i(o.layers,a,n)):4===o.ty?e(o.shapes):5==o.ty&&(0!==(c=o).t.a.length||"m"in c.t.p||(c.singleShape=!0))}}(i.layers,i.assets,s),i.__complete=!0)},p}var dataManager=dataFunctionManager(),FontManager=function(){var t=5e3,e={w:0,size:0,shapes:[]},r=[];function i(t,e){var r=createTag("span");r.style.fontFamily=e;var i=createTag("span");i.innerHTML="giItT1WQy@!-/#",r.style.position="absolute",r.style.left="-10000px",r.style.top="-10000px",r.style.fontSize="300px",r.style.fontVariant="normal",r.style.fontStyle="normal",r.style.fontWeight="normal",r.style.letterSpacing="0",r.appendChild(i),document.body.appendChild(r);var s=i.offsetWidth;return i.style.fontFamily=t+", "+e,{node:i,w:s,parent:r}}function s(t,e){var r=createNS("text");return r.style.fontSize="100px",r.setAttribute("font-family",e.fFamily),r.setAttribute("font-style",e.fStyle),r.setAttribute("font-weight",e.fWeight),r.textContent="1",e.fClass?(r.style.fontFamily="inherit",r.setAttribute("class",e.fClass)):r.style.fontFamily=e.fFamily,t.appendChild(r),createTag("canvas").getContext("2d").font=e.fWeight+" "+e.fStyle+" 100px "+e.fFamily,r}r=r.concat([2304,2305,2306,2307,2362,2363,2364,2364,2366,2367,2368,2369,2370,2371,2372,2373,2374,2375,2376,2377,2378,2379,2380,2381,2382,2383,2387,2388,2389,2390,2391,2402,2403]);var a=function(){this.fonts=[],this.chars=null,this.typekitLoaded=0,this.isLoaded=!1,this.initTime=Date.now()};return a.getCombinedCharacterCodes=function(){return r},a.prototype.addChars=function(t){if(t){this.chars||(this.chars=[]);var e,r,i,s=t.length,a=this.chars.length;for(e=0;e<s;e+=1){for(r=0,i=!1;r<a;)this.chars[r].style===t[e].style&&this.chars[r].fFamily===t[e].fFamily&&this.chars[r].ch===t[e].ch&&(i=!0),r+=1;i||(this.chars.push(t[e]),a+=1)}}},a.prototype.addFonts=function(t,e){if(t){if(this.chars)return this.isLoaded=!0,void(this.fonts=t.list);var r,a=t.list,n=a.length,o=n;for(r=0;r<n;r+=1){var h,p,l=!0;if(a[r].loaded=!1,a[r].monoCase=i(a[r].fFamily,"monospace"),a[r].sansCase=i(a[r].fFamily,"sans-serif"),a[r].fPath){if("p"===a[r].fOrigin||3===a[r].origin){if((h=document.querySelectorAll('style[f-forigin="p"][f-family="'+a[r].fFamily+'"], style[f-origin="3"][f-family="'+a[r].fFamily+'"]')).length>0&&(l=!1),l){var f=createTag("style");f.setAttribute("f-forigin",a[r].fOrigin),f.setAttribute("f-origin",a[r].origin),f.setAttribute("f-family",a[r].fFamily),f.type="text/css",f.innerHTML="@font-face {font-family: "+a[r].fFamily+"; font-style: normal; src: url('"+a[r].fPath+"');}",e.appendChild(f)}}else if("g"===a[r].fOrigin||1===a[r].origin){for(h=document.querySelectorAll('link[f-forigin="g"], link[f-origin="1"]'),p=0;p<h.length;p++)-1!==h[p].href.indexOf(a[r].fPath)&&(l=!1);if(l){var m=createTag("link");m.setAttribute("f-forigin",a[r].fOrigin),m.setAttribute("f-origin",a[r].origin),m.type="text/css",m.rel="stylesheet",m.href=a[r].fPath,document.body.appendChild(m)}}else if("t"===a[r].fOrigin||2===a[r].origin){for(h=document.querySelectorAll('script[f-forigin="t"], script[f-origin="2"]'),p=0;p<h.length;p++)a[r].fPath===h[p].src&&(l=!1);if(l){var c=createTag("link");c.setAttribute("f-forigin",a[r].fOrigin),c.setAttribute("f-origin",a[r].origin),c.setAttribute("rel","stylesheet"),c.setAttribute("href",a[r].fPath),e.appendChild(c)}}}else a[r].loaded=!0,o-=1;a[r].helper=s(e,a[r]),a[r].cache={},this.fonts.push(a[r])}0===o?this.isLoaded=!0:setTimeout(this.checkLoadedFonts.bind(this),100)}else this.isLoaded=!0},a.prototype.getCharData=function(t,r,i){for(var s=0,a=this.chars.length;s<a;){if(this.chars[s].ch===t&&this.chars[s].style===r&&this.chars[s].fFamily===i)return this.chars[s];s+=1}return console&&console.warn&&console.warn("Missing character from exported characters list: ",t,r,i),e},a.prototype.getFontByName=function(t){for(var e=0,r=this.fonts.length;e<r;){if(this.fonts[e].fName===t)return this.fonts[e];e+=1}return this.fonts[0]},a.prototype.measureText=function(t,e,r){var i=this.getFontByName(e),s=t.charCodeAt(0);if(!i.cache[s+1]){var a=i.helper;if(" "===t){a.textContent="|"+t+"|";var n=a.getComputedTextLength();a.textContent="||";var o=a.getComputedTextLength();i.cache[s+1]=(n-o)/100}else a.textContent=t,i.cache[s+1]=a.getComputedTextLength()/100}return i.cache[s+1]*r},a.prototype.checkLoadedFonts=function(){var e,r,i,s=this.fonts.length,a=s;for(e=0;e<s;e+=1)this.fonts[e].loaded?a-=1:"n"===this.fonts[e].fOrigin||0===this.fonts[e].origin?this.fonts[e].loaded=!0:(r=this.fonts[e].monoCase.node,i=this.fonts[e].monoCase.w,r.offsetWidth!==i?(a-=1,this.fonts[e].loaded=!0):(r=this.fonts[e].sansCase.node,i=this.fonts[e].sansCase.w,r.offsetWidth!==i&&(a-=1,this.fonts[e].loaded=!0)),this.fonts[e].loaded&&(this.fonts[e].sansCase.parent.parentNode.removeChild(this.fonts[e].sansCase.parent),this.fonts[e].monoCase.parent.parentNode.removeChild(this.fonts[e].monoCase.parent)));0!==a&&Date.now()-this.initTime<t?setTimeout(this.checkLoadedFonts.bind(this),20):setTimeout(function(){this.isLoaded=!0}.bind(this),0)},a.prototype.loaded=function(){return this.isLoaded},a}(),PropertyFactory=function(){var t=initialDefaultFrame,e=Math.abs;function r(t,e){var r,s=this.offsetTime;"multidimensional"===this.propType&&(r=createTypedArray("float32",this.pv.length));for(var a,n,o,h,p,l,f,m,c=e.lastIndex,d=c,u=this.keyframes.length-1,y=!0;y;){if(a=this.keyframes[d],n=this.keyframes[d+1],d===u-1&&t>=n.t-s){a.h&&(a=n),c=0;break}if(n.t-s>t){c=d;break}d<u-1?d+=1:(c=0,y=!1)}var g,v,b,P,_,S,A,x,E,k,T=n.t-s,M=a.t-s;if(a.to){a.bezierData||(a.bezierData=bez.buildBezierData(a.s,n.s||a.e,a.to,a.ti));var D=a.bezierData;if(t>=T||t<M){var F=t>=T?D.points.length-1:0;for(h=D.points[F].point.length,o=0;o<h;o+=1)r[o]=D.points[F].point[o]}else{a.__fnct?m=a.__fnct:(m=BezierFactory.getBezierEasing(a.o.x,a.o.y,a.i.x,a.i.y,a.n).get,a.__fnct=m),p=m((t-M)/(T-M));var I,C=D.segmentLength*p,w=e.lastFrame<t&&e._lastKeyframeIndex===d?e._lastAddedLength:0;for(f=e.lastFrame<t&&e._lastKeyframeIndex===d?e._lastPoint:0,y=!0,l=D.points.length;y;){if(w+=D.points[f].partialLength,0===C||0===p||f===D.points.length-1){for(h=D.points[f].point.length,o=0;o<h;o+=1)r[o]=D.points[f].point[o];break}if(C>=w&&C<w+D.points[f+1].partialLength){for(I=(C-w)/D.points[f+1].partialLength,h=D.points[f].point.length,o=0;o<h;o+=1)r[o]=D.points[f].point[o]+(D.points[f+1].point[o]-D.points[f].point[o])*I;break}f<l-1?f+=1:y=!1}e._lastPoint=f,e._lastAddedLength=w-D.points[f].partialLength,e._lastKeyframeIndex=d}}else{var V,R,L,G,N;if(u=a.s.length,g=n.s||a.e,this.sh&&1!==a.h)if(t>=T)r[0]=g[0],r[1]=g[1],r[2]=g[2];else if(t<=M)r[0]=a.s[0],r[1]=a.s[1],r[2]=a.s[2];else{var B=i(a.s),z=i(g);v=r,b=function(t,e,r){var i,s,a,n,o,h=[],p=t[0],l=t[1],f=t[2],m=t[3],c=e[0],d=e[1],u=e[2],y=e[3];(s=p*c+l*d+f*u+m*y)<0&&(s=-s,c=-c,d=-d,u=-u,y=-y);1-s>1e-6?(i=Math.acos(s),a=Math.sin(i),n=Math.sin((1-r)*i)/a,o=Math.sin(r*i)/a):(n=1-r,o=r);return h[0]=n*p+o*c,h[1]=n*l+o*d,h[2]=n*f+o*u,h[3]=n*m+o*y,h}(B,z,(t-M)/(T-M)),P=b[0],_=b[1],S=b[2],A=b[3],x=Math.atan2(2*_*A-2*P*S,1-2*_*_-2*S*S),E=Math.asin(2*P*_+2*S*A),k=Math.atan2(2*P*A-2*_*S,1-2*P*P-2*S*S),v[0]=x/degToRads,v[1]=E/degToRads,v[2]=k/degToRads}else for(d=0;d<u;d+=1)1!==a.h&&(t>=T?p=1:t<M?p=0:(a.o.x.constructor===Array?(a.__fnct||(a.__fnct=[]),a.__fnct[d]?m=a.__fnct[d]:(V=void 0===a.o.x[d]?a.o.x[0]:a.o.x[d],R=void 0===a.o.y[d]?a.o.y[0]:a.o.y[d],L=void 0===a.i.x[d]?a.i.x[0]:a.i.x[d],G=void 0===a.i.y[d]?a.i.y[0]:a.i.y[d],m=BezierFactory.getBezierEasing(V,R,L,G).get,a.__fnct[d]=m)):a.__fnct?m=a.__fnct:(V=a.o.x,R=a.o.y,L=a.i.x,G=a.i.y,m=BezierFactory.getBezierEasing(V,R,L,G).get,a.__fnct=m),p=m((t-M)/(T-M)))),g=n.s||a.e,N=1===a.h?a.s[d]:a.s[d]+(g[d]-a.s[d])*p,1===u?r=N:r[d]=N}return e.lastIndex=c,r}function i(t){var e=t[0]*degToRads,r=t[1]*degToRads,i=t[2]*degToRads,s=Math.cos(e/2),a=Math.cos(r/2),n=Math.cos(i/2),o=Math.sin(e/2),h=Math.sin(r/2),p=Math.sin(i/2);return[o*h*n+s*a*p,o*a*n+s*h*p,s*h*n-o*a*p,s*a*n-o*h*p]}function s(){var e=this.comp.renderedFrame-this.offsetTime,r=this.keyframes[0].t-this.offsetTime,i=this.keyframes[this.keyframes.length-1].t-this.offsetTime;if(!(e===this._caching.lastFrame||this._caching.lastFrame!==t&&(this._caching.lastFrame>=i&&e>=i||this._caching.lastFrame<r&&e<r))){this._caching.lastFrame>=e&&(this._caching._lastKeyframeIndex=-1,this._caching.lastIndex=0);var s=this.interpolateValue(e,this._caching);this.pv=s}return this._caching.lastFrame=e,this.pv}function a(t){var r;if("unidimensional"===this.propType)r=t*this.mult,e(this.v-r)>1e-5&&(this.v=r,this._mdf=!0);else for(var i=0,s=this.v.length;i<s;)r=t[i]*this.mult,e(this.v[i]-r)>1e-5&&(this.v[i]=r,this._mdf=!0),i+=1}function n(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{this.lock=!0,this._mdf=this._isFirstFrame;var t,e=this.effectsSequence.length,r=this.kf?this.pv:this.data.k;for(t=0;t<e;t+=1)r=this.effectsSequence[t](r);this.setVValue(r),this._isFirstFrame=!1,this.lock=!1,this.frameId=this.elem.globalData.frameId}}function o(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function h(t,e,r,i){this.propType="unidimensional",this.mult=r||1,this.data=e,this.v=r?e.k*r:e.k,this.pv=e.k,this._mdf=!1,this.elem=t,this.container=i,this.comp=t.comp,this.k=!1,this.kf=!1,this.vel=0,this.effectsSequence=[],this._isFirstFrame=!0,this.getValue=n,this.setVValue=a,this.addEffect=o}function p(t,e,r,i){this.propType="multidimensional",this.mult=r||1,this.data=e,this._mdf=!1,this.elem=t,this.container=i,this.comp=t.comp,this.k=!1,this.kf=!1,this.frameId=-1;var s,h=e.k.length;this.v=createTypedArray("float32",h),this.pv=createTypedArray("float32",h);createTypedArray("float32",h);for(this.vel=createTypedArray("float32",h),s=0;s<h;s+=1)this.v[s]=e.k[s]*this.mult,this.pv[s]=e.k[s];this._isFirstFrame=!0,this.effectsSequence=[],this.getValue=n,this.setVValue=a,this.addEffect=o}function l(e,i,h,p){this.propType="unidimensional",this.keyframes=i.k,this.offsetTime=e.data.st,this.frameId=-1,this._caching={lastFrame:t,lastIndex:0,value:0,_lastKeyframeIndex:-1},this.k=!0,this.kf=!0,this.data=i,this.mult=h||1,this.elem=e,this.container=p,this.comp=e.comp,this.v=t,this.pv=t,this._isFirstFrame=!0,this.getValue=n,this.setVValue=a,this.interpolateValue=r,this.effectsSequence=[s.bind(this)],this.addEffect=o}function f(e,i,h,p){this.propType="multidimensional";var l,f,m,c,d,u=i.k.length;for(l=0;l<u-1;l+=1)i.k[l].to&&i.k[l].s&&i.k[l].e&&(f=i.k[l].s,m=i.k[l].e,c=i.k[l].to,d=i.k[l].ti,(2===f.length&&(f[0]!==m[0]||f[1]!==m[1])&&bez.pointOnLine2D(f[0],f[1],m[0],m[1],f[0]+c[0],f[1]+c[1])&&bez.pointOnLine2D(f[0],f[1],m[0],m[1],m[0]+d[0],m[1]+d[1])||3===f.length&&(f[0]!==m[0]||f[1]!==m[1]||f[2]!==m[2])&&bez.pointOnLine3D(f[0],f[1],f[2],m[0],m[1],m[2],f[0]+c[0],f[1]+c[1],f[2]+c[2])&&bez.pointOnLine3D(f[0],f[1],f[2],m[0],m[1],m[2],m[0]+d[0],m[1]+d[1],m[2]+d[2]))&&(i.k[l].to=null,i.k[l].ti=null),f[0]===m[0]&&f[1]===m[1]&&0===c[0]&&0===c[1]&&0===d[0]&&0===d[1]&&(2===f.length||f[2]===m[2]&&0===c[2]&&0===d[2])&&(i.k[l].to=null,i.k[l].ti=null));this.effectsSequence=[s.bind(this)],this.keyframes=i.k,this.offsetTime=e.data.st,this.k=!0,this.kf=!0,this._isFirstFrame=!0,this.mult=h||1,this.elem=e,this.container=p,this.comp=e.comp,this.getValue=n,this.setVValue=a,this.interpolateValue=r,this.frameId=-1;var y=i.k[0].s.length;for(this.v=createTypedArray("float32",y),this.pv=createTypedArray("float32",y),l=0;l<y;l+=1)this.v[l]=t,this.pv[l]=t;this._caching={lastFrame:t,lastIndex:0,value:createTypedArray("float32",y)},this.addEffect=o}return{getProp:function(t,e,r,i,s){var a;if(e.k.length)if("number"==typeof e.k[0])a=new p(t,e,i,s);else switch(r){case 0:a=new l(t,e,i,s);break;case 1:a=new f(t,e,i,s)}else a=new h(t,e,i,s);return a.effectsSequence.length&&s.addDynamicProperty(a),a}}}(),TransformPropertyFactory=function(){function t(t,e,r){if(this.elem=t,this.frameId=-1,this.propType="transform",this.data=e,this.v=new Matrix,this.pre=new Matrix,this.appliedTransformations=0,this.initDynamicPropertyContainer(r||t),e.p&&e.p.s?(this.px=PropertyFactory.getProp(t,e.p.x,0,0,this),this.py=PropertyFactory.getProp(t,e.p.y,0,0,this),e.p.z&&(this.pz=PropertyFactory.getProp(t,e.p.z,0,0,this))):this.p=PropertyFactory.getProp(t,e.p||{k:[0,0,0]},1,0,this),e.rx){if(this.rx=PropertyFactory.getProp(t,e.rx,0,degToRads,this),this.ry=PropertyFactory.getProp(t,e.ry,0,degToRads,this),this.rz=PropertyFactory.getProp(t,e.rz,0,degToRads,this),e.or.k[0].ti){var i,s=e.or.k.length;for(i=0;i<s;i+=1)e.or.k[i].to=e.or.k[i].ti=null}this.or=PropertyFactory.getProp(t,e.or,1,degToRads,this),this.or.sh=!0}else this.r=PropertyFactory.getProp(t,e.r||{k:0},0,degToRads,this);e.sk&&(this.sk=PropertyFactory.getProp(t,e.sk,0,degToRads,this),this.sa=PropertyFactory.getProp(t,e.sa,0,degToRads,this)),this.a=PropertyFactory.getProp(t,e.a||{k:[0,0,0]},1,0,this),this.s=PropertyFactory.getProp(t,e.s||{k:[100,100,100]},1,.01,this),e.o?this.o=PropertyFactory.getProp(t,e.o,0,.01,t):this.o={_mdf:!1,v:1},this._isDirty=!0,this.dynamicProperties.length||this.getValue(!0)}return t.prototype={applyToMatrix:function(t){var e=this._mdf;this.iterateDynamicProperties(),this._mdf=this._mdf||e,this.a&&t.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.s&&t.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&t.skewFromAxis(-this.sk.v,this.sa.v),this.r?t.rotate(-this.r.v):t.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.data.p.s?this.data.p.z?t.translate(this.px.v,this.py.v,-this.pz.v):t.translate(this.px.v,this.py.v,0):t.translate(this.p.v[0],this.p.v[1],-this.p.v[2])},getValue:function(t){if(this.elem.globalData.frameId!==this.frameId){if(this._isDirty&&(this.precalculateMatrix(),this._isDirty=!1),this.iterateDynamicProperties(),this._mdf||t){if(this.v.cloneFromProps(this.pre.props),this.appliedTransformations<1&&this.v.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations<2&&this.v.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.sk&&this.appliedTransformations<3&&this.v.skewFromAxis(-this.sk.v,this.sa.v),this.r&&this.appliedTransformations<4?this.v.rotate(-this.r.v):!this.r&&this.appliedTransformations<4&&this.v.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.autoOriented){var e,r,i=this.elem.globalData.frameRate;if(this.p&&this.p.keyframes&&this.p.getValueAtTime)this.p._caching.lastFrame+this.p.offsetTime<=this.p.keyframes[0].t?(e=this.p.getValueAtTime((this.p.keyframes[0].t+.01)/i,0),r=this.p.getValueAtTime(this.p.keyframes[0].t/i,0)):this.p._caching.lastFrame+this.p.offsetTime>=this.p.keyframes[this.p.keyframes.length-1].t?(e=this.p.getValueAtTime(this.p.keyframes[this.p.keyframes.length-1].t/i,0),r=this.p.getValueAtTime((this.p.keyframes[this.p.keyframes.length-1].t-.01)/i,0)):(e=this.p.pv,r=this.p.getValueAtTime((this.p._caching.lastFrame+this.p.offsetTime-.01)/i,this.p.offsetTime));else if(this.px&&this.px.keyframes&&this.py.keyframes&&this.px.getValueAtTime&&this.py.getValueAtTime){e=[],r=[];var s=this.px,a=this.py;s._caching.lastFrame+s.offsetTime<=s.keyframes[0].t?(e[0]=s.getValueAtTime((s.keyframes[0].t+.01)/i,0),e[1]=a.getValueAtTime((a.keyframes[0].t+.01)/i,0),r[0]=s.getValueAtTime(s.keyframes[0].t/i,0),r[1]=a.getValueAtTime(a.keyframes[0].t/i,0)):s._caching.lastFrame+s.offsetTime>=s.keyframes[s.keyframes.length-1].t?(e[0]=s.getValueAtTime(s.keyframes[s.keyframes.length-1].t/i,0),e[1]=a.getValueAtTime(a.keyframes[a.keyframes.length-1].t/i,0),r[0]=s.getValueAtTime((s.keyframes[s.keyframes.length-1].t-.01)/i,0),r[1]=a.getValueAtTime((a.keyframes[a.keyframes.length-1].t-.01)/i,0)):(e=[s.pv,a.pv],r[0]=s.getValueAtTime((s._caching.lastFrame+s.offsetTime-.01)/i,s.offsetTime),r[1]=a.getValueAtTime((a._caching.lastFrame+a.offsetTime-.01)/i,a.offsetTime))}this.v.rotate(-Math.atan2(e[1]-r[1],e[0]-r[0]))}this.data.p&&this.data.p.s?this.data.p.z?this.v.translate(this.px.v,this.py.v,-this.pz.v):this.v.translate(this.px.v,this.py.v,0):this.v.translate(this.p.v[0],this.p.v[1],-this.p.v[2])}this.frameId=this.elem.globalData.frameId}},precalculateMatrix:function(){if(!this.a.k&&(this.pre.translate(-this.a.v[0],-this.a.v[1],this.a.v[2]),this.appliedTransformations=1,!this.s.effectsSequence.length)){if(this.pre.scale(this.s.v[0],this.s.v[1],this.s.v[2]),this.appliedTransformations=2,this.sk){if(this.sk.effectsSequence.length||this.sa.effectsSequence.length)return;this.pre.skewFromAxis(-this.sk.v,this.sa.v),this.appliedTransformations=3}if(this.r){if(this.r.effectsSequence.length)return;this.pre.rotate(-this.r.v),this.appliedTransformations=4}else this.rz.effectsSequence.length||this.ry.effectsSequence.length||this.rx.effectsSequence.length||this.or.effectsSequence.length||(this.pre.rotateZ(-this.rz.v).rotateY(this.ry.v).rotateX(this.rx.v).rotateZ(-this.or.v[2]).rotateY(this.or.v[1]).rotateX(this.or.v[0]),this.appliedTransformations=4)}},autoOrient:function(){}},extendPrototype([DynamicPropertyContainer],t),t.prototype.addDynamicProperty=function(t){this._addDynamicProperty(t),this.elem.addDynamicProperty(t),this._isDirty=!0},t.prototype._addDynamicProperty=DynamicPropertyContainer.prototype.addDynamicProperty,{getTransformProperty:function(e,r,i){return new t(e,r,i)}}}();function ShapePath(){this.c=!1,this._length=0,this._maxLength=8,this.v=createSizedArray(this._maxLength),this.o=createSizedArray(this._maxLength),this.i=createSizedArray(this._maxLength)}ShapePath.prototype.setPathData=function(t,e){this.c=t,this.setLength(e);for(var r=0;r<e;)this.v[r]=point_pool.newElement(),this.o[r]=point_pool.newElement(),this.i[r]=point_pool.newElement(),r+=1},ShapePath.prototype.setLength=function(t){for(;this._maxLength<t;)this.doubleArrayLength();this._length=t},ShapePath.prototype.doubleArrayLength=function(){this.v=this.v.concat(createSizedArray(this._maxLength)),this.i=this.i.concat(createSizedArray(this._maxLength)),this.o=this.o.concat(createSizedArray(this._maxLength)),this._maxLength*=2},ShapePath.prototype.setXYAt=function(t,e,r,i,s){var a;switch(this._length=Math.max(this._length,i+1),this._length>=this._maxLength&&this.doubleArrayLength(),r){case"v":a=this.v;break;case"i":a=this.i;break;case"o":a=this.o}(!a[i]||a[i]&&!s)&&(a[i]=point_pool.newElement()),a[i][0]=t,a[i][1]=e},ShapePath.prototype.setTripleAt=function(t,e,r,i,s,a,n,o){this.setXYAt(t,e,"v",n,o),this.setXYAt(r,i,"o",n,o),this.setXYAt(s,a,"i",n,o)},ShapePath.prototype.reverse=function(){var t=new ShapePath;t.setPathData(this.c,this._length);var e=this.v,r=this.o,i=this.i,s=0;this.c&&(t.setTripleAt(e[0][0],e[0][1],i[0][0],i[0][1],r[0][0],r[0][1],0,!1),s=1);var a,n=this._length-1,o=this._length;for(a=s;a<o;a+=1)t.setTripleAt(e[n][0],e[n][1],i[n][0],i[n][1],r[n][0],r[n][1],a,!1),n-=1;return t};var ShapePropertyFactory=function(){var t=-999999;function e(t,e,r){var i,s,a,n,o,h,p,l,f,m=r.lastIndex,c=this.keyframes;if(t<c[0].t-this.offsetTime)i=c[0].s[0],a=!0,m=0;else if(t>=c[c.length-1].t-this.offsetTime)i=c[c.length-1].s?c[c.length-1].s[0]:c[c.length-2].e[0],a=!0;else{for(var d,u,y=m,g=c.length-1,v=!0;v&&(d=c[y],!((u=c[y+1]).t-this.offsetTime>t));)y<g-1?y+=1:v=!1;if(m=y,!(a=1===d.h)){if(t>=u.t-this.offsetTime)l=1;else if(t<d.t-this.offsetTime)l=0;else{var b;d.__fnct?b=d.__fnct:(b=BezierFactory.getBezierEasing(d.o.x,d.o.y,d.i.x,d.i.y).get,d.__fnct=b),l=b((t-(d.t-this.offsetTime))/(u.t-this.offsetTime-(d.t-this.offsetTime)))}s=u.s?u.s[0]:d.e[0]}i=d.s[0]}for(h=e._length,p=i.i[0].length,r.lastIndex=m,n=0;n<h;n+=1)for(o=0;o<p;o+=1)f=a?i.i[n][o]:i.i[n][o]+(s.i[n][o]-i.i[n][o])*l,e.i[n][o]=f,f=a?i.o[n][o]:i.o[n][o]+(s.o[n][o]-i.o[n][o])*l,e.o[n][o]=f,f=a?i.v[n][o]:i.v[n][o]+(s.v[n][o]-i.v[n][o])*l,e.v[n][o]=f}function r(){var e=this.comp.renderedFrame-this.offsetTime,r=this.keyframes[0].t-this.offsetTime,i=this.keyframes[this.keyframes.length-1].t-this.offsetTime,s=this._caching.lastFrame;return s!==t&&(s<r&&e<r||s>i&&e>i)||(this._caching.lastIndex=s<e?this._caching.lastIndex:0,this.interpolateShape(e,this.pv,this._caching)),this._caching.lastFrame=e,this.pv}function i(){this.paths=this.localShapeCollection}function s(t){(function(t,e){if(t._length!==e._length||t.c!==e.c)return!1;var r,i=t._length;for(r=0;r<i;r+=1)if(t.v[r][0]!==e.v[r][0]||t.v[r][1]!==e.v[r][1]||t.o[r][0]!==e.o[r][0]||t.o[r][1]!==e.o[r][1]||t.i[r][0]!==e.i[r][0]||t.i[r][1]!==e.i[r][1])return!1;return!0})(this.v,t)||(this.v=shape_pool.clone(t),this.localShapeCollection.releaseShapes(),this.localShapeCollection.addShape(this.v),this._mdf=!0,this.paths=this.localShapeCollection)}function a(){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length)if(this.lock)this.setVValue(this.pv);else{this.lock=!0,this._mdf=!1;var t,e=this.kf?this.pv:this.data.ks?this.data.ks.k:this.data.pt.k,r=this.effectsSequence.length;for(t=0;t<r;t+=1)e=this.effectsSequence[t](e);this.setVValue(e),this.lock=!1,this.frameId=this.elem.globalData.frameId}}function n(t,e,r){this.propType="shape",this.comp=t.comp,this.container=t,this.elem=t,this.data=e,this.k=!1,this.kf=!1,this._mdf=!1;var s=3===r?e.pt.k:e.ks.k;this.v=shape_pool.clone(s),this.pv=shape_pool.clone(this.v),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.reset=i,this.effectsSequence=[]}function o(t){this.effectsSequence.push(t),this.container.addDynamicProperty(this)}function h(e,s,a){this.propType="shape",this.comp=e.comp,this.elem=e,this.container=e,this.offsetTime=e.data.st,this.keyframes=3===a?s.pt.k:s.ks.k,this.k=!0,this.kf=!0;var n=this.keyframes[0].s[0].i.length;this.keyframes[0].s[0].i[0].length;this.v=shape_pool.newElement(),this.v.setPathData(this.keyframes[0].s[0].c,n),this.pv=shape_pool.clone(this.v),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.paths.addShape(this.v),this.lastFrame=t,this.reset=i,this._caching={lastFrame:t,lastIndex:0},this.effectsSequence=[r.bind(this)]}n.prototype.interpolateShape=e,n.prototype.getValue=a,n.prototype.setVValue=s,n.prototype.addEffect=o,h.prototype.getValue=a,h.prototype.interpolateShape=e,h.prototype.setVValue=s,h.prototype.addEffect=o;var p=function(){var t=roundCorner;function e(t,e){this.v=shape_pool.newElement(),this.v.setPathData(!0,4),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.paths=this.localShapeCollection,this.localShapeCollection.addShape(this.v),this.d=e.d,this.elem=t,this.comp=t.comp,this.frameId=-1,this.initDynamicPropertyContainer(t),this.p=PropertyFactory.getProp(t,e.p,1,0,this),this.s=PropertyFactory.getProp(t,e.s,1,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertEllToPath())}return e.prototype={reset:i,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertEllToPath())},convertEllToPath:function(){var e=this.p.v[0],r=this.p.v[1],i=this.s.v[0]/2,s=this.s.v[1]/2,a=3!==this.d,n=this.v;n.v[0][0]=e,n.v[0][1]=r-s,n.v[1][0]=a?e+i:e-i,n.v[1][1]=r,n.v[2][0]=e,n.v[2][1]=r+s,n.v[3][0]=a?e-i:e+i,n.v[3][1]=r,n.i[0][0]=a?e-i*t:e+i*t,n.i[0][1]=r-s,n.i[1][0]=a?e+i:e-i,n.i[1][1]=r-s*t,n.i[2][0]=a?e+i*t:e-i*t,n.i[2][1]=r+s,n.i[3][0]=a?e-i:e+i,n.i[3][1]=r+s*t,n.o[0][0]=a?e+i*t:e-i*t,n.o[0][1]=r-s,n.o[1][0]=a?e+i:e-i,n.o[1][1]=r+s*t,n.o[2][0]=a?e-i*t:e+i*t,n.o[2][1]=r+s,n.o[3][0]=a?e-i:e+i,n.o[3][1]=r-s*t}},extendPrototype([DynamicPropertyContainer],e),e}(),l=function(){function t(t,e){this.v=shape_pool.newElement(),this.v.setPathData(!0,0),this.elem=t,this.comp=t.comp,this.data=e,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),1===e.sy?(this.ir=PropertyFactory.getProp(t,e.ir,0,0,this),this.is=PropertyFactory.getProp(t,e.is,0,.01,this),this.convertToPath=this.convertStarToPath):this.convertToPath=this.convertPolygonToPath,this.pt=PropertyFactory.getProp(t,e.pt,0,0,this),this.p=PropertyFactory.getProp(t,e.p,1,0,this),this.r=PropertyFactory.getProp(t,e.r,0,degToRads,this),this.or=PropertyFactory.getProp(t,e.or,0,0,this),this.os=PropertyFactory.getProp(t,e.os,0,.01,this),this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertToPath())}return t.prototype={reset:i,getValue:function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertToPath())},convertStarToPath:function(){var t,e,r,i,s=2*Math.floor(this.pt.v),a=2*Math.PI/s,n=!0,o=this.or.v,h=this.ir.v,p=this.os.v,l=this.is.v,f=2*Math.PI*o/(2*s),m=2*Math.PI*h/(2*s),c=-Math.PI/2;c+=this.r.v;var d=3===this.data.d?-1:1;for(this.v._length=0,t=0;t<s;t+=1){r=n?p:l,i=n?f:m;var u=(e=n?o:h)*Math.cos(c),y=e*Math.sin(c),g=0===u&&0===y?0:y/Math.sqrt(u*u+y*y),v=0===u&&0===y?0:-u/Math.sqrt(u*u+y*y);u+=+this.p.v[0],y+=+this.p.v[1],this.v.setTripleAt(u,y,u-g*i*r*d,y-v*i*r*d,u+g*i*r*d,y+v*i*r*d,t,!0),n=!n,c+=a*d}},convertPolygonToPath:function(){var t,e=Math.floor(this.pt.v),r=2*Math.PI/e,i=this.or.v,s=this.os.v,a=2*Math.PI*i/(4*e),n=-Math.PI/2,o=3===this.data.d?-1:1;for(n+=this.r.v,this.v._length=0,t=0;t<e;t+=1){var h=i*Math.cos(n),p=i*Math.sin(n),l=0===h&&0===p?0:p/Math.sqrt(h*h+p*p),f=0===h&&0===p?0:-h/Math.sqrt(h*h+p*p);h+=+this.p.v[0],p+=+this.p.v[1],this.v.setTripleAt(h,p,h-l*a*s*o,p-f*a*s*o,h+l*a*s*o,p+f*a*s*o,t,!0),n+=r*o}this.paths.length=0,this.paths[0]=this.v}},extendPrototype([DynamicPropertyContainer],t),t}(),f=function(){function t(t,e){this.v=shape_pool.newElement(),this.v.c=!0,this.localShapeCollection=shapeCollection_pool.newShapeCollection(),this.localShapeCollection.addShape(this.v),this.paths=this.localShapeCollection,this.elem=t,this.comp=t.comp,this.frameId=-1,this.d=e.d,this.initDynamicPropertyContainer(t),this.p=PropertyFactory.getProp(t,e.p,1,0,this),this.s=PropertyFactory.getProp(t,e.s,1,0,this),this.r=PropertyFactory.getProp(t,e.r,0,0,this),this.dynamicProperties.length?this.k=!0:(this.k=!1,this.convertRectToPath())}return t.prototype={convertRectToPath:function(){var t=this.p.v[0],e=this.p.v[1],r=this.s.v[0]/2,i=this.s.v[1]/2,s=bm_min(r,i,this.r.v),a=s*(1-roundCorner);this.v._length=0,2===this.d||1===this.d?(this.v.setTripleAt(t+r,e-i+s,t+r,e-i+s,t+r,e-i+a,0,!0),this.v.setTripleAt(t+r,e+i-s,t+r,e+i-a,t+r,e+i-s,1,!0),0!==s?(this.v.setTripleAt(t+r-s,e+i,t+r-s,e+i,t+r-a,e+i,2,!0),this.v.setTripleAt(t-r+s,e+i,t-r+a,e+i,t-r+s,e+i,3,!0),this.v.setTripleAt(t-r,e+i-s,t-r,e+i-s,t-r,e+i-a,4,!0),this.v.setTripleAt(t-r,e-i+s,t-r,e-i+a,t-r,e-i+s,5,!0),this.v.setTripleAt(t-r+s,e-i,t-r+s,e-i,t-r+a,e-i,6,!0),this.v.setTripleAt(t+r-s,e-i,t+r-a,e-i,t+r-s,e-i,7,!0)):(this.v.setTripleAt(t-r,e+i,t-r+a,e+i,t-r,e+i,2),this.v.setTripleAt(t-r,e-i,t-r,e-i+a,t-r,e-i,3))):(this.v.setTripleAt(t+r,e-i+s,t+r,e-i+a,t+r,e-i+s,0,!0),0!==s?(this.v.setTripleAt(t+r-s,e-i,t+r-s,e-i,t+r-a,e-i,1,!0),this.v.setTripleAt(t-r+s,e-i,t-r+a,e-i,t-r+s,e-i,2,!0),this.v.setTripleAt(t-r,e-i+s,t-r,e-i+s,t-r,e-i+a,3,!0),this.v.setTripleAt(t-r,e+i-s,t-r,e+i-a,t-r,e+i-s,4,!0),this.v.setTripleAt(t-r+s,e+i,t-r+s,e+i,t-r+a,e+i,5,!0),this.v.setTripleAt(t+r-s,e+i,t+r-a,e+i,t+r-s,e+i,6,!0),this.v.setTripleAt(t+r,e+i-s,t+r,e+i-s,t+r,e+i-a,7,!0)):(this.v.setTripleAt(t-r,e-i,t-r+a,e-i,t-r,e-i,1,!0),this.v.setTripleAt(t-r,e+i,t-r,e+i-a,t-r,e+i,2,!0),this.v.setTripleAt(t+r,e+i,t+r-a,e+i,t+r,e+i,3,!0)))},getValue:function(t){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf&&this.convertRectToPath())},reset:i},extendPrototype([DynamicPropertyContainer],t),t}();var m={getShapeProp:function(t,e,r){var i;return 3===r||4===r?i=(3===r?e.pt:e.ks).k.length?new h(t,e,r):new n(t,e,r):5===r?i=new f(t,e):6===r?i=new p(t,e):7===r&&(i=new l(t,e)),i.k&&t.addDynamicProperty(i),i},getConstructorFunction:function(){return n},getKeyframedConstructorFunction:function(){return h}};return m}(),ShapeModifiers=function(){var t={},e={};return t.registerModifier=function(t,r){e[t]||(e[t]=r)},t.getModifier=function(t,r,i){return new e[t](r,i)},t}();function ShapeModifier(){}function TrimModifier(){}function RoundCornersModifier(){}function RepeaterModifier(){}function ShapeCollection(){this._length=0,this._maxLength=4,this.shapes=createSizedArray(this._maxLength)}function DashProperty(t,e,r,i){this.elem=t,this.frameId=-1,this.dataProps=createSizedArray(e.length),this.renderer=r,this.k=!1,this.dashStr="",this.dashArray=createTypedArray("float32",e.length?e.length-1:0),this.dashoffset=createTypedArray("float32",1),this.initDynamicPropertyContainer(i);var s,a,n=e.length||0;for(s=0;s<n;s+=1)a=PropertyFactory.getProp(t,e[s].v,0,0,this),this.k=a.k||this.k,this.dataProps[s]={n:e[s].n,p:a};this.k||this.getValue(!0),this._isAnimated=this.k}function GradientProperty(t,e,r){this.data=e,this.c=createTypedArray("uint8c",4*e.p);var i=e.k.k[0].s?e.k.k[0].s.length-4*e.p:e.k.k.length-4*e.p;this.o=createTypedArray("float32",i),this._cmdf=!1,this._omdf=!1,this._collapsable=this.checkCollapsable(),this._hasOpacity=i,this.initDynamicPropertyContainer(r),this.prop=PropertyFactory.getProp(t,e.k,1,null,this),this.k=this.prop.k,this.getValue(!0)}ShapeModifier.prototype.initModifierProperties=function(){},ShapeModifier.prototype.addShapeToModifier=function(){},ShapeModifier.prototype.addShape=function(t){if(!this.closed){var e={shape:t.sh,data:t,localShapeCollection:shapeCollection_pool.newShapeCollection()};this.shapes.push(e),this.addShapeToModifier(e),this._isAnimated&&t.setAsAnimated()}},ShapeModifier.prototype.init=function(t,e){this.shapes=[],this.elem=t,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e),this.frameId=initialDefaultFrame,this.closed=!1,this.k=!1,this.dynamicProperties.length?this.k=!0:this.getValue(!0)},ShapeModifier.prototype.processKeys=function(){this.elem.globalData.frameId!==this.frameId&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties())},extendPrototype([DynamicPropertyContainer],ShapeModifier),extendPrototype([ShapeModifier],TrimModifier),TrimModifier.prototype.initModifierProperties=function(t,e){this.s=PropertyFactory.getProp(t,e.s,0,.01,this),this.e=PropertyFactory.getProp(t,e.e,0,.01,this),this.o=PropertyFactory.getProp(t,e.o,0,0,this),this.sValue=0,this.eValue=0,this.getValue=this.processKeys,this.m=e.m,this._isAnimated=!!this.s.effectsSequence.length||!!this.e.effectsSequence.length||!!this.o.effectsSequence.length},TrimModifier.prototype.addShapeToModifier=function(t){t.pathsData=[]},TrimModifier.prototype.calculateShapeEdges=function(t,e,r,i,s){var a=[];e<=1?a.push({s:t,e:e}):t>=1?a.push({s:t-1,e:e-1}):(a.push({s:t,e:1}),a.push({s:0,e:e-1}));var n,o,h=[],p=a.length;for(n=0;n<p;n+=1){var l,f;if((o=a[n]).e*s<i||o.s*s>i+r);else l=o.s*s<=i?0:(o.s*s-i)/r,f=o.e*s>=i+r?1:(o.e*s-i)/r,h.push([l,f])}return h.length||h.push([0,0]),h},TrimModifier.prototype.releasePathsData=function(t){var e,r=t.length;for(e=0;e<r;e+=1)segments_length_pool.release(t[e]);return t.length=0,t},TrimModifier.prototype.processShapes=function(t){var e,r,i;if(this._mdf||t){var s=this.o.v%360/360;if(s<0&&(s+=1),(e=(this.s.v>1?1:this.s.v<0?0:this.s.v)+s)>(r=(this.e.v>1?1:this.e.v<0?0:this.e.v)+s)){var a=e;e=r,r=a}e=1e-4*Math.round(1e4*e),r=1e-4*Math.round(1e4*r),this.sValue=e,this.eValue=r}else e=this.sValue,r=this.eValue;var n,o,h,p,l,f,m=this.shapes.length,c=0;if(r===e)for(n=0;n<m;n+=1)this.shapes[n].localShapeCollection.releaseShapes(),this.shapes[n].shape._mdf=!0,this.shapes[n].shape.paths=this.shapes[n].localShapeCollection;else if(1===r&&0===e||0===r&&1===e){if(this._mdf)for(n=0;n<m;n+=1)this.shapes[n].pathsData.length=0,this.shapes[n].shape._mdf=!0}else{var d,u,y=[];for(n=0;n<m;n+=1)if((d=this.shapes[n]).shape._mdf||this._mdf||t||2===this.m){if(h=(i=d.shape.paths)._length,f=0,!d.shape._mdf&&d.pathsData.length)f=d.totalShapeLength;else{for(p=this.releasePathsData(d.pathsData),o=0;o<h;o+=1)l=bez.getSegmentsLength(i.shapes[o]),p.push(l),f+=l.totalLength;d.totalShapeLength=f,d.pathsData=p}c+=f,d.shape._mdf=!0}else d.shape.paths=d.localShapeCollection;var g,v=e,b=r,P=0;for(n=m-1;n>=0;n-=1)if((d=this.shapes[n]).shape._mdf){for((u=d.localShapeCollection).releaseShapes(),2===this.m&&m>1?(g=this.calculateShapeEdges(e,r,d.totalShapeLength,P,c),P+=d.totalShapeLength):g=[[v,b]],h=g.length,o=0;o<h;o+=1){v=g[o][0],b=g[o][1],y.length=0,b<=1?y.push({s:d.totalShapeLength*v,e:d.totalShapeLength*b}):v>=1?y.push({s:d.totalShapeLength*(v-1),e:d.totalShapeLength*(b-1)}):(y.push({s:d.totalShapeLength*v,e:d.totalShapeLength}),y.push({s:0,e:d.totalShapeLength*(b-1)}));var _=this.addShapes(d,y[0]);if(y[0].s!==y[0].e){if(y.length>1)if(d.shape.paths.shapes[d.shape.paths._length-1].c){var S=_.pop();this.addPaths(_,u),_=this.addShapes(d,y[1],S)}else this.addPaths(_,u),_=this.addShapes(d,y[1]);this.addPaths(_,u)}}d.shape.paths=u}}},TrimModifier.prototype.addPaths=function(t,e){var r,i=t.length;for(r=0;r<i;r+=1)e.addShape(t[r])},TrimModifier.prototype.addSegment=function(t,e,r,i,s,a,n){s.setXYAt(e[0],e[1],"o",a),s.setXYAt(r[0],r[1],"i",a+1),n&&s.setXYAt(t[0],t[1],"v",a),s.setXYAt(i[0],i[1],"v",a+1)},TrimModifier.prototype.addSegmentFromArray=function(t,e,r,i){e.setXYAt(t[1],t[5],"o",r),e.setXYAt(t[2],t[6],"i",r+1),i&&e.setXYAt(t[0],t[4],"v",r),e.setXYAt(t[3],t[7],"v",r+1)},TrimModifier.prototype.addShapes=function(t,e,r){var i,s,a,n,o,h,p,l,f=t.pathsData,m=t.shape.paths.shapes,c=t.shape.paths._length,d=0,u=[],y=!0;for(r?(o=r._length,l=r._length):(r=shape_pool.newElement(),o=0,l=0),u.push(r),i=0;i<c;i+=1){for(h=f[i].lengths,r.c=m[i].c,a=m[i].c?h.length:h.length+1,s=1;s<a;s+=1)if(d+(n=h[s-1]).addedLength<e.s)d+=n.addedLength,r.c=!1;else{if(d>e.e){r.c=!1;break}e.s<=d&&e.e>=d+n.addedLength?(this.addSegment(m[i].v[s-1],m[i].o[s-1],m[i].i[s],m[i].v[s],r,o,y),y=!1):(p=bez.getNewSegment(m[i].v[s-1],m[i].v[s],m[i].o[s-1],m[i].i[s],(e.s-d)/n.addedLength,(e.e-d)/n.addedLength,h[s-1]),this.addSegmentFromArray(p,r,o,y),y=!1,r.c=!1),d+=n.addedLength,o+=1}if(m[i].c&&h.length){if(n=h[s-1],d<=e.e){var g=h[s-1].addedLength;e.s<=d&&e.e>=d+g?(this.addSegment(m[i].v[s-1],m[i].o[s-1],m[i].i[0],m[i].v[0],r,o,y),y=!1):(p=bez.getNewSegment(m[i].v[s-1],m[i].v[0],m[i].o[s-1],m[i].i[0],(e.s-d)/g,(e.e-d)/g,h[s-1]),this.addSegmentFromArray(p,r,o,y),y=!1,r.c=!1)}else r.c=!1;d+=n.addedLength,o+=1}if(r._length&&(r.setXYAt(r.v[l][0],r.v[l][1],"i",l),r.setXYAt(r.v[r._length-1][0],r.v[r._length-1][1],"o",r._length-1)),d>e.e)break;i<c-1&&(r=shape_pool.newElement(),y=!0,u.push(r),o=0)}return u},ShapeModifiers.registerModifier("tm",TrimModifier),extendPrototype([ShapeModifier],RoundCornersModifier),RoundCornersModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.rd=PropertyFactory.getProp(t,e.r,0,null,this),this._isAnimated=!!this.rd.effectsSequence.length},RoundCornersModifier.prototype.processPath=function(t,e){var r=shape_pool.newElement();r.c=t.c;var i,s,a,n,o,h,p,l,f,m,c,d,u,y=t._length,g=0;for(i=0;i<y;i+=1)s=t.v[i],n=t.o[i],a=t.i[i],s[0]===n[0]&&s[1]===n[1]&&s[0]===a[0]&&s[1]===a[1]?0!==i&&i!==y-1||t.c?(o=0===i?t.v[y-1]:t.v[i-1],p=(h=Math.sqrt(Math.pow(s[0]-o[0],2)+Math.pow(s[1]-o[1],2)))?Math.min(h/2,e)/h:0,l=d=s[0]+(o[0]-s[0])*p,f=u=s[1]-(s[1]-o[1])*p,m=l-(l-s[0])*roundCorner,c=f-(f-s[1])*roundCorner,r.setTripleAt(l,f,m,c,d,u,g),g+=1,o=i===y-1?t.v[0]:t.v[i+1],p=(h=Math.sqrt(Math.pow(s[0]-o[0],2)+Math.pow(s[1]-o[1],2)))?Math.min(h/2,e)/h:0,l=m=s[0]+(o[0]-s[0])*p,f=c=s[1]+(o[1]-s[1])*p,d=l-(l-s[0])*roundCorner,u=f-(f-s[1])*roundCorner,r.setTripleAt(l,f,m,c,d,u,g),g+=1):(r.setTripleAt(s[0],s[1],n[0],n[1],a[0],a[1],g),g+=1):(r.setTripleAt(t.v[i][0],t.v[i][1],t.o[i][0],t.o[i][1],t.i[i][0],t.i[i][1],g),g+=1);return r},RoundCornersModifier.prototype.processShapes=function(t){var e,r,i,s,a,n,o=this.shapes.length,h=this.rd.v;if(0!==h)for(r=0;r<o;r+=1){if((a=this.shapes[r]).shape.paths,n=a.localShapeCollection,a.shape._mdf||this._mdf||t)for(n.releaseShapes(),a.shape._mdf=!0,e=a.shape.paths.shapes,s=a.shape.paths._length,i=0;i<s;i+=1)n.addShape(this.processPath(e[i],h));a.shape.paths=a.localShapeCollection}this.dynamicProperties.length||(this._mdf=!1)},ShapeModifiers.registerModifier("rd",RoundCornersModifier),extendPrototype([ShapeModifier],RepeaterModifier),RepeaterModifier.prototype.initModifierProperties=function(t,e){this.getValue=this.processKeys,this.c=PropertyFactory.getProp(t,e.c,0,null,this),this.o=PropertyFactory.getProp(t,e.o,0,null,this),this.tr=TransformPropertyFactory.getTransformProperty(t,e.tr,this),this.so=PropertyFactory.getProp(t,e.tr.so,0,.01,this),this.eo=PropertyFactory.getProp(t,e.tr.eo,0,.01,this),this.data=e,this.dynamicProperties.length||this.getValue(!0),this._isAnimated=!!this.dynamicProperties.length,this.pMatrix=new Matrix,this.rMatrix=new Matrix,this.sMatrix=new Matrix,this.tMatrix=new Matrix,this.matrix=new Matrix},RepeaterModifier.prototype.applyTransforms=function(t,e,r,i,s,a){var n=a?-1:1,o=i.s.v[0]+(1-i.s.v[0])*(1-s),h=i.s.v[1]+(1-i.s.v[1])*(1-s);t.translate(i.p.v[0]*n*s,i.p.v[1]*n*s,i.p.v[2]),e.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),e.rotate(-i.r.v*n*s),e.translate(i.a.v[0],i.a.v[1],i.a.v[2]),r.translate(-i.a.v[0],-i.a.v[1],i.a.v[2]),r.scale(a?1/o:o,a?1/h:h),r.translate(i.a.v[0],i.a.v[1],i.a.v[2])},RepeaterModifier.prototype.init=function(t,e,r,i){this.elem=t,this.arr=e,this.pos=r,this.elemsData=i,this._currentCopies=0,this._elements=[],this._groups=[],this.frameId=-1,this.initDynamicPropertyContainer(t),this.initModifierProperties(t,e[r]);for(;r>0;)r-=1,this._elements.unshift(e[r]),1;this.dynamicProperties.length?this.k=!0:this.getValue(!0)},RepeaterModifier.prototype.resetElements=function(t){var e,r=t.length;for(e=0;e<r;e+=1)t[e]._processed=!1,"gr"===t[e].ty&&this.resetElements(t[e].it)},RepeaterModifier.prototype.cloneElements=function(t){t.length;var e=JSON.parse(JSON.stringify(t));return this.resetElements(e),e},RepeaterModifier.prototype.changeGroupRender=function(t,e){var r,i=t.length;for(r=0;r<i;r+=1)t[r]._render=e,"gr"===t[r].ty&&this.changeGroupRender(t[r].it,e)},RepeaterModifier.prototype.processShapes=function(t){var e,r,i,s,a;if(this._mdf||t){var n,o=Math.ceil(this.c.v);if(this._groups.length<o){for(;this._groups.length<o;){var h={it:this.cloneElements(this._elements),ty:"gr"};h.it.push({a:{a:0,ix:1,k:[0,0]},nm:"Transform",o:{a:0,ix:7,k:100},p:{a:0,ix:2,k:[0,0]},r:{a:1,ix:6,k:[{s:0,e:0,t:0},{s:0,e:0,t:1}]},s:{a:0,ix:3,k:[100,100]},sa:{a:0,ix:5,k:0},sk:{a:0,ix:4,k:0},ty:"tr"}),this.arr.splice(0,0,h),this._groups.splice(0,0,h),this._currentCopies+=1}this.elem.reloadShapes()}for(a=0,i=0;i<=this._groups.length-1;i+=1)n=a<o,this._groups[i]._render=n,this.changeGroupRender(this._groups[i].it,n),a+=1;this._currentCopies=o;var p=this.o.v,l=p%1,f=p>0?Math.floor(p):Math.ceil(p),m=(this.tr.v.props,this.pMatrix.props),c=this.rMatrix.props,d=this.sMatrix.props;this.pMatrix.reset(),this.rMatrix.reset(),this.sMatrix.reset(),this.tMatrix.reset(),this.matrix.reset();var u,y,g=0;if(p>0){for(;g<f;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),g+=1;l&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,l,!1),g+=l)}else if(p<0){for(;g>f;)this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!0),g-=1;l&&(this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,-l,!0),g-=l)}for(i=1===this.data.m?0:this._currentCopies-1,s=1===this.data.m?1:-1,a=this._currentCopies;a;){if(y=(r=(e=this.elemsData[i].it)[e.length-1].transform.mProps.v.props).length,e[e.length-1].transform.mProps._mdf=!0,e[e.length-1].transform.op._mdf=!0,e[e.length-1].transform.op.v=this.so.v+(this.eo.v-this.so.v)*(i/(this._currentCopies-1)),0!==g){for((0!==i&&1===s||i!==this._currentCopies-1&&-1===s)&&this.applyTransforms(this.pMatrix,this.rMatrix,this.sMatrix,this.tr,1,!1),this.matrix.transform(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],c[11],c[12],c[13],c[14],c[15]),this.matrix.transform(d[0],d[1],d[2],d[3],d[4],d[5],d[6],d[7],d[8],d[9],d[10],d[11],d[12],d[13],d[14],d[15]),this.matrix.transform(m[0],m[1],m[2],m[3],m[4],m[5],m[6],m[7],m[8],m[9],m[10],m[11],m[12],m[13],m[14],m[15]),u=0;u<y;u+=1)r[u]=this.matrix.props[u];this.matrix.reset()}else for(this.matrix.reset(),u=0;u<y;u+=1)r[u]=this.matrix.props[u];g+=1,a-=1,i+=s}}else for(a=this._currentCopies,i=0,s=1;a;)r=(e=this.elemsData[i].it)[e.length-1].transform.mProps.v.props,e[e.length-1].transform.mProps._mdf=!1,e[e.length-1].transform.op._mdf=!1,a-=1,i+=s},RepeaterModifier.prototype.addShape=function(){},ShapeModifiers.registerModifier("rp",RepeaterModifier),ShapeCollection.prototype.addShape=function(t){this._length===this._maxLength&&(this.shapes=this.shapes.concat(createSizedArray(this._maxLength)),this._maxLength*=2),this.shapes[this._length]=t,this._length+=1},ShapeCollection.prototype.releaseShapes=function(){var t;for(t=0;t<this._length;t+=1)shape_pool.release(this.shapes[t]);this._length=0},DashProperty.prototype.getValue=function(t){if((this.elem.globalData.frameId!==this.frameId||t)&&(this.frameId=this.elem.globalData.frameId,this.iterateDynamicProperties(),this._mdf=this._mdf||t,this._mdf)){var e=0,r=this.dataProps.length;for("svg"===this.renderer&&(this.dashStr=""),e=0;e<r;e+=1)"o"!=this.dataProps[e].n?"svg"===this.renderer?this.dashStr+=" "+this.dataProps[e].p.v:this.dashArray[e]=this.dataProps[e].p.v:this.dashoffset[0]=this.dataProps[e].p.v}},extendPrototype([DynamicPropertyContainer],DashProperty),GradientProperty.prototype.comparePoints=function(t,e){for(var r=0,i=this.o.length/2;r<i;){if(Math.abs(t[4*r]-t[4*e+2*r])>.01)return!1;r+=1}return!0},GradientProperty.prototype.checkCollapsable=function(){if(this.o.length/2!=this.c.length/4)return!1;if(this.data.k.k[0].s)for(var t=0,e=this.data.k.k.length;t<e;){if(!this.comparePoints(this.data.k.k[t].s,this.data.p))return!1;t+=1}else if(!this.comparePoints(this.data.k.k,this.data.p))return!1;return!0},GradientProperty.prototype.getValue=function(t){if(this.prop.getValue(),this._mdf=!1,this._cmdf=!1,this._omdf=!1,this.prop._mdf||t){var e,r,i,s=4*this.data.p;for(e=0;e<s;e+=1)r=e%4==0?100:255,i=Math.round(this.prop.v[e]*r),this.c[e]!==i&&(this.c[e]=i,this._cmdf=!t);if(this.o.length)for(s=this.prop.v.length,e=4*this.data.p;e<s;e+=1)r=e%2==0?100:1,i=e%2==0?Math.round(100*this.prop.v[e]):this.prop.v[e],this.o[e-4*this.data.p]!==i&&(this.o[e-4*this.data.p]=i,this._omdf=!t);this._mdf=!t}},extendPrototype([DynamicPropertyContainer],GradientProperty);var buildShapeString=function(t,e,r,i){if(0===e)return"";var s,a=t.o,n=t.i,o=t.v,h=" M"+i.applyToPointStringified(o[0][0],o[0][1]);for(s=1;s<e;s+=1)h+=" C"+i.applyToPointStringified(a[s-1][0],a[s-1][1])+" "+i.applyToPointStringified(n[s][0],n[s][1])+" "+i.applyToPointStringified(o[s][0],o[s][1]);return r&&e&&(h+=" C"+i.applyToPointStringified(a[s-1][0],a[s-1][1])+" "+i.applyToPointStringified(n[0][0],n[0][1])+" "+i.applyToPointStringified(o[0][0],o[0][1]),h+="z"),h},ImagePreloader=function(){var t=function(){var t=createTag("canvas");t.width=1,t.height=1;var e=t.getContext("2d");return e.fillStyle="#FF0000",e.fillRect(0,0,1,1),t}();function e(){this.loadedAssets+=1,this.loadedAssets===this.totalImages&&this.imagesLoadedCb&&this.imagesLoadedCb(null)}function r(e){var r=function(t,e,r){var i="";if(t.e)i=t.p;else if(e){var s=t.p;-1!==s.indexOf("images/")&&(s=s.split("/")[1]),i=e+s}else i=r,i+=t.u?t.u:"",i+=t.p;return i}(e,this.assetsPath,this.path),i=createTag("img");i.crossOrigin="anonymous",i.addEventListener("load",this._imageLoaded.bind(this),!1),i.addEventListener("error",function(){s.img=t,this._imageLoaded()}.bind(this),!1),i.src=r;var s={img:i,assetData:e};return s}function i(t,e){this.imagesLoadedCb=e;var r,i=t.length;for(r=0;r<i;r+=1)t[r].layers||(this.totalImages+=1,this.images.push(this._createImageData(t[r])))}function s(t){this.path=t||""}function a(t){this.assetsPath=t||""}function n(t){for(var e=0,r=this.images.length;e<r;){if(this.images[e].assetData===t)return this.images[e].img;e+=1}}function o(){this.imagesLoadedCb=null,this.images.length=0}function h(){return this.totalImages===this.loadedAssets}return function(){this.loadAssets=i,this.setAssetsPath=a,this.setPath=s,this.loaded=h,this.destroy=o,this.getImage=n,this._createImageData=r,this._imageLoaded=e,this.assetsPath="",this.path="",this.totalImages=0,this.loadedAssets=0,this.imagesLoadedCb=null,this.images=[]}}(),featureSupport=function(){var t={maskType:!0};return(/MSIE 10/i.test(navigator.userAgent)||/MSIE 9/i.test(navigator.userAgent)||/rv:11.0/i.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent))&&(t.maskType=!1),t}(),filtersFactory=function(){var t={};return t.createFilter=function(t){var e=createNS("filter");return e.setAttribute("id",t),e.setAttribute("filterUnits","objectBoundingBox"),e.setAttribute("x","0%"),e.setAttribute("y","0%"),e.setAttribute("width","100%"),e.setAttribute("height","100%"),e},t.createAlphaToLuminanceFilter=function(){var t=createNS("feColorMatrix");return t.setAttribute("type","matrix"),t.setAttribute("color-interpolation-filters","sRGB"),t.setAttribute("values","0 0 0 1 0  0 0 0 1 0  0 0 0 1 0  0 0 0 1 1"),t},t}(),assetLoader=function(){function t(t){return t.response&&"object"==typeof t.response?t.response:t.response&&"string"==typeof t.response?JSON.parse(t.response):t.responseText?JSON.parse(t.responseText):void 0}return{load:function(e,r,i){var s,a=new XMLHttpRequest;a.open("GET",e,!0);try{a.responseType="json"}catch(n){}a.send(),a.onreadystatechange=function(){if(4==a.readyState)if(200==a.status)s=t(a),r(s);else try{s=t(a),r(s)}catch(n){i&&i(n)}}}}}();function TextAnimatorProperty(t,e,r){this._isFirstFrame=!0,this._hasMaskedPath=!1,this._frameId=-1,this._textData=t,this._renderType=e,this._elem=r,this._animatorsData=createSizedArray(this._textData.a.length),this._pathData={},this._moreOptions={alignment:{}},this.renderedLetters=[],this.lettersChangedFlag=!1,this.initDynamicPropertyContainer(r)}function TextAnimatorDataProperty(t,e,r){var i={propType:!1},s=PropertyFactory.getProp,a=e.a;this.a={r:a.r?s(t,a.r,0,degToRads,r):i,rx:a.rx?s(t,a.rx,0,degToRads,r):i,ry:a.ry?s(t,a.ry,0,degToRads,r):i,sk:a.sk?s(t,a.sk,0,degToRads,r):i,sa:a.sa?s(t,a.sa,0,degToRads,r):i,s:a.s?s(t,a.s,1,.01,r):i,a:a.a?s(t,a.a,1,0,r):i,o:a.o?s(t,a.o,0,.01,r):i,p:a.p?s(t,a.p,1,0,r):i,sw:a.sw?s(t,a.sw,0,0,r):i,sc:a.sc?s(t,a.sc,1,0,r):i,fc:a.fc?s(t,a.fc,1,0,r):i,fh:a.fh?s(t,a.fh,0,0,r):i,fs:a.fs?s(t,a.fs,0,.01,r):i,fb:a.fb?s(t,a.fb,0,.01,r):i,t:a.t?s(t,a.t,0,0,r):i},this.s=TextSelectorProp.getTextSelectorProp(t,e.s,r),this.s.t=e.s.t}function LetterProps(t,e,r,i,s,a){this.o=t,this.sw=e,this.sc=r,this.fc=i,this.m=s,this.p=a,this._mdf={o:!0,sw:!!e,sc:!!r,fc:!!i,m:!0,p:!0}}function TextProperty(t,e){this._frameId=initialDefaultFrame,this.pv="",this.v="",this.kf=!1,this._isFirstFrame=!0,this._mdf=!1,this.data=e,this.elem=t,this.comp=this.elem.comp,this.keysIndex=0,this.canResize=!1,this.minimumFontSize=1,this.effectsSequence=[],this.currentData={ascent:0,boxWidth:this.defaultBoxWidth,f:"",fStyle:"",fWeight:"",fc:"",j:"",justifyOffset:"",l:[],lh:0,lineWidths:[],ls:"",of:"",s:"",sc:"",sw:0,t:0,tr:0,sz:0,ps:null,fillColorAnim:!1,strokeColorAnim:!1,strokeWidthAnim:!1,yOffset:0,finalSize:0,finalText:[],finalLineHeight:0,__complete:!1},this.copyData(this.currentData,this.data.d.k[0].s),this.searchProperty()||this.completeTextData(this.currentData)}TextAnimatorProperty.prototype.searchProperties=function(){var t,e,r=this._textData.a.length,i=PropertyFactory.getProp;for(t=0;t<r;t+=1)e=this._textData.a[t],this._animatorsData[t]=new TextAnimatorDataProperty(this._elem,e,this);this._textData.p&&"m"in this._textData.p?(this._pathData={f:i(this._elem,this._textData.p.f,0,0,this),l:i(this._elem,this._textData.p.l,0,0,this),r:this._textData.p.r,m:this._elem.maskManager.getMaskProperty(this._textData.p.m)},this._hasMaskedPath=!0):this._hasMaskedPath=!1,this._moreOptions.alignment=i(this._elem,this._textData.m.a,1,0,this)},TextAnimatorProperty.prototype.getMeasures=function(t,e){if(this.lettersChangedFlag=e,this._mdf||this._isFirstFrame||e||this._hasMaskedPath&&this._pathData.m._mdf){this._isFirstFrame=!1;var r,i,s,a,n,o,h,p,l,f,m,c,d,u,y,g,v,b,P,_=this._moreOptions.alignment.v,S=this._animatorsData,A=this._textData,x=this.mHelper,E=this._renderType,k=this.renderedLetters.length,T=(this.data,t.l);if(this._hasMaskedPath){if(P=this._pathData.m,!this._pathData.n||this._pathData._mdf){var M,D=P.v;for(this._pathData.r&&(D=D.reverse()),n={tLength:0,segments:[]},a=D._length-1,g=0,s=0;s<a;s+=1)M=bez.buildBezierData(D.v[s],D.v[s+1],[D.o[s][0]-D.v[s][0],D.o[s][1]-D.v[s][1]],[D.i[s+1][0]-D.v[s+1][0],D.i[s+1][1]-D.v[s+1][1]]),n.tLength+=M.segmentLength,n.segments.push(M),g+=M.segmentLength;s=a,P.v.c&&(M=bez.buildBezierData(D.v[s],D.v[0],[D.o[s][0]-D.v[s][0],D.o[s][1]-D.v[s][1]],[D.i[0][0]-D.v[0][0],D.i[0][1]-D.v[0][1]]),n.tLength+=M.segmentLength,n.segments.push(M),g+=M.segmentLength),this._pathData.pi=n}if(n=this._pathData.pi,o=this._pathData.f.v,m=0,f=1,p=0,l=!0,u=n.segments,o<0&&P.v.c)for(n.tLength<Math.abs(o)&&(o=-Math.abs(o)%n.tLength),f=(d=u[m=u.length-1].points).length-1;o<0;)o+=d[f].partialLength,(f-=1)<0&&(f=(d=u[m-=1].points).length-1);c=(d=u[m].points)[f-1],y=(h=d[f]).partialLength}a=T.length,r=0,i=0;var F,I,C,w,V=1.2*t.finalSize*.714,R=!0;C=S.length;var L,G,N,B,z,O,j,q,H,W,X,Y,$,K=-1,J=o,U=m,Z=f,Q=-1,tt="",et=this.defaultPropsArray;if(2===t.j||1===t.j){var rt=0,it=0,st=2===t.j?-.5:-1,at=0,nt=!0;for(s=0;s<a;s+=1)if(T[s].n){for(rt&&(rt+=it);at<s;)T[at].animatorJustifyOffset=rt,at+=1;rt=0,nt=!0}else{for(I=0;I<C;I+=1)(F=S[I].a).t.propType&&(nt&&2===t.j&&(it+=F.t.v*st),(L=S[I].s.getMult(T[s].anIndexes[I],A.a[I].s.totalChars)).length?rt+=F.t.v*L[0]*st:rt+=F.t.v*L*st);nt=!1}for(rt&&(rt+=it);at<s;)T[at].animatorJustifyOffset=rt,at+=1}for(s=0;s<a;s+=1){if(x.reset(),z=1,T[s].n)r=0,i+=t.yOffset,i+=R?1:0,o=J,R=!1,0,this._hasMaskedPath&&(f=Z,c=(d=u[m=U].points)[f-1],y=(h=d[f]).partialLength,p=0),$=W=Y=tt="",et=this.defaultPropsArray;else{if(this._hasMaskedPath){if(Q!==T[s].line){switch(t.j){case 1:o+=g-t.lineWidths[T[s].line];break;case 2:o+=(g-t.lineWidths[T[s].line])/2}Q=T[s].line}K!==T[s].ind&&(T[K]&&(o+=T[K].extra),o+=T[s].an/2,K=T[s].ind),o+=_[0]*T[s].an/200;var ot=0;for(I=0;I<C;I+=1)(F=S[I].a).p.propType&&((L=S[I].s.getMult(T[s].anIndexes[I],A.a[I].s.totalChars)).length?ot+=F.p.v[0]*L[0]:ot+=F.p.v[0]*L),F.a.propType&&((L=S[I].s.getMult(T[s].anIndexes[I],A.a[I].s.totalChars)).length?ot+=F.a.v[0]*L[0]:ot+=F.a.v[0]*L);for(l=!0;l;)p+y>=o+ot||!d?(v=(o+ot-p)/h.partialLength,N=c.point[0]+(h.point[0]-c.point[0])*v,B=c.point[1]+(h.point[1]-c.point[1])*v,x.translate(-_[0]*T[s].an/200,-_[1]*V/100),l=!1):d&&(p+=h.partialLength,(f+=1)>=d.length&&(f=0,u[m+=1]?d=u[m].points:P.v.c?(f=0,d=u[m=0].points):(p-=h.partialLength,d=null)),d&&(c=h,y=(h=d[f]).partialLength));G=T[s].an/2-T[s].add,x.translate(-G,0,0)}else G=T[s].an/2-T[s].add,x.translate(-G,0,0),x.translate(-_[0]*T[s].an/200,-_[1]*V/100,0);for(T[s].l/2,I=0;I<C;I+=1)(F=S[I].a).t.propType&&(L=S[I].s.getMult(T[s].anIndexes[I],A.a[I].s.totalChars),0===r&&0===t.j||(this._hasMaskedPath?L.length?o+=F.t.v*L[0]:o+=F.t.v*L:L.length?r+=F.t.v*L[0]:r+=F.t.v*L));for(T[s].l/2,t.strokeWidthAnim&&(j=t.sw||0),t.strokeColorAnim&&(O=t.sc?[t.sc[0],t.sc[1],t.sc[2]]:[0,0,0]),t.fillColorAnim&&t.fc&&(q=[t.fc[0],t.fc[1],t.fc[2]]),I=0;I<C;I+=1)(F=S[I].a).a.propType&&((L=S[I].s.getMult(T[s].anIndexes[I],A.a[I].s.totalChars)).length?x.translate(-F.a.v[0]*L[0],-F.a.v[1]*L[1],F.a.v[2]*L[2]):x.translate(-F.a.v[0]*L,-F.a.v[1]*L,F.a.v[2]*L));for(I=0;I<C;I+=1)(F=S[I].a).s.propType&&((L=S[I].s.getMult(T[s].anIndexes[I],A.a[I].s.totalChars)).length?x.scale(1+(F.s.v[0]-1)*L[0],1+(F.s.v[1]-1)*L[1],1):x.scale(1+(F.s.v[0]-1)*L,1+(F.s.v[1]-1)*L,1));for(I=0;I<C;I+=1){if(F=S[I].a,L=S[I].s.getMult(T[s].anIndexes[I],A.a[I].s.totalChars),F.sk.propType&&(L.length?x.skewFromAxis(-F.sk.v*L[0],F.sa.v*L[1]):x.skewFromAxis(-F.sk.v*L,F.sa.v*L)),F.r.propType&&(L.length?x.rotateZ(-F.r.v*L[2]):x.rotateZ(-F.r.v*L)),F.ry.propType&&(L.length?x.rotateY(F.ry.v*L[1]):x.rotateY(F.ry.v*L)),F.rx.propType&&(L.length?x.rotateX(F.rx.v*L[0]):x.rotateX(F.rx.v*L)),F.o.propType&&(L.length?z+=(F.o.v*L[0]-z)*L[0]:z+=(F.o.v*L-z)*L),t.strokeWidthAnim&&F.sw.propType&&(L.length?j+=F.sw.v*L[0]:j+=F.sw.v*L),t.strokeColorAnim&&F.sc.propType)for(H=0;H<3;H+=1)L.length?O[H]=O[H]+(F.sc.v[H]-O[H])*L[0]:O[H]=O[H]+(F.sc.v[H]-O[H])*L;if(t.fillColorAnim&&t.fc){if(F.fc.propType)for(H=0;H<3;H+=1)L.length?q[H]=q[H]+(F.fc.v[H]-q[H])*L[0]:q[H]=q[H]+(F.fc.v[H]-q[H])*L;F.fh.propType&&(q=L.length?addHueToRGB(q,F.fh.v*L[0]):addHueToRGB(q,F.fh.v*L)),F.fs.propType&&(q=L.length?addSaturationToRGB(q,F.fs.v*L[0]):addSaturationToRGB(q,F.fs.v*L)),F.fb.propType&&(q=L.length?addBrightnessToRGB(q,F.fb.v*L[0]):addBrightnessToRGB(q,F.fb.v*L))}}for(I=0;I<C;I+=1)(F=S[I].a).p.propType&&(L=S[I].s.getMult(T[s].anIndexes[I],A.a[I].s.totalChars),this._hasMaskedPath?L.length?x.translate(0,F.p.v[1]*L[0],-F.p.v[2]*L[1]):x.translate(0,F.p.v[1]*L,-F.p.v[2]*L):L.length?x.translate(F.p.v[0]*L[0],F.p.v[1]*L[1],-F.p.v[2]*L[2]):x.translate(F.p.v[0]*L,F.p.v[1]*L,-F.p.v[2]*L));if(t.strokeWidthAnim&&(W=j<0?0:j),t.strokeColorAnim&&(X="rgb("+Math.round(255*O[0])+","+Math.round(255*O[1])+","+Math.round(255*O[2])+")"),t.fillColorAnim&&t.fc&&(Y="rgb("+Math.round(255*q[0])+","+Math.round(255*q[1])+","+Math.round(255*q[2])+")"),this._hasMaskedPath){if(x.translate(0,-t.ls),x.translate(0,_[1]*V/100+i,0),A.p.p){b=(h.point[1]-c.point[1])/(h.point[0]-c.point[0]);var ht=180*Math.atan(b)/Math.PI;h.point[0]<c.point[0]&&(ht+=180),x.rotate(-ht*Math.PI/180)}x.translate(N,B,0),o-=_[0]*T[s].an/200,T[s+1]&&K!==T[s+1].ind&&(o+=T[s].an/2,o+=t.tr/1e3*t.finalSize)}else{switch(x.translate(r,i,0),t.ps&&x.translate(t.ps[0],t.ps[1]+t.ascent,0),t.j){case 1:x.translate(T[s].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[T[s].line]),0,0);break;case 2:x.translate(T[s].animatorJustifyOffset+t.justifyOffset+(t.boxWidth-t.lineWidths[T[s].line])/2,0,0)}x.translate(0,-t.ls),x.translate(G,0,0),x.translate(_[0]*T[s].an/200,_[1]*V/100,0),r+=T[s].l+t.tr/1e3*t.finalSize}"html"===E?tt=x.toCSS():"svg"===E?tt=x.to2dCSS():et=[x.props[0],x.props[1],x.props[2],x.props[3],x.props[4],x.props[5],x.props[6],x.props[7],x.props[8],x.props[9],x.props[10],x.props[11],x.props[12],x.props[13],x.props[14],x.props[15]],$=z}k<=s?(w=new LetterProps($,W,X,Y,tt,et),this.renderedLetters.push(w),k+=1,this.lettersChangedFlag=!0):(w=this.renderedLetters[s],this.lettersChangedFlag=w.update($,W,X,Y,tt,et)||this.lettersChangedFlag)}}},TextAnimatorProperty.prototype.getValue=function(){this._elem.globalData.frameId!==this._frameId&&(this._frameId=this._elem.globalData.frameId,this.iterateDynamicProperties())},TextAnimatorProperty.prototype.mHelper=new Matrix,TextAnimatorProperty.prototype.defaultPropsArray=[],extendPrototype([DynamicPropertyContainer],TextAnimatorProperty),LetterProps.prototype.update=function(t,e,r,i,s,a){this._mdf.o=!1,this._mdf.sw=!1,this._mdf.sc=!1,this._mdf.fc=!1,this._mdf.m=!1,this._mdf.p=!1;var n=!1;return this.o!==t&&(this.o=t,this._mdf.o=!0,n=!0),this.sw!==e&&(this.sw=e,this._mdf.sw=!0,n=!0),this.sc!==r&&(this.sc=r,this._mdf.sc=!0,n=!0),this.fc!==i&&(this.fc=i,this._mdf.fc=!0,n=!0),this.m!==s&&(this.m=s,this._mdf.m=!0,n=!0),!a.length||this.p[0]===a[0]&&this.p[1]===a[1]&&this.p[4]===a[4]&&this.p[5]===a[5]&&this.p[12]===a[12]&&this.p[13]===a[13]||(this.p=a,this._mdf.p=!0,n=!0),n},TextProperty.prototype.defaultBoxWidth=[0,0],TextProperty.prototype.copyData=function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return t},TextProperty.prototype.setCurrentData=function(t){t.__complete||this.completeTextData(t),this.currentData=t,this.currentData.boxWidth=this.currentData.boxWidth||this.defaultBoxWidth,this._mdf=!0},TextProperty.prototype.searchProperty=function(){return this.searchKeyframes()},TextProperty.prototype.searchKeyframes=function(){return this.kf=this.data.d.k.length>1,this.kf&&this.addEffect(this.getKeyframeValue.bind(this)),this.kf},TextProperty.prototype.addEffect=function(t){this.effectsSequence.push(t),this.elem.addDynamicProperty(this)},TextProperty.prototype.getValue=function(t){if(this.elem.globalData.frameId!==this.frameId&&this.effectsSequence.length||t){this.currentData.t=this.data.d.k[this.keysIndex].s.t;var e=this.currentData,r=this.keysIndex;if(this.lock)this.setCurrentData(this.currentData);else{this.lock=!0,this._mdf=!1;var i,s=this.effectsSequence.length,a=t||this.data.d.k[this.keysIndex].s;for(i=0;i<s;i+=1)a=r!==this.keysIndex?this.effectsSequence[i](a,a.t):this.effectsSequence[i](this.currentData,a.t);e!==a&&this.setCurrentData(a),this.pv=this.v=this.currentData,this.lock=!1,this.frameId=this.elem.globalData.frameId}}},TextProperty.prototype.getKeyframeValue=function(){for(var t=this.data.d.k,e=this.elem.comp.renderedFrame,r=0,i=t.length;r<=i-1&&(t[r].s,!(r===i-1||t[r+1].t>e));)r+=1;return this.keysIndex!==r&&(this.keysIndex=r),this.data.d.k[this.keysIndex].s},TextProperty.prototype.buildFinalText=function(t){for(var e=FontManager.getCombinedCharacterCodes(),r=[],i=0,s=t.length;i<s;)-1!==e.indexOf(t.charCodeAt(i))?r[r.length-1]+=t.charAt(i):r.push(t.charAt(i)),i+=1;return r},TextProperty.prototype.completeTextData=function(t){t.__complete=!0;var e,r,i,s,a,n,o,h=this.elem.globalData.fontManager,p=this.data,l=[],f=0,m=p.m.g,c=0,d=0,u=0,y=[],g=0,v=0,b=h.getFontByName(t.f),P=0,_=b.fStyle?b.fStyle.split(" "):[],S="normal",A="normal";for(r=_.length,e=0;e<r;e+=1)switch(_[e].toLowerCase()){case"italic":A="italic";break;case"bold":S="700";break;case"black":S="900";break;case"medium":S="500";break;case"regular":case"normal":S="400";break;case"light":case"thin":S="200"}t.fWeight=b.fWeight||S,t.fStyle=A,r=t.t.length,t.finalSize=t.s,t.finalText=this.buildFinalText(t.t),t.finalLineHeight=t.lh;var x,E=t.tr/1e3*t.finalSize;if(t.sz)for(var k,T,M=!0,D=t.sz[0],F=t.sz[1];M;){k=0,g=0,r=(T=this.buildFinalText(t.t)).length,E=t.tr/1e3*t.finalSize;var I=-1;for(e=0;e<r;e+=1)x=T[e].charCodeAt(0),i=!1," "===T[e]?I=e:13!==x&&3!==x||(g=0,i=!0,k+=t.finalLineHeight||1.2*t.finalSize),h.chars?(o=h.getCharData(T[e],b.fStyle,b.fFamily),P=i?0:o.w*t.finalSize/100):P=h.measureText(T[e],t.f,t.finalSize),g+P>D&&" "!==T[e]?(-1===I?r+=1:e=I,k+=t.finalLineHeight||1.2*t.finalSize,T.splice(e,I===e?1:0,"\r"),I=-1,g=0):(g+=P,g+=E);k+=b.ascent*t.finalSize/100,this.canResize&&t.finalSize>this.minimumFontSize&&F<k?(t.finalSize-=1,t.finalLineHeight=t.finalSize*t.lh/t.s):(t.finalText=T,r=t.finalText.length,M=!1)}g=-E,P=0;var C,w=0;for(e=0;e<r;e+=1)if(i=!1,x=(C=t.finalText[e]).charCodeAt(0)," "===C?s=" ":13===x||3===x?(w=0,y.push(g),v=g>v?g:v,g=-2*E,s="",i=!0,u+=1):s=t.finalText[e],h.chars?(o=h.getCharData(C,b.fStyle,h.getFontByName(t.f).fFamily),P=i?0:o.w*t.finalSize/100):P=h.measureText(s,t.f,t.finalSize)," "===C?w+=P+E:(g+=P+E+w,w=0),l.push({l:P,an:P,add:c,n:i,anIndexes:[],val:s,line:u,animatorJustifyOffset:0}),2==m){if(c+=P,""===s||" "===s||e===r-1){for(""!==s&&" "!==s||(c-=P);d<=e;)l[d].an=c,l[d].ind=f,l[d].extra=P,d+=1;f+=1,c=0}}else if(3==m){if(c+=P,""===s||e===r-1){for(""===s&&(c-=P);d<=e;)l[d].an=c,l[d].ind=f,l[d].extra=P,d+=1;c=0,f+=1}}else l[f].ind=f,l[f].extra=0,f+=1;if(t.l=l,v=g>v?g:v,y.push(g),t.sz)t.boxWidth=t.sz[0],t.justifyOffset=0;else switch(t.boxWidth=v,t.j){case 1:t.justifyOffset=-t.boxWidth;break;case 2:t.justifyOffset=-t.boxWidth/2;break;default:t.justifyOffset=0}t.lineWidths=y;var V,R,L=p.a;n=L.length;var G,N,B=[];for(a=0;a<n;a+=1){for((V=L[a]).a.sc&&(t.strokeColorAnim=!0),V.a.sw&&(t.strokeWidthAnim=!0),(V.a.fc||V.a.fh||V.a.fs||V.a.fb)&&(t.fillColorAnim=!0),N=0,G=V.s.b,e=0;e<r;e+=1)(R=l[e]).anIndexes[a]=N,(1==G&&""!==R.val||2==G&&""!==R.val&&" "!==R.val||3==G&&(R.n||" "==R.val||e==r-1)||4==G&&(R.n||e==r-1))&&(1===V.s.rn&&B.push(N),N+=1);p.a[a].s.totalChars=N;var z,O=-1;if(1===V.s.rn)for(e=0;e<r;e+=1)O!=(R=l[e]).anIndexes[a]&&(O=R.anIndexes[a],z=B.splice(Math.floor(Math.random()*B.length),1)[0]),R.anIndexes[a]=z}t.yOffset=t.finalLineHeight||1.2*t.finalSize,t.ls=t.ls||0,t.ascent=b.ascent*t.finalSize/100},TextProperty.prototype.updateDocumentData=function(t,e){e=void 0===e?this.keysIndex:e;var r=this.copyData({},this.data.d.k[e].s);r=this.copyData(r,t),this.data.d.k[e].s=r,this.recalculate(e),this.elem.addDynamicProperty(this)},TextProperty.prototype.recalculate=function(t){var e=this.data.d.k[t].s;e.__complete=!1,this.keysIndex=0,this._isFirstFrame=!0,this.getValue(e)},TextProperty.prototype.canResizeFont=function(t){this.canResize=t,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)},TextProperty.prototype.setMinimumFontSize=function(t){this.minimumFontSize=Math.floor(t)||1,this.recalculate(this.keysIndex),this.elem.addDynamicProperty(this)};var TextSelectorProp=function(){var t=Math.max,e=Math.min,r=Math.floor;function i(t,e){this._currentTextLength=-1,this.k=!1,this.data=e,this.elem=t,this.comp=t.comp,this.finalS=0,this.finalE=0,this.initDynamicPropertyContainer(t),this.s=PropertyFactory.getProp(t,e.s||{k:0},0,0,this),this.e="e"in e?PropertyFactory.getProp(t,e.e,0,0,this):{v:100},this.o=PropertyFactory.getProp(t,e.o||{k:0},0,0,this),this.xe=PropertyFactory.getProp(t,e.xe||{k:0},0,0,this),this.ne=PropertyFactory.getProp(t,e.ne||{k:0},0,0,this),this.a=PropertyFactory.getProp(t,e.a,0,.01,this),this.dynamicProperties.length||this.getValue()}return i.prototype={getMult:function(i){this._currentTextLength!==this.elem.textProperty.currentData.l.length&&this.getValue();var s=BezierFactory.getBezierEasing(this.ne.v/100,0,1-this.xe.v/100,1).get,a=0,n=this.finalS,o=this.finalE,h=this.data.sh;if(2==h)a=s(a=o===n?i>=o?1:0:t(0,e(.5/(o-n)+(i-n)/(o-n),1)));else if(3==h)a=s(a=o===n?i>=o?0:1:1-t(0,e(.5/(o-n)+(i-n)/(o-n),1)));else if(4==h)o===n?a=0:(a=t(0,e(.5/(o-n)+(i-n)/(o-n),1)))<.5?a*=2:a=1-2*(a-.5),a=s(a);else if(5==h){if(o===n)a=0;else{var p=o-n,l=-p/2+(i=e(t(0,i+.5-n),o-n)),f=p/2;a=Math.sqrt(1-l*l/(f*f))}a=s(a)}else 6==h?(o===n?a=0:(i=e(t(0,i+.5-n),o-n),a=(1+Math.cos(Math.PI+2*Math.PI*i/(o-n)))/2),a=s(a)):(i>=r(n)&&(a=i-n<0?1-(n-i):t(0,e(o-i,1))),a=s(a));return a*this.a.v},getValue:function(t){this.iterateDynamicProperties(),this._mdf=t||this._mdf,this._currentTextLength=this.elem.textProperty.currentData.l.length||0,t&&2===this.data.r&&(this.e.v=this._currentTextLength);var e=2===this.data.r?1:100/this.data.totalChars,r=this.o.v/e,i=this.s.v/e+r,s=this.e.v/e+r;if(i>s){var a=i;i=s,s=a}this.finalS=i,this.finalE=s}},extendPrototype([DynamicPropertyContainer],i),{getTextSelectorProp:function(t,e,r){return new i(t,e,r)}}}(),pool_factory=function(t,e,r,i){var s=0,a=t,n=createSizedArray(a);function o(){return s?n[s-=1]:e()}return{newElement:o,release:function(t){s===a&&(n=pooling.double(n),a*=2),r&&r(t),n[s]=t,s+=1}}},pooling=function(){return{double:function(t){return t.concat(createSizedArray(t.length))}}}(),point_pool=function(){return pool_factory(8,function(){return createTypedArray("float32",2)})}(),shape_pool=function(){var t=pool_factory(4,function(){return new ShapePath},function(t){var e,r=t._length;for(e=0;e<r;e+=1)point_pool.release(t.v[e]),point_pool.release(t.i[e]),point_pool.release(t.o[e]),t.v[e]=null,t.i[e]=null,t.o[e]=null;t._length=0,t.c=!1});return t.clone=function(e){var r,i=t.newElement(),s=void 0===e._length?e.v.length:e._length;for(i.setLength(s),i.c=e.c,r=0;r<s;r+=1)i.setTripleAt(e.v[r][0],e.v[r][1],e.o[r][0],e.o[r][1],e.i[r][0],e.i[r][1],r);return i},t}(),shapeCollection_pool=function(){var t={newShapeCollection:function(){var t;t=e?i[e-=1]:new ShapeCollection;return t},release:function(t){var s,a=t._length;for(s=0;s<a;s+=1)shape_pool.release(t.shapes[s]);t._length=0,e===r&&(i=pooling.double(i),r*=2);i[e]=t,e+=1}},e=0,r=4,i=createSizedArray(r);return t}(),segments_length_pool=function(){return pool_factory(8,function(){return{lengths:[],totalLength:0}},function(t){var e,r=t.lengths.length;for(e=0;e<r;e+=1)bezier_length_pool.release(t.lengths[e]);t.lengths.length=0})}(),bezier_length_pool=function(){return pool_factory(8,function(){return{addedLength:0,percents:createTypedArray("float32",defaultCurveSegments),lengths:createTypedArray("float32",defaultCurveSegments)}})}();function BaseRenderer(){}function SVGRenderer(t,e){this.animationItem=t,this.layers=null,this.renderedFrame=-1,this.svgElement=createNS("svg");var r="";if(e&&e.title){var i=createNS("title"),s=createElementID();i.setAttribute("id",s),i.textContent=e.title,this.svgElement.appendChild(i),r+=s}if(e&&e.description){var a=createNS("desc"),n=createElementID();a.setAttribute("id",n),a.textContent=e.description,this.svgElement.appendChild(a),r+=" "+n}r&&this.svgElement.setAttribute("aria-labelledby",r);var o=createNS("defs");this.svgElement.appendChild(o);var h=createNS("g");this.svgElement.appendChild(h),this.layerElement=h,this.renderConfig={preserveAspectRatio:e&&e.preserveAspectRatio||"xMidYMid meet",imagePreserveAspectRatio:e&&e.imagePreserveAspectRatio||"xMidYMid slice",progressiveLoad:e&&e.progressiveLoad||!1,hideOnTransparent:!e||!1!==e.hideOnTransparent,viewBoxOnly:e&&e.viewBoxOnly||!1,viewBoxSize:e&&e.viewBoxSize||!1,className:e&&e.className||""},this.globalData={_mdf:!1,frameNum:-1,defs:o,renderConfig:this.renderConfig},this.elements=[],this.pendingElements=[],this.destroyed=!1,this.rendererType="svg"}function MaskElement(t,e,r){this.data=t,this.element=e,this.globalData=r,this.storedData=[],this.masksProperties=this.data.masksProperties||[],this.maskElement=null;var i,s=this.globalData.defs,a=this.masksProperties?this.masksProperties.length:0;this.viewData=createSizedArray(a),this.solidPath="";var n,o,h,p,l,f,m,c=this.masksProperties,d=0,u=[],y=createElementID(),g="clipPath",v="clip-path";for(i=0;i<a;i++)if(("a"!==c[i].mode&&"n"!==c[i].mode||c[i].inv||100!==c[i].o.k)&&(g="mask",v="mask"),"s"!=c[i].mode&&"i"!=c[i].mode||0!==d?p=null:((p=createNS("rect")).setAttribute("fill","#ffffff"),p.setAttribute("width",this.element.comp.data.w||0),p.setAttribute("height",this.element.comp.data.h||0),u.push(p)),n=createNS("path"),"n"!=c[i].mode){var b;if(d+=1,n.setAttribute("fill","s"===c[i].mode?"#000000":"#ffffff"),n.setAttribute("clip-rule","nonzero"),0!==c[i].x.k?(g="mask",v="mask",m=PropertyFactory.getProp(this.element,c[i].x,0,null,this.element),b=createElementID(),(l=createNS("filter")).setAttribute("id",b),(f=createNS("feMorphology")).setAttribute("operator","erode"),f.setAttribute("in","SourceGraphic"),f.setAttribute("radius","0"),l.appendChild(f),s.appendChild(l),n.setAttribute("stroke","s"===c[i].mode?"#000000":"#ffffff")):(f=null,m=null),this.storedData[i]={elem:n,x:m,expan:f,lastPath:"",lastOperator:"",filterId:b,lastRadius:0},"i"==c[i].mode){h=u.length;var P=createNS("g");for(o=0;o<h;o+=1)P.appendChild(u[o]);var _=createNS("mask");_.setAttribute("mask-type","alpha"),_.setAttribute("id",y+"_"+d),_.appendChild(n),s.appendChild(_),P.setAttribute("mask","url("+locationHref+"#"+y+"_"+d+")"),u.length=0,u.push(P)}else u.push(n);c[i].inv&&!this.solidPath&&(this.solidPath=this.createLayerSolidPath()),this.viewData[i]={elem:n,lastPath:"",op:PropertyFactory.getProp(this.element,c[i].o,0,.01,this.element),prop:ShapePropertyFactory.getShapeProp(this.element,c[i],3),invRect:p},this.viewData[i].prop.k||this.drawPath(c[i],this.viewData[i].prop.v,this.viewData[i])}else this.viewData[i]={op:PropertyFactory.getProp(this.element,c[i].o,0,.01,this.element),prop:ShapePropertyFactory.getShapeProp(this.element,c[i],3),elem:n,lastPath:""},s.appendChild(n);for(this.maskElement=createNS(g),a=u.length,i=0;i<a;i+=1)this.maskElement.appendChild(u[i]);d>0&&(this.maskElement.setAttribute("id",y),this.element.maskedElement.setAttribute(v,"url("+locationHref+"#"+y+")"),s.appendChild(this.maskElement)),this.viewData.length&&this.element.addRenderableComponent(this)}function HierarchyElement(){}function FrameElement(){}function TransformElement(){}function RenderableElement(){}function RenderableDOMElement(){}function ProcessedElement(t,e){this.elem=t,this.pos=e}function SVGStyleData(t,e){this.data=t,this.type=t.ty,this.d="",this.lvl=e,this._mdf=!1,this.closed=!0===t.hd,this.pElem=createNS("path"),this.msElem=null}function SVGShapeData(t,e,r){this.caches=[],this.styles=[],this.transformers=t,this.lStr="",this.sh=r,this.lvl=e,this._isAnimated=!!r.k;for(var i=0,s=t.length;i<s;){if(t[i].mProps.dynamicProperties.length){this._isAnimated=!0;break}i+=1}}function SVGTransformData(t,e,r){this.transform={mProps:t,op:e,container:r},this.elements=[],this._isAnimated=this.transform.mProps.dynamicProperties.length||this.transform.op.effectsSequence.length}function SVGStrokeStyleData(t,e,r){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.o=PropertyFactory.getProp(t,e.o,0,.01,this),this.w=PropertyFactory.getProp(t,e.w,0,null,this),this.d=new DashProperty(t,e.d||{},"svg",this),this.c=PropertyFactory.getProp(t,e.c,1,255,this),this.style=r,this._isAnimated=!!this._isAnimated}function SVGFillStyleData(t,e,r){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.o=PropertyFactory.getProp(t,e.o,0,.01,this),this.c=PropertyFactory.getProp(t,e.c,1,255,this),this.style=r}function SVGGradientFillStyleData(t,e,r){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.initGradientData(t,e,r)}function SVGGradientStrokeStyleData(t,e,r){this.initDynamicPropertyContainer(t),this.getValue=this.iterateDynamicProperties,this.w=PropertyFactory.getProp(t,e.w,0,null,this),this.d=new DashProperty(t,e.d||{},"svg",this),this.initGradientData(t,e,r),this._isAnimated=!!this._isAnimated}function ShapeGroupData(){this.it=[],this.prevViewData=[],this.gr=createNS("g")}BaseRenderer.prototype.checkLayers=function(t){var e,r,i=this.layers.length;for(this.completeLayers=!0,e=i-1;e>=0;e--)this.elements[e]||(r=this.layers[e]).ip-r.st<=t-this.layers[e].st&&r.op-r.st>t-this.layers[e].st&&this.buildItem(e),this.completeLayers=!!this.elements[e]&&this.completeLayers;this.checkPendingElements()},BaseRenderer.prototype.createItem=function(t){switch(t.ty){case 2:return this.createImage(t);case 0:return this.createComp(t);case 1:return this.createSolid(t);case 3:return this.createNull(t);case 4:return this.createShape(t);case 5:return this.createText(t);case 13:return this.createCamera(t)}return this.createNull(t)},BaseRenderer.prototype.createCamera=function(){throw new Error("You're using a 3d camera. Try the html renderer.")},BaseRenderer.prototype.buildAllItems=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.buildItem(t);this.checkPendingElements()},BaseRenderer.prototype.includeLayers=function(t){this.completeLayers=!1;var e,r,i=t.length,s=this.layers.length;for(e=0;e<i;e+=1)for(r=0;r<s;){if(this.layers[r].id==t[e].id){this.layers[r]=t[e];break}r+=1}},BaseRenderer.prototype.setProjectInterface=function(t){this.globalData.projectInterface=t},BaseRenderer.prototype.initItems=function(){this.globalData.progressiveLoad||this.buildAllItems()},BaseRenderer.prototype.buildElementParenting=function(t,e,r){for(var i=this.elements,s=this.layers,a=0,n=s.length;a<n;)s[a].ind==e&&(i[a]&&!0!==i[a]?(r.push(i[a]),i[a].setAsParent(),void 0!==s[a].parent?this.buildElementParenting(t,s[a].parent,r):t.setHierarchy(r)):(this.buildItem(a),this.addPendingElement(t))),a+=1},BaseRenderer.prototype.addPendingElement=function(t){this.pendingElements.push(t)},BaseRenderer.prototype.searchExtraCompositions=function(t){var e,r=t.length;for(e=0;e<r;e+=1)if(t[e].xt){var i=this.createComp(t[e]);i.initExpressions(),this.globalData.projectInterface.registerComposition(i)}},BaseRenderer.prototype.setupGlobalData=function(t,e){this.globalData.fontManager=new FontManager,this.globalData.fontManager.addChars(t.chars),this.globalData.fontManager.addFonts(t.fonts,e),this.globalData.getAssetData=this.animationItem.getAssetData.bind(this.animationItem),this.globalData.getAssetsPath=this.animationItem.getAssetsPath.bind(this.animationItem),this.globalData.imageLoader=this.animationItem.imagePreloader,this.globalData.frameId=0,this.globalData.frameRate=t.fr,this.globalData.nm=t.nm,this.globalData.compSize={w:t.w,h:t.h}},extendPrototype([BaseRenderer],SVGRenderer),SVGRenderer.prototype.createNull=function(t){return new NullElement(t,this.globalData,this)},SVGRenderer.prototype.createShape=function(t){return new SVGShapeElement(t,this.globalData,this)},SVGRenderer.prototype.createText=function(t){return new SVGTextElement(t,this.globalData,this)},SVGRenderer.prototype.createImage=function(t){return new IImageElement(t,this.globalData,this)},SVGRenderer.prototype.createComp=function(t){return new SVGCompElement(t,this.globalData,this)},SVGRenderer.prototype.createSolid=function(t){return new ISolidElement(t,this.globalData,this)},SVGRenderer.prototype.configAnimation=function(t){this.svgElement.setAttribute("xmlns","http://www.w3.org/2000/svg"),this.renderConfig.viewBoxSize?this.svgElement.setAttribute("viewBox",this.renderConfig.viewBoxSize):this.svgElement.setAttribute("viewBox","0 0 "+t.w+" "+t.h),this.renderConfig.viewBoxOnly||(this.svgElement.setAttribute("width",t.w),this.svgElement.setAttribute("height",t.h),this.svgElement.style.width="100%",this.svgElement.style.height="100%",this.svgElement.style.transform="translate3d(0,0,0)"),this.renderConfig.className&&this.svgElement.setAttribute("class",this.renderConfig.className),this.svgElement.setAttribute("preserveAspectRatio",this.renderConfig.preserveAspectRatio),this.animationItem.wrapper.appendChild(this.svgElement);var e=this.globalData.defs;this.setupGlobalData(t,e),this.globalData.progressiveLoad=this.renderConfig.progressiveLoad,this.data=t;var r=createNS("clipPath"),i=createNS("rect");i.setAttribute("width",t.w),i.setAttribute("height",t.h),i.setAttribute("x",0),i.setAttribute("y",0);var s=createElementID();r.setAttribute("id",s),r.appendChild(i),this.layerElement.setAttribute("clip-path","url("+locationHref+"#"+s+")"),e.appendChild(r),this.layers=t.layers,this.elements=createSizedArray(t.layers.length)},SVGRenderer.prototype.destroy=function(){this.animationItem.wrapper.innerHTML="",this.layerElement=null,this.globalData.defs=null;var t,e=this.layers?this.layers.length:0;for(t=0;t<e;t++)this.elements[t]&&this.elements[t].destroy();this.elements.length=0,this.destroyed=!0,this.animationItem=null},SVGRenderer.prototype.updateContainerSize=function(){},SVGRenderer.prototype.buildItem=function(t){var e=this.elements;if(!e[t]&&99!=this.layers[t].ty){e[t]=!0;var r=this.createItem(this.layers[t]);e[t]=r,expressionsPlugin&&(0===this.layers[t].ty&&this.globalData.projectInterface.registerComposition(r),r.initExpressions()),this.appendElementInPos(r,t),this.layers[t].tt&&(this.elements[t-1]&&!0!==this.elements[t-1]?r.setMatte(e[t-1].layerId):(this.buildItem(t-1),this.addPendingElement(r)))}},SVGRenderer.prototype.checkPendingElements=function(){for(;this.pendingElements.length;){var t=this.pendingElements.pop();if(t.checkParenting(),t.data.tt)for(var e=0,r=this.elements.length;e<r;){if(this.elements[e]===t){t.setMatte(this.elements[e-1].layerId);break}e+=1}}},SVGRenderer.prototype.renderFrame=function(t){if(this.renderedFrame!==t&&!this.destroyed){null===t?t=this.renderedFrame:this.renderedFrame=t,this.globalData.frameNum=t,this.globalData.frameId+=1,this.globalData.projectInterface.currentFrame=t,this.globalData._mdf=!1;var e,r=this.layers.length;for(this.completeLayers||this.checkLayers(t),e=r-1;e>=0;e--)(this.completeLayers||this.elements[e])&&this.elements[e].prepareFrame(t-this.layers[e].st);if(this.globalData._mdf)for(e=0;e<r;e+=1)(this.completeLayers||this.elements[e])&&this.elements[e].renderFrame()}},SVGRenderer.prototype.appendElementInPos=function(t,e){var r=t.getBaseElement();if(r){for(var i,s=0;s<e;)this.elements[s]&&!0!==this.elements[s]&&this.elements[s].getBaseElement()&&(i=this.elements[s].getBaseElement()),s+=1;i?this.layerElement.insertBefore(r,i):this.layerElement.appendChild(r)}},SVGRenderer.prototype.hide=function(){this.layerElement.style.display="none"},SVGRenderer.prototype.show=function(){this.layerElement.style.display="block"},MaskElement.prototype.getMaskProperty=function(t){return this.viewData[t].prop},MaskElement.prototype.renderFrame=function(t){var e,r=this.element.finalTransform.mat,i=this.masksProperties.length;for(e=0;e<i;e++)if((this.viewData[e].prop._mdf||t)&&this.drawPath(this.masksProperties[e],this.viewData[e].prop.v,this.viewData[e]),(this.viewData[e].op._mdf||t)&&this.viewData[e].elem.setAttribute("fill-opacity",this.viewData[e].op.v),"n"!==this.masksProperties[e].mode&&(this.viewData[e].invRect&&(this.element.finalTransform.mProp._mdf||t)&&(this.viewData[e].invRect.setAttribute("x",-r.props[12]),this.viewData[e].invRect.setAttribute("y",-r.props[13])),this.storedData[e].x&&(this.storedData[e].x._mdf||t))){var s=this.storedData[e].expan;this.storedData[e].x.v<0?("erode"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="erode",this.storedData[e].elem.setAttribute("filter","url("+locationHref+"#"+this.storedData[e].filterId+")")),s.setAttribute("radius",-this.storedData[e].x.v)):("dilate"!==this.storedData[e].lastOperator&&(this.storedData[e].lastOperator="dilate",this.storedData[e].elem.setAttribute("filter",null)),this.storedData[e].elem.setAttribute("stroke-width",2*this.storedData[e].x.v))}},MaskElement.prototype.getMaskelement=function(){return this.maskElement},MaskElement.prototype.createLayerSolidPath=function(){var t="M0,0 ";return t+=" h"+this.globalData.compSize.w,t+=" v"+this.globalData.compSize.h,t+=" h-"+this.globalData.compSize.w,t+=" v-"+this.globalData.compSize.h+" "},MaskElement.prototype.drawPath=function(t,e,r){var i,s,a=" M"+e.v[0][0]+","+e.v[0][1];for(s=e._length,i=1;i<s;i+=1)a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[i][0]+","+e.i[i][1]+" "+e.v[i][0]+","+e.v[i][1];if(e.c&&s>1&&(a+=" C"+e.o[i-1][0]+","+e.o[i-1][1]+" "+e.i[0][0]+","+e.i[0][1]+" "+e.v[0][0]+","+e.v[0][1]),r.lastPath!==a){var n="";r.elem&&(e.c&&(n=t.inv?this.solidPath+a:a),r.elem.setAttribute("d",n)),r.lastPath=a}},MaskElement.prototype.destroy=function(){this.element=null,this.globalData=null,this.maskElement=null,this.data=null,this.masksProperties=null},HierarchyElement.prototype={initHierarchy:function(){this.hierarchy=[],this._isParent=!1,this.checkParenting()},setHierarchy:function(t){this.hierarchy=t},setAsParent:function(){this._isParent=!0},checkParenting:function(){void 0!==this.data.parent&&this.comp.buildElementParenting(this,this.data.parent,[])}},FrameElement.prototype={initFrame:function(){this._isFirstFrame=!1,this.dynamicProperties=[],this._mdf=!1},prepareProperties:function(t,e){var r,i=this.dynamicProperties.length;for(r=0;r<i;r+=1)(e||this._isParent&&"transform"===this.dynamicProperties[r].propType)&&(this.dynamicProperties[r].getValue(),this.dynamicProperties[r]._mdf&&(this.globalData._mdf=!0,this._mdf=!0))},addDynamicProperty:function(t){-1===this.dynamicProperties.indexOf(t)&&this.dynamicProperties.push(t)}},TransformElement.prototype={initTransform:function(){this.finalTransform={mProp:this.data.ks?TransformPropertyFactory.getTransformProperty(this,this.data.ks,this):{o:0},_matMdf:!1,_opMdf:!1,mat:new Matrix},this.data.ao&&(this.finalTransform.mProp.autoOriented=!0),this.data.ty},renderTransform:function(){if(this.finalTransform._opMdf=this.finalTransform.mProp.o._mdf||this._isFirstFrame,this.finalTransform._matMdf=this.finalTransform.mProp._mdf||this._isFirstFrame,this.hierarchy){var t,e=this.finalTransform.mat,r=0,i=this.hierarchy.length;if(!this.finalTransform._matMdf)for(;r<i;){if(this.hierarchy[r].finalTransform.mProp._mdf){this.finalTransform._matMdf=!0;break}r+=1}if(this.finalTransform._matMdf)for(t=this.finalTransform.mProp.v.props,e.cloneFromProps(t),r=0;r<i;r+=1)t=this.hierarchy[r].finalTransform.mProp.v.props,e.transform(t[0],t[1],t[2],t[3],t[4],t[5],t[6],t[7],t[8],t[9],t[10],t[11],t[12],t[13],t[14],t[15])}},globalToLocal:function(t){var e=[];e.push(this.finalTransform);for(var r=!0,i=this.comp;r;)i.finalTransform?(i.data.hasMask&&e.splice(0,0,i.finalTransform),i=i.comp):r=!1;var s,a,n=e.length;for(s=0;s<n;s+=1)a=e[s].mat.applyToPointArray(0,0,0),t=[t[0]-a[0],t[1]-a[1],0];return t},mHelper:new Matrix},RenderableElement.prototype={initRenderable:function(){this.isInRange=!1,this.hidden=!1,this.isTransparent=!1,this.renderableComponents=[]},addRenderableComponent:function(t){-1===this.renderableComponents.indexOf(t)&&this.renderableComponents.push(t)},removeRenderableComponent:function(t){-1!==this.renderableComponents.indexOf(t)&&this.renderableComponents.splice(this.renderableComponents.indexOf(t),1)},prepareRenderableFrame:function(t){this.checkLayerLimits(t)},checkTransparency:function(){this.finalTransform.mProp.o.v<=0?!this.isTransparent&&this.globalData.renderConfig.hideOnTransparent&&(this.isTransparent=!0,this.hide()):this.isTransparent&&(this.isTransparent=!1,this.show())},checkLayerLimits:function(t){this.data.ip-this.data.st<=t&&this.data.op-this.data.st>t?!0!==this.isInRange&&(this.globalData._mdf=!0,this._mdf=!0,this.isInRange=!0,this.show()):!1!==this.isInRange&&(this.globalData._mdf=!0,this.isInRange=!1,this.hide())},renderRenderable:function(){var t,e=this.renderableComponents.length;for(t=0;t<e;t+=1)this.renderableComponents[t].renderFrame(this._isFirstFrame)},sourceRectAtTime:function(){return{top:0,left:0,width:100,height:100}},getLayerSize:function(){return 5===this.data.ty?{w:this.data.textData.width,h:this.data.textData.height}:{w:this.data.width,h:this.data.height}}},extendPrototype([RenderableElement,createProxyFunction({initElement:function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide()},hide:function(){this.hidden||this.isInRange&&!this.isTransparent||((this.baseElement||this.layerElement).style.display="none",this.hidden=!0)},show:function(){this.isInRange&&!this.isTransparent&&(this.data.hd||((this.baseElement||this.layerElement).style.display="block"),this.hidden=!1,this._isFirstFrame=!0)},renderFrame:function(){this.data.hd||this.hidden||(this.renderTransform(),this.renderRenderable(),this.renderElement(),this.renderInnerContent(),this._isFirstFrame&&(this._isFirstFrame=!1))},renderInnerContent:function(){},prepareFrame:function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.checkTransparency()},destroy:function(){this.innerElem=null,this.destroyBaseElement()}})],RenderableDOMElement),SVGStyleData.prototype.reset=function(){this.d="",this._mdf=!1},SVGShapeData.prototype.setAsAnimated=function(){this._isAnimated=!0},extendPrototype([DynamicPropertyContainer],SVGStrokeStyleData),extendPrototype([DynamicPropertyContainer],SVGFillStyleData),SVGGradientFillStyleData.prototype.initGradientData=function(t,e,r){this.o=PropertyFactory.getProp(t,e.o,0,.01,this),this.s=PropertyFactory.getProp(t,e.s,1,null,this),this.e=PropertyFactory.getProp(t,e.e,1,null,this),this.h=PropertyFactory.getProp(t,e.h||{k:0},0,.01,this),this.a=PropertyFactory.getProp(t,e.a||{k:0},0,degToRads,this),this.g=new GradientProperty(t,e.g,this),this.style=r,this.stops=[],this.setGradientData(r.pElem,e),this.setGradientOpacity(e,r),this._isAnimated=!!this._isAnimated},SVGGradientFillStyleData.prototype.setGradientData=function(t,e){var r=createElementID(),i=createNS(1===e.t?"linearGradient":"radialGradient");i.setAttribute("id",r),i.setAttribute("spreadMethod","pad"),i.setAttribute("gradientUnits","userSpaceOnUse");var s,a,n,o=[];for(n=4*e.g.p,a=0;a<n;a+=4)s=createNS("stop"),i.appendChild(s),o.push(s);t.setAttribute("gf"===e.ty?"fill":"stroke","url("+locationHref+"#"+r+")"),this.gf=i,this.cst=o},SVGGradientFillStyleData.prototype.setGradientOpacity=function(t,e){if(this.g._hasOpacity&&!this.g._collapsable){var r,i,s,a=createNS("mask"),n=createNS("path");a.appendChild(n);var o=createElementID(),h=createElementID();a.setAttribute("id",h);var p=createNS(1===t.t?"linearGradient":"radialGradient");p.setAttribute("id",o),p.setAttribute("spreadMethod","pad"),p.setAttribute("gradientUnits","userSpaceOnUse"),s=t.g.k.k[0].s?t.g.k.k[0].s.length:t.g.k.k.length;var l=this.stops;for(i=4*t.g.p;i<s;i+=2)(r=createNS("stop")).setAttribute("stop-color","rgb(255,255,255)"),p.appendChild(r),l.push(r);n.setAttribute("gf"===t.ty?"fill":"stroke","url("+locationHref+"#"+o+")"),this.of=p,this.ms=a,this.ost=l,this.maskId=h,e.msElem=n}},extendPrototype([DynamicPropertyContainer],SVGGradientFillStyleData),extendPrototype([SVGGradientFillStyleData,DynamicPropertyContainer],SVGGradientStrokeStyleData);var SVGElementsRenderer=function(){var t=new Matrix,e=new Matrix;function r(t,e,r){(r||e.transform.op._mdf)&&e.transform.container.setAttribute("opacity",e.transform.op.v),(r||e.transform.mProps._mdf)&&e.transform.container.setAttribute("transform",e.transform.mProps.v.to2dCSS())}function i(r,i,s){var a,n,o,h,p,l,f,m,c,d,u,y=i.styles.length,g=i.lvl;for(l=0;l<y;l+=1){if(h=i.sh._mdf||s,i.styles[l].lvl<g){for(m=e.reset(),d=g-i.styles[l].lvl,u=i.transformers.length-1;!h&&d>0;)h=i.transformers[u].mProps._mdf||h,d--,u--;if(h)for(d=g-i.styles[l].lvl,u=i.transformers.length-1;d>0;)c=i.transformers[u].mProps.v.props,m.transform(c[0],c[1],c[2],c[3],c[4],c[5],c[6],c[7],c[8],c[9],c[10],c[11],c[12],c[13],c[14],c[15]),d--,u--}else m=t;if(n=(f=i.sh.paths)._length,h){for(o="",a=0;a<n;a+=1)(p=f.shapes[a])&&p._length&&(o+=buildShapeString(p,p._length,p.c,m));i.caches[l]=o}else o=i.caches[l];i.styles[l].d+=!0===r.hd?"":o,i.styles[l]._mdf=h||i.styles[l]._mdf}}function s(t,e,r){var i=e.style;(e.c._mdf||r)&&i.pElem.setAttribute("fill","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o._mdf||r)&&i.pElem.setAttribute("fill-opacity",e.o.v)}function a(t,e,r){n(t,e,r),o(t,e,r)}function n(t,e,r){var i,s,a,n,o,h=e.gf,p=e.g._hasOpacity,l=e.s.v,f=e.e.v;if(e.o._mdf||r){var m="gf"===t.ty?"fill-opacity":"stroke-opacity";e.style.pElem.setAttribute(m,e.o.v)}if(e.s._mdf||r){var c=1===t.t?"x1":"cx",d="x1"===c?"y1":"cy";h.setAttribute(c,l[0]),h.setAttribute(d,l[1]),p&&!e.g._collapsable&&(e.of.setAttribute(c,l[0]),e.of.setAttribute(d,l[1]))}if(e.g._cmdf||r){i=e.cst;var u=e.g.c;for(a=i.length,s=0;s<a;s+=1)(n=i[s]).setAttribute("offset",u[4*s]+"%"),n.setAttribute("stop-color","rgb("+u[4*s+1]+","+u[4*s+2]+","+u[4*s+3]+")")}if(p&&(e.g._omdf||r)){var y=e.g.o;for(a=(i=e.g._collapsable?e.cst:e.ost).length,s=0;s<a;s+=1)n=i[s],e.g._collapsable||n.setAttribute("offset",y[2*s]+"%"),n.setAttribute("stop-opacity",y[2*s+1])}if(1===t.t)(e.e._mdf||r)&&(h.setAttribute("x2",f[0]),h.setAttribute("y2",f[1]),p&&!e.g._collapsable&&(e.of.setAttribute("x2",f[0]),e.of.setAttribute("y2",f[1])));else if((e.s._mdf||e.e._mdf||r)&&(o=Math.sqrt(Math.pow(l[0]-f[0],2)+Math.pow(l[1]-f[1],2)),h.setAttribute("r",o),p&&!e.g._collapsable&&e.of.setAttribute("r",o)),e.e._mdf||e.h._mdf||e.a._mdf||r){o||(o=Math.sqrt(Math.pow(l[0]-f[0],2)+Math.pow(l[1]-f[1],2)));var g=Math.atan2(f[1]-l[1],f[0]-l[0]),v=o*(e.h.v>=1?.99:e.h.v<=-1?-.99:e.h.v),b=Math.cos(g+e.a.v)*v+l[0],P=Math.sin(g+e.a.v)*v+l[1];h.setAttribute("fx",b),h.setAttribute("fy",P),p&&!e.g._collapsable&&(e.of.setAttribute("fx",b),e.of.setAttribute("fy",P))}}function o(t,e,r){var i=e.style,s=e.d;s&&(s._mdf||r)&&s.dashStr&&(i.pElem.setAttribute("stroke-dasharray",s.dashStr),i.pElem.setAttribute("stroke-dashoffset",s.dashoffset[0])),e.c&&(e.c._mdf||r)&&i.pElem.setAttribute("stroke","rgb("+bm_floor(e.c.v[0])+","+bm_floor(e.c.v[1])+","+bm_floor(e.c.v[2])+")"),(e.o._mdf||r)&&i.pElem.setAttribute("stroke-opacity",e.o.v),(e.w._mdf||r)&&(i.pElem.setAttribute("stroke-width",e.w.v),i.msElem&&i.msElem.setAttribute("stroke-width",e.w.v))}return{createRenderFunction:function(t){t.ty;switch(t.ty){case"fl":return s;case"gf":return n;case"gs":return a;case"st":return o;case"sh":case"el":case"rc":case"sr":return i;case"tr":return r}}}}();function ShapeTransformManager(){this.sequences={},this.sequenceList=[],this.transform_key_count=0}function BaseElement(){}function NullElement(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initFrame(),this.initTransform(t,e,r),this.initHierarchy()}function SVGBaseElement(){}function IShapeElement(){}function ITextElement(){}function ICompElement(){}function IImageElement(t,e,r){this.assetData=e.getAssetData(t.refId),this.initElement(t,e,r),this.sourceRect={top:0,left:0,width:this.assetData.w,height:this.assetData.h}}function ISolidElement(t,e,r){this.initElement(t,e,r)}function SVGCompElement(t,e,r){this.layers=t.layers,this.supports3d=!0,this.completeLayers=!1,this.pendingElements=[],this.elements=this.layers?createSizedArray(this.layers.length):[],this.initElement(t,e,r),this.tm=t.tm?PropertyFactory.getProp(this,t.tm,0,e.frameRate,this):{_placeholder:!0}}function SVGTextElement(t,e,r){this.textSpans=[],this.renderType="svg",this.initElement(t,e,r)}function SVGShapeElement(t,e,r){this.shapes=[],this.shapesData=t.shapes,this.stylesList=[],this.shapeModifiers=[],this.itemsData=[],this.processedElements=[],this.animatedContents=[],this.initElement(t,e,r),this.prevViewData=[]}function SVGTintFilter(t,e){this.filterManager=e;var r=createNS("feColorMatrix");if(r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","linearRGB"),r.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),r.setAttribute("result","f1"),t.appendChild(r),(r=createNS("feColorMatrix")).setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","sRGB"),r.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),r.setAttribute("result","f2"),t.appendChild(r),this.matrixFilter=r,100!==e.effectElements[2].p.v||e.effectElements[2].p.k){var i,s=createNS("feMerge");t.appendChild(s),(i=createNS("feMergeNode")).setAttribute("in","SourceGraphic"),s.appendChild(i),(i=createNS("feMergeNode")).setAttribute("in","f2"),s.appendChild(i)}}function SVGFillFilter(t,e){this.filterManager=e;var r=createNS("feColorMatrix");r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","sRGB"),r.setAttribute("values","1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0"),t.appendChild(r),this.matrixFilter=r}function SVGStrokeEffect(t,e){this.initialized=!1,this.filterManager=e,this.elem=t,this.paths=[]}function SVGTritoneFilter(t,e){this.filterManager=e;var r=createNS("feColorMatrix");r.setAttribute("type","matrix"),r.setAttribute("color-interpolation-filters","linearRGB"),r.setAttribute("values","0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0.3333 0.3333 0.3333 0 0 0 0 0 1 0"),r.setAttribute("result","f1"),t.appendChild(r);var i=createNS("feComponentTransfer");i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.matrixFilter=i;var s=createNS("feFuncR");s.setAttribute("type","table"),i.appendChild(s),this.feFuncR=s;var a=createNS("feFuncG");a.setAttribute("type","table"),i.appendChild(a),this.feFuncG=a;var n=createNS("feFuncB");n.setAttribute("type","table"),i.appendChild(n),this.feFuncB=n}function SVGProLevelsFilter(t,e){this.filterManager=e;var r=this.filterManager.effectElements,i=createNS("feComponentTransfer");(r[10].p.k||0!==r[10].p.v||r[11].p.k||1!==r[11].p.v||r[12].p.k||1!==r[12].p.v||r[13].p.k||0!==r[13].p.v||r[14].p.k||1!==r[14].p.v)&&(this.feFuncR=this.createFeFunc("feFuncR",i)),(r[17].p.k||0!==r[17].p.v||r[18].p.k||1!==r[18].p.v||r[19].p.k||1!==r[19].p.v||r[20].p.k||0!==r[20].p.v||r[21].p.k||1!==r[21].p.v)&&(this.feFuncG=this.createFeFunc("feFuncG",i)),(r[24].p.k||0!==r[24].p.v||r[25].p.k||1!==r[25].p.v||r[26].p.k||1!==r[26].p.v||r[27].p.k||0!==r[27].p.v||r[28].p.k||1!==r[28].p.v)&&(this.feFuncB=this.createFeFunc("feFuncB",i)),(r[31].p.k||0!==r[31].p.v||r[32].p.k||1!==r[32].p.v||r[33].p.k||1!==r[33].p.v||r[34].p.k||0!==r[34].p.v||r[35].p.k||1!==r[35].p.v)&&(this.feFuncA=this.createFeFunc("feFuncA",i)),(this.feFuncR||this.feFuncG||this.feFuncB||this.feFuncA)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),i=createNS("feComponentTransfer")),(r[3].p.k||0!==r[3].p.v||r[4].p.k||1!==r[4].p.v||r[5].p.k||1!==r[5].p.v||r[6].p.k||0!==r[6].p.v||r[7].p.k||1!==r[7].p.v)&&(i.setAttribute("color-interpolation-filters","sRGB"),t.appendChild(i),this.feFuncRComposed=this.createFeFunc("feFuncR",i),this.feFuncGComposed=this.createFeFunc("feFuncG",i),this.feFuncBComposed=this.createFeFunc("feFuncB",i))}function SVGDropShadowEffect(t,e){t.setAttribute("x","-100%"),t.setAttribute("y","-100%"),t.setAttribute("width","400%"),t.setAttribute("height","400%"),this.filterManager=e;var r=createNS("feGaussianBlur");r.setAttribute("in","SourceAlpha"),r.setAttribute("result","drop_shadow_1"),r.setAttribute("stdDeviation","0"),this.feGaussianBlur=r,t.appendChild(r);var i=createNS("feOffset");i.setAttribute("dx","25"),i.setAttribute("dy","0"),i.setAttribute("in","drop_shadow_1"),i.setAttribute("result","drop_shadow_2"),this.feOffset=i,t.appendChild(i);var s=createNS("feFlood");s.setAttribute("flood-color","#00ff00"),s.setAttribute("flood-opacity","1"),s.setAttribute("result","drop_shadow_3"),this.feFlood=s,t.appendChild(s);var a=createNS("feComposite");a.setAttribute("in","drop_shadow_3"),a.setAttribute("in2","drop_shadow_2"),a.setAttribute("operator","in"),a.setAttribute("result","drop_shadow_4"),t.appendChild(a);var n,o=createNS("feMerge");t.appendChild(o),n=createNS("feMergeNode"),o.appendChild(n),(n=createNS("feMergeNode")).setAttribute("in","SourceGraphic"),this.feMergeNode=n,this.feMerge=o,this.originalNodeAdded=!1,o.appendChild(n)}ShapeTransformManager.prototype={addTransformSequence:function(t){var e,r=t.length,i="_";for(e=0;e<r;e+=1)i+=t[e].transform.key+"_";var s=this.sequences[i];return s||(s={transforms:[].concat(t),finalTransform:new Matrix,_mdf:!1},this.sequences[i]=s,this.sequenceList.push(s)),s},processSequence:function(t,e){for(var r,i=0,s=t.transforms.length,a=e;i<s&&!e;){if(t.transforms[i].transform.mProps._mdf){a=!0;break}i+=1}if(a)for(t.finalTransform.reset(),i=s-1;i>=0;i-=1)r=t.transforms[i].transform.mProps.v.props,t.finalTransform.transform(r[0],r[1],r[2],r[3],r[4],r[5],r[6],r[7],r[8],r[9],r[10],r[11],r[12],r[13],r[14],r[15]);t._mdf=a},processSequences:function(t){var e,r=this.sequenceList.length;for(e=0;e<r;e+=1)this.processSequence(this.sequenceList[e],t)},getNewKey:function(){return"_"+this.transform_key_count++}},BaseElement.prototype={checkMasks:function(){if(!this.data.hasMask)return!1;for(var t=0,e=this.data.masksProperties.length;t<e;){if("n"!==this.data.masksProperties[t].mode&&!1!==this.data.masksProperties[t].cl)return!0;t+=1}return!1},initExpressions:function(){this.layerInterface=LayerExpressionInterface(this),this.data.hasMask&&this.maskManager&&this.layerInterface.registerMaskInterface(this.maskManager);var t=EffectsExpressionInterface.createEffectsInterface(this,this.layerInterface);this.layerInterface.registerEffectsInterface(t),0===this.data.ty||this.data.xt?this.compInterface=CompExpressionInterface(this):4===this.data.ty?(this.layerInterface.shapeInterface=ShapeExpressionInterface(this.shapesData,this.itemsData,this.layerInterface),this.layerInterface.content=this.layerInterface.shapeInterface):5===this.data.ty&&(this.layerInterface.textInterface=TextExpressionInterface(this),this.layerInterface.text=this.layerInterface.textInterface)},setBlendMode:function(){var t=getBlendMode(this.data.bm);(this.baseElement||this.layerElement).style["mix-blend-mode"]=t},initBaseData:function(t,e,r){this.globalData=e,this.comp=r,this.data=t,this.layerId=createElementID(),this.data.sr||(this.data.sr=1),this.effectsManager=new EffectsManager(this.data,this,this.dynamicProperties)},getType:function(){return this.type},sourceRectAtTime:function(){}},NullElement.prototype.prepareFrame=function(t){this.prepareProperties(t,!0)},NullElement.prototype.renderFrame=function(){},NullElement.prototype.getBaseElement=function(){return null},NullElement.prototype.destroy=function(){},NullElement.prototype.sourceRectAtTime=function(){},NullElement.prototype.hide=function(){},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement],NullElement),SVGBaseElement.prototype={initRendererElement:function(){this.layerElement=createNS("g")},createContainerElements:function(){this.matteElement=createNS("g"),this.transformedElement=this.layerElement,this.maskedElement=this.layerElement,this._sizeChanged=!1;var t,e,r,i=null;if(this.data.td){if(3==this.data.td||1==this.data.td){var s=createNS("mask");s.setAttribute("id",this.layerId),s.setAttribute("mask-type",3==this.data.td?"luminance":"alpha"),s.appendChild(this.layerElement),i=s,this.globalData.defs.appendChild(s),featureSupport.maskType||1!=this.data.td||(s.setAttribute("mask-type","luminance"),t=createElementID(),e=filtersFactory.createFilter(t),this.globalData.defs.appendChild(e),e.appendChild(filtersFactory.createAlphaToLuminanceFilter()),(r=createNS("g")).appendChild(this.layerElement),i=r,s.appendChild(r),r.setAttribute("filter","url("+locationHref+"#"+t+")"))}else if(2==this.data.td){var a=createNS("mask");a.setAttribute("id",this.layerId),a.setAttribute("mask-type","alpha");var n=createNS("g");a.appendChild(n),t=createElementID(),e=filtersFactory.createFilter(t);var o=createNS("feComponentTransfer");o.setAttribute("in","SourceGraphic"),e.appendChild(o);var h=createNS("feFuncA");h.setAttribute("type","table"),h.setAttribute("tableValues","1.0 0.0"),o.appendChild(h),this.globalData.defs.appendChild(e);var p=createNS("rect");p.setAttribute("width",this.comp.data.w),p.setAttribute("height",this.comp.data.h),p.setAttribute("x","0"),p.setAttribute("y","0"),p.setAttribute("fill","#ffffff"),p.setAttribute("opacity","0"),n.setAttribute("filter","url("+locationHref+"#"+t+")"),n.appendChild(p),n.appendChild(this.layerElement),i=n,featureSupport.maskType||(a.setAttribute("mask-type","luminance"),e.appendChild(filtersFactory.createAlphaToLuminanceFilter()),r=createNS("g"),n.appendChild(p),r.appendChild(this.layerElement),i=r,n.appendChild(r)),this.globalData.defs.appendChild(a)}}else this.data.tt?(this.matteElement.appendChild(this.layerElement),i=this.matteElement,this.baseElement=this.matteElement):this.baseElement=this.layerElement;if(this.data.ln&&this.layerElement.setAttribute("id",this.data.ln),this.data.cl&&this.layerElement.setAttribute("class",this.data.cl),0===this.data.ty&&!this.data.hd){var l=createNS("clipPath"),f=createNS("path");f.setAttribute("d","M0,0 L"+this.data.w+",0 L"+this.data.w+","+this.data.h+" L0,"+this.data.h+"z");var m=createElementID();if(l.setAttribute("id",m),l.appendChild(f),this.globalData.defs.appendChild(l),this.checkMasks()){var c=createNS("g");c.setAttribute("clip-path","url("+locationHref+"#"+m+")"),c.appendChild(this.layerElement),this.transformedElement=c,i?i.appendChild(this.transformedElement):this.baseElement=this.transformedElement}else this.layerElement.setAttribute("clip-path","url("+locationHref+"#"+m+")")}0!==this.data.bm&&this.setBlendMode()},renderElement:function(){this.finalTransform._matMdf&&this.transformedElement.setAttribute("transform",this.finalTransform.mat.to2dCSS()),this.finalTransform._opMdf&&this.transformedElement.setAttribute("opacity",this.finalTransform.mProp.o.v)},destroyBaseElement:function(){this.layerElement=null,this.matteElement=null,this.maskManager.destroy()},getBaseElement:function(){return this.data.hd?null:this.baseElement},createRenderableComponents:function(){this.maskManager=new MaskElement(this.data,this,this.globalData),this.renderableEffectsManager=new SVGEffects(this)},setMatte:function(t){this.matteElement&&this.matteElement.setAttribute("mask","url("+locationHref+"#"+t+")")}},IShapeElement.prototype={addShapeToModifiers:function(t){var e,r=this.shapeModifiers.length;for(e=0;e<r;e+=1)this.shapeModifiers[e].addShape(t)},isShapeInAnimatedModifiers:function(t){for(var e=this.shapeModifiers.length;0<e;)if(this.shapeModifiers[0].isAnimatedWithShape(t))return!0;return!1},renderModifiers:function(){if(this.shapeModifiers.length){var t,e=this.shapes.length;for(t=0;t<e;t+=1)this.shapes[t].sh.reset();for(t=(e=this.shapeModifiers.length)-1;t>=0;t-=1)this.shapeModifiers[t].processShapes(this._isFirstFrame)}},lcEnum:{1:"butt",2:"round",3:"square"},ljEnum:{1:"miter",2:"round",3:"bevel"},searchProcessedElement:function(t){for(var e=this.processedElements,r=0,i=e.length;r<i;){if(e[r].elem===t)return e[r].pos;r+=1}return 0},addProcessedElement:function(t,e){for(var r=this.processedElements,i=r.length;i;)if(r[i-=1].elem===t)return void(r[i].pos=e);r.push(new ProcessedElement(t,e))},prepareFrame:function(t){this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange)}},ITextElement.prototype.initElement=function(t,e,r){this.lettersChangedFlag=!0,this.initFrame(),this.initBaseData(t,e,r),this.textProperty=new TextProperty(this,t.t,this.dynamicProperties),this.textAnimator=new TextAnimatorProperty(t.t,this.renderType,this),this.initTransform(t,e,r),this.initHierarchy(),this.initRenderable(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),this.createContent(),this.hide(),this.textAnimator.searchProperties(this.dynamicProperties)},ITextElement.prototype.prepareFrame=function(t){this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),(this.textProperty._mdf||this.textProperty._isFirstFrame)&&(this.buildNewText(),this.textProperty._isFirstFrame=!1,this.textProperty._mdf=!1)},ITextElement.prototype.createPathShape=function(t,e){var r,i,s=e.length,a="";for(r=0;r<s;r+=1)i=e[r].ks.k,a+=buildShapeString(i,i.i.length,!0,t);return a},ITextElement.prototype.updateDocumentData=function(t,e){this.textProperty.updateDocumentData(t,e)},ITextElement.prototype.canResizeFont=function(t){this.textProperty.canResizeFont(t)},ITextElement.prototype.setMinimumFontSize=function(t){this.textProperty.setMinimumFontSize(t)},ITextElement.prototype.applyTextPropertiesToMatrix=function(t,e,r,i,s){switch(t.ps&&e.translate(t.ps[0],t.ps[1]+t.ascent,0),e.translate(0,-t.ls,0),t.j){case 1:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r]),0,0);break;case 2:e.translate(t.justifyOffset+(t.boxWidth-t.lineWidths[r])/2,0,0)}e.translate(i,s,0)},ITextElement.prototype.buildColor=function(t){return"rgb("+Math.round(255*t[0])+","+Math.round(255*t[1])+","+Math.round(255*t[2])+")"},ITextElement.prototype.emptyProp=new LetterProps,ITextElement.prototype.destroy=function(){},extendPrototype([BaseElement,TransformElement,HierarchyElement,FrameElement,RenderableDOMElement],ICompElement),ICompElement.prototype.initElement=function(t,e,r){this.initFrame(),this.initBaseData(t,e,r),this.initTransform(t,e,r),this.initRenderable(),this.initHierarchy(),this.initRendererElement(),this.createContainerElements(),this.createRenderableComponents(),!this.data.xt&&e.progressiveLoad||this.buildAllItems(),this.hide()},ICompElement.prototype.prepareFrame=function(t){if(this._mdf=!1,this.prepareRenderableFrame(t),this.prepareProperties(t,this.isInRange),this.isInRange||this.data.xt){if(this.tm._placeholder)this.renderedFrame=t/this.data.sr;else{var e=this.tm.v;e===this.data.op&&(e=this.data.op-1),this.renderedFrame=e}var r,i=this.elements.length;for(this.completeLayers||this.checkLayers(this.renderedFrame),r=i-1;r>=0;r-=1)(this.completeLayers||this.elements[r])&&(this.elements[r].prepareFrame(this.renderedFrame-this.layers[r].st),this.elements[r]._mdf&&(this._mdf=!0))}},ICompElement.prototype.renderInnerContent=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)(this.completeLayers||this.elements[t])&&this.elements[t].renderFrame()},ICompElement.prototype.setElements=function(t){this.elements=t},ICompElement.prototype.getElements=function(){return this.elements},ICompElement.prototype.destroyElements=function(){var t,e=this.layers.length;for(t=0;t<e;t+=1)this.elements[t]&&this.elements[t].destroy()},ICompElement.prototype.destroy=function(){this.destroyElements(),this.destroyBaseElement()},extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement],IImageElement),IImageElement.prototype.createContent=function(){var t=this.globalData.getAssetsPath(this.assetData);this.innerElem=createNS("image"),this.innerElem.setAttribute("width",this.assetData.w+"px"),this.innerElem.setAttribute("height",this.assetData.h+"px"),this.innerElem.setAttribute("preserveAspectRatio",this.assetData.pr||this.globalData.renderConfig.imagePreserveAspectRatio),this.innerElem.setAttributeNS("http://www.w3.org/1999/xlink","href",t),this.layerElement.appendChild(this.innerElem)},IImageElement.prototype.sourceRectAtTime=function(){return this.sourceRect},extendPrototype([IImageElement],ISolidElement),ISolidElement.prototype.createContent=function(){var t=createNS("rect");t.setAttribute("width",this.data.sw),t.setAttribute("height",this.data.sh),t.setAttribute("fill",this.data.sc),this.layerElement.appendChild(t)},extendPrototype([SVGRenderer,ICompElement,SVGBaseElement],SVGCompElement),extendPrototype([BaseElement,TransformElement,SVGBaseElement,HierarchyElement,FrameElement,RenderableDOMElement,ITextElement],SVGTextElement),SVGTextElement.prototype.createContent=function(){this.data.singleShape&&!this.globalData.fontManager.chars&&(this.textContainer=createNS("text"))},SVGTextElement.prototype.buildTextContents=function(t){for(var e=0,r=t.length,i=[],s="";e<r;)t[e]===String.fromCharCode(13)||t[e]===String.fromCharCode(3)?(i.push(s),s=""):s+=t[e],e+=1;return i.push(s),i},SVGTextElement.prototype.buildNewText=function(){var t,e,r=this.textProperty.currentData;this.renderedLetters=createSizedArray(r?r.l.length:0),r.fc?this.layerElement.setAttribute("fill",this.buildColor(r.fc)):this.layerElement.setAttribute("fill","rgba(0,0,0,0)"),r.sc&&(this.layerElement.setAttribute("stroke",this.buildColor(r.sc)),this.layerElement.setAttribute("stroke-width",r.sw)),this.layerElement.setAttribute("font-size",r.finalSize);var i=this.globalData.fontManager.getFontByName(r.f);if(i.fClass)this.layerElement.setAttribute("class",i.fClass);else{this.layerElement.setAttribute("font-family",i.fFamily);var s=r.fWeight,a=r.fStyle;this.layerElement.setAttribute("font-style",a),this.layerElement.setAttribute("font-weight",s)}this.layerElement.setAttribute("arial-label",r.t);var n,o=r.l||[],h=!!this.globalData.fontManager.chars;e=o.length;var p,l=this.mHelper,f="",m=this.data.singleShape,c=0,d=0,u=!0,y=r.tr/1e3*r.finalSize;if(!m||h||r.sz){var g,v,b=this.textSpans.length;for(t=0;t<e;t+=1)h&&m&&0!==t||(n=b>t?this.textSpans[t]:createNS(h?"path":"text"),b<=t&&(n.setAttribute("stroke-linecap","butt"),n.setAttribute("stroke-linejoin","round"),n.setAttribute("stroke-miterlimit","4"),this.textSpans[t]=n,this.layerElement.appendChild(n)),n.style.display="inherit"),l.reset(),l.scale(r.finalSize/100,r.finalSize/100),m&&(o[t].n&&(c=-y,d+=r.yOffset,d+=u?1:0,u=!1),this.applyTextPropertiesToMatrix(r,l,o[t].line,c,d),c+=o[t].l||0,c+=y),h?(p=(g=(v=this.globalData.fontManager.getCharData(r.finalText[t],i.fStyle,this.globalData.fontManager.getFontByName(r.f).fFamily))&&v.data||{}).shapes?g.shapes[0].it:[],m?f+=this.createPathShape(l,p):n.setAttribute("d",this.createPathShape(l,p))):(m&&n.setAttribute("transform","translate("+l.props[12]+","+l.props[13]+")"),n.textContent=o[t].val,n.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"));m&&n&&n.setAttribute("d",f)}else{var P=this.textContainer,_="start";switch(r.j){case 1:_="end";break;case 2:_="middle"}P.setAttribute("text-anchor",_),P.setAttribute("letter-spacing",y);var S=this.buildTextContents(r.finalText);for(e=S.length,d=r.ps?r.ps[1]+r.ascent:0,t=0;t<e;t+=1)(n=this.textSpans[t]||createNS("tspan")).textContent=S[t],n.setAttribute("x",0),n.setAttribute("y",d),n.style.display="inherit",P.appendChild(n),this.textSpans[t]=n,d+=r.finalLineHeight;this.layerElement.appendChild(P)}for(;t<this.textSpans.length;)this.textSpans[t].style.display="none",t+=1;this._sizeChanged=!0},SVGTextElement.prototype.sourceRectAtTime=function(t){if(this.prepareFrame(this.comp.renderedFrame-this.data.st),this.renderInnerContent(),this._sizeChanged){this._sizeChanged=!1;var e=this.layerElement.getBBox();this.bbox={top:e.y,left:e.x,width:e.width,height:e.height}}return this.bbox},SVGTextElement.prototype.renderInnerContent=function(){if(!this.data.singleShape&&(this.textAnimator.getMeasures(this.textProperty.currentData,this.lettersChangedFlag),this.lettersChangedFlag||this.textAnimator.lettersChangedFlag)){var t,e;this._sizeChanged=!0;var r,i,s=this.textAnimator.renderedLetters,a=this.textProperty.currentData.l;for(e=a.length,t=0;t<e;t+=1)a[t].n||(r=s[t],i=this.textSpans[t],r._mdf.m&&i.setAttribute("transform",r.m),r._mdf.o&&i.setAttribute("opacity",r.o),r._mdf.sw&&i.setAttribute("stroke-width",r.sw),r._mdf.sc&&i.setAttribute("stroke",r.sc),r._mdf.fc&&i.setAttribute("fill",r.fc))}},extendPrototype([BaseElement,TransformElement,SVGBaseElement,IShapeElement,HierarchyElement,FrameElement,RenderableDOMElement],SVGShapeElement),SVGShapeElement.prototype.initSecondaryElement=function(){},SVGShapeElement.prototype.identityMatrix=new Matrix,SVGShapeElement.prototype.buildExpressionInterface=function(){},SVGShapeElement.prototype.createContent=function(){this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes()},SVGShapeElement.prototype.filterUniqueShapes=function(){var t,e,r,i,s=this.shapes.length,a=this.stylesList.length,n=[],o=!1;for(r=0;r<a;r+=1){for(i=this.stylesList[r],o=!1,n.length=0,t=0;t<s;t+=1)-1!==(e=this.shapes[t]).styles.indexOf(i)&&(n.push(e),o=e._isAnimated||o);n.length>1&&o&&this.setShapesAsAnimated(n)}},SVGShapeElement.prototype.setShapesAsAnimated=function(t){var e,r=t.length;for(e=0;e<r;e+=1)t[e].setAsAnimated()},SVGShapeElement.prototype.createStyleElement=function(t,e){var r,i=new SVGStyleData(t,e),s=i.pElem;if("st"===t.ty)r=new SVGStrokeStyleData(this,t,i);else if("fl"===t.ty)r=new SVGFillStyleData(this,t,i);else if("gf"===t.ty||"gs"===t.ty){r=new("gf"===t.ty?SVGGradientFillStyleData:SVGGradientStrokeStyleData)(this,t,i),this.globalData.defs.appendChild(r.gf),r.maskId&&(this.globalData.defs.appendChild(r.ms),this.globalData.defs.appendChild(r.of),s.setAttribute("mask","url("+locationHref+"#"+r.maskId+")"))}return"st"!==t.ty&&"gs"!==t.ty||(s.setAttribute("stroke-linecap",this.lcEnum[t.lc]||"round"),s.setAttribute("stroke-linejoin",this.ljEnum[t.lj]||"round"),s.setAttribute("fill-opacity","0"),1===t.lj&&s.setAttribute("stroke-miterlimit",t.ml)),2===t.r&&s.setAttribute("fill-rule","evenodd"),t.ln&&s.setAttribute("id",t.ln),t.cl&&s.setAttribute("class",t.cl),t.bm&&(s.style["mix-blend-mode"]=getBlendMode(t.bm)),this.stylesList.push(i),this.addToAnimatedContents(t,r),r},SVGShapeElement.prototype.createGroupElement=function(t){var e=new ShapeGroupData;return t.ln&&e.gr.setAttribute("id",t.ln),t.cl&&e.gr.setAttribute("class",t.cl),t.bm&&(e.gr.style["mix-blend-mode"]=getBlendMode(t.bm)),e},SVGShapeElement.prototype.createTransformElement=function(t,e){var r=TransformPropertyFactory.getTransformProperty(this,t,this),i=new SVGTransformData(r,r.o,e);return this.addToAnimatedContents(t,i),i},SVGShapeElement.prototype.createShapeElement=function(t,e,r){var i=4;"rc"===t.ty?i=5:"el"===t.ty?i=6:"sr"===t.ty&&(i=7);var s=new SVGShapeData(e,r,ShapePropertyFactory.getShapeProp(this,t,i,this));return this.shapes.push(s),this.addShapeToModifiers(s),this.addToAnimatedContents(t,s),s},SVGShapeElement.prototype.addToAnimatedContents=function(t,e){for(var r=0,i=this.animatedContents.length;r<i;){if(this.animatedContents[r].element===e)return;r+=1}this.animatedContents.push({fn:SVGElementsRenderer.createRenderFunction(t),element:e,data:t})},SVGShapeElement.prototype.setElementStyles=function(t){var e,r=t.styles,i=this.stylesList.length;for(e=0;e<i;e+=1)this.stylesList[e].closed||r.push(this.stylesList[e])},SVGShapeElement.prototype.reloadShapes=function(){this._isFirstFrame=!0;var t,e=this.itemsData.length;for(t=0;t<e;t+=1)this.prevViewData[t]=this.itemsData[t];for(this.searchShapes(this.shapesData,this.itemsData,this.prevViewData,this.layerElement,0,[],!0),this.filterUniqueShapes(),e=this.dynamicProperties.length,t=0;t<e;t+=1)this.dynamicProperties[t].getValue();this.renderModifiers()},SVGShapeElement.prototype.searchShapes=function(t,e,r,i,s,a,n){var o,h,p,l,f,m,c=[].concat(a),d=t.length-1,u=[],y=[];for(o=d;o>=0;o-=1){if((m=this.searchProcessedElement(t[o]))?e[o]=r[m-1]:t[o]._render=n,"fl"==t[o].ty||"st"==t[o].ty||"gf"==t[o].ty||"gs"==t[o].ty)m?e[o].style.closed=!1:e[o]=this.createStyleElement(t[o],s),t[o]._render&&i.appendChild(e[o].style.pElem),u.push(e[o].style);else if("gr"==t[o].ty){if(m)for(p=e[o].it.length,h=0;h<p;h+=1)e[o].prevViewData[h]=e[o].it[h];else e[o]=this.createGroupElement(t[o]);this.searchShapes(t[o].it,e[o].it,e[o].prevViewData,e[o].gr,s+1,c,n),t[o]._render&&i.appendChild(e[o].gr)}else"tr"==t[o].ty?(m||(e[o]=this.createTransformElement(t[o],i)),l=e[o].transform,c.push(l)):"sh"==t[o].ty||"rc"==t[o].ty||"el"==t[o].ty||"sr"==t[o].ty?(m||(e[o]=this.createShapeElement(t[o],c,s)),this.setElementStyles(e[o])):"tm"==t[o].ty||"rd"==t[o].ty||"ms"==t[o].ty?(m?(f=e[o]).closed=!1:((f=ShapeModifiers.getModifier(t[o].ty)).init(this,t[o]),e[o]=f,this.shapeModifiers.push(f)),y.push(f)):"rp"==t[o].ty&&(m?(f=e[o]).closed=!0:(f=ShapeModifiers.getModifier(t[o].ty),e[o]=f,f.init(this,t,o,e),this.shapeModifiers.push(f),n=!1),y.push(f));this.addProcessedElement(t[o],o+1)}for(d=u.length,o=0;o<d;o+=1)u[o].closed=!0;for(d=y.length,o=0;o<d;o+=1)y[o].closed=!0},SVGShapeElement.prototype.renderInnerContent=function(){this.renderModifiers();var t,e=this.stylesList.length;for(t=0;t<e;t+=1)this.stylesList[t].reset();for(this.renderShape(),t=0;t<e;t+=1)(this.stylesList[t]._mdf||this._isFirstFrame)&&(this.stylesList[t].msElem&&(this.stylesList[t].msElem.setAttribute("d",this.stylesList[t].d),this.stylesList[t].d="M0 0"+this.stylesList[t].d),this.stylesList[t].pElem.setAttribute("d",this.stylesList[t].d||"M0 0"))},SVGShapeElement.prototype.renderShape=function(){var t,e,r=this.animatedContents.length;for(t=0;t<r;t+=1)e=this.animatedContents[t],(this._isFirstFrame||e.element._isAnimated)&&!0!==e.data&&e.fn(e.data,e.element,this._isFirstFrame)},SVGShapeElement.prototype.destroy=function(){this.destroyBaseElement(),this.shapesData=null,this.itemsData=null},SVGTintFilter.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e=this.filterManager.effectElements[0].p.v,r=this.filterManager.effectElements[1].p.v,i=this.filterManager.effectElements[2].p.v/100;this.matrixFilter.setAttribute("values",r[0]-e[0]+" 0 0 0 "+e[0]+" "+(r[1]-e[1])+" 0 0 0 "+e[1]+" "+(r[2]-e[2])+" 0 0 0 "+e[2]+" 0 0 0 "+i+" 0")}},SVGFillFilter.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e=this.filterManager.effectElements[2].p.v,r=this.filterManager.effectElements[6].p.v;this.matrixFilter.setAttribute("values","0 0 0 0 "+e[0]+" 0 0 0 0 "+e[1]+" 0 0 0 0 "+e[2]+" 0 0 0 "+r+" 0")}},SVGStrokeEffect.prototype.initialize=function(){var t,e,r,i,s=this.elem.layerElement.children||this.elem.layerElement.childNodes;for(1===this.filterManager.effectElements[1].p.v?(i=this.elem.maskManager.masksProperties.length,r=0):i=(r=this.filterManager.effectElements[0].p.v-1)+1,(e=createNS("g")).setAttribute("fill","none"),e.setAttribute("stroke-linecap","round"),e.setAttribute("stroke-dashoffset",1);r<i;r+=1)t=createNS("path"),e.appendChild(t),this.paths.push({p:t,m:r});if(3===this.filterManager.effectElements[10].p.v){var a=createNS("mask"),n=createElementID();a.setAttribute("id",n),a.setAttribute("mask-type","alpha"),a.appendChild(e),this.elem.globalData.defs.appendChild(a);var o=createNS("g");for(o.setAttribute("mask","url("+locationHref+"#"+n+")");s[0];)o.appendChild(s[0]);this.elem.layerElement.appendChild(o),this.masker=a,e.setAttribute("stroke","#fff")}else if(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v){if(2===this.filterManager.effectElements[10].p.v)for(s=this.elem.layerElement.children||this.elem.layerElement.childNodes;s.length;)this.elem.layerElement.removeChild(s[0]);this.elem.layerElement.appendChild(e),this.elem.layerElement.removeAttribute("mask"),e.setAttribute("stroke","#fff")}this.initialized=!0,this.pathMasker=e},SVGStrokeEffect.prototype.renderFrame=function(t){this.initialized||this.initialize();var e,r,i,s=this.paths.length;for(e=0;e<s;e+=1)if(-1!==this.paths[e].m&&(r=this.elem.maskManager.viewData[this.paths[e].m],i=this.paths[e].p,(t||this.filterManager._mdf||r.prop._mdf)&&i.setAttribute("d",r.lastPath),t||this.filterManager.effectElements[9].p._mdf||this.filterManager.effectElements[4].p._mdf||this.filterManager.effectElements[7].p._mdf||this.filterManager.effectElements[8].p._mdf||r.prop._mdf)){var a;if(0!==this.filterManager.effectElements[7].p.v||100!==this.filterManager.effectElements[8].p.v){var n=Math.min(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,o=Math.max(this.filterManager.effectElements[7].p.v,this.filterManager.effectElements[8].p.v)/100,h=i.getTotalLength();a="0 0 0 "+h*n+" ";var p,l=h*(o-n),f=1+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100,m=Math.floor(l/f);for(p=0;p<m;p+=1)a+="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100+" ";a+="0 "+10*h+" 0 0"}else a="1 "+2*this.filterManager.effectElements[4].p.v*this.filterManager.effectElements[9].p.v/100;i.setAttribute("stroke-dasharray",a)}if((t||this.filterManager.effectElements[4].p._mdf)&&this.pathMasker.setAttribute("stroke-width",2*this.filterManager.effectElements[4].p.v),(t||this.filterManager.effectElements[6].p._mdf)&&this.pathMasker.setAttribute("opacity",this.filterManager.effectElements[6].p.v),(1===this.filterManager.effectElements[10].p.v||2===this.filterManager.effectElements[10].p.v)&&(t||this.filterManager.effectElements[3].p._mdf)){var c=this.filterManager.effectElements[3].p.v;this.pathMasker.setAttribute("stroke","rgb("+bm_floor(255*c[0])+","+bm_floor(255*c[1])+","+bm_floor(255*c[2])+")")}},SVGTritoneFilter.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e=this.filterManager.effectElements[0].p.v,r=this.filterManager.effectElements[1].p.v,i=this.filterManager.effectElements[2].p.v,s=i[0]+" "+r[0]+" "+e[0],a=i[1]+" "+r[1]+" "+e[1],n=i[2]+" "+r[2]+" "+e[2];this.feFuncR.setAttribute("tableValues",s),this.feFuncG.setAttribute("tableValues",a),this.feFuncB.setAttribute("tableValues",n)}},SVGProLevelsFilter.prototype.createFeFunc=function(t,e){var r=createNS(t);return r.setAttribute("type","table"),e.appendChild(r),r},SVGProLevelsFilter.prototype.getTableValue=function(t,e,r,i,s){for(var a,n,o=0,h=Math.min(t,e),p=Math.max(t,e),l=Array.call(null,{length:256}),f=0,m=s-i,c=e-t;o<=256;)n=(a=o/256)<=h?c<0?s:i:a>=p?c<0?i:s:i+m*Math.pow((a-t)/c,1/r),l[f++]=n,o+=256/255;return l.join(" ")},SVGProLevelsFilter.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){var e,r=this.filterManager.effectElements;this.feFuncRComposed&&(t||r[3].p._mdf||r[4].p._mdf||r[5].p._mdf||r[6].p._mdf||r[7].p._mdf)&&(e=this.getTableValue(r[3].p.v,r[4].p.v,r[5].p.v,r[6].p.v,r[7].p.v),this.feFuncRComposed.setAttribute("tableValues",e),this.feFuncGComposed.setAttribute("tableValues",e),this.feFuncBComposed.setAttribute("tableValues",e)),this.feFuncR&&(t||r[10].p._mdf||r[11].p._mdf||r[12].p._mdf||r[13].p._mdf||r[14].p._mdf)&&(e=this.getTableValue(r[10].p.v,r[11].p.v,r[12].p.v,r[13].p.v,r[14].p.v),this.feFuncR.setAttribute("tableValues",e)),this.feFuncG&&(t||r[17].p._mdf||r[18].p._mdf||r[19].p._mdf||r[20].p._mdf||r[21].p._mdf)&&(e=this.getTableValue(r[17].p.v,r[18].p.v,r[19].p.v,r[20].p.v,r[21].p.v),this.feFuncG.setAttribute("tableValues",e)),this.feFuncB&&(t||r[24].p._mdf||r[25].p._mdf||r[26].p._mdf||r[27].p._mdf||r[28].p._mdf)&&(e=this.getTableValue(r[24].p.v,r[25].p.v,r[26].p.v,r[27].p.v,r[28].p.v),this.feFuncB.setAttribute("tableValues",e)),this.feFuncA&&(t||r[31].p._mdf||r[32].p._mdf||r[33].p._mdf||r[34].p._mdf||r[35].p._mdf)&&(e=this.getTableValue(r[31].p.v,r[32].p.v,r[33].p.v,r[34].p.v,r[35].p.v),this.feFuncA.setAttribute("tableValues",e))}},SVGDropShadowEffect.prototype.renderFrame=function(t){if(t||this.filterManager._mdf){if((t||this.filterManager.effectElements[4].p._mdf)&&this.feGaussianBlur.setAttribute("stdDeviation",this.filterManager.effectElements[4].p.v/4),t||this.filterManager.effectElements[0].p._mdf){var e=this.filterManager.effectElements[0].p.v;this.feFlood.setAttribute("flood-color",rgbToHex(Math.round(255*e[0]),Math.round(255*e[1]),Math.round(255*e[2])))}if((t||this.filterManager.effectElements[1].p._mdf)&&this.feFlood.setAttribute("flood-opacity",this.filterManager.effectElements[1].p.v/255),t||this.filterManager.effectElements[2].p._mdf||this.filterManager.effectElements[3].p._mdf){var r=this.filterManager.effectElements[3].p.v,i=(this.filterManager.effectElements[2].p.v-90)*degToRads,s=r*Math.cos(i),a=r*Math.sin(i);this.feOffset.setAttribute("dx",s),this.feOffset.setAttribute("dy",a)}}};var _svgMatteSymbols=[];function SVGMatte3Effect(t,e,r){this.initialized=!1,this.filterManager=e,this.filterElem=t,this.elem=r,r.matteElement=createNS("g"),r.matteElement.appendChild(r.layerElement),r.matteElement.appendChild(r.transformedElement),r.baseElement=r.matteElement}function SVGEffects(t){var e,r,i=t.data.ef?t.data.ef.length:0,s=createElementID(),a=filtersFactory.createFilter(s),n=0;for(this.filters=[],e=0;e<i;e+=1)r=null,20===t.data.ef[e].ty?(n+=1,r=new SVGTintFilter(a,t.effectsManager.effectElements[e])):21===t.data.ef[e].ty?(n+=1,r=new SVGFillFilter(a,t.effectsManager.effectElements[e])):22===t.data.ef[e].ty?r=new SVGStrokeEffect(t,t.effectsManager.effectElements[e]):23===t.data.ef[e].ty?(n+=1,r=new SVGTritoneFilter(a,t.effectsManager.effectElements[e])):24===t.data.ef[e].ty?(n+=1,r=new SVGProLevelsFilter(a,t.effectsManager.effectElements[e])):25===t.data.ef[e].ty?(n+=1,r=new SVGDropShadowEffect(a,t.effectsManager.effectElements[e])):28===t.data.ef[e].ty&&(r=new SVGMatte3Effect(a,t.effectsManager.effectElements[e],t)),r&&this.filters.push(r);n&&(t.globalData.defs.appendChild(a),t.layerElement.setAttribute("filter","url("+locationHref+"#"+s+")")),this.filters.length&&t.addRenderableComponent(this)}SVGMatte3Effect.prototype.findSymbol=function(t){for(var e=0,r=_svgMatteSymbols.length;e<r;){if(_svgMatteSymbols[e]===t)return _svgMatteSymbols[e];e+=1}return null},SVGMatte3Effect.prototype.replaceInParent=function(t,e){var r=t.layerElement.parentNode;if(r){for(var i,s=r.children,a=0,n=s.length;a<n&&s[a]!==t.layerElement;)a+=1;a<=n-2&&(i=s[a+1]);var o=createNS("use");o.setAttribute("href","#"+e),i?r.insertBefore(o,i):r.appendChild(o)}},SVGMatte3Effect.prototype.setElementAsMask=function(t,e){if(!this.findSymbol(e)){var r=createElementID(),i=createNS("mask");i.setAttribute("id",e.layerId),i.setAttribute("mask-type","alpha"),_svgMatteSymbols.push(e);var s=t.globalData.defs;s.appendChild(i);var a=createNS("symbol");a.setAttribute("id",r),this.replaceInParent(e,r),a.appendChild(e.layerElement),s.appendChild(a);var n=createNS("use");n.setAttribute("href","#"+r),i.appendChild(n),e.data.hd=!1,e.show()}t.setMatte(e.layerId)},SVGMatte3Effect.prototype.initialize=function(){for(var t=this.filterManager.effectElements[0].p.v,e=this.elem.comp.elements,r=0,i=e.length;r<i;)e[r]&&e[r].data.ind===t&&this.setElementAsMask(this.elem,e[r]),r+=1;this.initialized=!0},SVGMatte3Effect.prototype.renderFrame=function(){this.initialized||this.initialize()},SVGEffects.prototype.renderFrame=function(t){var e,r=this.filters.length;for(e=0;e<r;e+=1)this.filters[e].renderFrame(t)};var animationManager=function(){var t={},e=[],r=0,i=0,s=0,a=!0,n=!1;function o(t){for(var r=0,s=t.target;r<i;)e[r].animation===s&&(e.splice(r,1),r-=1,i-=1,s.isPaused||l()),r+=1}function h(t,r){if(!t)return null;for(var s=0;s<i;){if(e[s].elem==t&&null!==e[s].elem)return e[s].animation;s+=1}var a=new AnimationItem;return f(a,t),a.setData(t,r),a}function p(){s+=1,d()}function l(){s-=1}function f(t,r){t.addEventListener("destroy",o),t.addEventListener("_active",p),t.addEventListener("_idle",l),e.push({elem:r,animation:t}),i+=1}function m(t){var o,h=t-r;for(o=0;o<i;o+=1)e[o].animation.advanceTime(h);r=t,s&&!n?window.requestAnimationFrame(m):a=!0}function c(t){r=t,window.requestAnimationFrame(m)}function d(){!n&&s&&a&&(window.requestAnimationFrame(c),a=!1)}return t.registerAnimation=h,t.loadAnimation=function(t){var e=new AnimationItem;return f(e,null),e.setParams(t),e},t.setSpeed=function(t,r){var s;for(s=0;s<i;s+=1)e[s].animation.setSpeed(t,r)},t.setDirection=function(t,r){var s;for(s=0;s<i;s+=1)e[s].animation.setDirection(t,r)},t.play=function(t){var r;for(r=0;r<i;r+=1)e[r].animation.play(t)},t.pause=function(t){var r;for(r=0;r<i;r+=1)e[r].animation.pause(t)},t.stop=function(t){var r;for(r=0;r<i;r+=1)e[r].animation.stop(t)},t.togglePause=function(t){var r;for(r=0;r<i;r+=1)e[r].animation.togglePause(t)},t.searchAnimations=function(t,e,r){var i,s=[].concat([].slice.call(document.getElementsByClassName("lottie")),[].slice.call(document.getElementsByClassName("bodymovin"))),a=s.length;for(i=0;i<a;i+=1)r&&s[i].setAttribute("data-bm-type",r),h(s[i],t);if(e&&0===a){r||(r="svg");var n=document.getElementsByTagName("body")[0];n.innerHTML="";var o=createTag("div");o.style.width="100%",o.style.height="100%",o.setAttribute("data-bm-type",r),n.appendChild(o),h(o,t)}},t.resize=function(){var t;for(t=0;t<i;t+=1)e[t].animation.resize()},t.goToAndStop=function(t,r,s){var a;for(a=0;a<i;a+=1)e[a].animation.goToAndStop(t,r,s)},t.destroy=function(t){var r;for(r=i-1;r>=0;r-=1)e[r].animation.destroy(t)},t.freeze=function(){n=!0},t.unfreeze=function(){n=!1,d()},t.getRegisteredAnimations=function(){var t,r=e.length,i=[];for(t=0;t<r;t+=1)i.push(e[t].animation);return i},t}(),AnimationItem=function(){this._cbs=[],this.name="",this.path="",this.isLoaded=!1,this.currentFrame=0,this.currentRawFrame=0,this.totalFrames=0,this.frameRate=0,this.frameMult=0,this.playSpeed=1,this.playDirection=1,this.playCount=0,this.animationData={},this.assets=[],this.isPaused=!0,this.autoplay=!1,this.loop=!0,this.renderer=null,this.animationID=createElementID(),this.assetsPath="",this.timeCompleted=0,this.segmentPos=0,this.subframeEnabled=subframeEnabled,this.segments=[],this._idle=!0,this._completedLoop=!1,this.projectInterface=ProjectInterface(),this.imagePreloader=new ImagePreloader};extendPrototype([BaseEvent],AnimationItem),AnimationItem.prototype.setParams=function(t){t.context&&(this.context=t.context),(t.wrapper||t.container)&&(this.wrapper=t.wrapper||t.container);var e=t.animType?t.animType:t.renderer?t.renderer:"svg";switch(e){case"canvas":this.renderer=new CanvasRenderer(this,t.rendererSettings);break;case"svg":this.renderer=new SVGRenderer(this,t.rendererSettings);break;default:this.renderer=new HybridRenderer(this,t.rendererSettings)}this.renderer.setProjectInterface(this.projectInterface),this.animType=e,""===t.loop||null===t.loop||(!1===t.loop?this.loop=!1:!0===t.loop?this.loop=!0:this.loop=parseInt(t.loop)),this.autoplay=!("autoplay"in t)||t.autoplay,this.name=t.name?t.name:"",this.autoloadSegments=!t.hasOwnProperty("autoloadSegments")||t.autoloadSegments,this.assetsPath=t.assetsPath,t.animationData?this.configAnimation(t.animationData):t.path&&("json"!=t.path.substr(-4)&&("/"!=t.path.substr(-1,1)&&(t.path+="/"),t.path+="data.json"),-1!=t.path.lastIndexOf("\\")?this.path=t.path.substr(0,t.path.lastIndexOf("\\")+1):this.path=t.path.substr(0,t.path.lastIndexOf("/")+1),this.fileName=t.path.substr(t.path.lastIndexOf("/")+1),this.fileName=this.fileName.substr(0,this.fileName.lastIndexOf(".json")),assetLoader.load(t.path,this.configAnimation.bind(this),function(){this.trigger("data_failed")}.bind(this)))},AnimationItem.prototype.setData=function(t,e){var r={wrapper:t,animationData:e?"object"==typeof e?e:JSON.parse(e):null},i=t.attributes;r.path=i.getNamedItem("data-animation-path")?i.getNamedItem("data-animation-path").value:i.getNamedItem("data-bm-path")?i.getNamedItem("data-bm-path").value:i.getNamedItem("bm-path")?i.getNamedItem("bm-path").value:"",r.animType=i.getNamedItem("data-anim-type")?i.getNamedItem("data-anim-type").value:i.getNamedItem("data-bm-type")?i.getNamedItem("data-bm-type").value:i.getNamedItem("bm-type")?i.getNamedItem("bm-type").value:i.getNamedItem("data-bm-renderer")?i.getNamedItem("data-bm-renderer").value:i.getNamedItem("bm-renderer")?i.getNamedItem("bm-renderer").value:"canvas";var s=i.getNamedItem("data-anim-loop")?i.getNamedItem("data-anim-loop").value:i.getNamedItem("data-bm-loop")?i.getNamedItem("data-bm-loop").value:i.getNamedItem("bm-loop")?i.getNamedItem("bm-loop").value:"";""===s||(r.loop="false"!==s&&("true"===s||parseInt(s)));var a=i.getNamedItem("data-anim-autoplay")?i.getNamedItem("data-anim-autoplay").value:i.getNamedItem("data-bm-autoplay")?i.getNamedItem("data-bm-autoplay").value:!i.getNamedItem("bm-autoplay")||i.getNamedItem("bm-autoplay").value;r.autoplay="false"!==a,r.name=i.getNamedItem("data-name")?i.getNamedItem("data-name").value:i.getNamedItem("data-bm-name")?i.getNamedItem("data-bm-name").value:i.getNamedItem("bm-name")?i.getNamedItem("bm-name").value:"","false"===(i.getNamedItem("data-anim-prerender")?i.getNamedItem("data-anim-prerender").value:i.getNamedItem("data-bm-prerender")?i.getNamedItem("data-bm-prerender").value:i.getNamedItem("bm-prerender")?i.getNamedItem("bm-prerender").value:"")&&(r.prerender=!1),this.setParams(r)},AnimationItem.prototype.includeLayers=function(t){t.op>this.animationData.op&&(this.animationData.op=t.op,this.totalFrames=Math.floor(t.op-this.animationData.ip));var e,r,i=this.animationData.layers,s=i.length,a=t.layers,n=a.length;for(r=0;r<n;r+=1)for(e=0;e<s;){if(i[e].id==a[r].id){i[e]=a[r];break}e+=1}if((t.chars||t.fonts)&&(this.renderer.globalData.fontManager.addChars(t.chars),this.renderer.globalData.fontManager.addFonts(t.fonts,this.renderer.globalData.defs)),t.assets)for(s=t.assets.length,e=0;e<s;e+=1)this.animationData.assets.push(t.assets[e]);this.animationData.__complete=!1,dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),this.renderer.includeLayers(t.layers),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.loadNextSegment()},AnimationItem.prototype.loadNextSegment=function(){var t=this.animationData.segments;if(!t||0===t.length||!this.autoloadSegments)return this.trigger("data_ready"),void(this.timeCompleted=this.totalFrames);var e=t.shift();this.timeCompleted=e.time*this.frameRate;var r=this.path+this.fileName+"_"+this.segmentPos+".json";this.segmentPos+=1,assetLoader.load(r,this.includeLayers.bind(this),function(){this.trigger("data_failed")}.bind(this))},AnimationItem.prototype.loadSegments=function(){this.animationData.segments||(this.timeCompleted=this.totalFrames),this.loadNextSegment()},AnimationItem.prototype.imagesLoaded=function(){this.trigger("loaded_images"),this.checkLoaded()},AnimationItem.prototype.preloadImages=function(){this.imagePreloader.setAssetsPath(this.assetsPath),this.imagePreloader.setPath(this.path),this.imagePreloader.loadAssets(this.animationData.assets,this.imagesLoaded.bind(this))},AnimationItem.prototype.configAnimation=function(t){this.renderer&&(this.animationData=t,this.totalFrames=Math.floor(this.animationData.op-this.animationData.ip),this.renderer.configAnimation(t),t.assets||(t.assets=[]),this.renderer.searchExtraCompositions(t.assets),this.assets=this.animationData.assets,this.frameRate=this.animationData.fr,this.firstFrame=Math.round(this.animationData.ip),this.frameMult=this.animationData.fr/1e3,this.trigger("config_ready"),this.preloadImages(),this.loadSegments(),this.updaFrameModifier(),this.waitForFontsLoaded())},AnimationItem.prototype.waitForFontsLoaded=function(){this.renderer&&(this.renderer.globalData.fontManager.loaded()?this.checkLoaded():setTimeout(this.waitForFontsLoaded.bind(this),20))},AnimationItem.prototype.checkLoaded=function(){this.isLoaded||!this.renderer.globalData.fontManager.loaded()||!this.imagePreloader.loaded()&&"canvas"===this.renderer.rendererType||(this.isLoaded=!0,dataManager.completeData(this.animationData,this.renderer.globalData.fontManager),expressionsPlugin&&expressionsPlugin.initExpressions(this),this.renderer.initItems(),setTimeout(function(){this.trigger("DOMLoaded")}.bind(this),0),this.gotoFrame(),this.autoplay&&this.play())},AnimationItem.prototype.resize=function(){this.renderer.updateContainerSize()},AnimationItem.prototype.setSubframe=function(t){this.subframeEnabled=!!t},AnimationItem.prototype.gotoFrame=function(){this.currentFrame=this.subframeEnabled?this.currentRawFrame:~~this.currentRawFrame,this.timeCompleted!==this.totalFrames&&this.currentFrame>this.timeCompleted&&(this.currentFrame=this.timeCompleted),this.trigger("enterFrame"),this.renderFrame()},AnimationItem.prototype.renderFrame=function(){!1!==this.isLoaded&&this.renderer.renderFrame(this.currentFrame+this.firstFrame)},AnimationItem.prototype.play=function(t){t&&this.name!=t||!0===this.isPaused&&(this.isPaused=!1,this._idle&&(this._idle=!1,this.trigger("_active")))},AnimationItem.prototype.pause=function(t){t&&this.name!=t||!1===this.isPaused&&(this.isPaused=!0,this._idle=!0,this.trigger("_idle"))},AnimationItem.prototype.togglePause=function(t){t&&this.name!=t||(!0===this.isPaused?this.play():this.pause())},AnimationItem.prototype.stop=function(t){t&&this.name!=t||(this.pause(),this.playCount=0,this._completedLoop=!1,this.setCurrentRawFrameValue(0))},AnimationItem.prototype.goToAndStop=function(t,e,r){r&&this.name!=r||(e?this.setCurrentRawFrameValue(t):this.setCurrentRawFrameValue(t*this.frameModifier),this.pause())},AnimationItem.prototype.goToAndPlay=function(t,e,r){this.goToAndStop(t,e,r),this.play()},AnimationItem.prototype.advanceTime=function(t){if(!0!==this.isPaused&&!1!==this.isLoaded){var e=this.currentRawFrame+t*this.frameModifier,r=!1;e>=this.totalFrames-1&&this.frameModifier>0?this.loop&&this.playCount!==this.loop?e>=this.totalFrames?(this.playCount+=1,this.checkSegments(e%this.totalFrames)||(this.setCurrentRawFrameValue(e%this.totalFrames),this._completedLoop=!0,this.trigger("loopComplete"))):this.setCurrentRawFrameValue(e):this.checkSegments(e>this.totalFrames?e%this.totalFrames:0)||(r=!0,e=this.totalFrames-1):e<0?this.checkSegments(e%this.totalFrames)||(!this.loop||this.playCount--<=0&&!0!==this.loop?(r=!0,e=0):(this.setCurrentRawFrameValue(this.totalFrames+e%this.totalFrames),this._completedLoop?this.trigger("loopComplete"):this._completedLoop=!0)):this.setCurrentRawFrameValue(e),r&&(this.setCurrentRawFrameValue(e),this.pause(),this.trigger("complete"))}},AnimationItem.prototype.adjustSegment=function(t,e){this.playCount=0,t[1]<t[0]?(this.frameModifier>0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(-1)),this.timeCompleted=this.totalFrames=t[0]-t[1],this.firstFrame=t[1],this.setCurrentRawFrameValue(this.totalFrames-.001-e)):t[1]>t[0]&&(this.frameModifier<0&&(this.playSpeed<0?this.setSpeed(-this.playSpeed):this.setDirection(1)),this.timeCompleted=this.totalFrames=t[1]-t[0],this.firstFrame=t[0],this.setCurrentRawFrameValue(.001+e)),this.trigger("segmentStart")},AnimationItem.prototype.setSegment=function(t,e){var r=-1;this.isPaused&&(this.currentRawFrame+this.firstFrame<t?r=t:this.currentRawFrame+this.firstFrame>e&&(r=e-t)),this.firstFrame=t,this.timeCompleted=this.totalFrames=e-t,-1!==r&&this.goToAndStop(r,!0)},AnimationItem.prototype.playSegments=function(t,e){if(e&&(this.segments.length=0),"object"==typeof t[0]){var r,i=t.length;for(r=0;r<i;r+=1)this.segments.push(t[r])}else this.segments.push(t);this.segments.length&&e&&this.adjustSegment(this.segments.shift(),0),this.isPaused&&this.play()},AnimationItem.prototype.resetSegments=function(t){this.segments.length=0,this.segments.push([this.animationData.ip,this.animationData.op]),t&&this.checkSegments(0)},AnimationItem.prototype.checkSegments=function(t){return!!this.segments.length&&(this.adjustSegment(this.segments.shift(),t),!0)},AnimationItem.prototype.destroy=function(t){t&&this.name!=t||!this.renderer||(this.renderer.destroy(),this.imagePreloader.destroy(),this.trigger("destroy"),this._cbs=null,this.onEnterFrame=this.onLoopComplete=this.onComplete=this.onSegmentStart=this.onDestroy=null,this.renderer=null)},AnimationItem.prototype.setCurrentRawFrameValue=function(t){this.currentRawFrame=t,this.gotoFrame()},AnimationItem.prototype.setSpeed=function(t){this.playSpeed=t,this.updaFrameModifier()},AnimationItem.prototype.setDirection=function(t){this.playDirection=t<0?-1:1,this.updaFrameModifier()},AnimationItem.prototype.updaFrameModifier=function(){this.frameModifier=this.frameMult*this.playSpeed*this.playDirection},AnimationItem.prototype.getPath=function(){return this.path},AnimationItem.prototype.getAssetsPath=function(t){var e="";if(t.e)e=t.p;else if(this.assetsPath){var r=t.p;-1!==r.indexOf("images/")&&(r=r.split("/")[1]),e=this.assetsPath+r}else e=this.path,e+=t.u?t.u:"",e+=t.p;return e},AnimationItem.prototype.getAssetData=function(t){for(var e=0,r=this.assets.length;e<r;){if(t==this.assets[e].id)return this.assets[e];e+=1}},AnimationItem.prototype.hide=function(){this.renderer.hide()},AnimationItem.prototype.show=function(){this.renderer.show()},AnimationItem.prototype.getDuration=function(t){return t?this.totalFrames:this.totalFrames/this.frameRate},AnimationItem.prototype.trigger=function(t){if(this._cbs&&this._cbs[t])switch(t){case"enterFrame":this.triggerEvent(t,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameModifier));break;case"loopComplete":this.triggerEvent(t,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult));break;case"complete":this.triggerEvent(t,new BMCompleteEvent(t,this.frameMult));break;case"segmentStart":this.triggerEvent(t,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames));break;case"destroy":this.triggerEvent(t,new BMDestroyEvent(t,this));break;default:this.triggerEvent(t)}"enterFrame"===t&&this.onEnterFrame&&this.onEnterFrame.call(this,new BMEnterFrameEvent(t,this.currentFrame,this.totalFrames,this.frameMult)),"loopComplete"===t&&this.onLoopComplete&&this.onLoopComplete.call(this,new BMCompleteLoopEvent(t,this.loop,this.playCount,this.frameMult)),"complete"===t&&this.onComplete&&this.onComplete.call(this,new BMCompleteEvent(t,this.frameMult)),"segmentStart"===t&&this.onSegmentStart&&this.onSegmentStart.call(this,new BMSegmentStartEvent(t,this.firstFrame,this.totalFrames)),"destroy"===t&&this.onDestroy&&this.onDestroy.call(this,new BMDestroyEvent(t,this))};var Expressions=function(){var t={};return t.initExpressions=function(t){var e=0,r=[];t.renderer.compInterface=CompExpressionInterface(t.renderer),t.renderer.globalData.projectInterface.registerComposition(t.renderer),t.renderer.globalData.pushExpression=function(){e+=1},t.renderer.globalData.popExpression=function(){0==(e-=1)&&function(){var t,e=r.length;for(t=0;t<e;t+=1)r[t].release();r.length=0}()},t.renderer.globalData.registerExpressionProperty=function(t){-1===r.indexOf(t)&&r.push(t)}},t}();expressionsPlugin=Expressions;var ExpressionManager=function(){var ob={},Math=BMMath,window=null,document=null;function $bm_isInstanceOfArray(t){return t.constructor===Array||t.constructor===Float32Array}function isNumerable(t,e){return"number"===t||"boolean"===t||"string"===t||e instanceof Number}function $bm_neg(t){var e=typeof t;if("number"===e||"boolean"===e||t instanceof Number)return-t;if($bm_isInstanceOfArray(t)){var r,i=t.length,s=[];for(r=0;r<i;r+=1)s[r]=-t[r];return s}return t.propType?t.v:void 0}var easeInBez=BezierFactory.getBezierEasing(.333,0,.833,.833,"easeIn").get,easeOutBez=BezierFactory.getBezierEasing(.167,.167,.667,1,"easeOut").get,easeInOutBez=BezierFactory.getBezierEasing(.33,0,.667,1,"easeInOut").get;function sum(t,e){var r=typeof t,i=typeof e;if("string"===r||"string"===i)return t+e;if(isNumerable(r,t)&&isNumerable(i,e))return t+e;if($bm_isInstanceOfArray(t)&&isNumerable(i,e))return(t=t.slice(0))[0]=t[0]+e,t;if(isNumerable(r,t)&&$bm_isInstanceOfArray(e))return(e=e.slice(0))[0]=t+e[0],e;if($bm_isInstanceOfArray(t)&&$bm_isInstanceOfArray(e)){for(var s=0,a=t.length,n=e.length,o=[];s<a||s<n;)("number"==typeof t[s]||t[s]instanceof Number)&&("number"==typeof e[s]||e[s]instanceof Number)?o[s]=t[s]+e[s]:o[s]=void 0===e[s]?t[s]:t[s]||e[s],s+=1;return o}return 0}var add=sum;function sub(t,e){var r=typeof t,i=typeof e;if(isNumerable(r,t)&&isNumerable(i,e))return"string"===r&&(t=parseInt(t)),"string"===i&&(e=parseInt(e)),t-e;if($bm_isInstanceOfArray(t)&&isNumerable(i,e))return(t=t.slice(0))[0]=t[0]-e,t;if(isNumerable(r,t)&&$bm_isInstanceOfArray(e))return(e=e.slice(0))[0]=t-e[0],e;if($bm_isInstanceOfArray(t)&&$bm_isInstanceOfArray(e)){for(var s=0,a=t.length,n=e.length,o=[];s<a||s<n;)("number"==typeof t[s]||t[s]instanceof Number)&&("number"==typeof e[s]||e[s]instanceof Number)?o[s]=t[s]-e[s]:o[s]=void 0===e[s]?t[s]:t[s]||e[s],s+=1;return o}return 0}function mul(t,e){var r,i,s,a=typeof t,n=typeof e;if(isNumerable(a,t)&&isNumerable(n,e))return t*e;if($bm_isInstanceOfArray(t)&&isNumerable(n,e)){for(s=t.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t[i]*e;return r}if(isNumerable(a,t)&&$bm_isInstanceOfArray(e)){for(s=e.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t*e[i];return r}return 0}function div(t,e){var r,i,s,a=typeof t,n=typeof e;if(isNumerable(a,t)&&isNumerable(n,e))return t/e;if($bm_isInstanceOfArray(t)&&isNumerable(n,e)){for(s=t.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t[i]/e;return r}if(isNumerable(a,t)&&$bm_isInstanceOfArray(e)){for(s=e.length,r=createTypedArray("float32",s),i=0;i<s;i+=1)r[i]=t/e[i];return r}return 0}function mod(t,e){return"string"==typeof t&&(t=parseInt(t)),"string"==typeof e&&(e=parseInt(e)),t%e}var $bm_sum=sum,$bm_sub=sub,$bm_mul=mul,$bm_div=div,$bm_mod=mod;function clamp(t,e,r){if(e>r){var i=r;r=e,e=i}return Math.min(Math.max(t,e),r)}function radiansToDegrees(t){return t/degToRads}var radians_to_degrees=radiansToDegrees;function degreesToRadians(t){return t*degToRads}var degrees_to_radians=radiansToDegrees,helperLengthArray=[0,0,0,0,0,0];function length(t,e){if("number"==typeof t||t instanceof Number)return e=e||0,Math.abs(t-e);e||(e=helperLengthArray);var r,i=Math.min(t.length,e.length),s=0;for(r=0;r<i;r+=1)s+=Math.pow(e[r]-t[r],2);return Math.sqrt(s)}function normalize(t){return div(t,length(t))}function rgbToHsl(t){var e,r,i=t[0],s=t[1],a=t[2],n=Math.max(i,s,a),o=Math.min(i,s,a),h=(n+o)/2;if(n==o)e=r=0;else{var p=n-o;switch(r=h>.5?p/(2-n-o):p/(n+o),n){case i:e=(s-a)/p+(s<a?6:0);break;case s:e=(a-i)/p+2;break;case a:e=(i-s)/p+4}e/=6}return[e,r,h,t[3]]}function hue2rgb(t,e,r){return r<0&&(r+=1),r>1&&(r-=1),r<1/6?t+6*(e-t)*r:r<.5?e:r<2/3?t+(e-t)*(2/3-r)*6:t}function hslToRgb(t){var e,r,i,s=t[0],a=t[1],n=t[2];if(0===a)e=r=i=n;else{var o=n<.5?n*(1+a):n+a-n*a,h=2*n-o;e=hue2rgb(h,o,s+1/3),r=hue2rgb(h,o,s),i=hue2rgb(h,o,s-1/3)}return[e,r,i,t[3]]}function linear(t,e,r,i,s){if(void 0!==i&&void 0!==s||(i=e,s=r,e=0,r=1),r<e){var a=r;r=e,e=a}if(t<=e)return i;if(t>=r)return s;var n=r===e?0:(t-e)/(r-e);if(!i.length)return i+(s-i)*n;var o,h=i.length,p=createTypedArray("float32",h);for(o=0;o<h;o+=1)p[o]=i[o]+(s[o]-i[o])*n;return p}function random(t,e){if(void 0===e&&(void 0===t?(t=0,e=1):(e=t,t=void 0)),e.length){var r,i=e.length;t||(t=createTypedArray("float32",i));var s=createTypedArray("float32",i),a=BMMath.random();for(r=0;r<i;r+=1)s[r]=t[r]+a*(e[r]-t[r]);return s}return void 0===t&&(t=0),t+BMMath.random()*(e-t)}function createPath(t,e,r,i){var s,a=t.length,n=shape_pool.newElement();n.setPathData(!!i,a);var o,h,p=[0,0];for(s=0;s<a;s+=1)o=e&&e[s]?e[s]:p,h=r&&r[s]?r[s]:p,n.setTripleAt(t[s][0],t[s][1],h[0]+t[s][0],h[1]+t[s][1],o[0]+t[s][0],o[1]+t[s][1],s,!0);return n}function initiateExpression(elem,data,property){var val=data.x,needsVelocity=/velocity(?![\w\d])/.test(val),_needsRandom=-1!==val.indexOf("random"),elemType=elem.data.ty,transform,$bm_transform,content,effect,thisProperty=property;thisProperty.valueAtTime=thisProperty.getValueAtTime,Object.defineProperty(thisProperty,"value",{get:function(){return thisProperty.v}}),elem.comp.frameDuration=1/elem.comp.globalData.frameRate,elem.comp.displayStartTime=0;var inPoint=elem.data.ip/elem.comp.globalData.frameRate,outPoint=elem.data.op/elem.comp.globalData.frameRate,width=elem.data.sw?elem.data.sw:0,height=elem.data.sh?elem.data.sh:0,name=elem.data.nm,loopIn,loop_in,loopOut,loop_out,smooth,toWorld,fromWorld,fromComp,toComp,fromCompToSurface,position,rotation,anchorPoint,scale,thisLayer,thisComp,mask,valueAtTime,velocityAtTime,__expression_functions=[],scoped_bm_rt;if(data.xf){var i,len=data.xf.length;for(i=0;i<len;i+=1)__expression_functions[i]=eval("(function(){ return "+data.xf[i]+"}())")}var expression_function=eval("[function _expression_function(){"+val+";scoped_bm_rt=$bm_rt}]")[0],numKeys=property.kf?data.k.length:0,active=!this.data||!0!==this.data.hd,wiggle=function(t,e){var r,i,s=this.pv.length?this.pv.length:1,a=createTypedArray("float32",s);var n=Math.floor(5*time);for(r=0,i=0;r<n;){for(i=0;i<s;i+=1)a[i]+=-e+2*e*BMMath.random();r+=1}var o=5*time,h=o-Math.floor(o),p=createTypedArray("float32",s);if(s>1){for(i=0;i<s;i+=1)p[i]=this.pv[i]+a[i]+(-e+2*e*BMMath.random())*h;return p}return this.pv+a[0]+(-e+2*e*BMMath.random())*h}.bind(this);function loopInDuration(t,e){return loopIn(t,e,!0)}function loopOutDuration(t,e){return loopOut(t,e,!0)}thisProperty.loopIn&&(loopIn=thisProperty.loopIn.bind(thisProperty),loop_in=loopIn),thisProperty.loopOut&&(loopOut=thisProperty.loopOut.bind(thisProperty),loop_out=loopOut),thisProperty.smooth&&(smooth=thisProperty.smooth.bind(thisProperty)),this.getValueAtTime&&(valueAtTime=this.getValueAtTime.bind(this)),this.getVelocityAtTime&&(velocityAtTime=this.getVelocityAtTime.bind(this));var comp=elem.comp.globalData.projectInterface.bind(elem.comp.globalData.projectInterface),time,velocity,value,text,textIndex,textTotal,selectorValue;function lookAt(t,e){var r=[e[0]-t[0],e[1]-t[1],e[2]-t[2]],i=Math.atan2(r[0],Math.sqrt(r[1]*r[1]+r[2]*r[2]))/degToRads;return[-Math.atan2(r[1],r[2])/degToRads,i,0]}function easeOut(t,e,r,i,s){return applyEase(easeOutBez,t,e,r,i,s)}function easeIn(t,e,r,i,s){return applyEase(easeInBez,t,e,r,i,s)}function ease(t,e,r,i,s){return applyEase(easeInOutBez,t,e,r,i,s)}function applyEase(t,e,r,i,s,a){void 0===s?(s=r,a=i):e=(e-r)/(i-r);var n=t(e=e>1?1:e<0?0:e);if($bm_isInstanceOfArray(s)){var o,h=s.length,p=createTypedArray("float32",h);for(o=0;o<h;o+=1)p[o]=(a[o]-s[o])*n+s[o];return p}return(a-s)*n+s}function nearestKey(t){var e,r,i,s=data.k.length;if(data.k.length&&"number"!=typeof data.k[0])if(r=-1,(t*=elem.comp.globalData.frameRate)<data.k[0].t)r=1,i=data.k[0].t;else{for(e=0;e<s-1;e+=1){if(t===data.k[e].t){r=e+1,i=data.k[e].t;break}if(t>data.k[e].t&&t<data.k[e+1].t){t-data.k[e].t>data.k[e+1].t-t?(r=e+2,i=data.k[e+1].t):(r=e+1,i=data.k[e].t);break}}-1===r&&(r=e+1,i=data.k[e].t)}else r=0,i=0;var a={};return a.index=r,a.time=i/elem.comp.globalData.frameRate,a}function key(t){var e,r,i,s;if(!data.k.length||"number"==typeof data.k[0])throw new Error("The property has no keyframe at index "+t);for(t-=1,e={time:data.k[t].t/elem.comp.globalData.frameRate,value:[]},i=(s=t!==data.k.length-1||data.k[t].h?data.k[t].s:data.k[t].s||0===data.k[t].s?data.k[t-1].s:data.k[t].e).length,r=0;r<i;r+=1)e[r]=s[r],e.value[r]=s[r];return e}function framesToTime(t,e){return e||(e=elem.comp.globalData.frameRate),t/e}function timeToFrames(t,e){return t||0===t||(t=time),e||(e=elem.comp.globalData.frameRate),t*e}function seedRandom(t){BMMath.seedrandom(randSeed+t)}function sourceRectAtTime(){return elem.sourceRectAtTime()}function substring(t,e){return"string"==typeof value?void 0===e?value.substring(t):value.substring(t,e):""}function substr(t,e){return"string"==typeof value?void 0===e?value.substr(t):value.substr(t,e):""}var index=elem.data.ind,hasParent=!(!elem.hierarchy||!elem.hierarchy.length),parent,randSeed=Math.floor(1e6*Math.random()),globalData=elem.globalData;function executeExpression(t){return value=t,_needsRandom&&seedRandom(randSeed),this.frameExpressionId===elem.globalData.frameId&&"textSelector"!==this.propType?value:("textSelector"===this.propType&&(textIndex=this.textIndex,textTotal=this.textTotal,selectorValue=this.selectorValue),thisLayer||(text=elem.layerInterface.text,thisLayer=elem.layerInterface,thisComp=elem.comp.compInterface,toWorld=thisLayer.toWorld.bind(thisLayer),fromWorld=thisLayer.fromWorld.bind(thisLayer),fromComp=thisLayer.fromComp.bind(thisLayer),toComp=thisLayer.toComp.bind(thisLayer),mask=thisLayer.mask?thisLayer.mask.bind(thisLayer):null,fromCompToSurface=fromComp),transform||(transform=elem.layerInterface("ADBE Transform Group"),$bm_transform=transform,transform&&(anchorPoint=transform.anchorPoint)),4!==elemType||content||(content=thisLayer("ADBE Root Vectors Group")),effect||(effect=thisLayer(4)),(hasParent=!(!elem.hierarchy||!elem.hierarchy.length))&&!parent&&(parent=elem.hierarchy[0].layerInterface),time=this.comp.renderedFrame/this.comp.globalData.frameRate,needsVelocity&&(velocity=velocityAtTime(time)),expression_function(),this.frameExpressionId=elem.globalData.frameId,"shape"===scoped_bm_rt.propType&&(scoped_bm_rt=scoped_bm_rt.v),scoped_bm_rt)}return executeExpression}return ob.initiateExpression=initiateExpression,ob}(),expressionHelpers=function(){return{searchExpressions:function(t,e,r){e.x&&(r.k=!0,r.x=!0,r.initiateExpression=ExpressionManager.initiateExpression,r.effectsSequence.push(r.initiateExpression(t,e,r).bind(r)))},getSpeedAtTime:function(t){var e=this.getValueAtTime(t),r=this.getValueAtTime(t+-.01),i=0;if(e.length){var s;for(s=0;s<e.length;s+=1)i+=Math.pow(r[s]-e[s],2);i=100*Math.sqrt(i)}else i=0;return i},getVelocityAtTime:function(t){if(void 0!==this.vel)return this.vel;var e,r,i=this.getValueAtTime(t),s=this.getValueAtTime(t+-.001);if(i.length)for(e=createTypedArray("float32",i.length),r=0;r<i.length;r+=1)e[r]=(s[r]-i[r])/-.001;else e=(s-i)/-.001;return e},getValueAtTime:function(t){return t*=this.elem.globalData.frameRate,(t-=this.offsetTime)!==this._cachingAtTime.lastFrame&&(this._cachingAtTime.lastIndex=this._cachingAtTime.lastFrame<t?this._cachingAtTime.lastIndex:0,this._cachingAtTime.value=this.interpolateValue(t,this._cachingAtTime),this._cachingAtTime.lastFrame=t),this._cachingAtTime.value},getStaticValueAtTime:function(){return this.pv},setGroupProperty:function(t){this.propertyGroup=t}}}();!function(){function t(t,e,r){if(!this.k||!this.keyframes)return this.pv;t=t?t.toLowerCase():"";var i,s,a,n,o,h=this.comp.renderedFrame,p=this.keyframes,l=p[p.length-1].t;if(h<=l)return this.pv;if(r?s=l-(i=e?Math.abs(l-elem.comp.globalData.frameRate*e):Math.max(0,l-this.elem.data.ip)):((!e||e>p.length-1)&&(e=p.length-1),i=l-(s=p[p.length-1-e].t)),"pingpong"===t){if(Math.floor((h-s)/i)%2!=0)return this.getValueAtTime((i-(h-s)%i+s)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(s/this.comp.globalData.frameRate,0),m=this.getValueAtTime(l/this.comp.globalData.frameRate,0),c=this.getValueAtTime(((h-s)%i+s)/this.comp.globalData.frameRate,0),d=Math.floor((h-s)/i);if(this.pv.length){for(n=(o=new Array(f.length)).length,a=0;a<n;a+=1)o[a]=(m[a]-f[a])*d+c[a];return o}return(m-f)*d+c}if("continue"===t){var u=this.getValueAtTime(l/this.comp.globalData.frameRate,0),y=this.getValueAtTime((l-.001)/this.comp.globalData.frameRate,0);if(this.pv.length){for(n=(o=new Array(u.length)).length,a=0;a<n;a+=1)o[a]=u[a]+(u[a]-y[a])*((h-l)/this.comp.globalData.frameRate)/5e-4;return o}return u+(h-l)/.001*(u-y)}}return this.getValueAtTime(((h-s)%i+s)/this.comp.globalData.frameRate,0)}function e(t,e,r){if(!this.k)return this.pv;t=t?t.toLowerCase():"";var i,s,a,n,o,h=this.comp.renderedFrame,p=this.keyframes,l=p[0].t;if(h>=l)return this.pv;if(r?s=l+(i=e?Math.abs(elem.comp.globalData.frameRate*e):Math.max(0,this.elem.data.op-l)):((!e||e>p.length-1)&&(e=p.length-1),i=(s=p[e].t)-l),"pingpong"===t){if(Math.floor((l-h)/i)%2==0)return this.getValueAtTime(((l-h)%i+l)/this.comp.globalData.frameRate,0)}else{if("offset"===t){var f=this.getValueAtTime(l/this.comp.globalData.frameRate,0),m=this.getValueAtTime(s/this.comp.globalData.frameRate,0),c=this.getValueAtTime((i-(l-h)%i+l)/this.comp.globalData.frameRate,0),d=Math.floor((l-h)/i)+1;if(this.pv.length){for(n=(o=new Array(f.length)).length,a=0;a<n;a+=1)o[a]=c[a]-(m[a]-f[a])*d;return o}return c-(m-f)*d}if("continue"===t){var u=this.getValueAtTime(l/this.comp.globalData.frameRate,0),y=this.getValueAtTime((l+.001)/this.comp.globalData.frameRate,0);if(this.pv.length){for(n=(o=new Array(u.length)).length,a=0;a<n;a+=1)o[a]=u[a]+(u[a]-y[a])*(l-h)/.001;return o}return u+(u-y)*(l-h)/.001}}return this.getValueAtTime((i-(l-h)%i+l)/this.comp.globalData.frameRate,0)}function r(t,e){if(!this.k)return this.pv;if(t=.5*(t||.4),(e=Math.floor(e||5))<=1)return this.pv;var r,i,s=this.comp.renderedFrame/this.comp.globalData.frameRate,a=s-t,n=e>1?(s+t-a)/(e-1):1,o=0,h=0;for(r=this.pv.length?createTypedArray("float32",this.pv.length):0;o<e;){if(i=this.getValueAtTime(a+o*n),this.pv.length)for(h=0;h<this.pv.length;h+=1)r[h]+=i[h];else r+=i;o+=1}if(this.pv.length)for(h=0;h<this.pv.length;h+=1)r[h]/=e;else r/=e;return r}var i=TransformPropertyFactory.getTransformProperty;TransformPropertyFactory.getTransformProperty=function(t,e,r){var s=i(t,e,r);return s.dynamicProperties.length?s.getValueAtTime=function(t){console.warn("Transform at time not supported")}.bind(s):s.getValueAtTime=function(t){}.bind(s),s.setGroupProperty=expressionHelpers.setGroupProperty,s};var s=PropertyFactory.getProp;PropertyFactory.getProp=function(i,a,n,o,h){var p=s(i,a,n,o,h);p.kf?p.getValueAtTime=expressionHelpers.getValueAtTime.bind(p):p.getValueAtTime=expressionHelpers.getStaticValueAtTime.bind(p),p.setGroupProperty=expressionHelpers.setGroupProperty,p.loopOut=t,p.loopIn=e,p.smooth=r,p.getVelocityAtTime=expressionHelpers.getVelocityAtTime.bind(p),p.getSpeedAtTime=expressionHelpers.getSpeedAtTime.bind(p),p.numKeys=1===a.a?a.k.length:0,p.propertyIndex=a.ix;var l=0;return 0!==n&&(l=createTypedArray("float32",1===a.a?a.k[0].s.length:a.k.length)),p._cachingAtTime={lastFrame:initialDefaultFrame,lastIndex:0,value:l},expressionHelpers.searchExpressions(i,a,p),p.k&&h.addDynamicProperty(p),p};var a=ShapePropertyFactory.getConstructorFunction(),n=ShapePropertyFactory.getKeyframedConstructorFunction();function o(){}o.prototype={vertices:function(t,e){this.k&&this.getValue();var r=this.v;void 0!==e&&(r=this.getValueAtTime(e,0));var i,s=r._length,a=r[t],n=r.v,o=createSizedArray(s);for(i=0;i<s;i+=1)o[i]="i"===t||"o"===t?[a[i][0]-n[i][0],a[i][1]-n[i][1]]:[a[i][0],a[i][1]];return o},points:function(t){return this.vertices("v",t)},inTangents:function(t){return this.vertices("i",t)},outTangents:function(t){return this.vertices("o",t)},isClosed:function(){return this.v.c},pointOnPath:function(t,e){var r=this.v;void 0!==e&&(r=this.getValueAtTime(e,0)),this._segmentsLength||(this._segmentsLength=bez.getSegmentsLength(r));for(var i,s=this._segmentsLength,a=s.lengths,n=s.totalLength*t,o=0,h=a.length,p=0;o<h;){if(p+a[o].addedLength>n){var l=o,f=r.c&&o===h-1?0:o+1,m=(n-p)/a[o].addedLength;i=bez.getPointInSegment(r.v[l],r.v[f],r.o[l],r.i[f],m,a[o]);break}p+=a[o].addedLength,o+=1}return i||(i=r.c?[r.v[0][0],r.v[0][1]]:[r.v[r._length-1][0],r.v[r._length-1][1]]),i},vectorOnPath:function(t,e,r){t=1==t?this.v.c?0:.999:t;var i=this.pointOnPath(t,e),s=this.pointOnPath(t+.001,e),a=s[0]-i[0],n=s[1]-i[1],o=Math.sqrt(Math.pow(a,2)+Math.pow(n,2));return"tangent"===r?[a/o,n/o]:[-n/o,a/o]},tangentOnPath:function(t,e){return this.vectorOnPath(t,e,"tangent")},normalOnPath:function(t,e){return this.vectorOnPath(t,e,"normal")},setGroupProperty:expressionHelpers.setGroupProperty,getValueAtTime:expressionHelpers.getStaticValueAtTime},extendPrototype([o],a),extendPrototype([o],n),n.prototype.getValueAtTime=function(t){return this._cachingAtTime||(this._cachingAtTime={shapeValue:shape_pool.clone(this.pv),lastIndex:0,lastTime:initialDefaultFrame}),t*=this.elem.globalData.frameRate,(t-=this.offsetTime)!==this._cachingAtTime.lastTime&&(this._cachingAtTime.lastIndex=this._cachingAtTime.lastTime<t?this._caching.lastIndex:0,this._cachingAtTime.lastTime=t,this.interpolateShape(t,this._cachingAtTime.shapeValue,this._cachingAtTime)),this._cachingAtTime.shapeValue},n.prototype.initiateExpression=ExpressionManager.initiateExpression;var h=ShapePropertyFactory.getShapeProp;ShapePropertyFactory.getShapeProp=function(t,e,r,i,s){var a=h(t,e,r,i,s);return a.propertyIndex=e.ix,a.lock=!1,3===r?expressionHelpers.searchExpressions(t,e.pt,a):4===r&&expressionHelpers.searchExpressions(t,e.ks,a),a.k&&t.addDynamicProperty(a),a}}(),function(){TextProperty.prototype.getExpressionValue=function(t,e){var r=this.calculateExpression(e);if(t.t!==r){var i={};return this.copyData(i,t),i.t=r.toString(),i.__complete=!1,i}return t},TextProperty.prototype.searchProperty=function(){var t=this.searchKeyframes(),e=this.searchExpressions();return this.kf=t||e,this.kf},TextProperty.prototype.searchExpressions=function(){if(this.data.d.x)return this.calculateExpression=ExpressionManager.initiateExpression.bind(this)(this.elem,this.data.d,this),this.addEffect(this.getExpressionValue.bind(this)),!0}}();var ShapeExpressionInterface=function(){function t(t,f,m){var c,d=[],u=t?t.length:0;for(c=0;c<u;c+=1)"gr"==t[c].ty?d.push(e(t[c],f[c],m)):"fl"==t[c].ty?d.push(r(t[c],f[c],m)):"st"==t[c].ty?d.push(i(t[c],f[c],m)):"tm"==t[c].ty?d.push(s(t[c],f[c],m)):"tr"==t[c].ty||("el"==t[c].ty?d.push(a(t[c],f[c],m)):"sr"==t[c].ty?d.push(n(t[c],f[c],m)):"sh"==t[c].ty?d.push(l(t[c],f[c],m)):"rc"==t[c].ty?d.push(o(t[c],f[c],m)):"rd"==t[c].ty?d.push(h(t[c],f[c],m)):"rp"==t[c].ty&&d.push(p(t[c],f[c],m)));return d}function e(e,r,i){var s=function(t){switch(t){case"ADBE Vectors Group":case"Contents":case 2:return s.content;default:return s.transform}};s.propertyGroup=function(t){return 1===t?s:i(t-1)};var a=function(e,r,i){var s,a=function(t){for(var e=0,r=s.length;e<r;){if(s[e]._name===t||s[e].mn===t||s[e].propertyIndex===t||s[e].ix===t||s[e].ind===t)return s[e];e+=1}if("number"==typeof t)return s[t-1]};return a.propertyGroup=function(t){return 1===t?a:i(t-1)},s=t(e.it,r.it,a.propertyGroup),a.numProperties=s.length,a.propertyIndex=e.cix,a._name=e.nm,a}(e,r,s.propertyGroup),n=function(t,e,r){function i(t){return 1==t?s:r(--t)}e.transform.mProps.o.setGroupProperty(i),e.transform.mProps.p.setGroupProperty(i),e.transform.mProps.a.setGroupProperty(i),e.transform.mProps.s.setGroupProperty(i),e.transform.mProps.r.setGroupProperty(i),e.transform.mProps.sk&&(e.transform.mProps.sk.setGroupProperty(i),e.transform.mProps.sa.setGroupProperty(i));function s(e){return t.a.ix===e||"Anchor Point"===e?s.anchorPoint:t.o.ix===e||"Opacity"===e?s.opacity:t.p.ix===e||"Position"===e?s.position:t.r.ix===e||"Rotation"===e||"ADBE Vector Rotation"===e?s.rotation:t.s.ix===e||"Scale"===e?s.scale:t.sk&&t.sk.ix===e||"Skew"===e?s.skew:t.sa&&t.sa.ix===e||"Skew Axis"===e?s.skewAxis:void 0}return e.transform.op.setGroupProperty(i),Object.defineProperties(s,{opacity:{get:ExpressionPropertyInterface(e.transform.mProps.o)},position:{get:ExpressionPropertyInterface(e.transform.mProps.p)},anchorPoint:{get:ExpressionPropertyInterface(e.transform.mProps.a)},scale:{get:ExpressionPropertyInterface(e.transform.mProps.s)},rotation:{get:ExpressionPropertyInterface(e.transform.mProps.r)},skew:{get:ExpressionPropertyInterface(e.transform.mProps.sk)},skewAxis:{get:ExpressionPropertyInterface(e.transform.mProps.sa)},_name:{value:t.nm}}),s.ty="tr",s.mn=t.mn,s.propertyGroup=r,s}(e.it[e.it.length-1],r.it[r.it.length-1],s.propertyGroup);return s.content=a,s.transform=n,Object.defineProperty(s,"_name",{get:function(){return e.nm}}),s.numProperties=e.np,s.propertyIndex=e.ix,s.nm=e.nm,s.mn=e.mn,s}function r(t,e,r){function i(t){return"Color"===t||"color"===t?i.color:"Opacity"===t||"opacity"===t?i.opacity:void 0}return Object.defineProperties(i,{color:{get:ExpressionPropertyInterface(e.c)},opacity:{get:ExpressionPropertyInterface(e.o)},_name:{value:t.nm},mn:{value:t.mn}}),e.c.setGroupProperty(r),e.o.setGroupProperty(r),i}function i(t,e,r){function i(t){return 1===t?ob:r(t-1)}function s(t){return 1===t?h:i(t-1)}function a(r){Object.defineProperty(h,t.d[r].nm,{get:ExpressionPropertyInterface(e.d.dataProps[r].p)})}var n,o=t.d?t.d.length:0,h={};for(n=0;n<o;n+=1)a(n),e.d.dataProps[n].p.setGroupProperty(s);function p(t){return"Color"===t||"color"===t?p.color:"Opacity"===t||"opacity"===t?p.opacity:"Stroke Width"===t||"stroke width"===t?p.strokeWidth:void 0}return Object.defineProperties(p,{color:{get:ExpressionPropertyInterface(e.c)},opacity:{get:ExpressionPropertyInterface(e.o)},strokeWidth:{get:ExpressionPropertyInterface(e.w)},dash:{get:function(){return h}},_name:{value:t.nm},mn:{value:t.mn}}),e.c.setGroupProperty(i),e.o.setGroupProperty(i),e.w.setGroupProperty(i),p}function s(t,e,r){function i(t){return 1==t?s:r(--t)}function s(e){return e===t.e.ix||"End"===e||"end"===e?s.end:e===t.s.ix?s.start:e===t.o.ix?s.offset:void 0}return s.propertyIndex=t.ix,e.s.setGroupProperty(i),e.e.setGroupProperty(i),e.o.setGroupProperty(i),s.propertyIndex=t.ix,s.propertyGroup=r,Object.defineProperties(s,{start:{get:ExpressionPropertyInterface(e.s)},end:{get:ExpressionPropertyInterface(e.e)},offset:{get:ExpressionPropertyInterface(e.o)},_name:{value:t.nm}}),s.mn=t.mn,s}function a(t,e,r){function i(t){return 1==t?a:r(--t)}a.propertyIndex=t.ix;var s="tm"===e.sh.ty?e.sh.prop:e.sh;function a(e){return t.p.ix===e?a.position:t.s.ix===e?a.size:void 0}return s.s.setGroupProperty(i),s.p.setGroupProperty(i),Object.defineProperties(a,{size:{get:ExpressionPropertyInterface(s.s)},position:{get:ExpressionPropertyInterface(s.p)},_name:{value:t.nm}}),a.mn=t.mn,a}function n(t,e,r){function i(t){return 1==t?a:r(--t)}var s="tm"===e.sh.ty?e.sh.prop:e.sh;function a(e){return t.p.ix===e?a.position:t.r.ix===e?a.rotation:t.pt.ix===e?a.points:t.or.ix===e||"ADBE Vector Star Outer Radius"===e?a.outerRadius:t.os.ix===e?a.outerRoundness:!t.ir||t.ir.ix!==e&&"ADBE Vector Star Inner Radius"!==e?t.is&&t.is.ix===e?a.innerRoundness:void 0:a.innerRadius}return a.propertyIndex=t.ix,s.or.setGroupProperty(i),s.os.setGroupProperty(i),s.pt.setGroupProperty(i),s.p.setGroupProperty(i),s.r.setGroupProperty(i),t.ir&&(s.ir.setGroupProperty(i),s.is.setGroupProperty(i)),Object.defineProperties(a,{position:{get:ExpressionPropertyInterface(s.p)},rotation:{get:ExpressionPropertyInterface(s.r)},points:{get:ExpressionPropertyInterface(s.pt)},outerRadius:{get:ExpressionPropertyInterface(s.or)},outerRoundness:{get:ExpressionPropertyInterface(s.os)},innerRadius:{get:ExpressionPropertyInterface(s.ir)},innerRoundness:{get:ExpressionPropertyInterface(s.is)},_name:{value:t.nm}}),a.mn=t.mn,a}function o(t,e,r){function i(t){return 1==t?a:r(--t)}var s="tm"===e.sh.ty?e.sh.prop:e.sh;function a(e){return t.p.ix===e?a.position:t.r.ix===e?a.roundness:t.s.ix===e||"Size"===e||"ADBE Vector Rect Size"===e?a.size:void 0}return a.propertyIndex=t.ix,s.p.setGroupProperty(i),s.s.setGroupProperty(i),s.r.setGroupProperty(i),Object.defineProperties(a,{position:{get:ExpressionPropertyInterface(s.p)},roundness:{get:ExpressionPropertyInterface(s.r)},size:{get:ExpressionPropertyInterface(s.s)},_name:{value:t.nm}}),a.mn=t.mn,a}function h(t,e,r){var i=e;function s(e){if(t.r.ix===e||"Round Corners 1"===e)return s.radius}return s.propertyIndex=t.ix,i.rd.setGroupProperty(function(t){return 1==t?s:r(--t)}),Object.defineProperties(s,{radius:{get:ExpressionPropertyInterface(i.rd)},_name:{value:t.nm}}),s.mn=t.mn,s}function p(t,e,r){function i(t){return 1==t?a:r(--t)}var s=e;function a(e){return t.c.ix===e||"Copies"===e?a.copies:t.o.ix===e||"Offset"===e?a.offset:void 0}return a.propertyIndex=t.ix,s.c.setGroupProperty(i),s.o.setGroupProperty(i),Object.defineProperties(a,{copies:{get:ExpressionPropertyInterface(s.c)},offset:{get:ExpressionPropertyInterface(s.o)},_name:{value:t.nm}}),a.mn=t.mn,a}function l(t,e,r){var i=e.sh;function s(t){if("Shape"===t||"shape"===t||"Path"===t||"path"===t||"ADBE Vector Shape"===t||2===t)return s.path}return i.setGroupProperty(function(t){return 1==t?s:r(--t)}),Object.defineProperties(s,{path:{get:function(){return i.k&&i.getValue(),i}},shape:{get:function(){return i.k&&i.getValue(),i}},_name:{value:t.nm},ix:{value:t.ix},mn:{value:t.mn}}),s}return function(e,r,i){var s;function a(t){if("number"==typeof t)return s[t-1];for(var e=0,r=s.length;e<r;){if(s[e]._name===t)return s[e];e+=1}}return a.propertyGroup=i,s=t(e,r,a),a.numProperties=s.length,a}}(),TextExpressionInterface=function(t){var e;function r(){}return Object.defineProperty(r,"sourceText",{get:function(){t.textProperty.getValue();var r=t.textProperty.currentData.t;return void 0!==r&&(t.textProperty.currentData.t=void 0,(e=new String(r)).value=r||new String(r)),e}}),r},LayerExpressionInterface=function(){function t(t,e){var r=new Matrix;if(r.reset(),this._elem.finalTransform.mProp.applyToMatrix(r),this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(r);return r.applyToPointArray(t[0],t[1],t[2]||0)}return r.applyToPointArray(t[0],t[1],t[2]||0)}function e(t,e){var r=new Matrix;if(r.reset(),this._elem.finalTransform.mProp.applyToMatrix(r),this._elem.hierarchy&&this._elem.hierarchy.length){var i,s=this._elem.hierarchy.length;for(i=0;i<s;i+=1)this._elem.hierarchy[i].finalTransform.mProp.applyToMatrix(r);return r.inversePoint(t)}return r.inversePoint(t)}function r(t){var e=new Matrix;if(e.reset(),this._elem.finalTransform.mProp.applyToMatrix(e),this._elem.hierarchy&&this._elem.hierarchy.length){var r,i=this._elem.hierarchy.length;for(r=0;r<i;r+=1)this._elem.hierarchy[r].finalTransform.mProp.applyToMatrix(e);return e.inversePoint(t)}return e.inversePoint(t)}function i(){return[1,1,1,1]}return function(s){var a;function n(t){switch(t){case"ADBE Root Vectors Group":case"Contents":case 2:return n.shapeInterface;case 1:case 6:case"Transform":case"transform":case"ADBE Transform Group":return a;case 4:case"ADBE Effect Parade":case"effects":case"Effects":return n.effect}}n.toWorld=t,n.fromWorld=e,n.toComp=t,n.fromComp=r,n.sampleImage=i,n.sourceRectAtTime=s.sourceRectAtTime.bind(s),n._elem=s;var o=getDescriptor(a=TransformExpressionInterface(s.finalTransform.mProp),"anchorPoint");return Object.defineProperties(n,{hasParent:{get:function(){return s.hierarchy.length}},parent:{get:function(){return s.hierarchy[0].layerInterface}},rotation:getDescriptor(a,"rotation"),scale:getDescriptor(a,"scale"),position:getDescriptor(a,"position"),opacity:getDescriptor(a,"opacity"),anchorPoint:o,anchor_point:o,transform:{get:function(){return a}},active:{get:function(){return s.isInRange}}}),n.startTime=s.data.st,n.index=s.data.ind,n.source=s.data.refId,n.height=0===s.data.ty?s.data.h:100,n.width=0===s.data.ty?s.data.w:100,n.inPoint=s.data.ip/s.comp.globalData.frameRate,n.outPoint=s.data.op/s.comp.globalData.frameRate,n._name=s.data.nm,n.registerMaskInterface=function(t){n.mask=new MaskManagerInterface(t,s)},n.registerEffectsInterface=function(t){n.effect=t},n}}(),CompExpressionInterface=function(t){function e(e){for(var r=0,i=t.layers.length;r<i;){if(t.layers[r].nm===e||t.layers[r].ind===e)return t.elements[r].layerInterface;r+=1}return null}return Object.defineProperty(e,"_name",{value:t.data.nm}),e.layer=e,e.pixelAspect=1,e.height=t.data.h||t.globalData.compSize.h,e.width=t.data.w||t.globalData.compSize.w,e.pixelAspect=1,e.frameDuration=1/t.globalData.frameRate,e.displayStartTime=0,e.numLayers=t.layers.length,e},TransformExpressionInterface=function(t){function e(t){switch(t){case"scale":case"Scale":case"ADBE Scale":case 6:return e.scale;case"rotation":case"Rotation":case"ADBE Rotation":case"ADBE Rotate Z":case 10:return e.rotation;case"ADBE Rotate X":return e.xRotation;case"ADBE Rotate Y":return e.yRotation;case"position":case"Position":case"ADBE Position":case 2:return e.position;case"ADBE Position_0":return e.xPosition;case"ADBE Position_1":return e.yPosition;case"ADBE Position_2":return e.zPosition;case"anchorPoint":case"AnchorPoint":case"Anchor Point":case"ADBE AnchorPoint":case 1:return e.anchorPoint;case"opacity":case"Opacity":case 11:return e.opacity}}if(Object.defineProperty(e,"rotation",{get:ExpressionPropertyInterface(t.r||t.rz)}),Object.defineProperty(e,"zRotation",{get:ExpressionPropertyInterface(t.rz||t.r)}),Object.defineProperty(e,"xRotation",{get:ExpressionPropertyInterface(t.rx)}),Object.defineProperty(e,"yRotation",{get:ExpressionPropertyInterface(t.ry)}),Object.defineProperty(e,"scale",{get:ExpressionPropertyInterface(t.s)}),t.p)var r=ExpressionPropertyInterface(t.p);return Object.defineProperty(e,"position",{get:function(){return t.p?r():[t.px.v,t.py.v,t.pz?t.pz.v:0]}}),Object.defineProperty(e,"xPosition",{get:ExpressionPropertyInterface(t.px)}),Object.defineProperty(e,"yPosition",{get:ExpressionPropertyInterface(t.py)}),Object.defineProperty(e,"zPosition",{get:ExpressionPropertyInterface(t.pz)}),Object.defineProperty(e,"anchorPoint",{get:ExpressionPropertyInterface(t.a)}),Object.defineProperty(e,"opacity",{get:ExpressionPropertyInterface(t.o)}),Object.defineProperty(e,"skew",{get:ExpressionPropertyInterface(t.sk)}),Object.defineProperty(e,"skewAxis",{get:ExpressionPropertyInterface(t.sa)}),Object.defineProperty(e,"orientation",{get:ExpressionPropertyInterface(t.or)}),e},ProjectInterface=function(){function t(t){this.compositions.push(t)}return function(){function e(t){for(var e=0,r=this.compositions.length;e<r;){if(this.compositions[e].data&&this.compositions[e].data.nm===t)return this.compositions[e].prepareFrame&&this.compositions[e].data.xt&&this.compositions[e].prepareFrame(this.currentFrame),this.compositions[e].compInterface;e+=1}}return e.compositions=[],e.currentFrame=0,e.registerComposition=t,e}}(),EffectsExpressionInterface=function(){function t(r,i,s,a){var n,o=[],h=r.ef.length;for(n=0;n<h;n+=1)5===r.ef[n].ty?o.push(t(r.ef[n],i.effectElements[n],i.effectElements[n].propertyGroup,a)):o.push(e(i.effectElements[n],r.ef[n].ty,a,p));function p(t){return 1===t?l:s(t-1)}var l=function(t){for(var e=r.ef,i=0,s=e.length;i<s;){if(t===e[i].nm||t===e[i].mn||t===e[i].ix)return 5===e[i].ty?o[i]:o[i]();i+=1}return o[0]()};return l.propertyGroup=p,"ADBE Color Control"===r.mn&&Object.defineProperty(l,"color",{get:function(){return o[0]()}}),Object.defineProperty(l,"numProperties",{get:function(){return r.np}}),l.active=l.enabled=0!==r.en,l}function e(t,e,r,i){var s=ExpressionPropertyInterface(t.p);return t.p.setGroupProperty&&t.p.setGroupProperty(i),function(){return 10===e?r.comp.compInterface(t.p.v):s()}}return{createEffectsInterface:function(e,r){if(e.effectsManager){var i,s=[],a=e.data.ef,n=e.effectsManager.effectElements.length;for(i=0;i<n;i+=1)s.push(t(a[i],e.effectsManager.effectElements[i],r,e));return function(t){for(var r=e.data.ef||[],i=0,a=r.length;i<a;){if(t===r[i].nm||t===r[i].mn||t===r[i].ix)return s[i];i+=1}}}}}}(),MaskManagerInterface=function(){function t(t,e){this._mask=t,this._data=e}Object.defineProperty(t.prototype,"maskPath",{get:function(){return this._mask.prop.k&&this._mask.prop.getValue(),this._mask.prop}});return function(e,r){var i,s=createSizedArray(e.viewData.length),a=e.viewData.length;for(i=0;i<a;i+=1)s[i]=new t(e.viewData[i],e.masksProperties[i]);return function(t){for(i=0;i<a;){if(e.masksProperties[i].nm===t)return s[i];i+=1}}}}(),ExpressionPropertyInterface=function(){var t={pv:0,v:0,mult:1},e={pv:[0,0,0],v:[0,0,0],mult:1};function r(t,e,r){Object.defineProperty(t,"velocity",{get:function(){return e.getVelocityAtTime(e.comp.currentFrame)}}),t.numKeys=e.keyframes?e.keyframes.length:0,t.key=function(i){if(t.numKeys){var s="";s="s"in e.keyframes[i-1]?e.keyframes[i-1].s:"e"in e.keyframes[i-2]?e.keyframes[i-2].e:e.keyframes[i-2].s;var a="unidimensional"===r?new Number(s):Object.assign({},s);return a.time=e.keyframes[i-1].t/e.elem.comp.globalData.frameRate,a}return 0},t.valueAtTime=e.getValueAtTime,t.speedAtTime=e.getSpeedAtTime,t.velocityAtTime=e.getVelocityAtTime,t.propertyGroup=e.propertyGroup}function i(){return t}return function(s){return s?"unidimensional"===s.propType?function(e){e&&"pv"in e||(e=t);var i=1/e.mult,s=e.pv*i,a=new Number(s);return a.value=s,r(a,e,"unidimensional"),function(){return e.k&&e.getValue(),s=e.v*i,a.value!==s&&((a=new Number(s)).value=s,r(a,e,"unidimensional")),a}}(s):function(t){t&&"pv"in t||(t=e);var i=1/t.mult,s=t.pv.length,a=createTypedArray("float32",s),n=createTypedArray("float32",s);return a.value=n,r(a,t,"multidimensional"),function(){t.k&&t.getValue();for(var e=0;e<s;e+=1)a[e]=n[e]=t.v[e]*i;return a}}(s):i}}(),TextExpressionSelectorProp,propertyGetTextProp;function SliderEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function AngleEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function ColorEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,1,0,r)}function PointEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,1,0,r)}function LayerIndexEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function MaskIndexEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function CheckboxEffect(t,e,r){this.p=PropertyFactory.getProp(e,t.v,0,0,r)}function NoValueEffect(){this.p={}}function EffectsManager(){}function EffectsManager(t,e){var r=t.ef||[];this.effectElements=[];var i,s,a=r.length;for(i=0;i<a;i++)s=new GroupEffect(r[i],e),this.effectElements.push(s)}function GroupEffect(t,e){this.init(t,e)}TextExpressionSelectorProp=function(){function t(t,e){return this.textIndex=t+1,this.textTotal=e,this.v=this.getValue()*this.mult,this.v}return function(e,r){this.pv=1,this.comp=e.comp,this.elem=e,this.mult=.01,this.propType="textSelector",this.textTotal=r.totalChars,this.selectorValue=100,this.lastValue=[1,1,1],this.k=!0,this.x=!0,this.getValue=ExpressionManager.initiateExpression.bind(this)(e,r,this),this.getMult=t,this.getVelocityAtTime=expressionHelpers.getVelocityAtTime,this.kf?this.getValueAtTime=expressionHelpers.getValueAtTime.bind(this):this.getValueAtTime=expressionHelpers.getStaticValueAtTime.bind(this),this.setGroupProperty=expressionHelpers.setGroupProperty}}(),propertyGetTextProp=TextSelectorProp.getTextSelectorProp,TextSelectorProp.getTextSelectorProp=function(t,e,r){return 1===e.t?new TextExpressionSelectorProp(t,e,r):propertyGetTextProp(t,e,r)},extendPrototype([DynamicPropertyContainer],GroupEffect),GroupEffect.prototype.getValue=GroupEffect.prototype.iterateDynamicProperties,GroupEffect.prototype.init=function(t,e){this.data=t,this.effectElements=[],this.initDynamicPropertyContainer(e);var r,i,s=this.data.ef.length,a=this.data.ef;for(r=0;r<s;r+=1){switch(i=null,a[r].ty){case 0:i=new SliderEffect(a[r],e,this);break;case 1:i=new AngleEffect(a[r],e,this);break;case 2:i=new ColorEffect(a[r],e,this);break;case 3:i=new PointEffect(a[r],e,this);break;case 4:case 7:i=new CheckboxEffect(a[r],e,this);break;case 10:i=new LayerIndexEffect(a[r],e,this);break;case 11:i=new MaskIndexEffect(a[r],e,this);break;case 5:i=new EffectsManager(a[r],e,this);break;default:i=new NoValueEffect(a[r],e,this)}i&&this.effectElements.push(i)}};var lottiejs={},_isFrozen=!1;function setLocationHref(t){locationHref=t}function searchAnimations(){!0===standalone?animationManager.searchAnimations(animationData,standalone,renderer):animationManager.searchAnimations()}function setSubframeRendering(t){subframeEnabled=t}function loadAnimation(t){return!0===standalone&&(t.animationData=JSON.parse(animationData)),animationManager.loadAnimation(t)}function setQuality(t){if("string"==typeof t)switch(t){case"high":defaultCurveSegments=200;break;case"medium":defaultCurveSegments=50;break;case"low":defaultCurveSegments=10}else!isNaN(t)&&t>1&&(defaultCurveSegments=t);roundValues(!(defaultCurveSegments>=50))}function inBrowser(){return"undefined"!=typeof navigator}function installPlugin(t,e){"expressions"===t&&(expressionsPlugin=e)}function getFactory(t){switch(t){case"propertyFactory":return PropertyFactory;case"shapePropertyFactory":return ShapePropertyFactory;case"matrix":return Matrix}}function checkReady(){"complete"===document.readyState&&(clearInterval(readyStateCheckInterval),searchAnimations())}function getQueryVariable(t){for(var e=queryString.split("&"),r=0;r<e.length;r++){var i=e[r].split("=");if(decodeURIComponent(i[0])==t)return decodeURIComponent(i[1])}}lottiejs.play=animationManager.play,lottiejs.pause=animationManager.pause,lottiejs.setLocationHref=setLocationHref,lottiejs.togglePause=animationManager.togglePause,lottiejs.setSpeed=animationManager.setSpeed,lottiejs.setDirection=animationManager.setDirection,lottiejs.stop=animationManager.stop,lottiejs.searchAnimations=searchAnimations,lottiejs.registerAnimation=animationManager.registerAnimation,lottiejs.loadAnimation=loadAnimation,lottiejs.setSubframeRendering=setSubframeRendering,lottiejs.resize=animationManager.resize,lottiejs.goToAndStop=animationManager.goToAndStop,lottiejs.destroy=animationManager.destroy,lottiejs.setQuality=setQuality,lottiejs.inBrowser=inBrowser,lottiejs.installPlugin=installPlugin,lottiejs.freeze=animationManager.freeze,lottiejs.unfreeze=animationManager.unfreeze,lottiejs.getRegisteredAnimations=animationManager.getRegisteredAnimations,lottiejs.__getFactory=getFactory,lottiejs.version="5.5.2";var standalone="__[STANDALONE]__",animationData="__[ANIMATIONDATA]__",renderer="";if(standalone){var scripts=document.getElementsByTagName("script"),index=scripts.length-1,myScript=scripts[index]||{src:""},queryString=myScript.src.replace(/^[^\?]+\??/,"");renderer=getQueryVariable("renderer")}var readyStateCheckInterval=setInterval(checkReady,100);return lottiejs});
+},{}],"jFKs":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.default=void 0;var r=require("lit-element"),e=r.css`
+* {
+  box-sizing: border-box;
+}
+
+:host {
+  --lottie-player-toolbar-height: 35px;
+  --lottie-player-toolbar-background-color: transparent;
+  --lottie-player-toolbar-icon-color: #999;
+  --lottie-player-toolbar-icon-hover-color: #222;
+  --lottie-player-toolbar-icon-active-color: #555;
+  --lottie-player-seeker-track-color: #CCC;
+  --lottie-player-seeker-thumb-color: rgba(0, 107, 120, 0.8);
+
+  display: block;
+  width: 100%;
+  height: 100%;
+}
+
+.main {
+  box-sizing: border-box;
+  display: inline-grid;
+  grid-auto-columns: auto;
+  grid-template-rows: auto;
+  position: relative;
+  height: inherit;
+  width: inherit;
+}
+
+.main.controls {
+  grid-template-rows: 1fr var(--lottie-player-toolbar-height);
+}
+
+.animation {
+  overflow: hidden;
+  height: calc(1fr - var(--lottie-player-toolbar-height));
+}
+
+.toolbar {
+  display: grid;
+  grid-template-columns: 32px 32px 1fr 32px 32px;
+  align-items: center;
+  justify-items: center;
+  background-color: var(--lottie-player-toolbar-background-color);
+}
+
+.toolbar button {
+  cursor: pointer;
+  fill: var(--lottie-player-toolbar-icon-color);
+  display: flex;
+  background: none;
+  border: 0;
+  padding: 0;
+  outline: none;
+  height: 100%;
+}
+
+.toolbar button:hover {
+  fill: var(--lottie-player-toolbar-icon-hover-color);
+}
+
+.toolbar button.active {
+  fill: var(--lottie-player-toolbar-icon-active-color);
+}
+
+.toolbar button svg {
+}
+
+.toolbar button.disabled svg {
+  display: none;
+}
+
+.toolbar a {
+  filter: grayscale(100%);
+  display: flex;
+  transition: filter .5s, opacity 0.5s;
+  opacity: 0.4;
+  height: 100%;
+  align-items: center;
+}
+
+.toolbar a:hover {
+  filter: none;
+  display: flex;
+  opacity: 1;
+}
+
+.toolbar a svg {
+}
+
+.seeker {
+  -webkit-appearance: none;
+  width: 95%;
+  outline: none;
+}
+
+.seeker::-webkit-slider-runnable-track {
+  width: 100%;
+  height: 5px;
+  cursor: pointer;
+  background: var(--lottie-player-seeker-track-color);
+  border-radius: 3px;
+}
+.seeker::-webkit-slider-thumb {
+  height: 15px;
+  width: 15px;
+  border-radius: 50%;
+  background: var(--lottie-player-seeker-thumb-color);
+  cursor: pointer;
+  -webkit-appearance: none;
+  margin-top: -5px;
+}
+.seeker:focus::-webkit-slider-runnable-track {
+  background: #999;
+}
+.seeker::-moz-range-track {
+  width: 100%;
+  height: 5px;
+  cursor: pointer;
+  background: var(--lottie-player-seeker-track-color);
+  border-radius: 3px;
+}
+.seeker::-moz-range-thumb {
+  height: 15px;
+  width: 15px;
+  border-radius: 50%;
+  background: var(--lottie-player-seeker-thumb-color);
+  cursor: pointer;
+}
+.seeker::-ms-track {
+  width: 100%;
+  height: 5px;
+  cursor: pointer;
+  background: transparent;
+  border-color: transparent;
+  color: transparent;
+}
+.seeker::-ms-fill-lower {
+  background: var(--lottie-player-seeker-track-color);
+  border-radius: 3px;
+}
+.seeker::-ms-fill-upper {
+  background: var(--lottie-player-seeker-track-color);
+  border-radius: 3px;
+}
+.seeker::-ms-thumb {
+  border: 0;
+  height: 15px;
+  width: 15px;
+  border-radius: 50%;
+  background: var(--lottie-player-seeker-thumb-color);
+  cursor: pointer;
+}
+.seeker:focus::-ms-fill-lower {
+  background: var(--lottie-player-seeker-track-color);
+}
+.seeker:focus::-ms-fill-upper {
+  background: var(--lottie-player-seeker-track-color);
+}
+
+.error {
+  display: flex;
+  justify-content: center;
+  height: 100%;
+  align-items: center;
+}
+`;exports.default=e;
+},{"lit-element":"+bhx"}],"M8c7":[function(require,module,exports) {
+    "use strict";Object.defineProperty(exports,"__esModule",{value:!0}),exports.parseSrc=l,exports.LottiePlayer=exports.PlayerEvents=exports.PlayMode=exports.PlayerState=void 0;var t=require("lit-element"),e=r(require("lottie-web/build/player/lottie_svg")),i=o(require("./lottie-player.styles"));function o(t){return t&&t.__esModule?t:{default:t}}function r(t){if(t&&t.__esModule)return t;var e={};if(null!=t)for(var i in t)if(Object.prototype.hasOwnProperty.call(t,i)){var o=Object.defineProperty&&Object.getOwnPropertyDescriptor?Object.getOwnPropertyDescriptor(t,i):{};o.get||o.set?Object.defineProperty(e,i,o):e[i]=t[i]}return e.default=t,e}var s,n,a,h=function(t,e,i,o){var r,s=arguments.length,n=s<3?e:null===o?o=Object.getOwnPropertyDescriptor(e,i):o;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)n=Reflect.decorate(t,e,i,o);else for(var a=t.length-1;a>=0;a--)(r=t[a])&&(n=(s<3?r(n):s>3?r(e,i,n):r(e,i))||n);return s>3&&n&&Object.defineProperty(e,i,n),n};function l(t){if("object"==typeof t)return t;try{return JSON.parse(t)}catch(e){return new URL(t,window.location.href).toString()}}exports.PlayerState=s,function(t){t.Loading="loading",t.Playing="playing",t.Paused="paused",t.Stopped="stopped",t.Frozen="frozen",t.Error="error"}(s||(exports.PlayerState=s={})),exports.PlayMode=n,function(t){t.Normal="normal",t.Bounce="bounce"}(n||(exports.PlayMode=n={})),exports.PlayerEvents=a,function(t){t.Load="load",t.Error="error",t.Ready="ready",t.Play="play",t.Pause="pause",t.Stop="stop",t.Freeze="freeze",t.Loop="loop",t.Complete="complete",t.Frame="frame"}(a||(exports.PlayerEvents=a={}));let p=class extends t.LitElement{constructor(){super(...arguments),this.mode=n.Normal,this.autoplay=!1,this.background="transparent",this.controls=!1,this.direction=1,this.hover=!1,this.loop=!1,this.renderer="svg",this.speed=1,this.currentState=s.Loading,this.intermission=1,this._counter=0}_onVisibilityChange(){!0===document.hidden&&this.currentState===s.Playing?this.freeze():this.currentState===s.Frozen&&this.play()}_handleSeekChange(t){if(!this._lottie||isNaN(t.target.value))return;const e=t.target.value/100*this._lottie.totalFrames;this.seek(e)}load(t){if(!this.shadowRoot)return;const i={container:this.container,loop:!1,autoplay:!1,renderer:this.renderer,rendererSettings:{scaleMode:"noScale",clearCanvas:!1,progressiveLoad:!0,hideOnTransparent:!0}};try{const r=l(t),n="string"==typeof r?"path":"animationData";this._lottie&&this._lottie.destroy(),this._lottie=e.loadAnimation(Object.assign({},i,{[n]:r}))}catch(o){return this.currentState=s.Error,void this.dispatchEvent(new CustomEvent(a.Error))}this._lottie&&(this._lottie.addEventListener("enterFrame",()=>{this.seeker=this._lottie.currentFrame/this._lottie.totalFrames*100,this.dispatchEvent(new CustomEvent(a.Frame,{detail:{frame:this._lottie.currentFrame,seeker:this.seeker}}))}),this._lottie.addEventListener("complete",()=>{this.currentState===s.Playing?!this.loop||this.count&&this._counter>=this.count?this.dispatchEvent(new CustomEvent(a.Complete)):this.mode===n.Bounce?(this.count&&(this._counter+=.5),setTimeout(()=>{this.dispatchEvent(new CustomEvent(a.Loop)),this.currentState===s.Playing&&(this._lottie.setDirection(-1*this._lottie.playDirection),this._lottie.play())},this.intermission)):(this.count&&(this._counter+=1),window.setTimeout(()=>{this.dispatchEvent(new CustomEvent(a.Loop)),this.currentState===s.Playing&&(this._lottie.stop(),this._lottie.play())},this.intermission)):this.dispatchEvent(new CustomEvent(a.Complete))}),this._lottie.addEventListener("DOMLoaded",()=>{this.dispatchEvent(new CustomEvent(a.Ready))}),this._lottie.addEventListener("data_ready",()=>{this.dispatchEvent(new CustomEvent(a.Load))}),this._lottie.addEventListener("data_failed",()=>{this.currentState=s.Error,this.dispatchEvent(new CustomEvent(a.Error))}),this.container.addEventListener("mouseenter",()=>{this.hover&&this.currentState!==s.Playing&&this.play()}),this.container.addEventListener("mouseleave",()=>{this.hover&&this.currentState===s.Playing&&this.stop()}),this.setSpeed(this.speed),this.setDirection(this.direction),this.autoplay&&this.play())}getLottie(){return this._lottie}play(){this._lottie&&(this._lottie.play(),this.currentState=s.Playing,this.dispatchEvent(new CustomEvent(a.Play)))}pause(){this._lottie&&(this._lottie.pause(),this.currentState=s.Paused,this.dispatchEvent(new CustomEvent(a.Pause)))}stop(){this._lottie&&(this._counter=0,this._lottie.stop(),this.currentState=s.Stopped,this.dispatchEvent(new CustomEvent(a.Stop)))}seek(t){if(!this._lottie)return;const e=t.toString().match(/^([0-9]+)(%?)$/);if(!e)return;const i="%"===e[2]?this._lottie.totalFrames*Number(e[1])/100:e[1];this.seeker=i,this.currentState===s.Playing?this._lottie.goToAndPlay(i,!0):(this._lottie.goToAndStop(i,!0),this._lottie.pause())}snapshot(t=!0){if(!this.shadowRoot)return;const e=this.shadowRoot.querySelector(".animation svg"),i=(new XMLSerializer).serializeToString(e);if(t){const t=document.createElement("a");t.href="data:image/svg+xml;charset=utf-8,"+encodeURIComponent(i),t.download="download_"+this.seeker+".svg",document.body.appendChild(t),t.click(),document.body.removeChild(t)}return i}freeze(){this._lottie&&(this._lottie.pause(),this.currentState=s.Frozen,this.dispatchEvent(new CustomEvent(a.Freeze)))}setSpeed(t=1){this._lottie&&this._lottie.setSpeed(t)}setDirection(t){this._lottie&&this._lottie.setDirection(t)}setLooping(t){this._lottie&&(this.loop=t,this._lottie.loop=t)}togglePlay(){return this.currentState===s.Playing?this.pause():this.play()}toggleLooping(){this.setLooping(!this.loop)}static get styles(){return i.default}firstUpdated(){"IntersectionObserver"in window&&(this._io=new IntersectionObserver(t=>{t[0].isIntersecting?this.currentState===s.Frozen&&this.play():this.currentState===s.Playing&&this.freeze()}),this._io.observe(this.container)),void 0!==document.hidden&&document.addEventListener("visibilitychange",()=>this._onVisibilityChange()),this.src&&this.load(this.src)}disconnectedCallback(){this._io&&(this._io.disconnect(),this._io=void 0),document.removeEventListener("visibilitychange",()=>this._onVisibilityChange())}renderControls(){const e=this.currentState===s.Playing,i=this.currentState===s.Paused,o=this.currentState===s.Stopped;return t.html`
+      <div class="toolbar">
+        <button @click=${this.togglePlay} class=${e||i?"active":""}>
+          ${e?t.html`<svg width="24" height="24"><path d="M14.016 5.016H18v13.969h-3.984V5.016zM6 18.984V5.015h3.984v13.969H6z"/></svg>`:t.html`<svg width="24" height="24"><path d="M8.016 5.016L18.985 12 8.016 18.984V5.015z"/></svg>`}
+        </button>
+        <button @click=${this.stop} class=${o?"active":""}>
+          <svg width="24" height="24"><path d="M6 6h12v12H6V6z" /></svg>
+        </button>
+        <input class="seeker" type="range" min="0" step="1" max="100" .value=${this.seeker}
+          @input=${this._handleSeekChange}
+          @mousedown=${()=>{this._prevState=this.currentState,this.freeze()}}
+          @mouseup=${()=>{this._prevState===s.Playing&&this.play()}}
+        />
+        <button @click=${this.toggleLooping} class=${this.loop?"active":""}>
+          <svg width="24" height="24">
+            <path d="M17.016 17.016v-4.031h1.969v6h-12v3l-3.984-3.984 3.984-3.984v3h10.031zM6.984 6.984v4.031H5.015v-6h12v-3l3.984 3.984-3.984 3.984v-3H6.984z"/>
+          </svg>
+        </button>
+        <a href="https://www.lottiefiles.com/" target="_blank">
+          <svg width="24" height="24" viewBox="0 0 320 320" fill-rule="nonzero"><rect fill="#adadad" x=".5" y=".5" width="100%" height="100%" rx="26.73"/><path d="M251.304 65.44a16.55 16.55 0 0 1 13.927 18.789c-1.333 9.04-9.73 15.292-18.762 13.954-15.992-2.37-39.95 22.534-66.77 73.74-34.24 65.37-66.113 96.517-99.667 94.032-9.102-.674-15.93-8.612-15.258-17.723s8.592-15.96 17.695-15.286c16.57 1.227 40.908-24.737 67.97-76.4 34.46-65.79 66.764-96.157 100.866-91.105z" fill="#fff"/></svg>
+        </a>
+      </div>
+    `}render(){return t.html`
+      <div class=${this.controls," controls"}>
+        <div class="animation" style=${"background:"+this.background}>
+          ${this.currentState===s.Error?t.html`<div class="error">⚠️</div>`:void 0}
+        </div>
+        ${this.controls?this.renderControls():void 0}
+      </div>`}};exports.LottiePlayer=p,h([(0,t.query)(".animation")],p.prototype,"container",void 0),h([(0,t.property)()],p.prototype,"mode",void 0),h([(0,t.property)({type:Boolean})],p.prototype,"autoplay",void 0),h([(0,t.property)({type:String,reflect:!0})],p.prototype,"background",void 0),h([(0,t.property)({type:Boolean})],p.prototype,"controls",void 0),h([(0,t.property)({type:Number})],p.prototype,"count",void 0),h([(0,t.property)({type:Number})],p.prototype,"direction",void 0),h([(0,t.property)({type:Boolean})],p.prototype,"hover",void 0),h([(0,t.property)({type:Boolean,reflect:!0})],p.prototype,"loop",void 0),h([(0,t.property)({type:String})],p.prototype,"renderer",void 0),h([(0,t.property)({type:Number})],p.prototype,"speed",void 0),h([(0,t.property)({type:String})],p.prototype,"src",void 0),h([(0,t.property)({type:String})],p.prototype,"currentState",void 0),h([(0,t.property)()],p.prototype,"seeker",void 0),h([(0,t.property)()],p.prototype,"intermission",void 0),exports.LottiePlayer=p=h([(0,t.customElement)("lottie-player")],p);
+},{"lit-element":"+bhx","lottie-web/build/player/lottie_svg":"aqmj","./lottie-player.styles":"jFKs"}]},{},["M8c7"], null)
+//# sourceMappingURL=/lottie-player.js.map
\ No newline at end of file
diff --git a/mobile/lib/snowfall.jquery.js b/mobile/lib/snowfall.jquery.js
new file mode 100644
index 0000000..0f5b780
--- /dev/null
+++ b/mobile/lib/snowfall.jquery.js
@@ -0,0 +1,317 @@
+/*  Snowfall jquery plugin
+
+	====================================================================
+	LICENSE
+	====================================================================
+	Licensed under the Apache License, Version 2.0 (the "License");
+	you may not use this file except in compliance with the License.
+	You may obtain a copy of the License at
+
+	   http://www.apache.org/licenses/LICENSE-2.0
+
+	   Unless required by applicable law or agreed to in writing, software
+	   distributed under the License is distributed on an "AS IS" BASIS,
+	   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+	   See the License for the specific language governing permissions and
+	   limitations under the License.
+	====================================================================
+
+	Version 1.51 Dec 2nd 2012
+	// fixed bug where snow collection didn't happen if a valid doctype was declared.
+	
+	Version 1.5 Oct 5th 2011
+	Added collecting snow! Uses the canvas element to collect snow. In order to initialize snow collection use the following
+	
+	$(document).snowfall({collection : 'element'});
+
+    element = any valid jquery selector.
+
+	The plugin then creates a canvas above every element that matches the selector, and collects the snow. If there are a varrying amount of elements the 
+	flakes get assigned a random one on start they will collide.
+
+	Version 1.4 Dec 8th 2010
+	Fixed issues (I hope) with scroll bars flickering due to snow going over the edge of the screen. 
+	Added round snowflakes via css, will not work for any version of IE. - Thanks to Luke Barker of http://www.infinite-eye.com/
+	Added shadows as an option via css again will not work with IE. The idea behind shadows, is to show flakes on lighter colored web sites - Thanks Yutt
+ 
+	Version 1.3.1 Nov 25th 2010
+	Updated script that caused flakes not to show at all if plugin was initialized with no options, also added the fixes that Han Bongers suggested 
+	
+	Developed by Jason Brown for any bugs or questions email me at loktar69@hotmail
+	info on the plugin is located on Somethinghitme.com
+	
+	values for snow options are
+	
+	flakeCount,
+	flakeColor,
+	flakeIndex,
+	minSize,
+	maxSize,
+	minSpeed,
+	maxSpeed,
+	round, 		true or false, makes the snowflakes rounded if the browser supports it.
+	shadow		true or false, gives the snowflakes a shadow if the browser supports it.
+	
+	Example Usage :
+	$(document).snowfall({flakeCount : 100, maxSpeed : 10});
+	
+	-or-
+	
+	$('#element').snowfall({flakeCount : 800, maxSpeed : 5, maxSize : 5});
+	
+	-or with defaults-
+	
+	$(document).snowfall();
+	
+	- To clear -
+	$('#element').snowfall('clear');
+*/
+
+(function($){
+	$.snowfall = function(element, options){
+		var	defaults = {
+				flakeCount : 15,
+				flakeColor : '#daa520',
+				flakeIndex: 999999,
+				minSize : 5,
+				maxSize : 10,
+				minSpeed : 1,
+				maxSpeed : 1,
+				round : false,
+				shadow : false,
+				collection : false,
+				collectionHeight : 400,
+				deviceorientation : false
+			},
+			options = $.extend(defaults, options),
+			random = function random(min, max){
+				return Math.round(min + Math.random()*(max-min)); 
+			};
+			
+			$(element).data("snowfall", this);			
+			
+			// Snow flake object
+			function Flake(_x, _y, _size, _speed, _id)
+			{
+				// Flake properties
+				this.id = _id; 
+				this.x  = _x;
+				this.y  = _y;
+				this.size = _size;
+				this.speed = _speed;
+				this.step = 0;
+				this.stepSize = random(1,10) / 100;
+	
+				if(options.collection){
+					this.target = canvasCollection[random(0,canvasCollection.length-1)];
+				}
+				
+				var flakeMarkup = $(document.createElement("div")).attr({'class': 'snowfall-flakes', 'id' : 'flake-' + this.id}).css({'width' : this.size, 'height' : this.size, 'background' : options.flakeColor, 'position' : 'absolute', 'top' : this.y, 'left' : this.x, 'fontSize' : 0, 'zIndex' : options.flakeIndex});
+				
+				if($(element).get(0).tagName === $(document).get(0).tagName){
+					$('body').append(flakeMarkup);
+					element = $('body');
+				}else{
+					$(element).append(flakeMarkup);
+				}
+				
+				this.element = document.getElementById('flake-' + this.id);
+				
+				// Update function, used to update the snow flakes, and checks current snowflake against bounds
+				this.update = function(){
+					this.y += this.speed;
+					
+					if(this.y > (elHeight) - (this.size  + 6)){
+						this.reset();
+					}
+					
+					this.element.style.top = this.y + 'px';
+					this.element.style.left = this.x + 'px';
+					
+					this.step += this.stepSize;
+
+					if (doRatio === false) {
+						this.x += Math.cos(this.step);
+					} else {
+						this.x += (doRatio + Math.cos(this.step));
+					}
+
+					// Pileup check
+					if(options.collection){
+						if(this.x > this.target.x && this.x < this.target.width + this.target.x && this.y > this.target.y && this.y < this.target.height + this.target.y){
+							var ctx = this.target.element.getContext("2d"),
+								curX = this.x - this.target.x,
+								curY = this.y - this.target.y,
+								colData = this.target.colData;
+								
+								if(colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] !== undefined || curY+this.speed+this.size > this.target.height){
+									if(curY+this.speed+this.size > this.target.height){
+										while(curY+this.speed+this.size > this.target.height && this.speed > 0){
+											this.speed *= .5;
+										}
+
+										ctx.fillStyle = "#fff";
+										
+										if(colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] == undefined){
+											colData[parseInt(curX)][parseInt(curY+this.speed+this.size)] = 1;
+											ctx.fillRect(curX, (curY)+this.speed+this.size, this.size, this.size);
+										}else{
+											colData[parseInt(curX)][parseInt(curY+this.speed)] = 1;
+											ctx.fillRect(curX, curY+this.speed, this.size, this.size);
+										}
+										this.reset();
+									}else{
+										// flow to the sides
+										this.speed = 1;
+										this.stepSize = 0;
+									
+										if(parseInt(curX)+1 < this.target.width && colData[parseInt(curX)+1][parseInt(curY)+1] == undefined ){
+											// go left
+											this.x++;
+										}else if(parseInt(curX)-1 > 0 && colData[parseInt(curX)-1][parseInt(curY)+1] == undefined ){
+											// go right
+											this.x--;
+										}else{
+											//stop
+											ctx.fillStyle = "#fff";
+											ctx.fillRect(curX, curY, this.size, this.size);
+											colData[parseInt(curX)][parseInt(curY)] = 1;
+											this.reset();
+										}
+									}
+								}
+						}
+					}
+					
+					if(this.x > (elWidth) - widthOffset || this.x < widthOffset){
+						this.reset();
+					}
+				}
+				
+				// Resets the snowflake once it reaches one of the bounds set
+				this.reset = function(){
+					this.y = 0;
+					this.x = random(widthOffset, elWidth - widthOffset);
+					this.stepSize = random(1,10) / 100;
+					this.size = random((options.minSize * 100), (options.maxSize * 100)) / 100;
+					this.speed = random(options.minSpeed, options.maxSpeed);
+				}
+			}
+		
+			// Private vars
+			var flakes = [],
+				flakeId = 0,
+				i = 0,
+				elHeight = $(element).height(),
+				elWidth = $(element).width(),
+				widthOffset = 0,
+				snowTimeout = 0;
+		
+			// Collection Piece ******************************
+			if(options.collection !== false){
+				var testElem = document.createElement('canvas');
+				if(!!(testElem.getContext && testElem.getContext('2d'))){
+					var canvasCollection = [],
+						elements = $(options.collection),
+						collectionHeight = options.collectionHeight;
+					
+					for(var i =0; i < elements.length; i++){
+							var bounds = elements[i].getBoundingClientRect(),
+								canvas = document.createElement('canvas'),
+								collisionData = [];
+
+							if(bounds.top-collectionHeight > 0){									
+								document.body.appendChild(canvas);
+								canvas.style.position = 'absolute';
+								canvas.height = collectionHeight;
+								canvas.width = bounds.width;
+								canvas.style.left = bounds.left + 'px';
+								canvas.style.top = bounds.top-collectionHeight + 'px';
+								
+								for(var w = 0; w < bounds.width; w++){
+									collisionData[w] = [];
+								}
+								
+								canvasCollection.push({element :canvas, x : bounds.left, y : bounds.top-collectionHeight, width : bounds.width, height: collectionHeight, colData : collisionData});
+							}
+					}
+				}else{
+					// Canvas element isnt supported
+					options.collection = false;
+				}
+			}
+			// ************************************************
+			
+			// This will reduce the horizontal scroll bar from displaying, when the effect is applied to the whole page
+			if($(element).get(0).tagName === $(document).get(0).tagName){
+				widthOffset = 25;
+			}
+			
+			// Bind the window resize event so we can get the innerHeight again
+			$(window).bind("resize", function(){  
+				elHeight = $(element).height();
+				elWidth = $(element).width();
+			}); 
+			
+
+			// initialize the flakes
+			for(i = 0; i < options.flakeCount; i+=1){
+				flakeId = flakes.length;
+				flakes.push(new Flake(random(widthOffset,elWidth - widthOffset), random(0, elHeight), random((options.minSize * 100), (options.maxSize * 100)) / 100, random(options.minSpeed, options.maxSpeed), flakeId));
+			}
+
+			// This adds the style to make the snowflakes round via border radius property 
+			if(options.round){
+				$('.snowfall-flakes').css({'-moz-border-radius' : options.maxSize, '-webkit-border-radius' : options.maxSize, 'border-radius' : options.maxSize});
+			}
+			
+			// This adds shadows just below the snowflake so they pop a bit on lighter colored web pages
+			if(options.shadow){
+				$('.snowfall-flakes').css({'-moz-box-shadow' : '1px 1px 1px #555', '-webkit-box-shadow' : '1px 1px 1px #555', 'box-shadow' : '1px 1px 1px #555'});
+			}
+
+			// On newer Macbooks Snowflakes will fall based on deviceorientation
+			var doRatio = false;
+			if (options.deviceorientation) {
+				$(window).bind('deviceorientation', function(event) {
+					doRatio = event.originalEvent.gamma * 0.1;
+				});
+			}
+
+			// this controls flow of the updating snow
+			function snow(){
+				for( i = 0; i < flakes.length; i += 1){
+					flakes[i].update();
+				}
+				
+				snowTimeout = setTimeout(function(){snow()}, 30);
+			}
+			
+			snow();
+		
+		// Public Methods
+		
+		// clears the snowflakes
+		this.clear = function(){
+						$(element).children('.snowfall-flakes').remove();
+						flakes = [];
+						clearTimeout(snowTimeout);
+					};
+	};
+	
+	// Initialize the options and the plugin
+	$.fn.snowfall = function(options){
+		if(typeof(options) == "object" || options == undefined){		
+				 return this.each(function(i){
+					(new $.snowfall(this, options)); 
+				});	
+		}else if (typeof(options) == "string") {
+			return this.each(function(i){
+				var snow = $(this).data('snowfall');
+				if(snow){
+					snow.clear();
+				}
+			});
+		}
+	};
+})(jQuery);
\ No newline at end of file
diff --git a/mobile/lib/swiper.min.js b/mobile/lib/swiper.min.js
new file mode 100644
index 0000000..e2b7d5e
--- /dev/null
+++ b/mobile/lib/swiper.min.js
@@ -0,0 +1,13 @@
+/**
+ * Swiper 4.5.0
+ * Most modern mobile touch slider and framework with hardware accelerated transitions
+ * http://www.idangero.us/swiper/
+ *
+ * Copyright 2014-2019 Vladimir Kharlampidi
+ *
+ * Released under the MIT License
+ *
+ * Released on: February 22, 2019
+ */
+!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Swiper=t()}(this,function(){"use strict";var f="undefined"==typeof document?{body:{},addEventListener:function(){},removeEventListener:function(){},activeElement:{blur:function(){},nodeName:""},querySelector:function(){return null},querySelectorAll:function(){return[]},getElementById:function(){return null},createEvent:function(){return{initEvent:function(){}}},createElement:function(){return{children:[],childNodes:[],style:{},setAttribute:function(){},getElementsByTagName:function(){return[]}}},location:{hash:""}}:document,J="undefined"==typeof window?{document:f,navigator:{userAgent:""},location:{},history:{},CustomEvent:function(){return this},addEventListener:function(){},removeEventListener:function(){},getComputedStyle:function(){return{getPropertyValue:function(){return""}}},Image:function(){},Date:function(){},screen:{},setTimeout:function(){},clearTimeout:function(){}}:window,l=function(e){for(var t=0;t<e.length;t+=1)this[t]=e[t];return this.length=e.length,this};function L(e,t){var a=[],i=0;if(e&&!t&&e instanceof l)return e;if(e)if("string"==typeof e){var s,r,n=e.trim();if(0<=n.indexOf("<")&&0<=n.indexOf(">")){var o="div";for(0===n.indexOf("<li")&&(o="ul"),0===n.indexOf("<tr")&&(o="tbody"),0!==n.indexOf("<td")&&0!==n.indexOf("<th")||(o="tr"),0===n.indexOf("<tbody")&&(o="table"),0===n.indexOf("<option")&&(o="select"),(r=f.createElement(o)).innerHTML=n,i=0;i<r.childNodes.length;i+=1)a.push(r.childNodes[i])}else for(s=t||"#"!==e[0]||e.match(/[ .<>:~]/)?(t||f).querySelectorAll(e.trim()):[f.getElementById(e.trim().split("#")[1])],i=0;i<s.length;i+=1)s[i]&&a.push(s[i])}else if(e.nodeType||e===J||e===f)a.push(e);else if(0<e.length&&e[0].nodeType)for(i=0;i<e.length;i+=1)a.push(e[i]);return new l(a)}function r(e){for(var t=[],a=0;a<e.length;a+=1)-1===t.indexOf(e[a])&&t.push(e[a]);return t}L.fn=l.prototype,L.Class=l,L.Dom7=l;var t={addClass:function(e){if(void 0===e)return this;for(var t=e.split(" "),a=0;a<t.length;a+=1)for(var i=0;i<this.length;i+=1)void 0!==this[i]&&void 0!==this[i].classList&&this[i].classList.add(t[a]);return this},removeClass:function(e){for(var t=e.split(" "),a=0;a<t.length;a+=1)for(var i=0;i<this.length;i+=1)void 0!==this[i]&&void 0!==this[i].classList&&this[i].classList.remove(t[a]);return this},hasClass:function(e){return!!this[0]&&this[0].classList.contains(e)},toggleClass:function(e){for(var t=e.split(" "),a=0;a<t.length;a+=1)for(var i=0;i<this.length;i+=1)void 0!==this[i]&&void 0!==this[i].classList&&this[i].classList.toggle(t[a]);return this},attr:function(e,t){var a=arguments;if(1===arguments.length&&"string"==typeof e)return this[0]?this[0].getAttribute(e):void 0;for(var i=0;i<this.length;i+=1)if(2===a.length)this[i].setAttribute(e,t);else for(var s in e)this[i][s]=e[s],this[i].setAttribute(s,e[s]);return this},removeAttr:function(e){for(var t=0;t<this.length;t+=1)this[t].removeAttribute(e);return this},data:function(e,t){var a;if(void 0!==t){for(var i=0;i<this.length;i+=1)(a=this[i]).dom7ElementDataStorage||(a.dom7ElementDataStorage={}),a.dom7ElementDataStorage[e]=t;return this}if(a=this[0]){if(a.dom7ElementDataStorage&&e in a.dom7ElementDataStorage)return a.dom7ElementDataStorage[e];var s=a.getAttribute("data-"+e);return s||void 0}},transform:function(e){for(var t=0;t<this.length;t+=1){var a=this[t].style;a.webkitTransform=e,a.transform=e}return this},transition:function(e){"string"!=typeof e&&(e+="ms");for(var t=0;t<this.length;t+=1){var a=this[t].style;a.webkitTransitionDuration=e,a.transitionDuration=e}return this},on:function(){for(var e,t=[],a=arguments.length;a--;)t[a]=arguments[a];var i=t[0],r=t[1],n=t[2],s=t[3];function o(e){var t=e.target;if(t){var a=e.target.dom7EventData||[];if(a.indexOf(e)<0&&a.unshift(e),L(t).is(r))n.apply(t,a);else for(var i=L(t).parents(),s=0;s<i.length;s+=1)L(i[s]).is(r)&&n.apply(i[s],a)}}function l(e){var t=e&&e.target&&e.target.dom7EventData||[];t.indexOf(e)<0&&t.unshift(e),n.apply(this,t)}"function"==typeof t[1]&&(i=(e=t)[0],n=e[1],s=e[2],r=void 0),s||(s=!1);for(var d,p=i.split(" "),c=0;c<this.length;c+=1){var u=this[c];if(r)for(d=0;d<p.length;d+=1){var h=p[d];u.dom7LiveListeners||(u.dom7LiveListeners={}),u.dom7LiveListeners[h]||(u.dom7LiveListeners[h]=[]),u.dom7LiveListeners[h].push({listener:n,proxyListener:o}),u.addEventListener(h,o,s)}else for(d=0;d<p.length;d+=1){var v=p[d];u.dom7Listeners||(u.dom7Listeners={}),u.dom7Listeners[v]||(u.dom7Listeners[v]=[]),u.dom7Listeners[v].push({listener:n,proxyListener:l}),u.addEventListener(v,l,s)}}return this},off:function(){for(var e,t=[],a=arguments.length;a--;)t[a]=arguments[a];var i=t[0],s=t[1],r=t[2],n=t[3];"function"==typeof t[1]&&(i=(e=t)[0],r=e[1],n=e[2],s=void 0),n||(n=!1);for(var o=i.split(" "),l=0;l<o.length;l+=1)for(var d=o[l],p=0;p<this.length;p+=1){var c=this[p],u=void 0;if(!s&&c.dom7Listeners?u=c.dom7Listeners[d]:s&&c.dom7LiveListeners&&(u=c.dom7LiveListeners[d]),u&&u.length)for(var h=u.length-1;0<=h;h-=1){var v=u[h];r&&v.listener===r?(c.removeEventListener(d,v.proxyListener,n),u.splice(h,1)):r&&v.listener&&v.listener.dom7proxy&&v.listener.dom7proxy===r?(c.removeEventListener(d,v.proxyListener,n),u.splice(h,1)):r||(c.removeEventListener(d,v.proxyListener,n),u.splice(h,1))}}return this},trigger:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var a=e[0].split(" "),i=e[1],s=0;s<a.length;s+=1)for(var r=a[s],n=0;n<this.length;n+=1){var o=this[n],l=void 0;try{l=new J.CustomEvent(r,{detail:i,bubbles:!0,cancelable:!0})}catch(e){(l=f.createEvent("Event")).initEvent(r,!0,!0),l.detail=i}o.dom7EventData=e.filter(function(e,t){return 0<t}),o.dispatchEvent(l),o.dom7EventData=[],delete o.dom7EventData}return this},transitionEnd:function(t){var a,i=["webkitTransitionEnd","transitionend"],s=this;function r(e){if(e.target===this)for(t.call(this,e),a=0;a<i.length;a+=1)s.off(i[a],r)}if(t)for(a=0;a<i.length;a+=1)s.on(i[a],r);return this},outerWidth:function(e){if(0<this.length){if(e){var t=this.styles();return this[0].offsetWidth+parseFloat(t.getPropertyValue("margin-right"))+parseFloat(t.getPropertyValue("margin-left"))}return this[0].offsetWidth}return null},outerHeight:function(e){if(0<this.length){if(e){var t=this.styles();return this[0].offsetHeight+parseFloat(t.getPropertyValue("margin-top"))+parseFloat(t.getPropertyValue("margin-bottom"))}return this[0].offsetHeight}return null},offset:function(){if(0<this.length){var e=this[0],t=e.getBoundingClientRect(),a=f.body,i=e.clientTop||a.clientTop||0,s=e.clientLeft||a.clientLeft||0,r=e===J?J.scrollY:e.scrollTop,n=e===J?J.scrollX:e.scrollLeft;return{top:t.top+r-i,left:t.left+n-s}}return null},css:function(e,t){var a;if(1===arguments.length){if("string"!=typeof e){for(a=0;a<this.length;a+=1)for(var i in e)this[a].style[i]=e[i];return this}if(this[0])return J.getComputedStyle(this[0],null).getPropertyValue(e)}if(2===arguments.length&&"string"==typeof e){for(a=0;a<this.length;a+=1)this[a].style[e]=t;return this}return this},each:function(e){if(!e)return this;for(var t=0;t<this.length;t+=1)if(!1===e.call(this[t],t,this[t]))return this;return this},html:function(e){if(void 0===e)return this[0]?this[0].innerHTML:void 0;for(var t=0;t<this.length;t+=1)this[t].innerHTML=e;return this},text:function(e){if(void 0===e)return this[0]?this[0].textContent.trim():null;for(var t=0;t<this.length;t+=1)this[t].textContent=e;return this},is:function(e){var t,a,i=this[0];if(!i||void 0===e)return!1;if("string"==typeof e){if(i.matches)return i.matches(e);if(i.webkitMatchesSelector)return i.webkitMatchesSelector(e);if(i.msMatchesSelector)return i.msMatchesSelector(e);for(t=L(e),a=0;a<t.length;a+=1)if(t[a]===i)return!0;return!1}if(e===f)return i===f;if(e===J)return i===J;if(e.nodeType||e instanceof l){for(t=e.nodeType?[e]:e,a=0;a<t.length;a+=1)if(t[a]===i)return!0;return!1}return!1},index:function(){var e,t=this[0];if(t){for(e=0;null!==(t=t.previousSibling);)1===t.nodeType&&(e+=1);return e}},eq:function(e){if(void 0===e)return this;var t,a=this.length;return new l(a-1<e?[]:e<0?(t=a+e)<0?[]:[this[t]]:[this[e]])},append:function(){for(var e,t=[],a=arguments.length;a--;)t[a]=arguments[a];for(var i=0;i<t.length;i+=1){e=t[i];for(var s=0;s<this.length;s+=1)if("string"==typeof e){var r=f.createElement("div");for(r.innerHTML=e;r.firstChild;)this[s].appendChild(r.firstChild)}else if(e instanceof l)for(var n=0;n<e.length;n+=1)this[s].appendChild(e[n]);else this[s].appendChild(e)}return this},prepend:function(e){var t,a;for(t=0;t<this.length;t+=1)if("string"==typeof e){var i=f.createElement("div");for(i.innerHTML=e,a=i.childNodes.length-1;0<=a;a-=1)this[t].insertBefore(i.childNodes[a],this[t].childNodes[0])}else if(e instanceof l)for(a=0;a<e.length;a+=1)this[t].insertBefore(e[a],this[t].childNodes[0]);else this[t].insertBefore(e,this[t].childNodes[0]);return this},next:function(e){return 0<this.length?e?this[0].nextElementSibling&&L(this[0].nextElementSibling).is(e)?new l([this[0].nextElementSibling]):new l([]):this[0].nextElementSibling?new l([this[0].nextElementSibling]):new l([]):new l([])},nextAll:function(e){var t=[],a=this[0];if(!a)return new l([]);for(;a.nextElementSibling;){var i=a.nextElementSibling;e?L(i).is(e)&&t.push(i):t.push(i),a=i}return new l(t)},prev:function(e){if(0<this.length){var t=this[0];return e?t.previousElementSibling&&L(t.previousElementSibling).is(e)?new l([t.previousElementSibling]):new l([]):t.previousElementSibling?new l([t.previousElementSibling]):new l([])}return new l([])},prevAll:function(e){var t=[],a=this[0];if(!a)return new l([]);for(;a.previousElementSibling;){var i=a.previousElementSibling;e?L(i).is(e)&&t.push(i):t.push(i),a=i}return new l(t)},parent:function(e){for(var t=[],a=0;a<this.length;a+=1)null!==this[a].parentNode&&(e?L(this[a].parentNode).is(e)&&t.push(this[a].parentNode):t.push(this[a].parentNode));return L(r(t))},parents:function(e){for(var t=[],a=0;a<this.length;a+=1)for(var i=this[a].parentNode;i;)e?L(i).is(e)&&t.push(i):t.push(i),i=i.parentNode;return L(r(t))},closest:function(e){var t=this;return void 0===e?new l([]):(t.is(e)||(t=t.parents(e).eq(0)),t)},find:function(e){for(var t=[],a=0;a<this.length;a+=1)for(var i=this[a].querySelectorAll(e),s=0;s<i.length;s+=1)t.push(i[s]);return new l(t)},children:function(e){for(var t=[],a=0;a<this.length;a+=1)for(var i=this[a].childNodes,s=0;s<i.length;s+=1)e?1===i[s].nodeType&&L(i[s]).is(e)&&t.push(i[s]):1===i[s].nodeType&&t.push(i[s]);return new l(r(t))},remove:function(){for(var e=0;e<this.length;e+=1)this[e].parentNode&&this[e].parentNode.removeChild(this[e]);return this},add:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var a,i;for(a=0;a<e.length;a+=1){var s=L(e[a]);for(i=0;i<s.length;i+=1)this[this.length]=s[i],this.length+=1}return this},styles:function(){return this[0]?J.getComputedStyle(this[0],null):{}}};Object.keys(t).forEach(function(e){L.fn[e]=t[e]});var e,a,i,s,ee={deleteProps:function(e){var t=e;Object.keys(t).forEach(function(e){try{t[e]=null}catch(e){}try{delete t[e]}catch(e){}})},nextTick:function(e,t){return void 0===t&&(t=0),setTimeout(e,t)},now:function(){return Date.now()},getTranslate:function(e,t){var a,i,s;void 0===t&&(t="x");var r=J.getComputedStyle(e,null);return J.WebKitCSSMatrix?(6<(i=r.transform||r.webkitTransform).split(",").length&&(i=i.split(", ").map(function(e){return e.replace(",",".")}).join(", ")),s=new J.WebKitCSSMatrix("none"===i?"":i)):a=(s=r.MozTransform||r.OTransform||r.MsTransform||r.msTransform||r.transform||r.getPropertyValue("transform").replace("translate(","matrix(1, 0, 0, 1,")).toString().split(","),"x"===t&&(i=J.WebKitCSSMatrix?s.m41:16===a.length?parseFloat(a[12]):parseFloat(a[4])),"y"===t&&(i=J.WebKitCSSMatrix?s.m42:16===a.length?parseFloat(a[13]):parseFloat(a[5])),i||0},parseUrlQuery:function(e){var t,a,i,s,r={},n=e||J.location.href;if("string"==typeof n&&n.length)for(s=(a=(n=-1<n.indexOf("?")?n.replace(/\S*\?/,""):"").split("&").filter(function(e){return""!==e})).length,t=0;t<s;t+=1)i=a[t].replace(/#\S+/g,"").split("="),r[decodeURIComponent(i[0])]=void 0===i[1]?void 0:decodeURIComponent(i[1])||"";return r},isObject:function(e){return"object"==typeof e&&null!==e&&e.constructor&&e.constructor===Object},extend:function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];for(var a=Object(e[0]),i=1;i<e.length;i+=1){var s=e[i];if(null!=s)for(var r=Object.keys(Object(s)),n=0,o=r.length;n<o;n+=1){var l=r[n],d=Object.getOwnPropertyDescriptor(s,l);void 0!==d&&d.enumerable&&(ee.isObject(a[l])&&ee.isObject(s[l])?ee.extend(a[l],s[l]):!ee.isObject(a[l])&&ee.isObject(s[l])?(a[l]={},ee.extend(a[l],s[l])):a[l]=s[l])}}return a}},te=(i=f.createElement("div"),{touch:J.Modernizr&&!0===J.Modernizr.touch||!!(0<J.navigator.maxTouchPoints||"ontouchstart"in J||J.DocumentTouch&&f instanceof J.DocumentTouch),pointerEvents:!!(J.navigator.pointerEnabled||J.PointerEvent||"maxTouchPoints"in J.navigator&&0<J.navigator.maxTouchPoints),prefixedPointerEvents:!!J.navigator.msPointerEnabled,transition:(a=i.style,"transition"in a||"webkitTransition"in a||"MozTransition"in a),transforms3d:J.Modernizr&&!0===J.Modernizr.csstransforms3d||(e=i.style,"webkitPerspective"in e||"MozPerspective"in e||"OPerspective"in e||"MsPerspective"in e||"perspective"in e),flexbox:function(){for(var e=i.style,t="alignItems webkitAlignItems webkitBoxAlign msFlexAlign mozBoxAlign webkitFlexDirection msFlexDirection mozBoxDirection mozBoxOrient webkitBoxDirection webkitBoxOrient".split(" "),a=0;a<t.length;a+=1)if(t[a]in e)return!0;return!1}(),observer:"MutationObserver"in J||"WebkitMutationObserver"in J,passiveListener:function(){var e=!1;try{var t=Object.defineProperty({},"passive",{get:function(){e=!0}});J.addEventListener("testPassiveListener",null,t)}catch(e){}return e}(),gestures:"ongesturestart"in J}),I={isIE:!!J.navigator.userAgent.match(/Trident/g)||!!J.navigator.userAgent.match(/MSIE/g),isEdge:!!J.navigator.userAgent.match(/Edge/g),isSafari:(s=J.navigator.userAgent.toLowerCase(),0<=s.indexOf("safari")&&s.indexOf("chrome")<0&&s.indexOf("android")<0),isUiWebView:/(iPhone|iPod|iPad).*AppleWebKit(?!.*Safari)/i.test(J.navigator.userAgent)},n=function(e){void 0===e&&(e={});var t=this;t.params=e,t.eventsListeners={},t.params&&t.params.on&&Object.keys(t.params.on).forEach(function(e){t.on(e,t.params.on[e])})},o={components:{configurable:!0}};n.prototype.on=function(e,t,a){var i=this;if("function"!=typeof t)return i;var s=a?"unshift":"push";return e.split(" ").forEach(function(e){i.eventsListeners[e]||(i.eventsListeners[e]=[]),i.eventsListeners[e][s](t)}),i},n.prototype.once=function(a,i,e){var s=this;if("function"!=typeof i)return s;function r(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];i.apply(s,e),s.off(a,r),r.f7proxy&&delete r.f7proxy}return r.f7proxy=i,s.on(a,r,e)},n.prototype.off=function(e,i){var s=this;return s.eventsListeners&&e.split(" ").forEach(function(a){void 0===i?s.eventsListeners[a]=[]:s.eventsListeners[a]&&s.eventsListeners[a].length&&s.eventsListeners[a].forEach(function(e,t){(e===i||e.f7proxy&&e.f7proxy===i)&&s.eventsListeners[a].splice(t,1)})}),s},n.prototype.emit=function(){for(var e=[],t=arguments.length;t--;)e[t]=arguments[t];var a,i,s,r=this;return r.eventsListeners&&("string"==typeof e[0]||Array.isArray(e[0])?(a=e[0],i=e.slice(1,e.length),s=r):(a=e[0].events,i=e[0].data,s=e[0].context||r),(Array.isArray(a)?a:a.split(" ")).forEach(function(e){if(r.eventsListeners&&r.eventsListeners[e]){var t=[];r.eventsListeners[e].forEach(function(e){t.push(e)}),t.forEach(function(e){e.apply(s,i)})}})),r},n.prototype.useModulesParams=function(a){var i=this;i.modules&&Object.keys(i.modules).forEach(function(e){var t=i.modules[e];t.params&&ee.extend(a,t.params)})},n.prototype.useModules=function(i){void 0===i&&(i={});var s=this;s.modules&&Object.keys(s.modules).forEach(function(e){var a=s.modules[e],t=i[e]||{};a.instance&&Object.keys(a.instance).forEach(function(e){var t=a.instance[e];s[e]="function"==typeof t?t.bind(s):t}),a.on&&s.on&&Object.keys(a.on).forEach(function(e){s.on(e,a.on[e])}),a.create&&a.create.bind(s)(t)})},o.components.set=function(e){this.use&&this.use(e)},n.installModule=function(t){for(var e=[],a=arguments.length-1;0<a--;)e[a]=arguments[a+1];var i=this;i.prototype.modules||(i.prototype.modules={});var s=t.name||Object.keys(i.prototype.modules).length+"_"+ee.now();return(i.prototype.modules[s]=t).proto&&Object.keys(t.proto).forEach(function(e){i.prototype[e]=t.proto[e]}),t.static&&Object.keys(t.static).forEach(function(e){i[e]=t.static[e]}),t.install&&t.install.apply(i,e),i},n.use=function(e){for(var t=[],a=arguments.length-1;0<a--;)t[a]=arguments[a+1];var i=this;return Array.isArray(e)?(e.forEach(function(e){return i.installModule(e)}),i):i.installModule.apply(i,[e].concat(t))},Object.defineProperties(n,o);var d={updateSize:function(){var e,t,a=this,i=a.$el;e=void 0!==a.params.width?a.params.width:i[0].clientWidth,t=void 0!==a.params.height?a.params.height:i[0].clientHeight,0===e&&a.isHorizontal()||0===t&&a.isVertical()||(e=e-parseInt(i.css("padding-left"),10)-parseInt(i.css("padding-right"),10),t=t-parseInt(i.css("padding-top"),10)-parseInt(i.css("padding-bottom"),10),ee.extend(a,{width:e,height:t,size:a.isHorizontal()?e:t}))},updateSlides:function(){var e=this,t=e.params,a=e.$wrapperEl,i=e.size,s=e.rtlTranslate,r=e.wrongRTL,n=e.virtual&&t.virtual.enabled,o=n?e.virtual.slides.length:e.slides.length,l=a.children("."+e.params.slideClass),d=n?e.virtual.slides.length:l.length,p=[],c=[],u=[],h=t.slidesOffsetBefore;"function"==typeof h&&(h=t.slidesOffsetBefore.call(e));var v=t.slidesOffsetAfter;"function"==typeof v&&(v=t.slidesOffsetAfter.call(e));var f=e.snapGrid.length,m=e.snapGrid.length,g=t.spaceBetween,b=-h,w=0,y=0;if(void 0!==i){var x,T;"string"==typeof g&&0<=g.indexOf("%")&&(g=parseFloat(g.replace("%",""))/100*i),e.virtualSize=-g,s?l.css({marginLeft:"",marginTop:""}):l.css({marginRight:"",marginBottom:""}),1<t.slidesPerColumn&&(x=Math.floor(d/t.slidesPerColumn)===d/e.params.slidesPerColumn?d:Math.ceil(d/t.slidesPerColumn)*t.slidesPerColumn,"auto"!==t.slidesPerView&&"row"===t.slidesPerColumnFill&&(x=Math.max(x,t.slidesPerView*t.slidesPerColumn)));for(var E,S=t.slidesPerColumn,C=x/S,M=Math.floor(d/t.slidesPerColumn),z=0;z<d;z+=1){T=0;var P=l.eq(z);if(1<t.slidesPerColumn){var k=void 0,$=void 0,L=void 0;"column"===t.slidesPerColumnFill?(L=z-($=Math.floor(z/S))*S,(M<$||$===M&&L===S-1)&&S<=(L+=1)&&(L=0,$+=1),k=$+L*x/S,P.css({"-webkit-box-ordinal-group":k,"-moz-box-ordinal-group":k,"-ms-flex-order":k,"-webkit-order":k,order:k})):$=z-(L=Math.floor(z/C))*C,P.css("margin-"+(e.isHorizontal()?"top":"left"),0!==L&&t.spaceBetween&&t.spaceBetween+"px").attr("data-swiper-column",$).attr("data-swiper-row",L)}if("none"!==P.css("display")){if("auto"===t.slidesPerView){var I=J.getComputedStyle(P[0],null),D=P[0].style.transform,O=P[0].style.webkitTransform;if(D&&(P[0].style.transform="none"),O&&(P[0].style.webkitTransform="none"),t.roundLengths)T=e.isHorizontal()?P.outerWidth(!0):P.outerHeight(!0);else if(e.isHorizontal()){var A=parseFloat(I.getPropertyValue("width")),H=parseFloat(I.getPropertyValue("padding-left")),N=parseFloat(I.getPropertyValue("padding-right")),G=parseFloat(I.getPropertyValue("margin-left")),B=parseFloat(I.getPropertyValue("margin-right")),X=I.getPropertyValue("box-sizing");T=X&&"border-box"===X?A+G+B:A+H+N+G+B}else{var Y=parseFloat(I.getPropertyValue("height")),V=parseFloat(I.getPropertyValue("padding-top")),F=parseFloat(I.getPropertyValue("padding-bottom")),R=parseFloat(I.getPropertyValue("margin-top")),q=parseFloat(I.getPropertyValue("margin-bottom")),W=I.getPropertyValue("box-sizing");T=W&&"border-box"===W?Y+R+q:Y+V+F+R+q}D&&(P[0].style.transform=D),O&&(P[0].style.webkitTransform=O),t.roundLengths&&(T=Math.floor(T))}else T=(i-(t.slidesPerView-1)*g)/t.slidesPerView,t.roundLengths&&(T=Math.floor(T)),l[z]&&(e.isHorizontal()?l[z].style.width=T+"px":l[z].style.height=T+"px");l[z]&&(l[z].swiperSlideSize=T),u.push(T),t.centeredSlides?(b=b+T/2+w/2+g,0===w&&0!==z&&(b=b-i/2-g),0===z&&(b=b-i/2-g),Math.abs(b)<.001&&(b=0),t.roundLengths&&(b=Math.floor(b)),y%t.slidesPerGroup==0&&p.push(b),c.push(b)):(t.roundLengths&&(b=Math.floor(b)),y%t.slidesPerGroup==0&&p.push(b),c.push(b),b=b+T+g),e.virtualSize+=T+g,w=T,y+=1}}if(e.virtualSize=Math.max(e.virtualSize,i)+v,s&&r&&("slide"===t.effect||"coverflow"===t.effect)&&a.css({width:e.virtualSize+t.spaceBetween+"px"}),te.flexbox&&!t.setWrapperSize||(e.isHorizontal()?a.css({width:e.virtualSize+t.spaceBetween+"px"}):a.css({height:e.virtualSize+t.spaceBetween+"px"})),1<t.slidesPerColumn&&(e.virtualSize=(T+t.spaceBetween)*x,e.virtualSize=Math.ceil(e.virtualSize/t.slidesPerColumn)-t.spaceBetween,e.isHorizontal()?a.css({width:e.virtualSize+t.spaceBetween+"px"}):a.css({height:e.virtualSize+t.spaceBetween+"px"}),t.centeredSlides)){E=[];for(var j=0;j<p.length;j+=1){var U=p[j];t.roundLengths&&(U=Math.floor(U)),p[j]<e.virtualSize+p[0]&&E.push(U)}p=E}if(!t.centeredSlides){E=[];for(var K=0;K<p.length;K+=1){var _=p[K];t.roundLengths&&(_=Math.floor(_)),p[K]<=e.virtualSize-i&&E.push(_)}p=E,1<Math.floor(e.virtualSize-i)-Math.floor(p[p.length-1])&&p.push(e.virtualSize-i)}if(0===p.length&&(p=[0]),0!==t.spaceBetween&&(e.isHorizontal()?s?l.css({marginLeft:g+"px"}):l.css({marginRight:g+"px"}):l.css({marginBottom:g+"px"})),t.centerInsufficientSlides){var Z=0;if(u.forEach(function(e){Z+=e+(t.spaceBetween?t.spaceBetween:0)}),(Z-=t.spaceBetween)<i){var Q=(i-Z)/2;p.forEach(function(e,t){p[t]=e-Q}),c.forEach(function(e,t){c[t]=e+Q})}}ee.extend(e,{slides:l,snapGrid:p,slidesGrid:c,slidesSizesGrid:u}),d!==o&&e.emit("slidesLengthChange"),p.length!==f&&(e.params.watchOverflow&&e.checkOverflow(),e.emit("snapGridLengthChange")),c.length!==m&&e.emit("slidesGridLengthChange"),(t.watchSlidesProgress||t.watchSlidesVisibility)&&e.updateSlidesOffset()}},updateAutoHeight:function(e){var t,a=this,i=[],s=0;if("number"==typeof e?a.setTransition(e):!0===e&&a.setTransition(a.params.speed),"auto"!==a.params.slidesPerView&&1<a.params.slidesPerView)for(t=0;t<Math.ceil(a.params.slidesPerView);t+=1){var r=a.activeIndex+t;if(r>a.slides.length)break;i.push(a.slides.eq(r)[0])}else i.push(a.slides.eq(a.activeIndex)[0]);for(t=0;t<i.length;t+=1)if(void 0!==i[t]){var n=i[t].offsetHeight;s=s<n?n:s}s&&a.$wrapperEl.css("height",s+"px")},updateSlidesOffset:function(){for(var e=this.slides,t=0;t<e.length;t+=1)e[t].swiperSlideOffset=this.isHorizontal()?e[t].offsetLeft:e[t].offsetTop},updateSlidesProgress:function(e){void 0===e&&(e=this&&this.translate||0);var t=this,a=t.params,i=t.slides,s=t.rtlTranslate;if(0!==i.length){void 0===i[0].swiperSlideOffset&&t.updateSlidesOffset();var r=-e;s&&(r=e),i.removeClass(a.slideVisibleClass),t.visibleSlidesIndexes=[],t.visibleSlides=[];for(var n=0;n<i.length;n+=1){var o=i[n],l=(r+(a.centeredSlides?t.minTranslate():0)-o.swiperSlideOffset)/(o.swiperSlideSize+a.spaceBetween);if(a.watchSlidesVisibility){var d=-(r-o.swiperSlideOffset),p=d+t.slidesSizesGrid[n];(0<=d&&d<t.size||0<p&&p<=t.size||d<=0&&p>=t.size)&&(t.visibleSlides.push(o),t.visibleSlidesIndexes.push(n),i.eq(n).addClass(a.slideVisibleClass))}o.progress=s?-l:l}t.visibleSlides=L(t.visibleSlides)}},updateProgress:function(e){void 0===e&&(e=this&&this.translate||0);var t=this,a=t.params,i=t.maxTranslate()-t.minTranslate(),s=t.progress,r=t.isBeginning,n=t.isEnd,o=r,l=n;0===i?n=r=!(s=0):(r=(s=(e-t.minTranslate())/i)<=0,n=1<=s),ee.extend(t,{progress:s,isBeginning:r,isEnd:n}),(a.watchSlidesProgress||a.watchSlidesVisibility)&&t.updateSlidesProgress(e),r&&!o&&t.emit("reachBeginning toEdge"),n&&!l&&t.emit("reachEnd toEdge"),(o&&!r||l&&!n)&&t.emit("fromEdge"),t.emit("progress",s)},updateSlidesClasses:function(){var e,t=this,a=t.slides,i=t.params,s=t.$wrapperEl,r=t.activeIndex,n=t.realIndex,o=t.virtual&&i.virtual.enabled;a.removeClass(i.slideActiveClass+" "+i.slideNextClass+" "+i.slidePrevClass+" "+i.slideDuplicateActiveClass+" "+i.slideDuplicateNextClass+" "+i.slideDuplicatePrevClass),(e=o?t.$wrapperEl.find("."+i.slideClass+'[data-swiper-slide-index="'+r+'"]'):a.eq(r)).addClass(i.slideActiveClass),i.loop&&(e.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+n+'"]').addClass(i.slideDuplicateActiveClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+n+'"]').addClass(i.slideDuplicateActiveClass));var l=e.nextAll("."+i.slideClass).eq(0).addClass(i.slideNextClass);i.loop&&0===l.length&&(l=a.eq(0)).addClass(i.slideNextClass);var d=e.prevAll("."+i.slideClass).eq(0).addClass(i.slidePrevClass);i.loop&&0===d.length&&(d=a.eq(-1)).addClass(i.slidePrevClass),i.loop&&(l.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+l.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+l.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicateNextClass),d.hasClass(i.slideDuplicateClass)?s.children("."+i.slideClass+":not(."+i.slideDuplicateClass+')[data-swiper-slide-index="'+d.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass):s.children("."+i.slideClass+"."+i.slideDuplicateClass+'[data-swiper-slide-index="'+d.attr("data-swiper-slide-index")+'"]').addClass(i.slideDuplicatePrevClass))},updateActiveIndex:function(e){var t,a=this,i=a.rtlTranslate?a.translate:-a.translate,s=a.slidesGrid,r=a.snapGrid,n=a.params,o=a.activeIndex,l=a.realIndex,d=a.snapIndex,p=e;if(void 0===p){for(var c=0;c<s.length;c+=1)void 0!==s[c+1]?i>=s[c]&&i<s[c+1]-(s[c+1]-s[c])/2?p=c:i>=s[c]&&i<s[c+1]&&(p=c+1):i>=s[c]&&(p=c);n.normalizeSlideIndex&&(p<0||void 0===p)&&(p=0)}if((t=0<=r.indexOf(i)?r.indexOf(i):Math.floor(p/n.slidesPerGroup))>=r.length&&(t=r.length-1),p!==o){var u=parseInt(a.slides.eq(p).attr("data-swiper-slide-index")||p,10);ee.extend(a,{snapIndex:t,realIndex:u,previousIndex:o,activeIndex:p}),a.emit("activeIndexChange"),a.emit("snapIndexChange"),l!==u&&a.emit("realIndexChange"),a.emit("slideChange")}else t!==d&&(a.snapIndex=t,a.emit("snapIndexChange"))},updateClickedSlide:function(e){var t=this,a=t.params,i=L(e.target).closest("."+a.slideClass)[0],s=!1;if(i)for(var r=0;r<t.slides.length;r+=1)t.slides[r]===i&&(s=!0);if(!i||!s)return t.clickedSlide=void 0,void(t.clickedIndex=void 0);t.clickedSlide=i,t.virtual&&t.params.virtual.enabled?t.clickedIndex=parseInt(L(i).attr("data-swiper-slide-index"),10):t.clickedIndex=L(i).index(),a.slideToClickedSlide&&void 0!==t.clickedIndex&&t.clickedIndex!==t.activeIndex&&t.slideToClickedSlide()}};var p={getTranslate:function(e){void 0===e&&(e=this.isHorizontal()?"x":"y");var t=this.params,a=this.rtlTranslate,i=this.translate,s=this.$wrapperEl;if(t.virtualTranslate)return a?-i:i;var r=ee.getTranslate(s[0],e);return a&&(r=-r),r||0},setTranslate:function(e,t){var a=this,i=a.rtlTranslate,s=a.params,r=a.$wrapperEl,n=a.progress,o=0,l=0;a.isHorizontal()?o=i?-e:e:l=e,s.roundLengths&&(o=Math.floor(o),l=Math.floor(l)),s.virtualTranslate||(te.transforms3d?r.transform("translate3d("+o+"px, "+l+"px, 0px)"):r.transform("translate("+o+"px, "+l+"px)")),a.previousTranslate=a.translate,a.translate=a.isHorizontal()?o:l;var d=a.maxTranslate()-a.minTranslate();(0===d?0:(e-a.minTranslate())/d)!==n&&a.updateProgress(e),a.emit("setTranslate",a.translate,t)},minTranslate:function(){return-this.snapGrid[0]},maxTranslate:function(){return-this.snapGrid[this.snapGrid.length-1]}};var c={setTransition:function(e,t){this.$wrapperEl.transition(e),this.emit("setTransition",e,t)},transitionStart:function(e,t){void 0===e&&(e=!0);var a=this,i=a.activeIndex,s=a.params,r=a.previousIndex;s.autoHeight&&a.updateAutoHeight();var n=t;if(n||(n=r<i?"next":i<r?"prev":"reset"),a.emit("transitionStart"),e&&i!==r){if("reset"===n)return void a.emit("slideResetTransitionStart");a.emit("slideChangeTransitionStart"),"next"===n?a.emit("slideNextTransitionStart"):a.emit("slidePrevTransitionStart")}},transitionEnd:function(e,t){void 0===e&&(e=!0);var a=this,i=a.activeIndex,s=a.previousIndex;a.animating=!1,a.setTransition(0);var r=t;if(r||(r=s<i?"next":i<s?"prev":"reset"),a.emit("transitionEnd"),e&&i!==s){if("reset"===r)return void a.emit("slideResetTransitionEnd");a.emit("slideChangeTransitionEnd"),"next"===r?a.emit("slideNextTransitionEnd"):a.emit("slidePrevTransitionEnd")}}};var u={slideTo:function(e,t,a,i){void 0===e&&(e=0),void 0===t&&(t=this.params.speed),void 0===a&&(a=!0);var s=this,r=e;r<0&&(r=0);var n=s.params,o=s.snapGrid,l=s.slidesGrid,d=s.previousIndex,p=s.activeIndex,c=s.rtlTranslate;if(s.animating&&n.preventInteractionOnTransition)return!1;var u=Math.floor(r/n.slidesPerGroup);u>=o.length&&(u=o.length-1),(p||n.initialSlide||0)===(d||0)&&a&&s.emit("beforeSlideChangeStart");var h,v=-o[u];if(s.updateProgress(v),n.normalizeSlideIndex)for(var f=0;f<l.length;f+=1)-Math.floor(100*v)>=Math.floor(100*l[f])&&(r=f);if(s.initialized&&r!==p){if(!s.allowSlideNext&&v<s.translate&&v<s.minTranslate())return!1;if(!s.allowSlidePrev&&v>s.translate&&v>s.maxTranslate()&&(p||0)!==r)return!1}return h=p<r?"next":r<p?"prev":"reset",c&&-v===s.translate||!c&&v===s.translate?(s.updateActiveIndex(r),n.autoHeight&&s.updateAutoHeight(),s.updateSlidesClasses(),"slide"!==n.effect&&s.setTranslate(v),"reset"!==h&&(s.transitionStart(a,h),s.transitionEnd(a,h)),!1):(0!==t&&te.transition?(s.setTransition(t),s.setTranslate(v),s.updateActiveIndex(r),s.updateSlidesClasses(),s.emit("beforeTransitionStart",t,i),s.transitionStart(a,h),s.animating||(s.animating=!0,s.onSlideToWrapperTransitionEnd||(s.onSlideToWrapperTransitionEnd=function(e){s&&!s.destroyed&&e.target===this&&(s.$wrapperEl[0].removeEventListener("transitionend",s.onSlideToWrapperTransitionEnd),s.$wrapperEl[0].removeEventListener("webkitTransitionEnd",s.onSlideToWrapperTransitionEnd),s.onSlideToWrapperTransitionEnd=null,delete s.onSlideToWrapperTransitionEnd,s.transitionEnd(a,h))}),s.$wrapperEl[0].addEventListener("transitionend",s.onSlideToWrapperTransitionEnd),s.$wrapperEl[0].addEventListener("webkitTransitionEnd",s.onSlideToWrapperTransitionEnd))):(s.setTransition(0),s.setTranslate(v),s.updateActiveIndex(r),s.updateSlidesClasses(),s.emit("beforeTransitionStart",t,i),s.transitionStart(a,h),s.transitionEnd(a,h)),!0)},slideToLoop:function(e,t,a,i){void 0===e&&(e=0),void 0===t&&(t=this.params.speed),void 0===a&&(a=!0);var s=e;return this.params.loop&&(s+=this.loopedSlides),this.slideTo(s,t,a,i)},slideNext:function(e,t,a){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0);var i=this,s=i.params,r=i.animating;return s.loop?!r&&(i.loopFix(),i._clientLeft=i.$wrapperEl[0].clientLeft,i.slideTo(i.activeIndex+s.slidesPerGroup,e,t,a)):i.slideTo(i.activeIndex+s.slidesPerGroup,e,t,a)},slidePrev:function(e,t,a){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0);var i=this,s=i.params,r=i.animating,n=i.snapGrid,o=i.slidesGrid,l=i.rtlTranslate;if(s.loop){if(r)return!1;i.loopFix(),i._clientLeft=i.$wrapperEl[0].clientLeft}function d(e){return e<0?-Math.floor(Math.abs(e)):Math.floor(e)}var p,c=d(l?i.translate:-i.translate),u=n.map(function(e){return d(e)}),h=(o.map(function(e){return d(e)}),n[u.indexOf(c)],n[u.indexOf(c)-1]);return void 0!==h&&(p=o.indexOf(h))<0&&(p=i.activeIndex-1),i.slideTo(p,e,t,a)},slideReset:function(e,t,a){return void 0===e&&(e=this.params.speed),void 0===t&&(t=!0),this.slideTo(this.activeIndex,e,t,a)},slideToClosest:function(e,t,a){void 0===e&&(e=this.params.speed),void 0===t&&(t=!0);var i=this,s=i.activeIndex,r=Math.floor(s/i.params.slidesPerGroup);if(r<i.snapGrid.length-1){var n=i.rtlTranslate?i.translate:-i.translate,o=i.snapGrid[r];(i.snapGrid[r+1]-o)/2<n-o&&(s=i.params.slidesPerGroup)}return i.slideTo(s,e,t,a)},slideToClickedSlide:function(){var e,t=this,a=t.params,i=t.$wrapperEl,s="auto"===a.slidesPerView?t.slidesPerViewDynamic():a.slidesPerView,r=t.clickedIndex;if(a.loop){if(t.animating)return;e=parseInt(L(t.clickedSlide).attr("data-swiper-slide-index"),10),a.centeredSlides?r<t.loopedSlides-s/2||r>t.slides.length-t.loopedSlides+s/2?(t.loopFix(),r=i.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+a.slideDuplicateClass+")").eq(0).index(),ee.nextTick(function(){t.slideTo(r)})):t.slideTo(r):r>t.slides.length-s?(t.loopFix(),r=i.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]:not(.'+a.slideDuplicateClass+")").eq(0).index(),ee.nextTick(function(){t.slideTo(r)})):t.slideTo(r)}else t.slideTo(r)}};var h={loopCreate:function(){var i=this,e=i.params,t=i.$wrapperEl;t.children("."+e.slideClass+"."+e.slideDuplicateClass).remove();var s=t.children("."+e.slideClass);if(e.loopFillGroupWithBlank){var a=e.slidesPerGroup-s.length%e.slidesPerGroup;if(a!==e.slidesPerGroup){for(var r=0;r<a;r+=1){var n=L(f.createElement("div")).addClass(e.slideClass+" "+e.slideBlankClass);t.append(n)}s=t.children("."+e.slideClass)}}"auto"!==e.slidesPerView||e.loopedSlides||(e.loopedSlides=s.length),i.loopedSlides=parseInt(e.loopedSlides||e.slidesPerView,10),i.loopedSlides+=e.loopAdditionalSlides,i.loopedSlides>s.length&&(i.loopedSlides=s.length);var o=[],l=[];s.each(function(e,t){var a=L(t);e<i.loopedSlides&&l.push(t),e<s.length&&e>=s.length-i.loopedSlides&&o.push(t),a.attr("data-swiper-slide-index",e)});for(var d=0;d<l.length;d+=1)t.append(L(l[d].cloneNode(!0)).addClass(e.slideDuplicateClass));for(var p=o.length-1;0<=p;p-=1)t.prepend(L(o[p].cloneNode(!0)).addClass(e.slideDuplicateClass))},loopFix:function(){var e,t=this,a=t.params,i=t.activeIndex,s=t.slides,r=t.loopedSlides,n=t.allowSlidePrev,o=t.allowSlideNext,l=t.snapGrid,d=t.rtlTranslate;t.allowSlidePrev=!0,t.allowSlideNext=!0;var p=-l[i]-t.getTranslate();i<r?(e=s.length-3*r+i,e+=r,t.slideTo(e,0,!1,!0)&&0!==p&&t.setTranslate((d?-t.translate:t.translate)-p)):("auto"===a.slidesPerView&&2*r<=i||i>=s.length-r)&&(e=-s.length+i+r,e+=r,t.slideTo(e,0,!1,!0)&&0!==p&&t.setTranslate((d?-t.translate:t.translate)-p));t.allowSlidePrev=n,t.allowSlideNext=o},loopDestroy:function(){var e=this.$wrapperEl,t=this.params,a=this.slides;e.children("."+t.slideClass+"."+t.slideDuplicateClass+",."+t.slideClass+"."+t.slideBlankClass).remove(),a.removeAttr("data-swiper-slide-index")}};var v={setGrabCursor:function(e){if(!(te.touch||!this.params.simulateTouch||this.params.watchOverflow&&this.isLocked)){var t=this.el;t.style.cursor="move",t.style.cursor=e?"-webkit-grabbing":"-webkit-grab",t.style.cursor=e?"-moz-grabbin":"-moz-grab",t.style.cursor=e?"grabbing":"grab"}},unsetGrabCursor:function(){te.touch||this.params.watchOverflow&&this.isLocked||(this.el.style.cursor="")}};var m={appendSlide:function(e){var t=this,a=t.$wrapperEl,i=t.params;if(i.loop&&t.loopDestroy(),"object"==typeof e&&"length"in e)for(var s=0;s<e.length;s+=1)e[s]&&a.append(e[s]);else a.append(e);i.loop&&t.loopCreate(),i.observer&&te.observer||t.update()},prependSlide:function(e){var t=this,a=t.params,i=t.$wrapperEl,s=t.activeIndex;a.loop&&t.loopDestroy();var r=s+1;if("object"==typeof e&&"length"in e){for(var n=0;n<e.length;n+=1)e[n]&&i.prepend(e[n]);r=s+e.length}else i.prepend(e);a.loop&&t.loopCreate(),a.observer&&te.observer||t.update(),t.slideTo(r,0,!1)},addSlide:function(e,t){var a=this,i=a.$wrapperEl,s=a.params,r=a.activeIndex;s.loop&&(r-=a.loopedSlides,a.loopDestroy(),a.slides=i.children("."+s.slideClass));var n=a.slides.length;if(e<=0)a.prependSlide(t);else if(n<=e)a.appendSlide(t);else{for(var o=e<r?r+1:r,l=[],d=n-1;e<=d;d-=1){var p=a.slides.eq(d);p.remove(),l.unshift(p)}if("object"==typeof t&&"length"in t){for(var c=0;c<t.length;c+=1)t[c]&&i.append(t[c]);o=e<r?r+t.length:r}else i.append(t);for(var u=0;u<l.length;u+=1)i.append(l[u]);s.loop&&a.loopCreate(),s.observer&&te.observer||a.update(),s.loop?a.slideTo(o+a.loopedSlides,0,!1):a.slideTo(o,0,!1)}},removeSlide:function(e){var t=this,a=t.params,i=t.$wrapperEl,s=t.activeIndex;a.loop&&(s-=t.loopedSlides,t.loopDestroy(),t.slides=i.children("."+a.slideClass));var r,n=s;if("object"==typeof e&&"length"in e){for(var o=0;o<e.length;o+=1)r=e[o],t.slides[r]&&t.slides.eq(r).remove(),r<n&&(n-=1);n=Math.max(n,0)}else r=e,t.slides[r]&&t.slides.eq(r).remove(),r<n&&(n-=1),n=Math.max(n,0);a.loop&&t.loopCreate(),a.observer&&te.observer||t.update(),a.loop?t.slideTo(n+t.loopedSlides,0,!1):t.slideTo(n,0,!1)},removeAllSlides:function(){for(var e=[],t=0;t<this.slides.length;t+=1)e.push(t);this.removeSlide(e)}},g=function(){var e=J.navigator.userAgent,t={ios:!1,android:!1,androidChrome:!1,desktop:!1,windows:!1,iphone:!1,ipod:!1,ipad:!1,cordova:J.cordova||J.phonegap,phonegap:J.cordova||J.phonegap},a=e.match(/(Windows Phone);?[\s\/]+([\d.]+)?/),i=e.match(/(Android);?[\s\/]+([\d.]+)?/),s=e.match(/(iPad).*OS\s([\d_]+)/),r=e.match(/(iPod)(.*OS\s([\d_]+))?/),n=!s&&e.match(/(iPhone\sOS|iOS)\s([\d_]+)/);if(a&&(t.os="windows",t.osVersion=a[2],t.windows=!0),i&&!a&&(t.os="android",t.osVersion=i[2],t.android=!0,t.androidChrome=0<=e.toLowerCase().indexOf("chrome")),(s||n||r)&&(t.os="ios",t.ios=!0),n&&!r&&(t.osVersion=n[2].replace(/_/g,"."),t.iphone=!0),s&&(t.osVersion=s[2].replace(/_/g,"."),t.ipad=!0),r&&(t.osVersion=r[3]?r[3].replace(/_/g,"."):null,t.iphone=!0),t.ios&&t.osVersion&&0<=e.indexOf("Version/")&&"10"===t.osVersion.split(".")[0]&&(t.osVersion=e.toLowerCase().split("version/")[1].split(" ")[0]),t.desktop=!(t.os||t.android||t.webView),t.webView=(n||s||r)&&e.match(/.*AppleWebKit(?!.*Safari)/i),t.os&&"ios"===t.os){var o=t.osVersion.split("."),l=f.querySelector('meta[name="viewport"]');t.minimalUi=!t.webView&&(r||n)&&(1*o[0]==7?1<=1*o[1]:7<1*o[0])&&l&&0<=l.getAttribute("content").indexOf("minimal-ui")}return t.pixelRatio=J.devicePixelRatio||1,t}();function b(){var e=this,t=e.params,a=e.el;if(!a||0!==a.offsetWidth){t.breakpoints&&e.setBreakpoint();var i=e.allowSlideNext,s=e.allowSlidePrev,r=e.snapGrid;if(e.allowSlideNext=!0,e.allowSlidePrev=!0,e.updateSize(),e.updateSlides(),t.freeMode){var n=Math.min(Math.max(e.translate,e.maxTranslate()),e.minTranslate());e.setTranslate(n),e.updateActiveIndex(),e.updateSlidesClasses(),t.autoHeight&&e.updateAutoHeight()}else e.updateSlidesClasses(),("auto"===t.slidesPerView||1<t.slidesPerView)&&e.isEnd&&!e.params.centeredSlides?e.slideTo(e.slides.length-1,0,!1,!0):e.slideTo(e.activeIndex,0,!1,!0);e.allowSlidePrev=s,e.allowSlideNext=i,e.params.watchOverflow&&r!==e.snapGrid&&e.checkOverflow()}}var w={init:!0,direction:"horizontal",touchEventsTarget:"container",initialSlide:0,speed:300,preventInteractionOnTransition:!1,edgeSwipeDetection:!1,edgeSwipeThreshold:20,freeMode:!1,freeModeMomentum:!0,freeModeMomentumRatio:1,freeModeMomentumBounce:!0,freeModeMomentumBounceRatio:1,freeModeMomentumVelocityRatio:1,freeModeSticky:!1,freeModeMinimumVelocity:.02,autoHeight:!1,setWrapperSize:!1,virtualTranslate:!1,effect:"slide",breakpoints:void 0,breakpointsInverse:!1,spaceBetween:0,slidesPerView:1,slidesPerColumn:1,slidesPerColumnFill:"column",slidesPerGroup:1,centeredSlides:!1,slidesOffsetBefore:0,slidesOffsetAfter:0,normalizeSlideIndex:!0,centerInsufficientSlides:!1,watchOverflow:!1,roundLengths:!1,touchRatio:1,touchAngle:45,simulateTouch:!0,shortSwipes:!0,longSwipes:!0,longSwipesRatio:.5,longSwipesMs:300,followFinger:!0,allowTouchMove:!0,threshold:0,touchMoveStopPropagation:!0,touchStartPreventDefault:!0,touchStartForcePreventDefault:!1,touchReleaseOnEdges:!1,uniqueNavElements:!0,resistance:!0,resistanceRatio:.85,watchSlidesProgress:!1,watchSlidesVisibility:!1,grabCursor:!1,preventClicks:!0,preventClicksPropagation:!0,slideToClickedSlide:!1,preloadImages:!0,updateOnImagesReady:!0,loop:!1,loopAdditionalSlides:0,loopedSlides:null,loopFillGroupWithBlank:!1,allowSlidePrev:!0,allowSlideNext:!0,swipeHandler:null,noSwiping:!0,noSwipingClass:"swiper-no-swiping",noSwipingSelector:null,passiveListeners:!0,containerModifierClass:"swiper-container-",slideClass:"swiper-slide",slideBlankClass:"swiper-slide-invisible-blank",slideActiveClass:"swiper-slide-active",slideDuplicateActiveClass:"swiper-slide-duplicate-active",slideVisibleClass:"swiper-slide-visible",slideDuplicateClass:"swiper-slide-duplicate",slideNextClass:"swiper-slide-next",slideDuplicateNextClass:"swiper-slide-duplicate-next",slidePrevClass:"swiper-slide-prev",slideDuplicatePrevClass:"swiper-slide-duplicate-prev",wrapperClass:"swiper-wrapper",runCallbacksOnInit:!0},y={update:d,translate:p,transition:c,slide:u,loop:h,grabCursor:v,manipulation:m,events:{attachEvents:function(){var e=this,t=e.params,a=e.touchEvents,i=e.el,s=e.wrapperEl;e.onTouchStart=function(e){var t=this,a=t.touchEventsData,i=t.params,s=t.touches;if(!t.animating||!i.preventInteractionOnTransition){var r=e;if(r.originalEvent&&(r=r.originalEvent),a.isTouchEvent="touchstart"===r.type,(a.isTouchEvent||!("which"in r)||3!==r.which)&&!(!a.isTouchEvent&&"button"in r&&0<r.button||a.isTouched&&a.isMoved))if(i.noSwiping&&L(r.target).closest(i.noSwipingSelector?i.noSwipingSelector:"."+i.noSwipingClass)[0])t.allowClick=!0;else if(!i.swipeHandler||L(r).closest(i.swipeHandler)[0]){s.currentX="touchstart"===r.type?r.targetTouches[0].pageX:r.pageX,s.currentY="touchstart"===r.type?r.targetTouches[0].pageY:r.pageY;var n=s.currentX,o=s.currentY,l=i.edgeSwipeDetection||i.iOSEdgeSwipeDetection,d=i.edgeSwipeThreshold||i.iOSEdgeSwipeThreshold;if(!l||!(n<=d||n>=J.screen.width-d)){if(ee.extend(a,{isTouched:!0,isMoved:!1,allowTouchCallbacks:!0,isScrolling:void 0,startMoving:void 0}),s.startX=n,s.startY=o,a.touchStartTime=ee.now(),t.allowClick=!0,t.updateSize(),t.swipeDirection=void 0,0<i.threshold&&(a.allowThresholdMove=!1),"touchstart"!==r.type){var p=!0;L(r.target).is(a.formElements)&&(p=!1),f.activeElement&&L(f.activeElement).is(a.formElements)&&f.activeElement!==r.target&&f.activeElement.blur();var c=p&&t.allowTouchMove&&i.touchStartPreventDefault;(i.touchStartForcePreventDefault||c)&&r.preventDefault()}t.emit("touchStart",r)}}}}.bind(e),e.onTouchMove=function(e){var t=this,a=t.touchEventsData,i=t.params,s=t.touches,r=t.rtlTranslate,n=e;if(n.originalEvent&&(n=n.originalEvent),a.isTouched){if(!a.isTouchEvent||"mousemove"!==n.type){var o="touchmove"===n.type?n.targetTouches[0].pageX:n.pageX,l="touchmove"===n.type?n.targetTouches[0].pageY:n.pageY;if(n.preventedByNestedSwiper)return s.startX=o,void(s.startY=l);if(!t.allowTouchMove)return t.allowClick=!1,void(a.isTouched&&(ee.extend(s,{startX:o,startY:l,currentX:o,currentY:l}),a.touchStartTime=ee.now()));if(a.isTouchEvent&&i.touchReleaseOnEdges&&!i.loop)if(t.isVertical()){if(l<s.startY&&t.translate<=t.maxTranslate()||l>s.startY&&t.translate>=t.minTranslate())return a.isTouched=!1,void(a.isMoved=!1)}else if(o<s.startX&&t.translate<=t.maxTranslate()||o>s.startX&&t.translate>=t.minTranslate())return;if(a.isTouchEvent&&f.activeElement&&n.target===f.activeElement&&L(n.target).is(a.formElements))return a.isMoved=!0,void(t.allowClick=!1);if(a.allowTouchCallbacks&&t.emit("touchMove",n),!(n.targetTouches&&1<n.targetTouches.length)){s.currentX=o,s.currentY=l;var d,p=s.currentX-s.startX,c=s.currentY-s.startY;if(!(t.params.threshold&&Math.sqrt(Math.pow(p,2)+Math.pow(c,2))<t.params.threshold))if(void 0===a.isScrolling&&(t.isHorizontal()&&s.currentY===s.startY||t.isVertical()&&s.currentX===s.startX?a.isScrolling=!1:25<=p*p+c*c&&(d=180*Math.atan2(Math.abs(c),Math.abs(p))/Math.PI,a.isScrolling=t.isHorizontal()?d>i.touchAngle:90-d>i.touchAngle)),a.isScrolling&&t.emit("touchMoveOpposite",n),void 0===a.startMoving&&(s.currentX===s.startX&&s.currentY===s.startY||(a.startMoving=!0)),a.isScrolling)a.isTouched=!1;else if(a.startMoving){t.allowClick=!1,n.preventDefault(),i.touchMoveStopPropagation&&!i.nested&&n.stopPropagation(),a.isMoved||(i.loop&&t.loopFix(),a.startTranslate=t.getTranslate(),t.setTransition(0),t.animating&&t.$wrapperEl.trigger("webkitTransitionEnd transitionend"),a.allowMomentumBounce=!1,!i.grabCursor||!0!==t.allowSlideNext&&!0!==t.allowSlidePrev||t.setGrabCursor(!0),t.emit("sliderFirstMove",n)),t.emit("sliderMove",n),a.isMoved=!0;var u=t.isHorizontal()?p:c;s.diff=u,u*=i.touchRatio,r&&(u=-u),t.swipeDirection=0<u?"prev":"next",a.currentTranslate=u+a.startTranslate;var h=!0,v=i.resistanceRatio;if(i.touchReleaseOnEdges&&(v=0),0<u&&a.currentTranslate>t.minTranslate()?(h=!1,i.resistance&&(a.currentTranslate=t.minTranslate()-1+Math.pow(-t.minTranslate()+a.startTranslate+u,v))):u<0&&a.currentTranslate<t.maxTranslate()&&(h=!1,i.resistance&&(a.currentTranslate=t.maxTranslate()+1-Math.pow(t.maxTranslate()-a.startTranslate-u,v))),h&&(n.preventedByNestedSwiper=!0),!t.allowSlideNext&&"next"===t.swipeDirection&&a.currentTranslate<a.startTranslate&&(a.currentTranslate=a.startTranslate),!t.allowSlidePrev&&"prev"===t.swipeDirection&&a.currentTranslate>a.startTranslate&&(a.currentTranslate=a.startTranslate),0<i.threshold){if(!(Math.abs(u)>i.threshold||a.allowThresholdMove))return void(a.currentTranslate=a.startTranslate);if(!a.allowThresholdMove)return a.allowThresholdMove=!0,s.startX=s.currentX,s.startY=s.currentY,a.currentTranslate=a.startTranslate,void(s.diff=t.isHorizontal()?s.currentX-s.startX:s.currentY-s.startY)}i.followFinger&&((i.freeMode||i.watchSlidesProgress||i.watchSlidesVisibility)&&(t.updateActiveIndex(),t.updateSlidesClasses()),i.freeMode&&(0===a.velocities.length&&a.velocities.push({position:s[t.isHorizontal()?"startX":"startY"],time:a.touchStartTime}),a.velocities.push({position:s[t.isHorizontal()?"currentX":"currentY"],time:ee.now()})),t.updateProgress(a.currentTranslate),t.setTranslate(a.currentTranslate))}}}}else a.startMoving&&a.isScrolling&&t.emit("touchMoveOpposite",n)}.bind(e),e.onTouchEnd=function(e){var t=this,a=t.touchEventsData,i=t.params,s=t.touches,r=t.rtlTranslate,n=t.$wrapperEl,o=t.slidesGrid,l=t.snapGrid,d=e;if(d.originalEvent&&(d=d.originalEvent),a.allowTouchCallbacks&&t.emit("touchEnd",d),a.allowTouchCallbacks=!1,!a.isTouched)return a.isMoved&&i.grabCursor&&t.setGrabCursor(!1),a.isMoved=!1,void(a.startMoving=!1);i.grabCursor&&a.isMoved&&a.isTouched&&(!0===t.allowSlideNext||!0===t.allowSlidePrev)&&t.setGrabCursor(!1);var p,c=ee.now(),u=c-a.touchStartTime;if(t.allowClick&&(t.updateClickedSlide(d),t.emit("tap",d),u<300&&300<c-a.lastClickTime&&(a.clickTimeout&&clearTimeout(a.clickTimeout),a.clickTimeout=ee.nextTick(function(){t&&!t.destroyed&&t.emit("click",d)},300)),u<300&&c-a.lastClickTime<300&&(a.clickTimeout&&clearTimeout(a.clickTimeout),t.emit("doubleTap",d))),a.lastClickTime=ee.now(),ee.nextTick(function(){t.destroyed||(t.allowClick=!0)}),!a.isTouched||!a.isMoved||!t.swipeDirection||0===s.diff||a.currentTranslate===a.startTranslate)return a.isTouched=!1,a.isMoved=!1,void(a.startMoving=!1);if(a.isTouched=!1,a.isMoved=!1,a.startMoving=!1,p=i.followFinger?r?t.translate:-t.translate:-a.currentTranslate,i.freeMode){if(p<-t.minTranslate())return void t.slideTo(t.activeIndex);if(p>-t.maxTranslate())return void(t.slides.length<l.length?t.slideTo(l.length-1):t.slideTo(t.slides.length-1));if(i.freeModeMomentum){if(1<a.velocities.length){var h=a.velocities.pop(),v=a.velocities.pop(),f=h.position-v.position,m=h.time-v.time;t.velocity=f/m,t.velocity/=2,Math.abs(t.velocity)<i.freeModeMinimumVelocity&&(t.velocity=0),(150<m||300<ee.now()-h.time)&&(t.velocity=0)}else t.velocity=0;t.velocity*=i.freeModeMomentumVelocityRatio,a.velocities.length=0;var g=1e3*i.freeModeMomentumRatio,b=t.velocity*g,w=t.translate+b;r&&(w=-w);var y,x,T=!1,E=20*Math.abs(t.velocity)*i.freeModeMomentumBounceRatio;if(w<t.maxTranslate())i.freeModeMomentumBounce?(w+t.maxTranslate()<-E&&(w=t.maxTranslate()-E),y=t.maxTranslate(),T=!0,a.allowMomentumBounce=!0):w=t.maxTranslate(),i.loop&&i.centeredSlides&&(x=!0);else if(w>t.minTranslate())i.freeModeMomentumBounce?(w-t.minTranslate()>E&&(w=t.minTranslate()+E),y=t.minTranslate(),T=!0,a.allowMomentumBounce=!0):w=t.minTranslate(),i.loop&&i.centeredSlides&&(x=!0);else if(i.freeModeSticky){for(var S,C=0;C<l.length;C+=1)if(l[C]>-w){S=C;break}w=-(w=Math.abs(l[S]-w)<Math.abs(l[S-1]-w)||"next"===t.swipeDirection?l[S]:l[S-1])}if(x&&t.once("transitionEnd",function(){t.loopFix()}),0!==t.velocity)g=r?Math.abs((-w-t.translate)/t.velocity):Math.abs((w-t.translate)/t.velocity);else if(i.freeModeSticky)return void t.slideToClosest();i.freeModeMomentumBounce&&T?(t.updateProgress(y),t.setTransition(g),t.setTranslate(w),t.transitionStart(!0,t.swipeDirection),t.animating=!0,n.transitionEnd(function(){t&&!t.destroyed&&a.allowMomentumBounce&&(t.emit("momentumBounce"),t.setTransition(i.speed),t.setTranslate(y),n.transitionEnd(function(){t&&!t.destroyed&&t.transitionEnd()}))})):t.velocity?(t.updateProgress(w),t.setTransition(g),t.setTranslate(w),t.transitionStart(!0,t.swipeDirection),t.animating||(t.animating=!0,n.transitionEnd(function(){t&&!t.destroyed&&t.transitionEnd()}))):t.updateProgress(w),t.updateActiveIndex(),t.updateSlidesClasses()}else if(i.freeModeSticky)return void t.slideToClosest();(!i.freeModeMomentum||u>=i.longSwipesMs)&&(t.updateProgress(),t.updateActiveIndex(),t.updateSlidesClasses())}else{for(var M=0,z=t.slidesSizesGrid[0],P=0;P<o.length;P+=i.slidesPerGroup)void 0!==o[P+i.slidesPerGroup]?p>=o[P]&&p<o[P+i.slidesPerGroup]&&(z=o[(M=P)+i.slidesPerGroup]-o[P]):p>=o[P]&&(M=P,z=o[o.length-1]-o[o.length-2]);var k=(p-o[M])/z;if(u>i.longSwipesMs){if(!i.longSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&(k>=i.longSwipesRatio?t.slideTo(M+i.slidesPerGroup):t.slideTo(M)),"prev"===t.swipeDirection&&(k>1-i.longSwipesRatio?t.slideTo(M+i.slidesPerGroup):t.slideTo(M))}else{if(!i.shortSwipes)return void t.slideTo(t.activeIndex);"next"===t.swipeDirection&&t.slideTo(M+i.slidesPerGroup),"prev"===t.swipeDirection&&t.slideTo(M)}}}.bind(e),e.onClick=function(e){this.allowClick||(this.params.preventClicks&&e.preventDefault(),this.params.preventClicksPropagation&&this.animating&&(e.stopPropagation(),e.stopImmediatePropagation()))}.bind(e);var r="container"===t.touchEventsTarget?i:s,n=!!t.nested;if(te.touch||!te.pointerEvents&&!te.prefixedPointerEvents){if(te.touch){var o=!("touchstart"!==a.start||!te.passiveListener||!t.passiveListeners)&&{passive:!0,capture:!1};r.addEventListener(a.start,e.onTouchStart,o),r.addEventListener(a.move,e.onTouchMove,te.passiveListener?{passive:!1,capture:n}:n),r.addEventListener(a.end,e.onTouchEnd,o)}(t.simulateTouch&&!g.ios&&!g.android||t.simulateTouch&&!te.touch&&g.ios)&&(r.addEventListener("mousedown",e.onTouchStart,!1),f.addEventListener("mousemove",e.onTouchMove,n),f.addEventListener("mouseup",e.onTouchEnd,!1))}else r.addEventListener(a.start,e.onTouchStart,!1),f.addEventListener(a.move,e.onTouchMove,n),f.addEventListener(a.end,e.onTouchEnd,!1);(t.preventClicks||t.preventClicksPropagation)&&r.addEventListener("click",e.onClick,!0),e.on(g.ios||g.android?"resize orientationchange observerUpdate":"resize observerUpdate",b,!0)},detachEvents:function(){var e=this,t=e.params,a=e.touchEvents,i=e.el,s=e.wrapperEl,r="container"===t.touchEventsTarget?i:s,n=!!t.nested;if(te.touch||!te.pointerEvents&&!te.prefixedPointerEvents){if(te.touch){var o=!("onTouchStart"!==a.start||!te.passiveListener||!t.passiveListeners)&&{passive:!0,capture:!1};r.removeEventListener(a.start,e.onTouchStart,o),r.removeEventListener(a.move,e.onTouchMove,n),r.removeEventListener(a.end,e.onTouchEnd,o)}(t.simulateTouch&&!g.ios&&!g.android||t.simulateTouch&&!te.touch&&g.ios)&&(r.removeEventListener("mousedown",e.onTouchStart,!1),f.removeEventListener("mousemove",e.onTouchMove,n),f.removeEventListener("mouseup",e.onTouchEnd,!1))}else r.removeEventListener(a.start,e.onTouchStart,!1),f.removeEventListener(a.move,e.onTouchMove,n),f.removeEventListener(a.end,e.onTouchEnd,!1);(t.preventClicks||t.preventClicksPropagation)&&r.removeEventListener("click",e.onClick,!0),e.off(g.ios||g.android?"resize orientationchange observerUpdate":"resize observerUpdate",b)}},breakpoints:{setBreakpoint:function(){var e=this,t=e.activeIndex,a=e.initialized,i=e.loopedSlides;void 0===i&&(i=0);var s=e.params,r=s.breakpoints;if(r&&(!r||0!==Object.keys(r).length)){var n=e.getBreakpoint(r);if(n&&e.currentBreakpoint!==n){var o=n in r?r[n]:void 0;o&&["slidesPerView","spaceBetween","slidesPerGroup"].forEach(function(e){var t=o[e];void 0!==t&&(o[e]="slidesPerView"!==e||"AUTO"!==t&&"auto"!==t?"slidesPerView"===e?parseFloat(t):parseInt(t,10):"auto")});var l=o||e.originalParams,d=l.direction&&l.direction!==s.direction,p=s.loop&&(l.slidesPerView!==s.slidesPerView||d);d&&a&&e.changeDirection(),ee.extend(e.params,l),ee.extend(e,{allowTouchMove:e.params.allowTouchMove,allowSlideNext:e.params.allowSlideNext,allowSlidePrev:e.params.allowSlidePrev}),e.currentBreakpoint=n,p&&a&&(e.loopDestroy(),e.loopCreate(),e.updateSlides(),e.slideTo(t-i+e.loopedSlides,0,!1)),e.emit("breakpoint",l)}}},getBreakpoint:function(e){if(e){var t=!1,a=[];Object.keys(e).forEach(function(e){a.push(e)}),a.sort(function(e,t){return parseInt(e,10)-parseInt(t,10)});for(var i=0;i<a.length;i+=1){var s=a[i];this.params.breakpointsInverse?s<=J.innerWidth&&(t=s):s>=J.innerWidth&&!t&&(t=s)}return t||"max"}}},checkOverflow:{checkOverflow:function(){var e=this,t=e.isLocked;e.isLocked=1===e.snapGrid.length,e.allowSlideNext=!e.isLocked,e.allowSlidePrev=!e.isLocked,t!==e.isLocked&&e.emit(e.isLocked?"lock":"unlock"),t&&t!==e.isLocked&&(e.isEnd=!1,e.navigation.update())}},classes:{addClasses:function(){var t=this.classNames,a=this.params,e=this.rtl,i=this.$el,s=[];s.push("initialized"),s.push(a.direction),a.freeMode&&s.push("free-mode"),te.flexbox||s.push("no-flexbox"),a.autoHeight&&s.push("autoheight"),e&&s.push("rtl"),1<a.slidesPerColumn&&s.push("multirow"),g.android&&s.push("android"),g.ios&&s.push("ios"),(I.isIE||I.isEdge)&&(te.pointerEvents||te.prefixedPointerEvents)&&s.push("wp8-"+a.direction),s.forEach(function(e){t.push(a.containerModifierClass+e)}),i.addClass(t.join(" "))},removeClasses:function(){var e=this.$el,t=this.classNames;e.removeClass(t.join(" "))}},images:{loadImage:function(e,t,a,i,s,r){var n;function o(){r&&r()}e.complete&&s?o():t?((n=new J.Image).onload=o,n.onerror=o,i&&(n.sizes=i),a&&(n.srcset=a),t&&(n.src=t)):o()},preloadImages:function(){var e=this;function t(){null!=e&&e&&!e.destroyed&&(void 0!==e.imagesLoaded&&(e.imagesLoaded+=1),e.imagesLoaded===e.imagesToLoad.length&&(e.params.updateOnImagesReady&&e.update(),e.emit("imagesReady")))}e.imagesToLoad=e.$el.find("img");for(var a=0;a<e.imagesToLoad.length;a+=1){var i=e.imagesToLoad[a];e.loadImage(i,i.currentSrc||i.getAttribute("src"),i.srcset||i.getAttribute("srcset"),i.sizes||i.getAttribute("sizes"),!0,t)}}}},x={},T=function(u){function h(){for(var e,t,s,a=[],i=arguments.length;i--;)a[i]=arguments[i];1===a.length&&a[0].constructor&&a[0].constructor===Object?s=a[0]:(t=(e=a)[0],s=e[1]),s||(s={}),s=ee.extend({},s),t&&!s.el&&(s.el=t),u.call(this,s),Object.keys(y).forEach(function(t){Object.keys(y[t]).forEach(function(e){h.prototype[e]||(h.prototype[e]=y[t][e])})});var r=this;void 0===r.modules&&(r.modules={}),Object.keys(r.modules).forEach(function(e){var t=r.modules[e];if(t.params){var a=Object.keys(t.params)[0],i=t.params[a];if("object"!=typeof i||null===i)return;if(!(a in s&&"enabled"in i))return;!0===s[a]&&(s[a]={enabled:!0}),"object"!=typeof s[a]||"enabled"in s[a]||(s[a].enabled=!0),s[a]||(s[a]={enabled:!1})}});var n=ee.extend({},w);r.useModulesParams(n),r.params=ee.extend({},n,x,s),r.originalParams=ee.extend({},r.params),r.passedParams=ee.extend({},s);var o=(r.$=L)(r.params.el);if(t=o[0]){if(1<o.length){var l=[];return o.each(function(e,t){var a=ee.extend({},s,{el:t});l.push(new h(a))}),l}t.swiper=r,o.data("swiper",r);var d,p,c=o.children("."+r.params.wrapperClass);return ee.extend(r,{$el:o,el:t,$wrapperEl:c,wrapperEl:c[0],classNames:[],slides:L(),slidesGrid:[],snapGrid:[],slidesSizesGrid:[],isHorizontal:function(){return"horizontal"===r.params.direction},isVertical:function(){return"vertical"===r.params.direction},rtl:"rtl"===t.dir.toLowerCase()||"rtl"===o.css("direction"),rtlTranslate:"horizontal"===r.params.direction&&("rtl"===t.dir.toLowerCase()||"rtl"===o.css("direction")),wrongRTL:"-webkit-box"===c.css("display"),activeIndex:0,realIndex:0,isBeginning:!0,isEnd:!1,translate:0,previousTranslate:0,progress:0,velocity:0,animating:!1,allowSlideNext:r.params.allowSlideNext,allowSlidePrev:r.params.allowSlidePrev,touchEvents:(d=["touchstart","touchmove","touchend"],p=["mousedown","mousemove","mouseup"],te.pointerEvents?p=["pointerdown","pointermove","pointerup"]:te.prefixedPointerEvents&&(p=["MSPointerDown","MSPointerMove","MSPointerUp"]),r.touchEventsTouch={start:d[0],move:d[1],end:d[2]},r.touchEventsDesktop={start:p[0],move:p[1],end:p[2]},te.touch||!r.params.simulateTouch?r.touchEventsTouch:r.touchEventsDesktop),touchEventsData:{isTouched:void 0,isMoved:void 0,allowTouchCallbacks:void 0,touchStartTime:void 0,isScrolling:void 0,currentTranslate:void 0,startTranslate:void 0,allowThresholdMove:void 0,formElements:"input, select, option, textarea, button, video",lastClickTime:ee.now(),clickTimeout:void 0,velocities:[],allowMomentumBounce:void 0,isTouchEvent:void 0,startMoving:void 0},allowClick:!0,allowTouchMove:r.params.allowTouchMove,touches:{startX:0,startY:0,currentX:0,currentY:0,diff:0},imagesToLoad:[],imagesLoaded:0}),r.useModules(),r.params.init&&r.init(),r}}u&&(h.__proto__=u);var e={extendedDefaults:{configurable:!0},defaults:{configurable:!0},Class:{configurable:!0},$:{configurable:!0}};return((h.prototype=Object.create(u&&u.prototype)).constructor=h).prototype.slidesPerViewDynamic=function(){var e=this,t=e.params,a=e.slides,i=e.slidesGrid,s=e.size,r=e.activeIndex,n=1;if(t.centeredSlides){for(var o,l=a[r].swiperSlideSize,d=r+1;d<a.length;d+=1)a[d]&&!o&&(n+=1,s<(l+=a[d].swiperSlideSize)&&(o=!0));for(var p=r-1;0<=p;p-=1)a[p]&&!o&&(n+=1,s<(l+=a[p].swiperSlideSize)&&(o=!0))}else for(var c=r+1;c<a.length;c+=1)i[c]-i[r]<s&&(n+=1);return n},h.prototype.update=function(){var a=this;if(a&&!a.destroyed){var e=a.snapGrid,t=a.params;t.breakpoints&&a.setBreakpoint(),a.updateSize(),a.updateSlides(),a.updateProgress(),a.updateSlidesClasses(),a.params.freeMode?(i(),a.params.autoHeight&&a.updateAutoHeight()):(("auto"===a.params.slidesPerView||1<a.params.slidesPerView)&&a.isEnd&&!a.params.centeredSlides?a.slideTo(a.slides.length-1,0,!1,!0):a.slideTo(a.activeIndex,0,!1,!0))||i(),t.watchOverflow&&e!==a.snapGrid&&a.checkOverflow(),a.emit("update")}function i(){var e=a.rtlTranslate?-1*a.translate:a.translate,t=Math.min(Math.max(e,a.maxTranslate()),a.minTranslate());a.setTranslate(t),a.updateActiveIndex(),a.updateSlidesClasses()}},h.prototype.changeDirection=function(a,e){void 0===e&&(e=!0);var t=this,i=t.params.direction;return a||(a="horizontal"===i?"vertical":"horizontal"),a===i||"horizontal"!==a&&"vertical"!==a||("vertical"===i&&(t.$el.removeClass(t.params.containerModifierClass+"vertical wp8-vertical").addClass(""+t.params.containerModifierClass+a),(I.isIE||I.isEdge)&&(te.pointerEvents||te.prefixedPointerEvents)&&t.$el.addClass(t.params.containerModifierClass+"wp8-"+a)),"horizontal"===i&&(t.$el.removeClass(t.params.containerModifierClass+"horizontal wp8-horizontal").addClass(""+t.params.containerModifierClass+a),(I.isIE||I.isEdge)&&(te.pointerEvents||te.prefixedPointerEvents)&&t.$el.addClass(t.params.containerModifierClass+"wp8-"+a)),t.params.direction=a,t.slides.each(function(e,t){"vertical"===a?t.style.width="":t.style.height=""}),t.emit("changeDirection"),e&&t.update()),t},h.prototype.init=function(){var e=this;e.initialized||(e.emit("beforeInit"),e.params.breakpoints&&e.setBreakpoint(),e.addClasses(),e.params.loop&&e.loopCreate(),e.updateSize(),e.updateSlides(),e.params.watchOverflow&&e.checkOverflow(),e.params.grabCursor&&e.setGrabCursor(),e.params.preloadImages&&e.preloadImages(),e.params.loop?e.slideTo(e.params.initialSlide+e.loopedSlides,0,e.params.runCallbacksOnInit):e.slideTo(e.params.initialSlide,0,e.params.runCallbacksOnInit),e.attachEvents(),e.initialized=!0,e.emit("init"))},h.prototype.destroy=function(e,t){void 0===e&&(e=!0),void 0===t&&(t=!0);var a=this,i=a.params,s=a.$el,r=a.$wrapperEl,n=a.slides;return void 0===a.params||a.destroyed||(a.emit("beforeDestroy"),a.initialized=!1,a.detachEvents(),i.loop&&a.loopDestroy(),t&&(a.removeClasses(),s.removeAttr("style"),r.removeAttr("style"),n&&n.length&&n.removeClass([i.slideVisibleClass,i.slideActiveClass,i.slideNextClass,i.slidePrevClass].join(" ")).removeAttr("style").removeAttr("data-swiper-slide-index").removeAttr("data-swiper-column").removeAttr("data-swiper-row")),a.emit("destroy"),Object.keys(a.eventsListeners).forEach(function(e){a.off(e)}),!1!==e&&(a.$el[0].swiper=null,a.$el.data("swiper",null),ee.deleteProps(a)),a.destroyed=!0),null},h.extendDefaults=function(e){ee.extend(x,e)},e.extendedDefaults.get=function(){return x},e.defaults.get=function(){return w},e.Class.get=function(){return u},e.$.get=function(){return L},Object.defineProperties(h,e),h}(n),E={name:"device",proto:{device:g},static:{device:g}},S={name:"support",proto:{support:te},static:{support:te}},C={name:"browser",proto:{browser:I},static:{browser:I}},M={name:"resize",create:function(){var e=this;ee.extend(e,{resize:{resizeHandler:function(){e&&!e.destroyed&&e.initialized&&(e.emit("beforeResize"),e.emit("resize"))},orientationChangeHandler:function(){e&&!e.destroyed&&e.initialized&&e.emit("orientationchange")}}})},on:{init:function(){J.addEventListener("resize",this.resize.resizeHandler),J.addEventListener("orientationchange",this.resize.orientationChangeHandler)},destroy:function(){J.removeEventListener("resize",this.resize.resizeHandler),J.removeEventListener("orientationchange",this.resize.orientationChangeHandler)}}},z={func:J.MutationObserver||J.WebkitMutationObserver,attach:function(e,t){void 0===t&&(t={});var a=this,i=new z.func(function(e){if(1!==e.length){var t=function(){a.emit("observerUpdate",e[0])};J.requestAnimationFrame?J.requestAnimationFrame(t):J.setTimeout(t,0)}else a.emit("observerUpdate",e[0])});i.observe(e,{attributes:void 0===t.attributes||t.attributes,childList:void 0===t.childList||t.childList,characterData:void 0===t.characterData||t.characterData}),a.observer.observers.push(i)},init:function(){var e=this;if(te.observer&&e.params.observer){if(e.params.observeParents)for(var t=e.$el.parents(),a=0;a<t.length;a+=1)e.observer.attach(t[a]);e.observer.attach(e.$el[0],{childList:e.params.observeSlideChildren}),e.observer.attach(e.$wrapperEl[0],{attributes:!1})}},destroy:function(){this.observer.observers.forEach(function(e){e.disconnect()}),this.observer.observers=[]}},P={name:"observer",params:{observer:!1,observeParents:!1,observeSlideChildren:!1},create:function(){ee.extend(this,{observer:{init:z.init.bind(this),attach:z.attach.bind(this),destroy:z.destroy.bind(this),observers:[]}})},on:{init:function(){this.observer.init()},destroy:function(){this.observer.destroy()}}},k={update:function(e){var t=this,a=t.params,i=a.slidesPerView,s=a.slidesPerGroup,r=a.centeredSlides,n=t.params.virtual,o=n.addSlidesBefore,l=n.addSlidesAfter,d=t.virtual,p=d.from,c=d.to,u=d.slides,h=d.slidesGrid,v=d.renderSlide,f=d.offset;t.updateActiveIndex();var m,g,b,w=t.activeIndex||0;m=t.rtlTranslate?"right":t.isHorizontal()?"left":"top",r?(g=Math.floor(i/2)+s+o,b=Math.floor(i/2)+s+l):(g=i+(s-1)+o,b=s+l);var y=Math.max((w||0)-b,0),x=Math.min((w||0)+g,u.length-1),T=(t.slidesGrid[y]||0)-(t.slidesGrid[0]||0);function E(){t.updateSlides(),t.updateProgress(),t.updateSlidesClasses(),t.lazy&&t.params.lazy.enabled&&t.lazy.load()}if(ee.extend(t.virtual,{from:y,to:x,offset:T,slidesGrid:t.slidesGrid}),p===y&&c===x&&!e)return t.slidesGrid!==h&&T!==f&&t.slides.css(m,T+"px"),void t.updateProgress();if(t.params.virtual.renderExternal)return t.params.virtual.renderExternal.call(t,{offset:T,from:y,to:x,slides:function(){for(var e=[],t=y;t<=x;t+=1)e.push(u[t]);return e}()}),void E();var S=[],C=[];if(e)t.$wrapperEl.find("."+t.params.slideClass).remove();else for(var M=p;M<=c;M+=1)(M<y||x<M)&&t.$wrapperEl.find("."+t.params.slideClass+'[data-swiper-slide-index="'+M+'"]').remove();for(var z=0;z<u.length;z+=1)y<=z&&z<=x&&(void 0===c||e?C.push(z):(c<z&&C.push(z),z<p&&S.push(z)));C.forEach(function(e){t.$wrapperEl.append(v(u[e],e))}),S.sort(function(e,t){return t-e}).forEach(function(e){t.$wrapperEl.prepend(v(u[e],e))}),t.$wrapperEl.children(".swiper-slide").css(m,T+"px"),E()},renderSlide:function(e,t){var a=this,i=a.params.virtual;if(i.cache&&a.virtual.cache[t])return a.virtual.cache[t];var s=i.renderSlide?L(i.renderSlide.call(a,e,t)):L('<div class="'+a.params.slideClass+'" data-swiper-slide-index="'+t+'">'+e+"</div>");return s.attr("data-swiper-slide-index")||s.attr("data-swiper-slide-index",t),i.cache&&(a.virtual.cache[t]=s),s},appendSlide:function(e){if("object"==typeof e&&"length"in e)for(var t=0;t<e.length;t+=1)e[t]&&this.virtual.slides.push(e[t]);else this.virtual.slides.push(e);this.virtual.update(!0)},prependSlide:function(e){var t=this,a=t.activeIndex,i=a+1,s=1;if(Array.isArray(e)){for(var r=0;r<e.length;r+=1)e[r]&&t.virtual.slides.unshift(e[r]);i=a+e.length,s=e.length}else t.virtual.slides.unshift(e);if(t.params.virtual.cache){var n=t.virtual.cache,o={};Object.keys(n).forEach(function(e){o[parseInt(e,10)+s]=n[e]}),t.virtual.cache=o}t.virtual.update(!0),t.slideTo(i,0)},removeSlide:function(e){var t=this;if(null!=e){var a=t.activeIndex;if(Array.isArray(e))for(var i=e.length-1;0<=i;i-=1)t.virtual.slides.splice(e[i],1),t.params.virtual.cache&&delete t.virtual.cache[e[i]],e[i]<a&&(a-=1),a=Math.max(a,0);else t.virtual.slides.splice(e,1),t.params.virtual.cache&&delete t.virtual.cache[e],e<a&&(a-=1),a=Math.max(a,0);t.virtual.update(!0),t.slideTo(a,0)}},removeAllSlides:function(){var e=this;e.virtual.slides=[],e.params.virtual.cache&&(e.virtual.cache={}),e.virtual.update(!0),e.slideTo(0,0)}},$={name:"virtual",params:{virtual:{enabled:!1,slides:[],cache:!0,renderSlide:null,renderExternal:null,addSlidesBefore:0,addSlidesAfter:0}},create:function(){var e=this;ee.extend(e,{virtual:{update:k.update.bind(e),appendSlide:k.appendSlide.bind(e),prependSlide:k.prependSlide.bind(e),removeSlide:k.removeSlide.bind(e),removeAllSlides:k.removeAllSlides.bind(e),renderSlide:k.renderSlide.bind(e),slides:e.params.virtual.slides,cache:{}}})},on:{beforeInit:function(){var e=this;if(e.params.virtual.enabled){e.classNames.push(e.params.containerModifierClass+"virtual");var t={watchSlidesProgress:!0};ee.extend(e.params,t),ee.extend(e.originalParams,t),e.params.initialSlide||e.virtual.update()}},setTranslate:function(){this.params.virtual.enabled&&this.virtual.update()}}},D={handle:function(e){var t=this,a=t.rtlTranslate,i=e;i.originalEvent&&(i=i.originalEvent);var s=i.keyCode||i.charCode;if(!t.allowSlideNext&&(t.isHorizontal()&&39===s||t.isVertical()&&40===s))return!1;if(!t.allowSlidePrev&&(t.isHorizontal()&&37===s||t.isVertical()&&38===s))return!1;if(!(i.shiftKey||i.altKey||i.ctrlKey||i.metaKey||f.activeElement&&f.activeElement.nodeName&&("input"===f.activeElement.nodeName.toLowerCase()||"textarea"===f.activeElement.nodeName.toLowerCase()))){if(t.params.keyboard.onlyInViewport&&(37===s||39===s||38===s||40===s)){var r=!1;if(0<t.$el.parents("."+t.params.slideClass).length&&0===t.$el.parents("."+t.params.slideActiveClass).length)return;var n=J.innerWidth,o=J.innerHeight,l=t.$el.offset();a&&(l.left-=t.$el[0].scrollLeft);for(var d=[[l.left,l.top],[l.left+t.width,l.top],[l.left,l.top+t.height],[l.left+t.width,l.top+t.height]],p=0;p<d.length;p+=1){var c=d[p];0<=c[0]&&c[0]<=n&&0<=c[1]&&c[1]<=o&&(r=!0)}if(!r)return}t.isHorizontal()?(37!==s&&39!==s||(i.preventDefault?i.preventDefault():i.returnValue=!1),(39===s&&!a||37===s&&a)&&t.slideNext(),(37===s&&!a||39===s&&a)&&t.slidePrev()):(38!==s&&40!==s||(i.preventDefault?i.preventDefault():i.returnValue=!1),40===s&&t.slideNext(),38===s&&t.slidePrev()),t.emit("keyPress",s)}},enable:function(){this.keyboard.enabled||(L(f).on("keydown",this.keyboard.handle),this.keyboard.enabled=!0)},disable:function(){this.keyboard.enabled&&(L(f).off("keydown",this.keyboard.handle),this.keyboard.enabled=!1)}},O={name:"keyboard",params:{keyboard:{enabled:!1,onlyInViewport:!0}},create:function(){ee.extend(this,{keyboard:{enabled:!1,enable:D.enable.bind(this),disable:D.disable.bind(this),handle:D.handle.bind(this)}})},on:{init:function(){this.params.keyboard.enabled&&this.keyboard.enable()},destroy:function(){this.keyboard.enabled&&this.keyboard.disable()}}};var A={lastScrollTime:ee.now(),event:-1<J.navigator.userAgent.indexOf("firefox")?"DOMMouseScroll":function(){var e="onwheel",t=e in f;if(!t){var a=f.createElement("div");a.setAttribute(e,"return;"),t="function"==typeof a[e]}return!t&&f.implementation&&f.implementation.hasFeature&&!0!==f.implementation.hasFeature("","")&&(t=f.implementation.hasFeature("Events.wheel","3.0")),t}()?"wheel":"mousewheel",normalize:function(e){var t=0,a=0,i=0,s=0;return"detail"in e&&(a=e.detail),"wheelDelta"in e&&(a=-e.wheelDelta/120),"wheelDeltaY"in e&&(a=-e.wheelDeltaY/120),"wheelDeltaX"in e&&(t=-e.wheelDeltaX/120),"axis"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=a,a=0),i=10*t,s=10*a,"deltaY"in e&&(s=e.deltaY),"deltaX"in e&&(i=e.deltaX),(i||s)&&e.deltaMode&&(1===e.deltaMode?(i*=40,s*=40):(i*=800,s*=800)),i&&!t&&(t=i<1?-1:1),s&&!a&&(a=s<1?-1:1),{spinX:t,spinY:a,pixelX:i,pixelY:s}},handleMouseEnter:function(){this.mouseEntered=!0},handleMouseLeave:function(){this.mouseEntered=!1},handle:function(e){var t=e,a=this,i=a.params.mousewheel;if(!a.mouseEntered&&!i.releaseOnEdges)return!0;t.originalEvent&&(t=t.originalEvent);var s=0,r=a.rtlTranslate?-1:1,n=A.normalize(t);if(i.forceToAxis)if(a.isHorizontal()){if(!(Math.abs(n.pixelX)>Math.abs(n.pixelY)))return!0;s=n.pixelX*r}else{if(!(Math.abs(n.pixelY)>Math.abs(n.pixelX)))return!0;s=n.pixelY}else s=Math.abs(n.pixelX)>Math.abs(n.pixelY)?-n.pixelX*r:-n.pixelY;if(0===s)return!0;if(i.invert&&(s=-s),a.params.freeMode){a.params.loop&&a.loopFix();var o=a.getTranslate()+s*i.sensitivity,l=a.isBeginning,d=a.isEnd;if(o>=a.minTranslate()&&(o=a.minTranslate()),o<=a.maxTranslate()&&(o=a.maxTranslate()),a.setTransition(0),a.setTranslate(o),a.updateProgress(),a.updateActiveIndex(),a.updateSlidesClasses(),(!l&&a.isBeginning||!d&&a.isEnd)&&a.updateSlidesClasses(),a.params.freeModeSticky&&(clearTimeout(a.mousewheel.timeout),a.mousewheel.timeout=ee.nextTick(function(){a.slideToClosest()},300)),a.emit("scroll",t),a.params.autoplay&&a.params.autoplayDisableOnInteraction&&a.autoplay.stop(),o===a.minTranslate()||o===a.maxTranslate())return!0}else{if(60<ee.now()-a.mousewheel.lastScrollTime)if(s<0)if(a.isEnd&&!a.params.loop||a.animating){if(i.releaseOnEdges)return!0}else a.slideNext(),a.emit("scroll",t);else if(a.isBeginning&&!a.params.loop||a.animating){if(i.releaseOnEdges)return!0}else a.slidePrev(),a.emit("scroll",t);a.mousewheel.lastScrollTime=(new J.Date).getTime()}return t.preventDefault?t.preventDefault():t.returnValue=!1,!1},enable:function(){var e=this;if(!A.event)return!1;if(e.mousewheel.enabled)return!1;var t=e.$el;return"container"!==e.params.mousewheel.eventsTarged&&(t=L(e.params.mousewheel.eventsTarged)),t.on("mouseenter",e.mousewheel.handleMouseEnter),t.on("mouseleave",e.mousewheel.handleMouseLeave),t.on(A.event,e.mousewheel.handle),e.mousewheel.enabled=!0},disable:function(){var e=this;if(!A.event)return!1;if(!e.mousewheel.enabled)return!1;var t=e.$el;return"container"!==e.params.mousewheel.eventsTarged&&(t=L(e.params.mousewheel.eventsTarged)),t.off(A.event,e.mousewheel.handle),!(e.mousewheel.enabled=!1)}},H={update:function(){var e=this,t=e.params.navigation;if(!e.params.loop){var a=e.navigation,i=a.$nextEl,s=a.$prevEl;s&&0<s.length&&(e.isBeginning?s.addClass(t.disabledClass):s.removeClass(t.disabledClass),s[e.params.watchOverflow&&e.isLocked?"addClass":"removeClass"](t.lockClass)),i&&0<i.length&&(e.isEnd?i.addClass(t.disabledClass):i.removeClass(t.disabledClass),i[e.params.watchOverflow&&e.isLocked?"addClass":"removeClass"](t.lockClass))}},onPrevClick:function(e){e.preventDefault(),this.isBeginning&&!this.params.loop||this.slidePrev()},onNextClick:function(e){e.preventDefault(),this.isEnd&&!this.params.loop||this.slideNext()},init:function(){var e,t,a=this,i=a.params.navigation;(i.nextEl||i.prevEl)&&(i.nextEl&&(e=L(i.nextEl),a.params.uniqueNavElements&&"string"==typeof i.nextEl&&1<e.length&&1===a.$el.find(i.nextEl).length&&(e=a.$el.find(i.nextEl))),i.prevEl&&(t=L(i.prevEl),a.params.uniqueNavElements&&"string"==typeof i.prevEl&&1<t.length&&1===a.$el.find(i.prevEl).length&&(t=a.$el.find(i.prevEl))),e&&0<e.length&&e.on("click",a.navigation.onNextClick),t&&0<t.length&&t.on("click",a.navigation.onPrevClick),ee.extend(a.navigation,{$nextEl:e,nextEl:e&&e[0],$prevEl:t,prevEl:t&&t[0]}))},destroy:function(){var e=this,t=e.navigation,a=t.$nextEl,i=t.$prevEl;a&&a.length&&(a.off("click",e.navigation.onNextClick),a.removeClass(e.params.navigation.disabledClass)),i&&i.length&&(i.off("click",e.navigation.onPrevClick),i.removeClass(e.params.navigation.disabledClass))}},N={update:function(){var e=this,t=e.rtl,s=e.params.pagination;if(s.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var r,a=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,i=e.pagination.$el,n=e.params.loop?Math.ceil((a-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length;if(e.params.loop?((r=Math.ceil((e.activeIndex-e.loopedSlides)/e.params.slidesPerGroup))>a-1-2*e.loopedSlides&&(r-=a-2*e.loopedSlides),n-1<r&&(r-=n),r<0&&"bullets"!==e.params.paginationType&&(r=n+r)):r=void 0!==e.snapIndex?e.snapIndex:e.activeIndex||0,"bullets"===s.type&&e.pagination.bullets&&0<e.pagination.bullets.length){var o,l,d,p=e.pagination.bullets;if(s.dynamicBullets&&(e.pagination.bulletSize=p.eq(0)[e.isHorizontal()?"outerWidth":"outerHeight"](!0),i.css(e.isHorizontal()?"width":"height",e.pagination.bulletSize*(s.dynamicMainBullets+4)+"px"),1<s.dynamicMainBullets&&void 0!==e.previousIndex&&(e.pagination.dynamicBulletIndex+=r-e.previousIndex,e.pagination.dynamicBulletIndex>s.dynamicMainBullets-1?e.pagination.dynamicBulletIndex=s.dynamicMainBullets-1:e.pagination.dynamicBulletIndex<0&&(e.pagination.dynamicBulletIndex=0)),o=r-e.pagination.dynamicBulletIndex,d=((l=o+(Math.min(p.length,s.dynamicMainBullets)-1))+o)/2),p.removeClass(s.bulletActiveClass+" "+s.bulletActiveClass+"-next "+s.bulletActiveClass+"-next-next "+s.bulletActiveClass+"-prev "+s.bulletActiveClass+"-prev-prev "+s.bulletActiveClass+"-main"),1<i.length)p.each(function(e,t){var a=L(t),i=a.index();i===r&&a.addClass(s.bulletActiveClass),s.dynamicBullets&&(o<=i&&i<=l&&a.addClass(s.bulletActiveClass+"-main"),i===o&&a.prev().addClass(s.bulletActiveClass+"-prev").prev().addClass(s.bulletActiveClass+"-prev-prev"),i===l&&a.next().addClass(s.bulletActiveClass+"-next").next().addClass(s.bulletActiveClass+"-next-next"))});else if(p.eq(r).addClass(s.bulletActiveClass),s.dynamicBullets){for(var c=p.eq(o),u=p.eq(l),h=o;h<=l;h+=1)p.eq(h).addClass(s.bulletActiveClass+"-main");c.prev().addClass(s.bulletActiveClass+"-prev").prev().addClass(s.bulletActiveClass+"-prev-prev"),u.next().addClass(s.bulletActiveClass+"-next").next().addClass(s.bulletActiveClass+"-next-next")}if(s.dynamicBullets){var v=Math.min(p.length,s.dynamicMainBullets+4),f=(e.pagination.bulletSize*v-e.pagination.bulletSize)/2-d*e.pagination.bulletSize,m=t?"right":"left";p.css(e.isHorizontal()?m:"top",f+"px")}}if("fraction"===s.type&&(i.find("."+s.currentClass).text(s.formatFractionCurrent(r+1)),i.find("."+s.totalClass).text(s.formatFractionTotal(n))),"progressbar"===s.type){var g;g=s.progressbarOpposite?e.isHorizontal()?"vertical":"horizontal":e.isHorizontal()?"horizontal":"vertical";var b=(r+1)/n,w=1,y=1;"horizontal"===g?w=b:y=b,i.find("."+s.progressbarFillClass).transform("translate3d(0,0,0) scaleX("+w+") scaleY("+y+")").transition(e.params.speed)}"custom"===s.type&&s.renderCustom?(i.html(s.renderCustom(e,r+1,n)),e.emit("paginationRender",e,i[0])):e.emit("paginationUpdate",e,i[0]),i[e.params.watchOverflow&&e.isLocked?"addClass":"removeClass"](s.lockClass)}},render:function(){var e=this,t=e.params.pagination;if(t.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var a=e.virtual&&e.params.virtual.enabled?e.virtual.slides.length:e.slides.length,i=e.pagination.$el,s="";if("bullets"===t.type){for(var r=e.params.loop?Math.ceil((a-2*e.loopedSlides)/e.params.slidesPerGroup):e.snapGrid.length,n=0;n<r;n+=1)t.renderBullet?s+=t.renderBullet.call(e,n,t.bulletClass):s+="<"+t.bulletElement+' class="'+t.bulletClass+'"></'+t.bulletElement+">";i.html(s),e.pagination.bullets=i.find("."+t.bulletClass)}"fraction"===t.type&&(s=t.renderFraction?t.renderFraction.call(e,t.currentClass,t.totalClass):'<span class="'+t.currentClass+'"></span> / <span class="'+t.totalClass+'"></span>',i.html(s)),"progressbar"===t.type&&(s=t.renderProgressbar?t.renderProgressbar.call(e,t.progressbarFillClass):'<span class="'+t.progressbarFillClass+'"></span>',i.html(s)),"custom"!==t.type&&e.emit("paginationRender",e.pagination.$el[0])}},init:function(){var a=this,e=a.params.pagination;if(e.el){var t=L(e.el);0!==t.length&&(a.params.uniqueNavElements&&"string"==typeof e.el&&1<t.length&&1===a.$el.find(e.el).length&&(t=a.$el.find(e.el)),"bullets"===e.type&&e.clickable&&t.addClass(e.clickableClass),t.addClass(e.modifierClass+e.type),"bullets"===e.type&&e.dynamicBullets&&(t.addClass(""+e.modifierClass+e.type+"-dynamic"),a.pagination.dynamicBulletIndex=0,e.dynamicMainBullets<1&&(e.dynamicMainBullets=1)),"progressbar"===e.type&&e.progressbarOpposite&&t.addClass(e.progressbarOppositeClass),e.clickable&&t.on("click","."+e.bulletClass,function(e){e.preventDefault();var t=L(this).index()*a.params.slidesPerGroup;a.params.loop&&(t+=a.loopedSlides),a.slideTo(t)}),ee.extend(a.pagination,{$el:t,el:t[0]}))}},destroy:function(){var e=this,t=e.params.pagination;if(t.el&&e.pagination.el&&e.pagination.$el&&0!==e.pagination.$el.length){var a=e.pagination.$el;a.removeClass(t.hiddenClass),a.removeClass(t.modifierClass+t.type),e.pagination.bullets&&e.pagination.bullets.removeClass(t.bulletActiveClass),t.clickable&&a.off("click","."+t.bulletClass)}}},G={setTranslate:function(){var e=this;if(e.params.scrollbar.el&&e.scrollbar.el){var t=e.scrollbar,a=e.rtlTranslate,i=e.progress,s=t.dragSize,r=t.trackSize,n=t.$dragEl,o=t.$el,l=e.params.scrollbar,d=s,p=(r-s)*i;a?0<(p=-p)?(d=s-p,p=0):r<-p+s&&(d=r+p):p<0?(d=s+p,p=0):r<p+s&&(d=r-p),e.isHorizontal()?(te.transforms3d?n.transform("translate3d("+p+"px, 0, 0)"):n.transform("translateX("+p+"px)"),n[0].style.width=d+"px"):(te.transforms3d?n.transform("translate3d(0px, "+p+"px, 0)"):n.transform("translateY("+p+"px)"),n[0].style.height=d+"px"),l.hide&&(clearTimeout(e.scrollbar.timeout),o[0].style.opacity=1,e.scrollbar.timeout=setTimeout(function(){o[0].style.opacity=0,o.transition(400)},1e3))}},setTransition:function(e){this.params.scrollbar.el&&this.scrollbar.el&&this.scrollbar.$dragEl.transition(e)},updateSize:function(){var e=this;if(e.params.scrollbar.el&&e.scrollbar.el){var t=e.scrollbar,a=t.$dragEl,i=t.$el;a[0].style.width="",a[0].style.height="";var s,r=e.isHorizontal()?i[0].offsetWidth:i[0].offsetHeight,n=e.size/e.virtualSize,o=n*(r/e.size);s="auto"===e.params.scrollbar.dragSize?r*n:parseInt(e.params.scrollbar.dragSize,10),e.isHorizontal()?a[0].style.width=s+"px":a[0].style.height=s+"px",i[0].style.display=1<=n?"none":"",e.params.scrollbar.hide&&(i[0].style.opacity=0),ee.extend(t,{trackSize:r,divider:n,moveDivider:o,dragSize:s}),t.$el[e.params.watchOverflow&&e.isLocked?"addClass":"removeClass"](e.params.scrollbar.lockClass)}},setDragPosition:function(e){var t,a=this,i=a.scrollbar,s=a.rtlTranslate,r=i.$el,n=i.dragSize,o=i.trackSize;t=((a.isHorizontal()?"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].pageX:e.pageX||e.clientX:"touchstart"===e.type||"touchmove"===e.type?e.targetTouches[0].pageY:e.pageY||e.clientY)-r.offset()[a.isHorizontal()?"left":"top"]-n/2)/(o-n),t=Math.max(Math.min(t,1),0),s&&(t=1-t);var l=a.minTranslate()+(a.maxTranslate()-a.minTranslate())*t;a.updateProgress(l),a.setTranslate(l),a.updateActiveIndex(),a.updateSlidesClasses()},onDragStart:function(e){var t=this,a=t.params.scrollbar,i=t.scrollbar,s=t.$wrapperEl,r=i.$el,n=i.$dragEl;t.scrollbar.isTouched=!0,e.preventDefault(),e.stopPropagation(),s.transition(100),n.transition(100),i.setDragPosition(e),clearTimeout(t.scrollbar.dragTimeout),r.transition(0),a.hide&&r.css("opacity",1),t.emit("scrollbarDragStart",e)},onDragMove:function(e){var t=this.scrollbar,a=this.$wrapperEl,i=t.$el,s=t.$dragEl;this.scrollbar.isTouched&&(e.preventDefault?e.preventDefault():e.returnValue=!1,t.setDragPosition(e),a.transition(0),i.transition(0),s.transition(0),this.emit("scrollbarDragMove",e))},onDragEnd:function(e){var t=this,a=t.params.scrollbar,i=t.scrollbar.$el;t.scrollbar.isTouched&&(t.scrollbar.isTouched=!1,a.hide&&(clearTimeout(t.scrollbar.dragTimeout),t.scrollbar.dragTimeout=ee.nextTick(function(){i.css("opacity",0),i.transition(400)},1e3)),t.emit("scrollbarDragEnd",e),a.snapOnRelease&&t.slideToClosest())},enableDraggable:function(){var e=this;if(e.params.scrollbar.el){var t=e.scrollbar,a=e.touchEventsTouch,i=e.touchEventsDesktop,s=e.params,r=t.$el[0],n=!(!te.passiveListener||!s.passiveListeners)&&{passive:!1,capture:!1},o=!(!te.passiveListener||!s.passiveListeners)&&{passive:!0,capture:!1};te.touch?(r.addEventListener(a.start,e.scrollbar.onDragStart,n),r.addEventListener(a.move,e.scrollbar.onDragMove,n),r.addEventListener(a.end,e.scrollbar.onDragEnd,o)):(r.addEventListener(i.start,e.scrollbar.onDragStart,n),f.addEventListener(i.move,e.scrollbar.onDragMove,n),f.addEventListener(i.end,e.scrollbar.onDragEnd,o))}},disableDraggable:function(){var e=this;if(e.params.scrollbar.el){var t=e.scrollbar,a=e.touchEventsTouch,i=e.touchEventsDesktop,s=e.params,r=t.$el[0],n=!(!te.passiveListener||!s.passiveListeners)&&{passive:!1,capture:!1},o=!(!te.passiveListener||!s.passiveListeners)&&{passive:!0,capture:!1};te.touch?(r.removeEventListener(a.start,e.scrollbar.onDragStart,n),r.removeEventListener(a.move,e.scrollbar.onDragMove,n),r.removeEventListener(a.end,e.scrollbar.onDragEnd,o)):(r.removeEventListener(i.start,e.scrollbar.onDragStart,n),f.removeEventListener(i.move,e.scrollbar.onDragMove,n),f.removeEventListener(i.end,e.scrollbar.onDragEnd,o))}},init:function(){var e=this;if(e.params.scrollbar.el){var t=e.scrollbar,a=e.$el,i=e.params.scrollbar,s=L(i.el);e.params.uniqueNavElements&&"string"==typeof i.el&&1<s.length&&1===a.find(i.el).length&&(s=a.find(i.el));var r=s.find("."+e.params.scrollbar.dragClass);0===r.length&&(r=L('<div class="'+e.params.scrollbar.dragClass+'"></div>'),s.append(r)),ee.extend(t,{$el:s,el:s[0],$dragEl:r,dragEl:r[0]}),i.draggable&&t.enableDraggable()}},destroy:function(){this.scrollbar.disableDraggable()}},B={setTransform:function(e,t){var a=this.rtl,i=L(e),s=a?-1:1,r=i.attr("data-swiper-parallax")||"0",n=i.attr("data-swiper-parallax-x"),o=i.attr("data-swiper-parallax-y"),l=i.attr("data-swiper-parallax-scale"),d=i.attr("data-swiper-parallax-opacity");if(n||o?(n=n||"0",o=o||"0"):this.isHorizontal()?(n=r,o="0"):(o=r,n="0"),n=0<=n.indexOf("%")?parseInt(n,10)*t*s+"%":n*t*s+"px",o=0<=o.indexOf("%")?parseInt(o,10)*t+"%":o*t+"px",null!=d){var p=d-(d-1)*(1-Math.abs(t));i[0].style.opacity=p}if(null==l)i.transform("translate3d("+n+", "+o+", 0px)");else{var c=l-(l-1)*(1-Math.abs(t));i.transform("translate3d("+n+", "+o+", 0px) scale("+c+")")}},setTranslate:function(){var i=this,e=i.$el,t=i.slides,s=i.progress,r=i.snapGrid;e.children("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]").each(function(e,t){i.parallax.setTransform(t,s)}),t.each(function(e,t){var a=t.progress;1<i.params.slidesPerGroup&&"auto"!==i.params.slidesPerView&&(a+=Math.ceil(e/2)-s*(r.length-1)),a=Math.min(Math.max(a,-1),1),L(t).find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]").each(function(e,t){i.parallax.setTransform(t,a)})})},setTransition:function(s){void 0===s&&(s=this.params.speed);this.$el.find("[data-swiper-parallax], [data-swiper-parallax-x], [data-swiper-parallax-y]").each(function(e,t){var a=L(t),i=parseInt(a.attr("data-swiper-parallax-duration"),10)||s;0===s&&(i=0),a.transition(i)})}},X={getDistanceBetweenTouches:function(e){if(e.targetTouches.length<2)return 1;var t=e.targetTouches[0].pageX,a=e.targetTouches[0].pageY,i=e.targetTouches[1].pageX,s=e.targetTouches[1].pageY;return Math.sqrt(Math.pow(i-t,2)+Math.pow(s-a,2))},onGestureStart:function(e){var t=this,a=t.params.zoom,i=t.zoom,s=i.gesture;if(i.fakeGestureTouched=!1,i.fakeGestureMoved=!1,!te.gestures){if("touchstart"!==e.type||"touchstart"===e.type&&e.targetTouches.length<2)return;i.fakeGestureTouched=!0,s.scaleStart=X.getDistanceBetweenTouches(e)}s.$slideEl&&s.$slideEl.length||(s.$slideEl=L(e.target).closest(".swiper-slide"),0===s.$slideEl.length&&(s.$slideEl=t.slides.eq(t.activeIndex)),s.$imageEl=s.$slideEl.find("img, svg, canvas"),s.$imageWrapEl=s.$imageEl.parent("."+a.containerClass),s.maxRatio=s.$imageWrapEl.attr("data-swiper-zoom")||a.maxRatio,0!==s.$imageWrapEl.length)?(s.$imageEl.transition(0),t.zoom.isScaling=!0):s.$imageEl=void 0},onGestureChange:function(e){var t=this.params.zoom,a=this.zoom,i=a.gesture;if(!te.gestures){if("touchmove"!==e.type||"touchmove"===e.type&&e.targetTouches.length<2)return;a.fakeGestureMoved=!0,i.scaleMove=X.getDistanceBetweenTouches(e)}i.$imageEl&&0!==i.$imageEl.length&&(a.scale=te.gestures?e.scale*a.currentScale:i.scaleMove/i.scaleStart*a.currentScale,a.scale>i.maxRatio&&(a.scale=i.maxRatio-1+Math.pow(a.scale-i.maxRatio+1,.5)),a.scale<t.minRatio&&(a.scale=t.minRatio+1-Math.pow(t.minRatio-a.scale+1,.5)),i.$imageEl.transform("translate3d(0,0,0) scale("+a.scale+")"))},onGestureEnd:function(e){var t=this.params.zoom,a=this.zoom,i=a.gesture;if(!te.gestures){if(!a.fakeGestureTouched||!a.fakeGestureMoved)return;if("touchend"!==e.type||"touchend"===e.type&&e.changedTouches.length<2&&!g.android)return;a.fakeGestureTouched=!1,a.fakeGestureMoved=!1}i.$imageEl&&0!==i.$imageEl.length&&(a.scale=Math.max(Math.min(a.scale,i.maxRatio),t.minRatio),i.$imageEl.transition(this.params.speed).transform("translate3d(0,0,0) scale("+a.scale+")"),a.currentScale=a.scale,a.isScaling=!1,1===a.scale&&(i.$slideEl=void 0))},onTouchStart:function(e){var t=this.zoom,a=t.gesture,i=t.image;a.$imageEl&&0!==a.$imageEl.length&&(i.isTouched||(g.android&&e.preventDefault(),i.isTouched=!0,i.touchesStart.x="touchstart"===e.type?e.targetTouches[0].pageX:e.pageX,i.touchesStart.y="touchstart"===e.type?e.targetTouches[0].pageY:e.pageY))},onTouchMove:function(e){var t=this,a=t.zoom,i=a.gesture,s=a.image,r=a.velocity;if(i.$imageEl&&0!==i.$imageEl.length&&(t.allowClick=!1,s.isTouched&&i.$slideEl)){s.isMoved||(s.width=i.$imageEl[0].offsetWidth,s.height=i.$imageEl[0].offsetHeight,s.startX=ee.getTranslate(i.$imageWrapEl[0],"x")||0,s.startY=ee.getTranslate(i.$imageWrapEl[0],"y")||0,i.slideWidth=i.$slideEl[0].offsetWidth,i.slideHeight=i.$slideEl[0].offsetHeight,i.$imageWrapEl.transition(0),t.rtl&&(s.startX=-s.startX,s.startY=-s.startY));var n=s.width*a.scale,o=s.height*a.scale;if(!(n<i.slideWidth&&o<i.slideHeight)){if(s.minX=Math.min(i.slideWidth/2-n/2,0),s.maxX=-s.minX,s.minY=Math.min(i.slideHeight/2-o/2,0),s.maxY=-s.minY,s.touchesCurrent.x="touchmove"===e.type?e.targetTouches[0].pageX:e.pageX,s.touchesCurrent.y="touchmove"===e.type?e.targetTouches[0].pageY:e.pageY,!s.isMoved&&!a.isScaling){if(t.isHorizontal()&&(Math.floor(s.minX)===Math.floor(s.startX)&&s.touchesCurrent.x<s.touchesStart.x||Math.floor(s.maxX)===Math.floor(s.startX)&&s.touchesCurrent.x>s.touchesStart.x))return void(s.isTouched=!1);if(!t.isHorizontal()&&(Math.floor(s.minY)===Math.floor(s.startY)&&s.touchesCurrent.y<s.touchesStart.y||Math.floor(s.maxY)===Math.floor(s.startY)&&s.touchesCurrent.y>s.touchesStart.y))return void(s.isTouched=!1)}e.preventDefault(),e.stopPropagation(),s.isMoved=!0,s.currentX=s.touchesCurrent.x-s.touchesStart.x+s.startX,s.currentY=s.touchesCurrent.y-s.touchesStart.y+s.startY,s.currentX<s.minX&&(s.currentX=s.minX+1-Math.pow(s.minX-s.currentX+1,.8)),s.currentX>s.maxX&&(s.currentX=s.maxX-1+Math.pow(s.currentX-s.maxX+1,.8)),s.currentY<s.minY&&(s.currentY=s.minY+1-Math.pow(s.minY-s.currentY+1,.8)),s.currentY>s.maxY&&(s.currentY=s.maxY-1+Math.pow(s.currentY-s.maxY+1,.8)),r.prevPositionX||(r.prevPositionX=s.touchesCurrent.x),r.prevPositionY||(r.prevPositionY=s.touchesCurrent.y),r.prevTime||(r.prevTime=Date.now()),r.x=(s.touchesCurrent.x-r.prevPositionX)/(Date.now()-r.prevTime)/2,r.y=(s.touchesCurrent.y-r.prevPositionY)/(Date.now()-r.prevTime)/2,Math.abs(s.touchesCurrent.x-r.prevPositionX)<2&&(r.x=0),Math.abs(s.touchesCurrent.y-r.prevPositionY)<2&&(r.y=0),r.prevPositionX=s.touchesCurrent.x,r.prevPositionY=s.touchesCurrent.y,r.prevTime=Date.now(),i.$imageWrapEl.transform("translate3d("+s.currentX+"px, "+s.currentY+"px,0)")}}},onTouchEnd:function(){var e=this.zoom,t=e.gesture,a=e.image,i=e.velocity;if(t.$imageEl&&0!==t.$imageEl.length){if(!a.isTouched||!a.isMoved)return a.isTouched=!1,void(a.isMoved=!1);a.isTouched=!1,a.isMoved=!1;var s=300,r=300,n=i.x*s,o=a.currentX+n,l=i.y*r,d=a.currentY+l;0!==i.x&&(s=Math.abs((o-a.currentX)/i.x)),0!==i.y&&(r=Math.abs((d-a.currentY)/i.y));var p=Math.max(s,r);a.currentX=o,a.currentY=d;var c=a.width*e.scale,u=a.height*e.scale;a.minX=Math.min(t.slideWidth/2-c/2,0),a.maxX=-a.minX,a.minY=Math.min(t.slideHeight/2-u/2,0),a.maxY=-a.minY,a.currentX=Math.max(Math.min(a.currentX,a.maxX),a.minX),a.currentY=Math.max(Math.min(a.currentY,a.maxY),a.minY),t.$imageWrapEl.transition(p).transform("translate3d("+a.currentX+"px, "+a.currentY+"px,0)")}},onTransitionEnd:function(){var e=this.zoom,t=e.gesture;t.$slideEl&&this.previousIndex!==this.activeIndex&&(t.$imageEl.transform("translate3d(0,0,0) scale(1)"),t.$imageWrapEl.transform("translate3d(0,0,0)"),e.scale=1,e.currentScale=1,t.$slideEl=void 0,t.$imageEl=void 0,t.$imageWrapEl=void 0)},toggle:function(e){var t=this.zoom;t.scale&&1!==t.scale?t.out():t.in(e)},in:function(e){var t,a,i,s,r,n,o,l,d,p,c,u,h,v,f,m,g=this,b=g.zoom,w=g.params.zoom,y=b.gesture,x=b.image;(y.$slideEl||(y.$slideEl=g.clickedSlide?L(g.clickedSlide):g.slides.eq(g.activeIndex),y.$imageEl=y.$slideEl.find("img, svg, canvas"),y.$imageWrapEl=y.$imageEl.parent("."+w.containerClass)),y.$imageEl&&0!==y.$imageEl.length)&&(y.$slideEl.addClass(""+w.zoomedSlideClass),void 0===x.touchesStart.x&&e?(t="touchend"===e.type?e.changedTouches[0].pageX:e.pageX,a="touchend"===e.type?e.changedTouches[0].pageY:e.pageY):(t=x.touchesStart.x,a=x.touchesStart.y),b.scale=y.$imageWrapEl.attr("data-swiper-zoom")||w.maxRatio,b.currentScale=y.$imageWrapEl.attr("data-swiper-zoom")||w.maxRatio,e?(f=y.$slideEl[0].offsetWidth,m=y.$slideEl[0].offsetHeight,i=y.$slideEl.offset().left+f/2-t,s=y.$slideEl.offset().top+m/2-a,o=y.$imageEl[0].offsetWidth,l=y.$imageEl[0].offsetHeight,d=o*b.scale,p=l*b.scale,h=-(c=Math.min(f/2-d/2,0)),v=-(u=Math.min(m/2-p/2,0)),(r=i*b.scale)<c&&(r=c),h<r&&(r=h),(n=s*b.scale)<u&&(n=u),v<n&&(n=v)):n=r=0,y.$imageWrapEl.transition(300).transform("translate3d("+r+"px, "+n+"px,0)"),y.$imageEl.transition(300).transform("translate3d(0,0,0) scale("+b.scale+")"))},out:function(){var e=this,t=e.zoom,a=e.params.zoom,i=t.gesture;i.$slideEl||(i.$slideEl=e.clickedSlide?L(e.clickedSlide):e.slides.eq(e.activeIndex),i.$imageEl=i.$slideEl.find("img, svg, canvas"),i.$imageWrapEl=i.$imageEl.parent("."+a.containerClass)),i.$imageEl&&0!==i.$imageEl.length&&(t.scale=1,t.currentScale=1,i.$imageWrapEl.transition(300).transform("translate3d(0,0,0)"),i.$imageEl.transition(300).transform("translate3d(0,0,0) scale(1)"),i.$slideEl.removeClass(""+a.zoomedSlideClass),i.$slideEl=void 0)},enable:function(){var e=this,t=e.zoom;if(!t.enabled){t.enabled=!0;var a=!("touchstart"!==e.touchEvents.start||!te.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1};te.gestures?(e.$wrapperEl.on("gesturestart",".swiper-slide",t.onGestureStart,a),e.$wrapperEl.on("gesturechange",".swiper-slide",t.onGestureChange,a),e.$wrapperEl.on("gestureend",".swiper-slide",t.onGestureEnd,a)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.on(e.touchEvents.start,".swiper-slide",t.onGestureStart,a),e.$wrapperEl.on(e.touchEvents.move,".swiper-slide",t.onGestureChange,a),e.$wrapperEl.on(e.touchEvents.end,".swiper-slide",t.onGestureEnd,a)),e.$wrapperEl.on(e.touchEvents.move,"."+e.params.zoom.containerClass,t.onTouchMove)}},disable:function(){var e=this,t=e.zoom;if(t.enabled){e.zoom.enabled=!1;var a=!("touchstart"!==e.touchEvents.start||!te.passiveListener||!e.params.passiveListeners)&&{passive:!0,capture:!1};te.gestures?(e.$wrapperEl.off("gesturestart",".swiper-slide",t.onGestureStart,a),e.$wrapperEl.off("gesturechange",".swiper-slide",t.onGestureChange,a),e.$wrapperEl.off("gestureend",".swiper-slide",t.onGestureEnd,a)):"touchstart"===e.touchEvents.start&&(e.$wrapperEl.off(e.touchEvents.start,".swiper-slide",t.onGestureStart,a),e.$wrapperEl.off(e.touchEvents.move,".swiper-slide",t.onGestureChange,a),e.$wrapperEl.off(e.touchEvents.end,".swiper-slide",t.onGestureEnd,a)),e.$wrapperEl.off(e.touchEvents.move,"."+e.params.zoom.containerClass,t.onTouchMove)}}},Y={loadInSlide:function(e,l){void 0===l&&(l=!0);var d=this,p=d.params.lazy;if(void 0!==e&&0!==d.slides.length){var c=d.virtual&&d.params.virtual.enabled?d.$wrapperEl.children("."+d.params.slideClass+'[data-swiper-slide-index="'+e+'"]'):d.slides.eq(e),t=c.find("."+p.elementClass+":not(."+p.loadedClass+"):not(."+p.loadingClass+")");!c.hasClass(p.elementClass)||c.hasClass(p.loadedClass)||c.hasClass(p.loadingClass)||(t=t.add(c[0])),0!==t.length&&t.each(function(e,t){var i=L(t);i.addClass(p.loadingClass);var s=i.attr("data-background"),r=i.attr("data-src"),n=i.attr("data-srcset"),o=i.attr("data-sizes");d.loadImage(i[0],r||s,n,o,!1,function(){if(null!=d&&d&&(!d||d.params)&&!d.destroyed){if(s?(i.css("background-image",'url("'+s+'")'),i.removeAttr("data-background")):(n&&(i.attr("srcset",n),i.removeAttr("data-srcset")),o&&(i.attr("sizes",o),i.removeAttr("data-sizes")),r&&(i.attr("src",r),i.removeAttr("data-src"))),i.addClass(p.loadedClass).removeClass(p.loadingClass),c.find("."+p.preloaderClass).remove(),d.params.loop&&l){var e=c.attr("data-swiper-slide-index");if(c.hasClass(d.params.slideDuplicateClass)){var t=d.$wrapperEl.children('[data-swiper-slide-index="'+e+'"]:not(.'+d.params.slideDuplicateClass+")");d.lazy.loadInSlide(t.index(),!1)}else{var a=d.$wrapperEl.children("."+d.params.slideDuplicateClass+'[data-swiper-slide-index="'+e+'"]');d.lazy.loadInSlide(a.index(),!1)}}d.emit("lazyImageReady",c[0],i[0])}}),d.emit("lazyImageLoad",c[0],i[0])})}},load:function(){var i=this,t=i.$wrapperEl,a=i.params,s=i.slides,e=i.activeIndex,r=i.virtual&&a.virtual.enabled,n=a.lazy,o=a.slidesPerView;function l(e){if(r){if(t.children("."+a.slideClass+'[data-swiper-slide-index="'+e+'"]').length)return!0}else if(s[e])return!0;return!1}function d(e){return r?L(e).attr("data-swiper-slide-index"):L(e).index()}if("auto"===o&&(o=0),i.lazy.initialImageLoaded||(i.lazy.initialImageLoaded=!0),i.params.watchSlidesVisibility)t.children("."+a.slideVisibleClass).each(function(e,t){var a=r?L(t).attr("data-swiper-slide-index"):L(t).index();i.lazy.loadInSlide(a)});else if(1<o)for(var p=e;p<e+o;p+=1)l(p)&&i.lazy.loadInSlide(p);else i.lazy.loadInSlide(e);if(n.loadPrevNext)if(1<o||n.loadPrevNextAmount&&1<n.loadPrevNextAmount){for(var c=n.loadPrevNextAmount,u=o,h=Math.min(e+u+Math.max(c,u),s.length),v=Math.max(e-Math.max(u,c),0),f=e+o;f<h;f+=1)l(f)&&i.lazy.loadInSlide(f);for(var m=v;m<e;m+=1)l(m)&&i.lazy.loadInSlide(m)}else{var g=t.children("."+a.slideNextClass);0<g.length&&i.lazy.loadInSlide(d(g));var b=t.children("."+a.slidePrevClass);0<b.length&&i.lazy.loadInSlide(d(b))}}},V={LinearSpline:function(e,t){var a,i,s,r,n,o=function(e,t){for(i=-1,a=e.length;1<a-i;)e[s=a+i>>1]<=t?i=s:a=s;return a};return this.x=e,this.y=t,this.lastIndex=e.length-1,this.interpolate=function(e){return e?(n=o(this.x,e),r=n-1,(e-this.x[r])*(this.y[n]-this.y[r])/(this.x[n]-this.x[r])+this.y[r]):0},this},getInterpolateFunction:function(e){var t=this;t.controller.spline||(t.controller.spline=t.params.loop?new V.LinearSpline(t.slidesGrid,e.slidesGrid):new V.LinearSpline(t.snapGrid,e.snapGrid))},setTranslate:function(e,t){var a,i,s=this,r=s.controller.control;function n(e){var t=s.rtlTranslate?-s.translate:s.translate;"slide"===s.params.controller.by&&(s.controller.getInterpolateFunction(e),i=-s.controller.spline.interpolate(-t)),i&&"container"!==s.params.controller.by||(a=(e.maxTranslate()-e.minTranslate())/(s.maxTranslate()-s.minTranslate()),i=(t-s.minTranslate())*a+e.minTranslate()),s.params.controller.inverse&&(i=e.maxTranslate()-i),e.updateProgress(i),e.setTranslate(i,s),e.updateActiveIndex(),e.updateSlidesClasses()}if(Array.isArray(r))for(var o=0;o<r.length;o+=1)r[o]!==t&&r[o]instanceof T&&n(r[o]);else r instanceof T&&t!==r&&n(r)},setTransition:function(t,e){var a,i=this,s=i.controller.control;function r(e){e.setTransition(t,i),0!==t&&(e.transitionStart(),e.params.autoHeight&&ee.nextTick(function(){e.updateAutoHeight()}),e.$wrapperEl.transitionEnd(function(){s&&(e.params.loop&&"slide"===i.params.controller.by&&e.loopFix(),e.transitionEnd())}))}if(Array.isArray(s))for(a=0;a<s.length;a+=1)s[a]!==e&&s[a]instanceof T&&r(s[a]);else s instanceof T&&e!==s&&r(s)}},F={makeElFocusable:function(e){return e.attr("tabIndex","0"),e},addElRole:function(e,t){return e.attr("role",t),e},addElLabel:function(e,t){return e.attr("aria-label",t),e},disableEl:function(e){return e.attr("aria-disabled",!0),e},enableEl:function(e){return e.attr("aria-disabled",!1),e},onEnterKey:function(e){var t=this,a=t.params.a11y;if(13===e.keyCode){var i=L(e.target);t.navigation&&t.navigation.$nextEl&&i.is(t.navigation.$nextEl)&&(t.isEnd&&!t.params.loop||t.slideNext(),t.isEnd?t.a11y.notify(a.lastSlideMessage):t.a11y.notify(a.nextSlideMessage)),t.navigation&&t.navigation.$prevEl&&i.is(t.navigation.$prevEl)&&(t.isBeginning&&!t.params.loop||t.slidePrev(),t.isBeginning?t.a11y.notify(a.firstSlideMessage):t.a11y.notify(a.prevSlideMessage)),t.pagination&&i.is("."+t.params.pagination.bulletClass)&&i[0].click()}},notify:function(e){var t=this.a11y.liveRegion;0!==t.length&&(t.html(""),t.html(e))},updateNavigation:function(){var e=this;if(!e.params.loop){var t=e.navigation,a=t.$nextEl,i=t.$prevEl;i&&0<i.length&&(e.isBeginning?e.a11y.disableEl(i):e.a11y.enableEl(i)),a&&0<a.length&&(e.isEnd?e.a11y.disableEl(a):e.a11y.enableEl(a))}},updatePagination:function(){var i=this,s=i.params.a11y;i.pagination&&i.params.pagination.clickable&&i.pagination.bullets&&i.pagination.bullets.length&&i.pagination.bullets.each(function(e,t){var a=L(t);i.a11y.makeElFocusable(a),i.a11y.addElRole(a,"button"),i.a11y.addElLabel(a,s.paginationBulletMessage.replace(/{{index}}/,a.index()+1))})},init:function(){var e=this;e.$el.append(e.a11y.liveRegion);var t,a,i=e.params.a11y;e.navigation&&e.navigation.$nextEl&&(t=e.navigation.$nextEl),e.navigation&&e.navigation.$prevEl&&(a=e.navigation.$prevEl),t&&(e.a11y.makeElFocusable(t),e.a11y.addElRole(t,"button"),e.a11y.addElLabel(t,i.nextSlideMessage),t.on("keydown",e.a11y.onEnterKey)),a&&(e.a11y.makeElFocusable(a),e.a11y.addElRole(a,"button"),e.a11y.addElLabel(a,i.prevSlideMessage),a.on("keydown",e.a11y.onEnterKey)),e.pagination&&e.params.pagination.clickable&&e.pagination.bullets&&e.pagination.bullets.length&&e.pagination.$el.on("keydown","."+e.params.pagination.bulletClass,e.a11y.onEnterKey)},destroy:function(){var e,t,a=this;a.a11y.liveRegion&&0<a.a11y.liveRegion.length&&a.a11y.liveRegion.remove(),a.navigation&&a.navigation.$nextEl&&(e=a.navigation.$nextEl),a.navigation&&a.navigation.$prevEl&&(t=a.navigation.$prevEl),e&&e.off("keydown",a.a11y.onEnterKey),t&&t.off("keydown",a.a11y.onEnterKey),a.pagination&&a.params.pagination.clickable&&a.pagination.bullets&&a.pagination.bullets.length&&a.pagination.$el.off("keydown","."+a.params.pagination.bulletClass,a.a11y.onEnterKey)}},R={init:function(){var e=this;if(e.params.history){if(!J.history||!J.history.pushState)return e.params.history.enabled=!1,void(e.params.hashNavigation.enabled=!0);var t=e.history;t.initialized=!0,t.paths=R.getPathValues(),(t.paths.key||t.paths.value)&&(t.scrollToSlide(0,t.paths.value,e.params.runCallbacksOnInit),e.params.history.replaceState||J.addEventListener("popstate",e.history.setHistoryPopState))}},destroy:function(){this.params.history.replaceState||J.removeEventListener("popstate",this.history.setHistoryPopState)},setHistoryPopState:function(){this.history.paths=R.getPathValues(),this.history.scrollToSlide(this.params.speed,this.history.paths.value,!1)},getPathValues:function(){var e=J.location.pathname.slice(1).split("/").filter(function(e){return""!==e}),t=e.length;return{key:e[t-2],value:e[t-1]}},setHistory:function(e,t){if(this.history.initialized&&this.params.history.enabled){var a=this.slides.eq(t),i=R.slugify(a.attr("data-history"));J.location.pathname.includes(e)||(i=e+"/"+i);var s=J.history.state;s&&s.value===i||(this.params.history.replaceState?J.history.replaceState({value:i},null,i):J.history.pushState({value:i},null,i))}},slugify:function(e){return e.toString().replace(/\s+/g,"-").replace(/[^\w-]+/g,"").replace(/--+/g,"-").replace(/^-+/,"").replace(/-+$/,"")},scrollToSlide:function(e,t,a){var i=this;if(t)for(var s=0,r=i.slides.length;s<r;s+=1){var n=i.slides.eq(s);if(R.slugify(n.attr("data-history"))===t&&!n.hasClass(i.params.slideDuplicateClass)){var o=n.index();i.slideTo(o,e,a)}}else i.slideTo(0,e,a)}},q={onHashCange:function(){var e=this,t=f.location.hash.replace("#","");if(t!==e.slides.eq(e.activeIndex).attr("data-hash")){var a=e.$wrapperEl.children("."+e.params.slideClass+'[data-hash="'+t+'"]').index();if(void 0===a)return;e.slideTo(a)}},setHash:function(){var e=this;if(e.hashNavigation.initialized&&e.params.hashNavigation.enabled)if(e.params.hashNavigation.replaceState&&J.history&&J.history.replaceState)J.history.replaceState(null,null,"#"+e.slides.eq(e.activeIndex).attr("data-hash")||"");else{var t=e.slides.eq(e.activeIndex),a=t.attr("data-hash")||t.attr("data-history");f.location.hash=a||""}},init:function(){var e=this;if(!(!e.params.hashNavigation.enabled||e.params.history&&e.params.history.enabled)){e.hashNavigation.initialized=!0;var t=f.location.hash.replace("#","");if(t)for(var a=0,i=e.slides.length;a<i;a+=1){var s=e.slides.eq(a);if((s.attr("data-hash")||s.attr("data-history"))===t&&!s.hasClass(e.params.slideDuplicateClass)){var r=s.index();e.slideTo(r,0,e.params.runCallbacksOnInit,!0)}}e.params.hashNavigation.watchState&&L(J).on("hashchange",e.hashNavigation.onHashCange)}},destroy:function(){this.params.hashNavigation.watchState&&L(J).off("hashchange",this.hashNavigation.onHashCange)}},W={run:function(){var e=this,t=e.slides.eq(e.activeIndex),a=e.params.autoplay.delay;t.attr("data-swiper-autoplay")&&(a=t.attr("data-swiper-autoplay")||e.params.autoplay.delay),e.autoplay.timeout=ee.nextTick(function(){e.params.autoplay.reverseDirection?e.params.loop?(e.loopFix(),e.slidePrev(e.params.speed,!0,!0),e.emit("autoplay")):e.isBeginning?e.params.autoplay.stopOnLastSlide?e.autoplay.stop():(e.slideTo(e.slides.length-1,e.params.speed,!0,!0),e.emit("autoplay")):(e.slidePrev(e.params.speed,!0,!0),e.emit("autoplay")):e.params.loop?(e.loopFix(),e.slideNext(e.params.speed,!0,!0),e.emit("autoplay")):e.isEnd?e.params.autoplay.stopOnLastSlide?e.autoplay.stop():(e.slideTo(0,e.params.speed,!0,!0),e.emit("autoplay")):(e.slideNext(e.params.speed,!0,!0),e.emit("autoplay"))},a)},start:function(){var e=this;return void 0===e.autoplay.timeout&&(!e.autoplay.running&&(e.autoplay.running=!0,e.emit("autoplayStart"),e.autoplay.run(),!0))},stop:function(){var e=this;return!!e.autoplay.running&&(void 0!==e.autoplay.timeout&&(e.autoplay.timeout&&(clearTimeout(e.autoplay.timeout),e.autoplay.timeout=void 0),e.autoplay.running=!1,e.emit("autoplayStop"),!0))},pause:function(e){var t=this;t.autoplay.running&&(t.autoplay.paused||(t.autoplay.timeout&&clearTimeout(t.autoplay.timeout),t.autoplay.paused=!0,0!==e&&t.params.autoplay.waitForTransition?(t.$wrapperEl[0].addEventListener("transitionend",t.autoplay.onTransitionEnd),t.$wrapperEl[0].addEventListener("webkitTransitionEnd",t.autoplay.onTransitionEnd)):(t.autoplay.paused=!1,t.autoplay.run())))}},j={setTranslate:function(){for(var e=this,t=e.slides,a=0;a<t.length;a+=1){var i=e.slides.eq(a),s=-i[0].swiperSlideOffset;e.params.virtualTranslate||(s-=e.translate);var r=0;e.isHorizontal()||(r=s,s=0);var n=e.params.fadeEffect.crossFade?Math.max(1-Math.abs(i[0].progress),0):1+Math.min(Math.max(i[0].progress,-1),0);i.css({opacity:n}).transform("translate3d("+s+"px, "+r+"px, 0px)")}},setTransition:function(e){var a=this,t=a.slides,i=a.$wrapperEl;if(t.transition(e),a.params.virtualTranslate&&0!==e){var s=!1;t.transitionEnd(function(){if(!s&&a&&!a.destroyed){s=!0,a.animating=!1;for(var e=["webkitTransitionEnd","transitionend"],t=0;t<e.length;t+=1)i.trigger(e[t])}})}}},U={setTranslate:function(){var e,t=this,a=t.$el,i=t.$wrapperEl,s=t.slides,r=t.width,n=t.height,o=t.rtlTranslate,l=t.size,d=t.params.cubeEffect,p=t.isHorizontal(),c=t.virtual&&t.params.virtual.enabled,u=0;d.shadow&&(p?(0===(e=i.find(".swiper-cube-shadow")).length&&(e=L('<div class="swiper-cube-shadow"></div>'),i.append(e)),e.css({height:r+"px"})):0===(e=a.find(".swiper-cube-shadow")).length&&(e=L('<div class="swiper-cube-shadow"></div>'),a.append(e)));for(var h=0;h<s.length;h+=1){var v=s.eq(h),f=h;c&&(f=parseInt(v.attr("data-swiper-slide-index"),10));var m=90*f,g=Math.floor(m/360);o&&(m=-m,g=Math.floor(-m/360));var b=Math.max(Math.min(v[0].progress,1),-1),w=0,y=0,x=0;f%4==0?(w=4*-g*l,x=0):(f-1)%4==0?(w=0,x=4*-g*l):(f-2)%4==0?(w=l+4*g*l,x=l):(f-3)%4==0&&(w=-l,x=3*l+4*l*g),o&&(w=-w),p||(y=w,w=0);var T="rotateX("+(p?0:-m)+"deg) rotateY("+(p?m:0)+"deg) translate3d("+w+"px, "+y+"px, "+x+"px)";if(b<=1&&-1<b&&(u=90*f+90*b,o&&(u=90*-f-90*b)),v.transform(T),d.slideShadows){var E=p?v.find(".swiper-slide-shadow-left"):v.find(".swiper-slide-shadow-top"),S=p?v.find(".swiper-slide-shadow-right"):v.find(".swiper-slide-shadow-bottom");0===E.length&&(E=L('<div class="swiper-slide-shadow-'+(p?"left":"top")+'"></div>'),v.append(E)),0===S.length&&(S=L('<div class="swiper-slide-shadow-'+(p?"right":"bottom")+'"></div>'),v.append(S)),E.length&&(E[0].style.opacity=Math.max(-b,0)),S.length&&(S[0].style.opacity=Math.max(b,0))}}if(i.css({"-webkit-transform-origin":"50% 50% -"+l/2+"px","-moz-transform-origin":"50% 50% -"+l/2+"px","-ms-transform-origin":"50% 50% -"+l/2+"px","transform-origin":"50% 50% -"+l/2+"px"}),d.shadow)if(p)e.transform("translate3d(0px, "+(r/2+d.shadowOffset)+"px, "+-r/2+"px) rotateX(90deg) rotateZ(0deg) scale("+d.shadowScale+")");else{var C=Math.abs(u)-90*Math.floor(Math.abs(u)/90),M=1.5-(Math.sin(2*C*Math.PI/360)/2+Math.cos(2*C*Math.PI/360)/2),z=d.shadowScale,P=d.shadowScale/M,k=d.shadowOffset;e.transform("scale3d("+z+", 1, "+P+") translate3d(0px, "+(n/2+k)+"px, "+-n/2/P+"px) rotateX(-90deg)")}var $=I.isSafari||I.isUiWebView?-l/2:0;i.transform("translate3d(0px,0,"+$+"px) rotateX("+(t.isHorizontal()?0:u)+"deg) rotateY("+(t.isHorizontal()?-u:0)+"deg)")},setTransition:function(e){var t=this.$el;this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),this.params.cubeEffect.shadow&&!this.isHorizontal()&&t.find(".swiper-cube-shadow").transition(e)}},K={setTranslate:function(){for(var e=this,t=e.slides,a=e.rtlTranslate,i=0;i<t.length;i+=1){var s=t.eq(i),r=s[0].progress;e.params.flipEffect.limitRotation&&(r=Math.max(Math.min(s[0].progress,1),-1));var n=-180*r,o=0,l=-s[0].swiperSlideOffset,d=0;if(e.isHorizontal()?a&&(n=-n):(d=l,o=-n,n=l=0),s[0].style.zIndex=-Math.abs(Math.round(r))+t.length,e.params.flipEffect.slideShadows){var p=e.isHorizontal()?s.find(".swiper-slide-shadow-left"):s.find(".swiper-slide-shadow-top"),c=e.isHorizontal()?s.find(".swiper-slide-shadow-right"):s.find(".swiper-slide-shadow-bottom");0===p.length&&(p=L('<div class="swiper-slide-shadow-'+(e.isHorizontal()?"left":"top")+'"></div>'),s.append(p)),0===c.length&&(c=L('<div class="swiper-slide-shadow-'+(e.isHorizontal()?"right":"bottom")+'"></div>'),s.append(c)),p.length&&(p[0].style.opacity=Math.max(-r,0)),c.length&&(c[0].style.opacity=Math.max(r,0))}s.transform("translate3d("+l+"px, "+d+"px, 0px) rotateX("+o+"deg) rotateY("+n+"deg)")}},setTransition:function(e){var a=this,t=a.slides,i=a.activeIndex,s=a.$wrapperEl;if(t.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e),a.params.virtualTranslate&&0!==e){var r=!1;t.eq(i).transitionEnd(function(){if(!r&&a&&!a.destroyed){r=!0,a.animating=!1;for(var e=["webkitTransitionEnd","transitionend"],t=0;t<e.length;t+=1)s.trigger(e[t])}})}}},_={setTranslate:function(){for(var e=this,t=e.width,a=e.height,i=e.slides,s=e.$wrapperEl,r=e.slidesSizesGrid,n=e.params.coverflowEffect,o=e.isHorizontal(),l=e.translate,d=o?t/2-l:a/2-l,p=o?n.rotate:-n.rotate,c=n.depth,u=0,h=i.length;u<h;u+=1){var v=i.eq(u),f=r[u],m=(d-v[0].swiperSlideOffset-f/2)/f*n.modifier,g=o?p*m:0,b=o?0:p*m,w=-c*Math.abs(m),y=o?0:n.stretch*m,x=o?n.stretch*m:0;Math.abs(x)<.001&&(x=0),Math.abs(y)<.001&&(y=0),Math.abs(w)<.001&&(w=0),Math.abs(g)<.001&&(g=0),Math.abs(b)<.001&&(b=0);var T="translate3d("+x+"px,"+y+"px,"+w+"px)  rotateX("+b+"deg) rotateY("+g+"deg)";if(v.transform(T),v[0].style.zIndex=1-Math.abs(Math.round(m)),n.slideShadows){var E=o?v.find(".swiper-slide-shadow-left"):v.find(".swiper-slide-shadow-top"),S=o?v.find(".swiper-slide-shadow-right"):v.find(".swiper-slide-shadow-bottom");0===E.length&&(E=L('<div class="swiper-slide-shadow-'+(o?"left":"top")+'"></div>'),v.append(E)),0===S.length&&(S=L('<div class="swiper-slide-shadow-'+(o?"right":"bottom")+'"></div>'),v.append(S)),E.length&&(E[0].style.opacity=0<m?m:0),S.length&&(S[0].style.opacity=0<-m?-m:0)}}(te.pointerEvents||te.prefixedPointerEvents)&&(s[0].style.perspectiveOrigin=d+"px 50%")},setTransition:function(e){this.slides.transition(e).find(".swiper-slide-shadow-top, .swiper-slide-shadow-right, .swiper-slide-shadow-bottom, .swiper-slide-shadow-left").transition(e)}},Z={init:function(){var e=this,t=e.params.thumbs,a=e.constructor;t.swiper instanceof a?(e.thumbs.swiper=t.swiper,ee.extend(e.thumbs.swiper.originalParams,{watchSlidesProgress:!0,slideToClickedSlide:!1}),ee.extend(e.thumbs.swiper.params,{watchSlidesProgress:!0,slideToClickedSlide:!1})):ee.isObject(t.swiper)&&(e.thumbs.swiper=new a(ee.extend({},t.swiper,{watchSlidesVisibility:!0,watchSlidesProgress:!0,slideToClickedSlide:!1})),e.thumbs.swiperCreated=!0),e.thumbs.swiper.$el.addClass(e.params.thumbs.thumbsContainerClass),e.thumbs.swiper.on("tap",e.thumbs.onThumbClick)},onThumbClick:function(){var e=this,t=e.thumbs.swiper;if(t){var a=t.clickedIndex,i=t.clickedSlide;if(!(i&&L(i).hasClass(e.params.thumbs.slideThumbActiveClass)||null==a)){var s;if(s=t.params.loop?parseInt(L(t.clickedSlide).attr("data-swiper-slide-index"),10):a,e.params.loop){var r=e.activeIndex;e.slides.eq(r).hasClass(e.params.slideDuplicateClass)&&(e.loopFix(),e._clientLeft=e.$wrapperEl[0].clientLeft,r=e.activeIndex);var n=e.slides.eq(r).prevAll('[data-swiper-slide-index="'+s+'"]').eq(0).index(),o=e.slides.eq(r).nextAll('[data-swiper-slide-index="'+s+'"]').eq(0).index();s=void 0===n?o:void 0===o?n:o-r<r-n?o:n}e.slideTo(s)}}},update:function(e){var t=this,a=t.thumbs.swiper;if(a){var i="auto"===a.params.slidesPerView?a.slidesPerViewDynamic():a.params.slidesPerView;if(t.realIndex!==a.realIndex){var s,r=a.activeIndex;if(a.params.loop){a.slides.eq(r).hasClass(a.params.slideDuplicateClass)&&(a.loopFix(),a._clientLeft=a.$wrapperEl[0].clientLeft,r=a.activeIndex);var n=a.slides.eq(r).prevAll('[data-swiper-slide-index="'+t.realIndex+'"]').eq(0).index(),o=a.slides.eq(r).nextAll('[data-swiper-slide-index="'+t.realIndex+'"]').eq(0).index();s=void 0===n?o:void 0===o?n:o-r==r-n?r:o-r<r-n?o:n}else s=t.realIndex;a.visibleSlidesIndexes.indexOf(s)<0&&(a.params.centeredSlides?s=r<s?s-Math.floor(i/2)+1:s+Math.floor(i/2)-1:r<s&&(s=s-i+1),a.slideTo(s,e?0:void 0))}var l=1,d=t.params.thumbs.slideThumbActiveClass;if(1<t.params.slidesPerView&&!t.params.centeredSlides&&(l=t.params.slidesPerView),a.slides.removeClass(d),a.params.loop)for(var p=0;p<l;p+=1)a.$wrapperEl.children('[data-swiper-slide-index="'+(t.realIndex+p)+'"]').addClass(d);else for(var c=0;c<l;c+=1)a.slides.eq(t.realIndex+c).addClass(d)}}},Q=[E,S,C,M,P,$,O,{name:"mousewheel",params:{mousewheel:{enabled:!1,releaseOnEdges:!1,invert:!1,forceToAxis:!1,sensitivity:1,eventsTarged:"container"}},create:function(){var e=this;ee.extend(e,{mousewheel:{enabled:!1,enable:A.enable.bind(e),disable:A.disable.bind(e),handle:A.handle.bind(e),handleMouseEnter:A.handleMouseEnter.bind(e),handleMouseLeave:A.handleMouseLeave.bind(e),lastScrollTime:ee.now()}})},on:{init:function(){this.params.mousewheel.enabled&&this.mousewheel.enable()},destroy:function(){this.mousewheel.enabled&&this.mousewheel.disable()}}},{name:"navigation",params:{navigation:{nextEl:null,prevEl:null,hideOnClick:!1,disabledClass:"swiper-button-disabled",hiddenClass:"swiper-button-hidden",lockClass:"swiper-button-lock"}},create:function(){var e=this;ee.extend(e,{navigation:{init:H.init.bind(e),update:H.update.bind(e),destroy:H.destroy.bind(e),onNextClick:H.onNextClick.bind(e),onPrevClick:H.onPrevClick.bind(e)}})},on:{init:function(){this.navigation.init(),this.navigation.update()},toEdge:function(){this.navigation.update()},fromEdge:function(){this.navigation.update()},destroy:function(){this.navigation.destroy()},click:function(e){var t,a=this,i=a.navigation,s=i.$nextEl,r=i.$prevEl;!a.params.navigation.hideOnClick||L(e.target).is(r)||L(e.target).is(s)||(s?t=s.hasClass(a.params.navigation.hiddenClass):r&&(t=r.hasClass(a.params.navigation.hiddenClass)),!0===t?a.emit("navigationShow",a):a.emit("navigationHide",a),s&&s.toggleClass(a.params.navigation.hiddenClass),r&&r.toggleClass(a.params.navigation.hiddenClass))}}},{name:"pagination",params:{pagination:{el:null,bulletElement:"span",clickable:!1,hideOnClick:!1,renderBullet:null,renderProgressbar:null,renderFraction:null,renderCustom:null,progressbarOpposite:!1,type:"bullets",dynamicBullets:!1,dynamicMainBullets:1,formatFractionCurrent:function(e){return e},formatFractionTotal:function(e){return e},bulletClass:"swiper-pagination-bullet",bulletActiveClass:"swiper-pagination-bullet-active",modifierClass:"swiper-pagination-",currentClass:"swiper-pagination-current",totalClass:"swiper-pagination-total",hiddenClass:"swiper-pagination-hidden",progressbarFillClass:"swiper-pagination-progressbar-fill",progressbarOppositeClass:"swiper-pagination-progressbar-opposite",clickableClass:"swiper-pagination-clickable",lockClass:"swiper-pagination-lock"}},create:function(){var e=this;ee.extend(e,{pagination:{init:N.init.bind(e),render:N.render.bind(e),update:N.update.bind(e),destroy:N.destroy.bind(e),dynamicBulletIndex:0}})},on:{init:function(){this.pagination.init(),this.pagination.render(),this.pagination.update()},activeIndexChange:function(){this.params.loop?this.pagination.update():void 0===this.snapIndex&&this.pagination.update()},snapIndexChange:function(){this.params.loop||this.pagination.update()},slidesLengthChange:function(){this.params.loop&&(this.pagination.render(),this.pagination.update())},snapGridLengthChange:function(){this.params.loop||(this.pagination.render(),this.pagination.update())},destroy:function(){this.pagination.destroy()},click:function(e){var t=this;t.params.pagination.el&&t.params.pagination.hideOnClick&&0<t.pagination.$el.length&&!L(e.target).hasClass(t.params.pagination.bulletClass)&&(!0===t.pagination.$el.hasClass(t.params.pagination.hiddenClass)?t.emit("paginationShow",t):t.emit("paginationHide",t),t.pagination.$el.toggleClass(t.params.pagination.hiddenClass))}}},{name:"scrollbar",params:{scrollbar:{el:null,dragSize:"auto",hide:!1,draggable:!1,snapOnRelease:!0,lockClass:"swiper-scrollbar-lock",dragClass:"swiper-scrollbar-drag"}},create:function(){var e=this;ee.extend(e,{scrollbar:{init:G.init.bind(e),destroy:G.destroy.bind(e),updateSize:G.updateSize.bind(e),setTranslate:G.setTranslate.bind(e),setTransition:G.setTransition.bind(e),enableDraggable:G.enableDraggable.bind(e),disableDraggable:G.disableDraggable.bind(e),setDragPosition:G.setDragPosition.bind(e),onDragStart:G.onDragStart.bind(e),onDragMove:G.onDragMove.bind(e),onDragEnd:G.onDragEnd.bind(e),isTouched:!1,timeout:null,dragTimeout:null}})},on:{init:function(){this.scrollbar.init(),this.scrollbar.updateSize(),this.scrollbar.setTranslate()},update:function(){this.scrollbar.updateSize()},resize:function(){this.scrollbar.updateSize()},observerUpdate:function(){this.scrollbar.updateSize()},setTranslate:function(){this.scrollbar.setTranslate()},setTransition:function(e){this.scrollbar.setTransition(e)},destroy:function(){this.scrollbar.destroy()}}},{name:"parallax",params:{parallax:{enabled:!1}},create:function(){ee.extend(this,{parallax:{setTransform:B.setTransform.bind(this),setTranslate:B.setTranslate.bind(this),setTransition:B.setTransition.bind(this)}})},on:{beforeInit:function(){this.params.parallax.enabled&&(this.params.watchSlidesProgress=!0,this.originalParams.watchSlidesProgress=!0)},init:function(){this.params.parallax.enabled&&this.parallax.setTranslate()},setTranslate:function(){this.params.parallax.enabled&&this.parallax.setTranslate()},setTransition:function(e){this.params.parallax.enabled&&this.parallax.setTransition(e)}}},{name:"zoom",params:{zoom:{enabled:!1,maxRatio:3,minRatio:1,toggle:!0,containerClass:"swiper-zoom-container",zoomedSlideClass:"swiper-slide-zoomed"}},create:function(){var i=this,t={enabled:!1,scale:1,currentScale:1,isScaling:!1,gesture:{$slideEl:void 0,slideWidth:void 0,slideHeight:void 0,$imageEl:void 0,$imageWrapEl:void 0,maxRatio:3},image:{isTouched:void 0,isMoved:void 0,currentX:void 0,currentY:void 0,minX:void 0,minY:void 0,maxX:void 0,maxY:void 0,width:void 0,height:void 0,startX:void 0,startY:void 0,touchesStart:{},touchesCurrent:{}},velocity:{x:void 0,y:void 0,prevPositionX:void 0,prevPositionY:void 0,prevTime:void 0}};"onGestureStart onGestureChange onGestureEnd onTouchStart onTouchMove onTouchEnd onTransitionEnd toggle enable disable in out".split(" ").forEach(function(e){t[e]=X[e].bind(i)}),ee.extend(i,{zoom:t});var s=1;Object.defineProperty(i.zoom,"scale",{get:function(){return s},set:function(e){if(s!==e){var t=i.zoom.gesture.$imageEl?i.zoom.gesture.$imageEl[0]:void 0,a=i.zoom.gesture.$slideEl?i.zoom.gesture.$slideEl[0]:void 0;i.emit("zoomChange",e,t,a)}s=e}})},on:{init:function(){this.params.zoom.enabled&&this.zoom.enable()},destroy:function(){this.zoom.disable()},touchStart:function(e){this.zoom.enabled&&this.zoom.onTouchStart(e)},touchEnd:function(e){this.zoom.enabled&&this.zoom.onTouchEnd(e)},doubleTap:function(e){this.params.zoom.enabled&&this.zoom.enabled&&this.params.zoom.toggle&&this.zoom.toggle(e)},transitionEnd:function(){this.zoom.enabled&&this.params.zoom.enabled&&this.zoom.onTransitionEnd()}}},{name:"lazy",params:{lazy:{enabled:!1,loadPrevNext:!1,loadPrevNextAmount:1,loadOnTransitionStart:!1,elementClass:"swiper-lazy",loadingClass:"swiper-lazy-loading",loadedClass:"swiper-lazy-loaded",preloaderClass:"swiper-lazy-preloader"}},create:function(){ee.extend(this,{lazy:{initialImageLoaded:!1,load:Y.load.bind(this),loadInSlide:Y.loadInSlide.bind(this)}})},on:{beforeInit:function(){this.params.lazy.enabled&&this.params.preloadImages&&(this.params.preloadImages=!1)},init:function(){this.params.lazy.enabled&&!this.params.loop&&0===this.params.initialSlide&&this.lazy.load()},scroll:function(){this.params.freeMode&&!this.params.freeModeSticky&&this.lazy.load()},resize:function(){this.params.lazy.enabled&&this.lazy.load()},scrollbarDragMove:function(){this.params.lazy.enabled&&this.lazy.load()},transitionStart:function(){var e=this;e.params.lazy.enabled&&(e.params.lazy.loadOnTransitionStart||!e.params.lazy.loadOnTransitionStart&&!e.lazy.initialImageLoaded)&&e.lazy.load()},transitionEnd:function(){this.params.lazy.enabled&&!this.params.lazy.loadOnTransitionStart&&this.lazy.load()}}},{name:"controller",params:{controller:{control:void 0,inverse:!1,by:"slide"}},create:function(){var e=this;ee.extend(e,{controller:{control:e.params.controller.control,getInterpolateFunction:V.getInterpolateFunction.bind(e),setTranslate:V.setTranslate.bind(e),setTransition:V.setTransition.bind(e)}})},on:{update:function(){this.controller.control&&this.controller.spline&&(this.controller.spline=void 0,delete this.controller.spline)},resize:function(){this.controller.control&&this.controller.spline&&(this.controller.spline=void 0,delete this.controller.spline)},observerUpdate:function(){this.controller.control&&this.controller.spline&&(this.controller.spline=void 0,delete this.controller.spline)},setTranslate:function(e,t){this.controller.control&&this.controller.setTranslate(e,t)},setTransition:function(e,t){this.controller.control&&this.controller.setTransition(e,t)}}},{name:"a11y",params:{a11y:{enabled:!0,notificationClass:"swiper-notification",prevSlideMessage:"Previous slide",nextSlideMessage:"Next slide",firstSlideMessage:"This is the first slide",lastSlideMessage:"This is the last slide",paginationBulletMessage:"Go to slide {{index}}"}},create:function(){var t=this;ee.extend(t,{a11y:{liveRegion:L('<span class="'+t.params.a11y.notificationClass+'" aria-live="assertive" aria-atomic="true"></span>')}}),Object.keys(F).forEach(function(e){t.a11y[e]=F[e].bind(t)})},on:{init:function(){this.params.a11y.enabled&&(this.a11y.init(),this.a11y.updateNavigation())},toEdge:function(){this.params.a11y.enabled&&this.a11y.updateNavigation()},fromEdge:function(){this.params.a11y.enabled&&this.a11y.updateNavigation()},paginationUpdate:function(){this.params.a11y.enabled&&this.a11y.updatePagination()},destroy:function(){this.params.a11y.enabled&&this.a11y.destroy()}}},{name:"history",params:{history:{enabled:!1,replaceState:!1,key:"slides"}},create:function(){var e=this;ee.extend(e,{history:{init:R.init.bind(e),setHistory:R.setHistory.bind(e),setHistoryPopState:R.setHistoryPopState.bind(e),scrollToSlide:R.scrollToSlide.bind(e),destroy:R.destroy.bind(e)}})},on:{init:function(){this.params.history.enabled&&this.history.init()},destroy:function(){this.params.history.enabled&&this.history.destroy()},transitionEnd:function(){this.history.initialized&&this.history.setHistory(this.params.history.key,this.activeIndex)}}},{name:"hash-navigation",params:{hashNavigation:{enabled:!1,replaceState:!1,watchState:!1}},create:function(){var e=this;ee.extend(e,{hashNavigation:{initialized:!1,init:q.init.bind(e),destroy:q.destroy.bind(e),setHash:q.setHash.bind(e),onHashCange:q.onHashCange.bind(e)}})},on:{init:function(){this.params.hashNavigation.enabled&&this.hashNavigation.init()},destroy:function(){this.params.hashNavigation.enabled&&this.hashNavigation.destroy()},transitionEnd:function(){this.hashNavigation.initialized&&this.hashNavigation.setHash()}}},{name:"autoplay",params:{autoplay:{enabled:!1,delay:3e3,waitForTransition:!0,disableOnInteraction:!0,stopOnLastSlide:!1,reverseDirection:!1}},create:function(){var t=this;ee.extend(t,{autoplay:{running:!1,paused:!1,run:W.run.bind(t),start:W.start.bind(t),stop:W.stop.bind(t),pause:W.pause.bind(t),onTransitionEnd:function(e){t&&!t.destroyed&&t.$wrapperEl&&e.target===this&&(t.$wrapperEl[0].removeEventListener("transitionend",t.autoplay.onTransitionEnd),t.$wrapperEl[0].removeEventListener("webkitTransitionEnd",t.autoplay.onTransitionEnd),t.autoplay.paused=!1,t.autoplay.running?t.autoplay.run():t.autoplay.stop())}}})},on:{init:function(){this.params.autoplay.enabled&&this.autoplay.start()},beforeTransitionStart:function(e,t){this.autoplay.running&&(t||!this.params.autoplay.disableOnInteraction?this.autoplay.pause(e):this.autoplay.stop())},sliderFirstMove:function(){this.autoplay.running&&(this.params.autoplay.disableOnInteraction?this.autoplay.stop():this.autoplay.pause())},destroy:function(){this.autoplay.running&&this.autoplay.stop()}}},{name:"effect-fade",params:{fadeEffect:{crossFade:!1}},create:function(){ee.extend(this,{fadeEffect:{setTranslate:j.setTranslate.bind(this),setTransition:j.setTransition.bind(this)}})},on:{beforeInit:function(){var e=this;if("fade"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"fade");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};ee.extend(e.params,t),ee.extend(e.originalParams,t)}},setTranslate:function(){"fade"===this.params.effect&&this.fadeEffect.setTranslate()},setTransition:function(e){"fade"===this.params.effect&&this.fadeEffect.setTransition(e)}}},{name:"effect-cube",params:{cubeEffect:{slideShadows:!0,shadow:!0,shadowOffset:20,shadowScale:.94}},create:function(){ee.extend(this,{cubeEffect:{setTranslate:U.setTranslate.bind(this),setTransition:U.setTransition.bind(this)}})},on:{beforeInit:function(){var e=this;if("cube"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"cube"),e.classNames.push(e.params.containerModifierClass+"3d");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,resistanceRatio:0,spaceBetween:0,centeredSlides:!1,virtualTranslate:!0};ee.extend(e.params,t),ee.extend(e.originalParams,t)}},setTranslate:function(){"cube"===this.params.effect&&this.cubeEffect.setTranslate()},setTransition:function(e){"cube"===this.params.effect&&this.cubeEffect.setTransition(e)}}},{name:"effect-flip",params:{flipEffect:{slideShadows:!0,limitRotation:!0}},create:function(){ee.extend(this,{flipEffect:{setTranslate:K.setTranslate.bind(this),setTransition:K.setTransition.bind(this)}})},on:{beforeInit:function(){var e=this;if("flip"===e.params.effect){e.classNames.push(e.params.containerModifierClass+"flip"),e.classNames.push(e.params.containerModifierClass+"3d");var t={slidesPerView:1,slidesPerColumn:1,slidesPerGroup:1,watchSlidesProgress:!0,spaceBetween:0,virtualTranslate:!0};ee.extend(e.params,t),ee.extend(e.originalParams,t)}},setTranslate:function(){"flip"===this.params.effect&&this.flipEffect.setTranslate()},setTransition:function(e){"flip"===this.params.effect&&this.flipEffect.setTransition(e)}}},{name:"effect-coverflow",params:{coverflowEffect:{rotate:50,stretch:0,depth:100,modifier:1,slideShadows:!0}},create:function(){ee.extend(this,{coverflowEffect:{setTranslate:_.setTranslate.bind(this),setTransition:_.setTransition.bind(this)}})},on:{beforeInit:function(){var e=this;"coverflow"===e.params.effect&&(e.classNames.push(e.params.containerModifierClass+"coverflow"),e.classNames.push(e.params.containerModifierClass+"3d"),e.params.watchSlidesProgress=!0,e.originalParams.watchSlidesProgress=!0)},setTranslate:function(){"coverflow"===this.params.effect&&this.coverflowEffect.setTranslate()},setTransition:function(e){"coverflow"===this.params.effect&&this.coverflowEffect.setTransition(e)}}},{name:"thumbs",params:{thumbs:{swiper:null,slideThumbActiveClass:"swiper-slide-thumb-active",thumbsContainerClass:"swiper-container-thumbs"}},create:function(){ee.extend(this,{thumbs:{swiper:null,init:Z.init.bind(this),update:Z.update.bind(this),onThumbClick:Z.onThumbClick.bind(this)}})},on:{beforeInit:function(){var e=this.params.thumbs;e&&e.swiper&&(this.thumbs.init(),this.thumbs.update(!0))},slideChange:function(){this.thumbs.swiper&&this.thumbs.update()},update:function(){this.thumbs.swiper&&this.thumbs.update()},resize:function(){this.thumbs.swiper&&this.thumbs.update()},observerUpdate:function(){this.thumbs.swiper&&this.thumbs.update()},setTransition:function(e){var t=this.thumbs.swiper;t&&t.setTransition(e)},beforeDestroy:function(){var e=this.thumbs.swiper;e&&this.thumbs.swiperCreated&&e&&e.destroy()}}}];return void 0===T.use&&(T.use=T.Class.use,T.installModule=T.Class.installModule),T.use(Q),T});
+//# sourceMappingURL=swiper.min.js.map
diff --git a/mobile/video.html b/mobile/video.html
new file mode 100644
index 0000000..f89391b
--- /dev/null
+++ b/mobile/video.html
@@ -0,0 +1,436 @@
+<!DOCTYPE html>
+<html lang="en">
+
+<head>
+    <meta charset="utf-8"/>
+    <!-- Global site tag (gtag.js) - Google Analytics -->
+    <script async src="https://www.googletagmanager.com/gtag/js?id=G-3V6KZGW418"></script>
+    <script>
+      window.dataLayer = window.dataLayer || [];
+      function gtag(){dataLayer.push(arguments);}
+      gtag('js', new Date());
+      gtag('config', 'G-3V6KZGW418');
+    </script>
+    <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no"/>
+    <meta name="apple-mobile-web-app-capable" content="yes">
+    <meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
+    <meta content="telephone=no" name="format-detection">
+    <meta name="wap-font-scale" content="no">
+    <title>footseen-腳控足控天堂-超激情美女主播視訊-絲足影片</title>
+    <meta class="keywords-meta" name="keywords" content="footseen,foot live,激情美女視訊,激情美女影片,腳控足控,絲足,裸足,美腿,絲襪,黑絲,台灣UU聊天室,swag,視訊聊天室,live173,uplive,vklive,nonolive,foot rub,foot fetish">
+    <meta name="description" content="footseen,腳控足控天堂,絲足美腿視訊影片,台灣足控第一高效約會軟體,免費影片立即觀看,在線美女激情互動,成人視訊線上體驗,徹底釋放你的慾望。">
+    <script src="lib/fsize.js"></script>
+    <link rel="stylesheet" href="css/base.css">
+    <link rel="stylesheet" href="css/layer.css">
+    <link rel="stylesheet" href="css/daily.css">
+    <link rel="stylesheet" href="css/swiper.min.css">
+    <link rel="stylesheet" href="css/index.css?v=22020119">
+    <link rel="stylesheet" href="css/liMarquee.css">
+    <script src="lib/flv.js"></script>
+    <style>
+        .recommend-swiper{
+        
+            width: 9.35rem;
+            height: 5.5rem;
+            overflow: hidden;
+            font-size: 0;
+        }
+        .recommend-swiper .video{
+            border-radius: 0.2rem;
+            width: 9.35rem;
+            height: 5.5rem; 
+        
+        }
+        .swiper-slide{
+            width: 9.35rem;
+            height: 5.05rem;
+            overflow: hidden;
+        }
+    </style>
+</head>
+<body style="background: #F3F3F3">
+<div class="m-content">
+    <a href="index.html"><img class="back" src="images/back.png" alt=""></a>
+    <div class="grap-swiper-box">       
+        <div class="recommend-swiper">
+
+            <!-- <div style="background: url(https://zhibocdn.yabolive.net/comm/theme/2022-04-02/253898d006be4ad1be5bf5acde410add.mp4?x-oss-process=video/snapshot,t_0,f_jpg,w_0,h_0,m_fast,f_jpg)no-repeat;background-size: cover;    background-position-y: center;" class="swiper-img"><div class="top-img-shadow"></div></div>
+            <p class="swiper-name">今天吃什么呢,打算吃什么呢</p>
+            <div class="swiper-face-name">
+                <img src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+                <p>糖醋榴莲</p>
+            </div>
+            <div class="swiper-more">
+                <div class="swiper-more1"><img src="images/message.png" alt=""> 25</div>
+            </div> -->
+        </div>
+    </div>
+    <div class="grap-name-box">
+        <!-- <img class="grap-user-face" src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+        <p class="grap-name-p1">糖醋里脊</p>
+        <p class="grap-name-p2">2022年03月14日 22:22</p>
+        <div class="grap-like">追蹤</div> -->
+    </div>
+    <div class="grap-content">
+        <!-- <h1 class="grap-title">標題預留啊預留很多個字</h1>
+        <div class="grap-more">
+            <div class="grap-more1"><img src="images/message2.png" alt=""> 25</div>
+            <div class="grap-more2"><img src="images/good2.png" alt=""> 50</div>
+        </div>
+        <div class="tag-content">
+            <div class="tag">#丝袜</div>
+            <div class="tag">#丝袜</div>
+            <div class="tag">#丝袜</div>
+            <div class="tag">#丝袜</div>
+            <div class="tag">#丝袜</div>
+        </div> -->
+    </div>
+    <div class="grap-msg-box">
+        <p class="grap-msg-top">評論 (--)</p>
+        <!-- <div class=grap-msg-content>
+            <img class="grap-msg-face" src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+            <div class="grap-msg-text">
+                <p class="grap-msg-text-name">用戶名稱預留</p>
+                <p class="grap-msg-text-p">
+                    我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論
+                </p>
+            </div>
+        </div>
+        <div class=grap-msg-content>
+            <img class="grap-msg-face" src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+            <div class="grap-msg-text">
+                <p class="grap-msg-text-name">用戶名稱預留</p>
+                <p class="grap-msg-text-p">
+                    我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論我的評論是我的評論
+                </p>
+            </div>
+        </div>
+        <div class="grap-bottom-box">查看更多</div> -->
+    </div>
+    <div class="grap-text2">相關推薦</div>
+    <div class="add-video-big-box">
+        <!-- <div class="add-video-box">
+            <div class="add-shadow"></div>
+            <div class="add-face-name">
+                <img src="https://zhibocdn.lvdou66.com/comm/user/boy.png?x-oss-process=image/resize,w_80" alt="">
+                <p>糖醋榴莲</p>
+            </div>
+            <div class="add-video-img"></div>
+            <div class="add-video-text-box">
+                <p>今天吃什么呢,打算吃什么呢</p>
+                <div class="tag-content">
+                    <div class="tag">#丝袜</div>
+                    <div class="tag">#丝袜</div>
+                    <div class="tag">#丝袜</div>
+                    <div class="tag">#丝袜</div>
+                    <div class="tag">#丝袜</div>
+                </div>
+            </div>
+        </div> -->
+    </div>
+    <div class="bottom-nav">
+        <h1 class="bottom-nav-h1">美腿、美足、絲襪直播</h1>
+        <div class="bottom-nav-btn"></div>
+        <div class="bottom-close-btn"></div>
+    </div>
+    <div style="height: 2.5rem;"></div>
+</div>    
+</body>
+<script src="lib/jquery-3.1.1.min.js"></script>
+<script src="lib/swiper.min.js"></script>
+<script src="layer-v3.1.0/layer/layer.js"></script>
+<script src="lib/liMarquee.js"></script>
+<script src="lib/swiper.min.js"></script>
+<script src="lib/default.js?v='20220418'"></script>
+<script>
+
+</script>
+<script>
+$(function(){
+    if(sessionStorage.topicId==undefined||sessionStorage.topicId=="undefined"){
+        window.location.href="index.html"
+    }
+    if(sessionStorage.tag=="undefined"){
+        sessionStorage.tag='' 
+    }
+    var scrollOk =true;
+    var pageNumber=1
+    var pageNum=1
+
+    moreAspect()
+    $(window).on("scroll",function(){
+        scrollTopNum=$(document).scrollTop()
+        if($(document).height()-$(document).scrollTop()-$(window).height()<=10){
+            if(scrollOk==false)return;
+            scrollOk=false
+            pageNumber+=1
+            
+            listAdd(pageNumber,pageNum,sessionStorage.tag)
+        }
+    })
+
+    $(".bottom-close-btn").on("click",function(){
+        $(".bottom-nav").fadeOut(350)
+    })
+    $.ajax({
+        url:$ip+'/footSeen/h5/queryTopicInfo',
+        data:{
+            topicId:sessionStorage.topicId
+        },
+        success:function(data){
+            // //console.log('查看帖文详情',data)
+            var html=[];
+            var list=data.topic;
+            var details=JSON.parse(list.content)  
+            $("title").text(details.title)
+           
+            var ua = window.navigator.userAgent.toLowerCase();
+            if (/iphone|ipad|ipod/.test(ua)) {
+                var iosUrl=details.videos[0].url.replace("flv","mp4")
+                $(".recommend-swiper").html('<video poster="https://zhibocdn.yabolive.net/comm'+details.videos[0].cover+'" autoplay playsinline class="video" src="https://zhibocdn.yabolive.net/comm'+iosUrl+'" id="videoElement" controls loop></video>')
+            }else{
+                $(".recommend-swiper").html('<video poster="https://zhibocdn.yabolive.net/comm'+details.videos[0].cover+'" autoplay class="video" src="" id="videoElement" controls loop></video>')
+                flvPlay('https://zhibocdn.yabolive.net/comm'+details.videos[0].url+'')   
+            }
+            // //console.log('https://zhibocdn.yabolive.net/comm'+details.videos[0].url+'')
+            var html=[];
+            var tagsArr=[]
+            html+='<img class="grap-user-face" src="https://zhibocdn.yabolive.net/comm'+list.face+'?x-oss-process=image/resize,w_80" alt="">';
+            html+='<p class="grap-name-p1">'+list.nickname+'</p>';
+            html+='<p class="grap-name-p2">'+timeGet(list.updateTime)[0]+'年'+timeGet(list.updateTime)[1]+'月'+timeGet(list.updateTime)[2]+'日 '+timeGet(list.updateTime)[3]+':'+timeGet(list.updateTime)[5]+'</p>';
+            html+='<div class="grap-like">追蹤</div>';
+            $(".grap-name-box").html(html);
+            $(".bottom-nav-btn,.grap-like").unbind("click").on("click",function(){
+                window.location.href='download/download2.html'
+            })
+            var html=[];
+            html+='<h1 class="grap-title">'+details.title+'</h1>';
+            html+='<div class="grap-more">';
+            html+='<div class="grap-more1"><img src="images/message2.png" alt=""> '+list.comment+'</div>';
+            html+='</div>';
+            html+='<div class="tag-content clearfix">';
+            for(var j=0;j<list.tags.length;j++){
+                html+='<div data-type="'+list.tags[j].tagId+'" class="tag">#'+list.tags[j].tagName+'</div>';
+                if(j+1==list.tags.length) tagsArr+=''+list.tags[j].tagName+''
+                else tagsArr+=''+list.tags[j].tagName+','
+            }
+            html+='</div>';
+            $(".grap-content").html(html);
+            $(".keywords-meta").attr("content",tagsArr)
+        }
+    })
+    $.ajax({
+        url:$ip+'/footSeen/h5/queryTopicComment',
+        data:{
+            topicId:sessionStorage.topicId,
+            page:pageNum,
+            size:20
+        },
+        success:function(data){
+            // //console.log('查看贴文评论',data)
+            if(data.commentResult.length==0){
+                var html='<p class="grap-msg-top">評論 (0)</p><div class="grap-bottom-box">暫無評論</div>'
+                $(".grap-msg-box").html(html);       
+                return;
+            }
+            // var list=data.commentResult
+            var html=[];
+            if(data.totalSize>99) var commentNum='99+'
+            else  var commentNum=data.totalSize
+            html+='<p class="grap-msg-top">評論 ('+commentNum+')</p>';
+            for(var i=0;i<2;i++){
+                if(data.commentResult[i]==undefined)continue;
+                var list=JSON.parse(data.commentResult[i].content)
+                html+='<div class="grap-msg-content">';
+                html+='<img class="grap-msg-face" src="https://zhibocdn.yabolive.net/comm'+data.commentResult[i].face+'?x-oss-process=image/resize,w_80" alt="">';
+                html+='<div class="grap-msg-text">';
+                html+='<p class="grap-msg-text-name">'+data.commentResult[i].nickname+'</p>';
+                html+='<p class="grap-msg-text-p">'+list.text+'</p>';
+                html+='</div>';
+                html+='</div>';
+            }
+            if(commentNum>2) html+='<div class="grap-bottom-box">查看更多</div>';
+        
+            $(".grap-msg-box").html(html);    
+            var moreClick=true
+            $(".grap-bottom-box").unbind("click").on("click",function(){
+                if(moreClick==false)return;
+                moreClick=false
+                $(this).hide()
+                addMsg(pageNum)
+                pageNum++
+            })
+        }
+    })
+    function addMsg(e){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryTopicComment',
+            data:{
+                topicId:sessionStorage.topicId,
+                page:pageNum,
+                size:20
+            },
+            success:function(data){
+                // //console.log('更多贴文评论',data)
+                var html=[];
+                for(var i=0;i<20;i++){
+                    if(e==1&&i<2)continue
+                    if(data.commentResult[i]==undefined)break;
+                    var list=JSON.parse(data.commentResult[i].content)
+                    html+='<div class="grap-msg-content">';
+                    html+='<img class="grap-msg-face" src="https://zhibocdn.yabolive.net/comm'+data.commentResult[i].face+'?x-oss-process=image/resize,w_80" alt="">';
+                    html+='<div class="grap-msg-text">';
+                    html+='<p class="grap-msg-text-name">'+data.commentResult[i].nickname+'</p>';
+                    html+='<p class="grap-msg-text-p">'+list.text+'</p>';
+                    html+='</div>';
+                    html+='</div>';
+                }
+                $(".grap-msg-box").append(html);    
+                if(e*20>data.totalSize){
+                    $(".grap-msg-box").append('<div class="grap-bottom-box">没有更多了</div>');   
+                    $(".grap-bottom-box").unbind("click") 
+                }else{
+                    $(".grap-msg-box").append('<div class="grap-bottom-box">加载更多</div>');   
+                    var moreClick=true
+                    $(".grap-bottom-box").unbind("click").on("click",function(){
+                        if(moreClick==false)return;
+                        moreClick=false
+                        $(this).hide()
+                        addMsg(pageNum)
+                        pageNum++
+                    })
+                }
+            }
+        })
+    }
+    function moreAspect(){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryTopics',
+            data:{
+                page:1,
+                size:10,
+                type:1,
+                tag:sessionStorage.tag,
+            },
+            success:function(data){
+                // //console.log('獲取貼文列表',data)
+                var html=[];
+                var moreNum=0
+                for(var i=0;i<6;i++){
+                    var list=data.dataList[i]
+                    var videoList=JSON.parse(list.content)
+                    if(sessionStorage.topicId==list.topicId)continue;
+                    if(data.dataList[i].type!=3)continue;
+                    if(moreNum==3)continue;
+                    moreNum++
+                    html+='<a href="video.html?topicId='+list.topicId+'&tag='+sessionStorage.tag+'"><div data-type="'+list.topicId+'" class="add-video-box">';
+                    html+='<div class="add-shadow"></div>';
+                    html+='<div class="add-time">'+add0(Math.floor(videoList.videos[0].duration/1000/60))+':'+add0(Math.floor(videoList.videos[0].duration/1000)%60)+'</div>';
+                    html+='<div class="add-face-name">';
+                    html+='<img src="https://zhibocdn.yabolive.net/comm'+list.face+'?x-oss-process=image/resize,w_80" alt="">';
+                    html+='<p>'+list.nickname+'</p>';
+                    html+='</div>';
+                    html+='<div style="background: url(https://zhibocdn.yabolive.net/comm'+videoList.videos[0].cover.split('?')[0]+'?x-oss-process=video/snapshot,t_100000,f_jpg,w_400,h_0,m_fast,f_jpg)no-repeat;background-size: cover;    background-position-y: center;" class="add-video-img">';
+                    html+='<img class="play-icon" src="images/play-icon.png" alt="">';
+                    html+='</div>';
+                    html+='<div class="add-video-text-box">';
+                    html+='<p>'+videoList.title+'</p>';
+                    html+='<div class="tag-content">';
+                    for(var j=0;j<list.tags.length;j++){
+                        html+='<div data-type="'+list.tags[j].tagId+'" class="tag">#'+list.tags[j].tagName+'</div>';
+                    }
+                    html+='</div>';
+                    html+='</div>';
+                    html+='</div></a>';
+                }
+                $(".add-video-big-box").html(html);
+         
+                // $(".add-video-box").unbind("click").on("click",function(){
+                //     var _self=$(this).attr("data-type")
+                //     window.location.href="video.html?topicId="+_self+"&tag="+sessionStorage.tag+""
+                // })
+            }
+        })
+
+    }
+    function listAdd(pageNum,typeNum,tagNum){
+        $.ajax({
+            url:$ip+'/footSeen/h5/queryTopics',
+            data:{
+                page:pageNum,
+                size:10,
+                type:typeNum,
+                tag:tagNum,
+            },
+            success:function(data){
+                // //console.log('獲取貼文列表',data)
+                for(var i=0;i<data.dataList.length;i++){
+                    if(data.dataList[i]==undefined)continue
+                    if(pageNum==1&&i<3)continue;
+                    var list=data.dataList[i]
+                    var videoList=JSON.parse(list.content)
+                    var html=[]
+                    html+='<a href="video.html?topicId='+list.topicId+'&tag='+tagNum+'"><div data-type="'+list.topicId+'" class="add-video-box">';
+                    html+='<div class="add-shadow"></div>';
+                    html+='<div class="add-time">'+add0(Math.floor(videoList.videos[0].duration/1000/60))+':'+add0(Math.floor(videoList.videos[0].duration/1000)%60)+'</div>';
+                    html+='<div class="add-face-name">';
+                    html+='<img src="https://zhibocdn.yabolive.net/comm'+list.face+'?x-oss-process=image/resize,w_80" alt="">';
+                    html+='<p>'+list.nickname+'</p>';
+                    html+='</div>';
+                    html+='<div style="background: url(https://zhibocdn.yabolive.net/comm'+videoList.videos[0].cover.split('?')[0]+'?x-oss-process=video/snapshot,t_100000,f_jpg,w_400,h_0,m_fast,f_jpg)no-repeat;background-size: cover;    background-position-y: center;" class="add-video-img">';
+                    html+='<img class="play-icon" src="images/play-icon.png" alt="">';
+                    html+='</div>';
+                    html+='<div class="add-video-text-box">';
+                    html+='<p>'+videoList.title+'</p>';
+                    html+='<div class="tag-content">';
+                    for(var j=0;j<list.tags.length;j++){
+                        html+='<div data-type="'+list.tags[j].tagId+'" class="tag">#'+list.tags[j].tagName+'</div>';
+                    }
+                    html+='</div>';
+                    html+='</div>';
+                    html+='</div></a>';
+                    $(".add-video-big-box").append(html)
+                    
+                }
+                setTimeout(function(){
+                    scrollOk=true;
+                }, 500);
+                // $(".add-video-box").unbind("click").on("click",function(){
+                //     var _self=$(this).attr("data-type")
+                //     window.location.href="video.html?topicId="+_self+"&tag="+tagNum+""
+                // })
+            }
+        })
+
+    }
+
+    function flvPlay(e){
+        var player = document.getElementById('videoElement');
+        if (flvjs.isSupported()) {
+            var flvPlayer = flvjs.createPlayer({
+                type: 'flv',
+                enableWorker:true,
+                hasAudio:true,
+                hasVideo:true,
+                url: e
+            });
+            flvPlayer.attachMediaElement(videoElement);
+            flvPlayer.load(); //加载
+        }
+    }
+    function flv_start() {
+        player.play();
+    }
+    function flv_pause() {
+        player.pause();
+    }
+    function flv_destroy() {
+        player.pause();
+        player.unload();
+        player.detachMediaElement();
+        player.destroy();
+        player = null;
+    }
+})
+</script>
+</html>
\ No newline at end of file
--
libgit2 0.25.0