summaryrefslogtreecommitdiff
path: root/src/main/resources/assets/js
diff options
context:
space:
mode:
authorzhanghongqing <[email protected]>2022-08-09 16:54:16 +0800
committerzhanghongqing <[email protected]>2022-08-09 16:54:16 +0800
commitb3fa11d4b1b5a68d7b04fde5eb6cfbda557927eb (patch)
treea49d344e49fc427fbf4cf00aa4963c4d04cd98a4 /src/main/resources/assets/js
parentd8a2be0d094ac9ba2d47c81ebf03b3fe6e34a078 (diff)
initializeHEADmain
Diffstat (limited to 'src/main/resources/assets/js')
-rw-r--r--src/main/resources/assets/js/admin.js764
-rw-r--r--src/main/resources/assets/js/angular-filemanager.min.js2240
-rw-r--r--src/main/resources/assets/js/angular-translate.min.js6
-rw-r--r--src/main/resources/assets/js/angular.min.js335
-rw-r--r--src/main/resources/assets/js/bootstrap.min.js6
-rw-r--r--src/main/resources/assets/js/default.js127
-rw-r--r--src/main/resources/assets/js/fileinput.min.js1822
-rw-r--r--src/main/resources/assets/js/index.js624
-rw-r--r--src/main/resources/assets/js/jquery-3.3.1.js10332
-rw-r--r--src/main/resources/assets/js/layer.js2
-rw-r--r--src/main/resources/assets/js/mobile/layer.js2
-rw-r--r--src/main/resources/assets/js/mobile/need/layer.css1
-rw-r--r--src/main/resources/assets/js/nav.js50
-rw-r--r--src/main/resources/assets/js/ng-file-upload.min.js1245
-rw-r--r--src/main/resources/assets/js/old/bootstrap.min.js7
-rw-r--r--src/main/resources/assets/js/old/jquery.min.js4
-rw-r--r--src/main/resources/assets/js/particles.js1533
-rw-r--r--src/main/resources/assets/js/particles.json110
-rw-r--r--src/main/resources/assets/js/piexif.min.js1
-rw-r--r--src/main/resources/assets/js/popper.min.js4
-rw-r--r--src/main/resources/assets/js/purify.min.js1
-rw-r--r--src/main/resources/assets/js/signin.js227
-rw-r--r--src/main/resources/assets/js/sortable.min.js1
-rw-r--r--src/main/resources/assets/js/theme.js46
-rw-r--r--src/main/resources/assets/js/theme/default/icon-ext.pngbin0 -> 5911 bytes
-rw-r--r--src/main/resources/assets/js/theme/default/icon.pngbin0 -> 11493 bytes
-rw-r--r--src/main/resources/assets/js/theme/default/layer.css1
-rw-r--r--src/main/resources/assets/js/theme/default/loading-0.gifbin0 -> 5793 bytes
-rw-r--r--src/main/resources/assets/js/theme/default/loading-1.gifbin0 -> 701 bytes
-rw-r--r--src/main/resources/assets/js/theme/default/loading-2.gifbin0 -> 1787 bytes
-rw-r--r--src/main/resources/assets/js/upload.js39
-rw-r--r--src/main/resources/assets/js/utils.js115
-rw-r--r--src/main/resources/assets/js/vue.js6
33 files changed, 19651 insertions, 0 deletions
diff --git a/src/main/resources/assets/js/admin.js b/src/main/resources/assets/js/admin.js
new file mode 100644
index 0000000..695d795
--- /dev/null
+++ b/src/main/resources/assets/js/admin.js
@@ -0,0 +1,764 @@
+var app = new Vue({
+ el: "#container",
+ data: {
+ categories: [],
+ downloaded: [],
+ uploaded: [],
+ files: [],
+ serverFiles: [],
+ selectedServerFiles: [],
+ auths: [],
+ users: []
+ }
+});
+
+var authFileSearch = "";
+
+var authSearchOffset = 0;
+
+var authModal = new Vue({
+ el: "#authAddedModal", methods: {
+ searchFileInAuth: function () {
+ var file = $("#auth-file-search").val();
+ if (isEmpty(file)) {
+ alerts("内容不能为空");
+ } else {
+ if (file === authFileSearch) {
+ authSearchOffset += 1;
+ } else {
+ authSearchOffset = 0;
+ authFileSearch = file;
+ }
+ layer.load(1);
+ $.get("/file/basic/all", {
+ user: "",
+ file: file,
+ category: "",
+ offset: authSearchOffset
+ }, function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.length < 1) {
+ alerts("糟糕,没有数据了");
+ } else {
+ var ele = $("#auth-file-list-group");
+ $(ele).empty();
+ $.each(json, function (i, n) {
+ var li = "<li class='list-group-item list-group-item-success'><a href='javascript:' class='auth-file' onclick='$(event.srcElement).parent().remove();' data-key='" + n.id + "'>" + n.localUrl + "</a></li>";
+ $(ele).append(li);
+ });
+ $('[data-toggle="tooltip"]').tooltip();
+ }
+ });
+ }
+ },
+ "searchUserInAuth": function () {
+ var user = $("#auth-user-search").val();
+ if (isEmpty(user)) {
+ alerts("内容不能为空");
+ } else {
+ layer.load(1);
+ $.get("/user/all", {
+ user: user,
+ offset: 0
+ }, function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.length < 1) {
+ alerts("糟糕,没有数据了");
+ } else {
+ var ele = $("#auth-user-list-group");
+ $(ele).empty();
+ $.each(json, function (i, n) {
+ var li = "<li class='list-group-item list-group-item-success'><a href='javascript:' class='auth-file' onclick='$(event.srcElement).parent().remove();' data-key='" + n.id + "'>" + n.username + "</a></li>";
+ $(ele).append(li);
+ });
+ $('[data-toggle="tooltip"]').tooltip();
+ }
+ });
+ }
+ }
+ }
+});
+
+var serverFileSearchHistory = [];
+
+Vue.component('file-filter-item', {
+ template: '<div class="col-12 col-sm-10 offset-sm-1 content-box rounded">' +
+ ' <br/>' +
+ ' <div class="row">' +
+ ' <div class="col-sm-2 col-4">' +
+ ' <input type="text" title="指定分类" data-toggle="tooltip" class="form-control file-filter category-filter"' +
+ ' placeholder="分类名称" onkeyup="fileFilter();"/>' +
+ ' </div>' +
+ ' <div class="col-sm-3 col-4">' +
+ ' <input type="text" title="指定用户" data-toggle="tooltip" class="form-control file-filter user-filter"' +
+ ' placeholder="用户名或邮箱" onkeyup="fileFilter();"/>' +
+ ' </div>' +
+ ' <div class="col-sm-4 col-4">' +
+ ' <input type="text" title="指定文件" data-toggle="tooltip" class="form-control file-filter file-name-filter"' +
+ ' placeholder="文件名" onkeyup="fileFilter();"/>' +
+ ' </div>' +
+ ' </div>' +
+ ' <br/>' +
+ ' </div>'
+});
+
+var offset = 0;
+
+var enableSearch = false;
+
+function getTabInfo(tabId) {
+ offset = 0;
+ enableSearch = false;
+ changeTabInfo(tabId);
+}
+
+function changeTabInfo(tabId) {
+ if (tabId.indexOf("#") === 0) {
+ tabId = tabId.substr(1);
+ }
+ if (tabId === "upload-manager") {
+ getUploaded();
+ } else if (tabId === "download-manager") {
+ getDownloaded();
+ } else if (tabId === "file-manager") {
+ getFile();
+ } else if (tabId === "auth-manager") {
+ getAuth();
+ } else if (tabId === "category-manager") {
+ setCategoryToDefault();
+ getCategory();
+ } else if (tabId === "user-manager") {
+ getUser();
+ } else if (tabId === "admin-manager") {
+
+ } else if (tabId === "system-setting") {
+ getConfig();
+ } else {
+ alerts("没有找到可执行的方法");
+ }
+ setTimeout(function () {
+ $('[data-toggle="tooltip"]').tooltip();
+ setCSS();
+ }, 1000);
+}
+
+function getConfig() {
+ layer.load(1);
+ $.get("/config/all", function (data) {
+ layer.closeAll();
+ $("#json-editor").children("textarea").val(JSON.stringify(JSON.parse(data), undefined, 4));
+ });
+}
+
+function saveConfig() {
+ layer.load(1);
+ $.ajax({
+ url: "/config",
+ type: "PUT",
+ data: {config: $("#json-editor").children("textarea").val()},
+ success: function (data) {
+ layer.closeAll();
+ alerts(JSON.parse(data).message);
+ }
+ });
+}
+
+// var editor = new JSONEditor(document.getElementById("json-editor"), {
+// theme: 'foundation5'
+// });
+
+function getUser() {
+ layer.load(1);
+ $.get("/user/all", getFileFilterParameters(), function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.length < 1) {
+ alerts("糟糕,没有数据了");
+ } else if (offset < 1) {
+ app.users = json;
+ } else {
+ app.users = app.users.concat(json);
+ }
+ });
+}
+
+function getIconYesOrNo(flag) {
+ return "<i class='text-" + (flag > 0 ? "success" : "danger") + " glyphicon glyphicon-" + (flag > 0 ? "ok" : "remove") + "'></i>";
+}
+
+function getAuth() {
+ layer.load(1);
+ $.get("/auth/all", getFileFilterParameters(), function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.length < 1) {
+ alerts("糟糕,没有数据了");
+ } else if (offset < 1) {
+ app.auths = json;
+ } else {
+ app.auths = app.auths.concat(json);
+ }
+ });
+}
+
+var fileFilterDivParent;
+
+function getFile() {
+ layer.load(1);
+ $.get("/file/basic/all", getFileFilterParameters(), function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.length < 1) {
+ alerts("糟糕,没有数据了");
+ } else if (offset < 1) {
+ app.files = json;
+ } else {
+ app.files = app.files.concat(json);
+ }
+ });
+}
+
+function getFileFilterParameters() {
+ var res = {
+ user: enableSearch ? $(fileFilterDivParent).find(".user-filter").val() : "",
+ file: enableSearch ? $(fileFilterDivParent).find(".file-name-filter").val() : "",
+ category: enableSearch ? $(fileFilterDivParent).find(".category-filter").val() : "",
+ offset: offset
+ };
+ enableSearch = false;
+ return res;
+}
+
+function fileFilter() {
+ /** @namespace window.event.keyCode */
+ if (window.event.keyCode === 13) {
+ offset = 0;
+ enableSearch = true;
+ fileFilterDivParent = $(event.srcElement).parent().parent();
+ changeTabInfo(window.location.hash);
+ }
+}
+
+function getUploaded() {
+ layer.load(1);
+ $.get("/uploaded/all", getFileFilterParameters(), function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.length < 1) {
+ alerts("糟糕,没有数据了");
+ } else if (offset < 1) {
+ app.uploaded = json;
+ } else {
+ app.uploaded = app.uploaded.concat(json);
+ }
+ });
+}
+
+function getDownloaded() {
+ layer.load(1);
+ $.get("/downloaded/all", getFileFilterParameters(), function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.length < 1) {
+ alerts("糟糕,没有数据了");
+ } else if (offset < 1) {
+ app.downloaded = json;
+ } else {
+ app.downloaded = app.downloaded.concat(json);
+ }
+ });
+}
+
+function getCategory() {
+ $.get("/category/all", function (data) {
+ app.categories = JSON.parse(data);
+ });
+}
+
+function deleteCategory() {
+ var srcTr = $(event.srcElement).parents("tr");
+ var categoryId = $(srcTr).children("td.category-id").text();
+ $.ajax({
+ url: "/category/" + categoryId, type: "DELETE", success: function (data) {
+ var json = JSON.parse(data);
+ if (json.status === "success") {
+ app.categories.splice($(srcTr).children("td.hide").text(), 1);
+ alerts("删除成功");
+ } else {
+ alerts("删除失败,请稍后重新尝试");
+ }
+ }, error: function () {
+ alerts("删除失败,该分类已被多个文件引用,无法删除(可尝试修改文件分类或删除文件)。");
+ }
+ });
+}
+
+function showFileShareModal() {
+ if (isEmpty($("#select-url").val())) {
+ getServerFileByPath(false);
+ }
+ var modal = $("#fileAddedModal");
+ var ele = $(modal).find(".modal-content");
+ if (isMobile()) {
+ $(ele).removeClass("width-60-vm");
+ } else {
+ $(ele).addClass("width-60-vm");
+ }
+ $(modal).modal("show");
+}
+
+var selectedRows = [];
+
+var rowIndex;
+
+/**
+ * 演示同类型的模态框
+ * @param table tableId
+ * @param modal 模态框
+ */
+function showFileModal(table, modal) {
+ rowIndex = 0;
+ selectedRows = getSelectedRows($(table).children("tbody"));
+ if (selectedRows.length < 1) {
+ alerts("请至少选择一行");
+ } else {
+ if (modal === "#fileModifiedModal") {
+ setModifyFile();
+ } else if (modal === "#fileAuthModal") {
+ setFileAuth();
+ } else if (modal === "#authEditModal") {
+ setAuth();
+ } else if (modal === "#userFileAuthModal") {
+ setUserFileAuth();
+ } else if (modal === "#userPasswordModal") {
+ setUsername(modal, '');
+ } else if (modal === "#userAuthModal") {
+ setUsername(modal, "auth");
+ }
+ $(modal).modal("show");
+ }
+}
+
+function setFileAuth() {
+ checkRowIndex();
+ var file = app.files[$(selectedRows[rowIndex]).children(".file-index").attr("data-key")];
+ /** @namespace file.localUrl */
+ $("#file-local-url").val(file.localUrl);
+ $("#file-auth-id").val(file.id);
+ layer.load(1);
+ $.get("/file/" + file.id + "/auth", function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ /** @namespace json.isDownloadable */
+ $("#file-downloadable-auth").val(json.isDownloadable);
+ /** @namespace json.isDeletable */
+ $("#file-deletable-auth").val(json.isDeletable);
+ /** @namespace json.isUpdatable */
+ $("#file-updatable-auth").val(json.isUpdatable);
+ /** @namespace json.isVisible */
+ $("#file-visible-auth").val(json.isVisible);
+ });
+}
+
+function setUsername(id, auth) {
+ checkRowIndex();
+ var user = app.users[$(selectedRows[rowIndex]).children(".user-index").attr("data-key")];
+ var parent = $(id);
+ $(parent).find(".username").val(user.username);
+ if (!isEmpty(auth)) {
+ $(parent).find(".user-permission").val(user.permission);
+ }
+}
+
+function setUserFileAuth() {
+ checkRowIndex();
+ var user = app.users[$(selectedRows[rowIndex]).children(".user-index").attr("data-key")];
+ var parent = $("#userFileAuthModal");
+ $(parent).find(".username").val(user.username);
+ $(parent).find(".user-downloadable").val(user.isDownloadable);
+ /** @namespace user.isUploadable */
+ $(parent).find(".user-uploadable").val(user.isUploadable);
+ $(parent).find(".user-deletable").val(user.isDeletable);
+ $(parent).find(".user-updatable").val(user.isUpdatable);
+}
+
+function setAuth() {
+ checkRowIndex();
+ var auth = app.auths[$(selectedRows[rowIndex]).children(".auth-index").attr("data-key")];
+ $("#auth-username").val(auth.username);
+ $("#auth-file-local-url").val(auth.localUrl);
+ $("#auth-id").val(auth.id);
+ $("#auth-downloadable").val(auth.isDownloadable);
+ $("#auth-deletable").val(auth.isDeletable);
+ $("#auth-updatable").val(auth.isUpdatable);
+ $("#auth-visible").val(auth.isVisible);
+}
+
+function checkRowIndex() {
+ if (rowIndex < 0) {
+ rowIndex = selectedRows.length - 1;
+ } else if (rowIndex >= selectedRows.length) {
+ rowIndex = 0;
+ }
+}
+
+function toggleCheckBoxStatus(tab) {
+ setCheckboxesStatus($("#" + tab + "-manager-table").children("tbody"), document.getElementById(tab + "-toggle-box").checked);
+}
+
+function setModifyFile() {
+ checkRowIndex();
+ var file = app.files[$(selectedRows[rowIndex]).children(".file-index").attr("data-key")];
+ /** @namespace file.localUrl */
+ $("#old-file-local-url").val(file.localUrl);
+ $("#old-file-visit-url").val(file.visitUrl);
+ $("#file-id").val(file.id);
+}
+
+function getServerFileByPath(addTo) {
+ var path = $("#select-url").val();
+ serverFileSearchHistory = serverFileSearchHistory.concat(path);
+ layer.load(1);
+ $.get("/file/server", {path: path}, function (data) {
+ layer.closeAll();
+ app.serverFiles = JSON.parse(data);
+ var ele = $("#server-file-list-group");
+ $(ele).empty();
+ $.each(app.serverFiles, function (i, json) {
+ var li = "<li class='list-group-item list-group-item-" + (json.isDirectory ? "primary" : "info") + "' data-key='" + i + "'><a href='javascript:' class='server-file' title='" + json.absolutePath + "' data-toggle='tooltip' onclick='selectServerFile();'>" + json.name + "</a></li>";
+ $(ele).append(li);
+ if (addTo && json.isFile) {
+ addToSelectedServerFile(json);
+ }
+ });
+ $('[data-toggle="tooltip"]').tooltip();
+ });
+}
+
+function editCategory() {
+ $("#category-title").text("编辑分类");
+ var srcTr = $(event.srcElement).parents("tr");
+ var categoryId = $(srcTr).children("td.category-id").text();
+ $("#category-id").val(categoryId);
+ $("#category-key").val($(srcTr).children("td.hide").text());
+ $("#category-name").val($(srcTr).children("td.category-name").text());
+}
+
+function saveCategory() {
+ var name = $("#category-name").val();
+ if (isEmpty(name)) {
+ alerts("分类名不能为空");
+ } else {
+ var id = $("#category-id").val();
+ layer.load(1);
+ if (id > 0) {
+ $.ajax({
+ url: "/category/" + id, type: "PUT", data: {name: name}, success: function (data) {
+ if (data.indexOf("success") > 0) {
+ app.categories[$("#category-key").val()].name = name;
+ }
+ responseTip(data);
+ }
+ });
+ } else {
+ $.post("/category/" + name, function (data) {
+ if (data.indexOf("success") > 0) {
+ getCategory();
+ }
+ responseTip(data);
+ });
+ }
+ }
+ setCategoryToDefault();
+}
+
+function toggleRowSelectedStatus(ele) {
+ if (event.srcElement.toString() === "[object HTMLTableCellElement]") {
+ var cb = $(ele).find("input[type='checkbox']")[0];
+ cb.checked = !cb.checked;
+ }
+}
+
+function setCategoryToDefault() {
+ $("#category-id").val(0);
+ $("#category-key").val(0);
+ $("#category-name").val("");
+ $("#category-title").text("添加新分类");
+}
+
+function addToSelectedServerFile(json) {
+ app.selectedServerFiles = app.selectedServerFiles.concat(json);
+ var li = "<li class='list-group-item list-group-item-success' data-key='" + (app.selectedServerFiles.length - 1) + "'><a href='javascript:' class='selected-server-file' title='" + json.absolutePath + "' data-toggle='tooltip' onclick='removeSelectedServerFile();'>" + json.name + "</a></li>";
+ $("#selected-file-list-group").append(li);
+ $('[data-toggle="tooltip"]').tooltip();
+}
+
+function selectServerFile() {
+ var json = app.serverFiles[$(event.srcElement).parent().attr("data-key")];
+ if (json.isDirectory) {
+ /** @namespace json.absolutePath */
+ $("#select-url").val(json.absolutePath);
+ getServerFileByPath(document.getElementById("share-all-file").checked);
+ } else {
+ addToSelectedServerFile(json);
+ }
+}
+
+function removeSelectedServerFile() {
+ var liEle = $(event.srcElement).parent();
+ var key = $(liEle).attr("data-key");
+ app.selectedServerFiles.splice(key, 1);
+ $(liEle).remove();
+}
+
+function toOneOrZero(val) {
+ return val > 0 ? 1 : 0;
+}
+
+function updateAuth(url, down, uplo, dele, upda, visi, key) {
+ var auth = toOneOrZero(down) + "," + toOneOrZero(uplo) + "," + toOneOrZero(dele) + "," + toOneOrZero(upda) + "," + toOneOrZero(visi);
+ layer.load(1);
+ $.ajax({
+ url: url, type: "PUT", data: {auth: auth}, success: function (data) {
+ layer.closeAll();
+ var result = data.indexOf("success") > 0;
+ alerts("更新" + boolToChinese(result));
+ if (result) {
+ if (url.indexOf("auth") === 1) {
+ app.auths[key].isDownloadable = down;
+ app.auths[key].isDeletable = dele;
+ app.auths[key].isUpdatable = upda;
+ app.auths[key].isVisible = visi;
+ } else if (url.indexOf("user") === 1) {
+ app.users[key].isDownloadable = down;
+ app.users[key].isUploadable = uplo;
+ app.users[key].isDeletable = dele;
+ app.users[key].isUpdatable = upda;
+ }
+ }
+ }
+ });
+}
+
+function doDelete(table, json, index, url) {
+ selectedRows = getSelectedRows($(table).children("tbody"));
+ if (selectedRows.length < 1) {
+ alerts("请至少选中一行");
+ } else {
+ layer.confirm('是否确定删除选中的所有行', {
+ btn: ['确定', '取消']
+ }, function () {
+ var ids = "";
+ selectedRows.forEach(function (tr) {
+ ids += json[$(tr).children(index).attr("data-key")].id + ",";
+ });
+ ids = ids.substr(0, ids.length - 1);
+ layer.load(1);
+ $.ajax({
+ url: url + ids, type: "DELETE", success: function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.status === "success") {
+ selectedRows.forEach(function (tr) {
+ var key = $(tr).children(index).attr("data-key");
+ if (table.indexOf("file") > 0) {
+ app.files.splice(key, 1);
+ } else if (table.indexOf("auth") > 0) {
+ app.auths.splice(key, 1);
+ }
+ });
+ $("[data-toggle='tooltip']").tooltip();
+ layer.msg("删除成功");
+ } else {
+ alerts("删除失败");
+ }
+ }
+ })
+ }, function () {
+ layer.msg("取消了操作");
+ });
+ }
+}
+
+$(document).ready(function () {
+ $("#auth-add-button").click(function () {
+ var fileList = $("#auth-file-list-group").find("a");
+ var files = "";
+ for (var i = 0; i < fileList.length; i++) {
+ files += $(fileList[i]).attr("data-key") + ",";
+ }
+ var userList = $("#auth-user-list-group").find("a");
+ var users = "";
+ for (var i = 0; i < userList.length; i++) {
+ users += $(userList[i]).attr("data-key") + ",";
+ }
+ if (isEmpty(files) || isEmpty(users)) {
+ alerts("内容不能为空");
+ } else {
+ files = files.substr(0, files.length - 1);
+ users = users.substr(0, users.length - 1);
+ var down = $("#auth-downloadable-new").val();
+ var dele = $("#auth-deletable-new").val();
+ var upda = $("#auth-updatable-new").val();
+ var visi = $("#auth-visible-new").val();
+ var auths = toOneOrZero(down) + ",1," + toOneOrZero(dele) + "," + toOneOrZero(upda) + "," + toOneOrZero(visi);
+ $.post("/auth", {files: files, users: users, auths: auths}, function (data) {
+ layer.closeAll();
+ getTabInfo("#auth-manager");
+ $("#authAddedModal").modal("hide");
+ alerts("添加" + boolToChinese(data.indexOf("success") > 0));
+ })
+ }
+ });
+ $("#user-auth-update-button").click(function () {
+ var key = $(selectedRows[rowIndex]).children(".user-index").attr("data-key");
+ var permission = $("#userAuthModal").find(".user-permission").val();
+ layer.load(1);
+ $.ajax({
+ url: "/user/" + app.users[key].id + "/" + permission + "/",
+ type: "PUT",
+ success: function (data) {
+ layer.closeAll();
+ alerts(JSON.parse(data).message);
+ if (data.indexOf("成功")) {
+ app.users[key].permission = permission;
+ }
+ }
+ });
+ });
+ $("#user-password-update-button").click(function () {
+ var password = $("#userPasswordModal").find(".user-password").val();
+ if (isEmpty(password)) {
+ alerts("密码不能为空");
+ } else {
+ var user = app.users[$(selectedRows[rowIndex]).children(".user-index").attr("data-key")];
+ layer.load(1);
+ $.ajax({
+ url: "/user/reset/" + user.id + "/" + password + "/",
+ type: "PUT",
+ success: function (data) {
+ layer.closeAll();
+ alerts("更新" + boolToChinese(data.indexOf("success") > 0));
+ }
+ });
+ }
+ });
+ $(".auth-delete").click(function () {
+ doDelete("#auth-manager-table", app.auths, ".auth-index", "/auth/batch/");
+ });
+ $("#auth-update-button").click(function () {
+ var down = $("#auth-downloadable").val();
+ var dele = $("#auth-deletable").val();
+ var upda = $("#auth-updatable").val();
+ var visi = $("#auth-visible").val();
+ var key = $(selectedRows[rowIndex]).children(".auth-index").attr("data-key");
+ var id = app.auths[key].id;
+ updateAuth("/auth/" + id, down, 1, dele, upda, visi, key);
+ });
+ $("#user-file-auth-update-button").click(function () {
+ var key = $(selectedRows[rowIndex]).children(".user-index").attr("data-key");
+ var parent = $("#userFileAuthModal");
+ var down = $(parent).find(".user-downloadable").val();
+ var uplo = $(parent).find(".user-uploadable").val();
+ var dele = $(parent).find(".user-deletable").val();
+ var upda = $(parent).find(".user-updatable").val();
+ updateAuth("/user/" + app.users[key].id + "/auth", down, uplo, dele, upda, 1, key);
+ });
+ $("#file-auth-update-button").click(function () {
+ var down = $("#file-downloadable-auth").val();
+ var dele = $("#file-deletable-auth").val();
+ var upda = $("#file-updatable-auth").val();
+ var visi = $("#file-visible-auth").val();
+ var id = app.files[$(selectedRows[rowIndex]).children(".file-index").attr("data-key")].id;
+ //无须传递KEY
+ updateAuth("/file/" + id + "/auth", down, 1, dele, upda, visi, 0);
+ });
+ setTimeout(function () {
+ if (isEmpty(location.hash)) {
+ location.hash = "#upload-manager";
+ getTabInfo(location.hash);
+ } else {
+ $("a[href='" + location.hash + "']").click();
+ }
+ }, 1000);
+ $("#server-file-share-button").click(function () {
+ if (app.selectedServerFiles.length > 0) {
+ var files = "";
+ app.selectedServerFiles.forEach(function (json) {
+ files += json.absolutePath + ",";
+ });
+ layer.load(1);
+ $.post("/file/server/share", {
+ prefix: $("#link-prefix").val(),
+ files: files.substr(0, files.length - 1)
+ }, function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.status === "success") {
+ getTabInfo(window.location.hash);
+ $("#fileAddedModal").modal("hide");
+ layer.msg("共享文件成功");
+ } else {
+ alerts("共享失败(可能是本地路径或访问链接已经存在导致)");
+ }
+ });
+ } else {
+ alerts("还没有选择任何文件");
+ }
+ });
+ $("#select-url").keyup(function () {
+ if (window.event.keyCode === 13) {
+ getServerFileByPath(false);
+ }
+ });
+ $(".server-path-return").click(function () {
+ var len = serverFileSearchHistory.length;
+ if (len > 1) {
+ serverFileSearchHistory.splice(len - 1, 1);
+ $("#select-url").val(serverFileSearchHistory[len - 2]);
+ serverFileSearchHistory.splice(len - 2, 1);
+ getServerFileByPath(false);
+ }
+ });
+ $(".to-upload-button").click(function () {
+ layer.prompt({title: '请输入文件前缀,支持规则', formType: 0}, function (prefix, index) {
+ layer.close(index);
+ window.open("upload?prefix=" + encodeURI(prefix));
+ });
+ });
+ $("#file-modify-button").click(function () {
+ var localUrl = $("#new-file-local-url").val();
+ var visitUrl = $("#new-file-visit-url").val();
+ if (isEmpty(localUrl) && isEmpty(visitUrl)) {
+ alerts("内容为空,无法更新");
+ } else {
+ layer.load(1);
+ $.ajax({
+ url: "/file/" + $("#file-id").val() + "/url",
+ data: {oldLocalUrl: $("#old-file-local-url").val(), localUrl: localUrl, visitUrl: visitUrl},
+ type: "PUT",
+ success: function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ var key = $(selectedRows[rowIndex]).children(".file-index").attr("data-key");
+ if (json.status.localUrl) {
+ app.files[key].localUrl = localUrl;
+ $("[data-toggle='tooltip']").tooltip();
+ }
+ if (json.status.visitUrl) {
+ app.files[key].visitUrl = visitUrl;
+ }
+ alerts((isEmpty(localUrl) ? "" : "更新本地路径" + boolToChinese(json.status.localUrl)) + (isEmpty(visitUrl) ? "" : (isEmpty(localUrl) ? "" : ",") + "更新访问链接" + boolToChinese(json.status.visitUrl)));
+ },
+ error: function () {
+ alerts("连接到服务器异常");
+ }
+ });
+ }
+ });
+ $(".file-delete").click(function () {
+ doDelete("#file-manager-table", app.files, ".file-index", "/file/batch/");
+ });
+}); \ No newline at end of file
diff --git a/src/main/resources/assets/js/angular-filemanager.min.js b/src/main/resources/assets/js/angular-filemanager.min.js
new file mode 100644
index 0000000..d83ad5f
--- /dev/null
+++ b/src/main/resources/assets/js/angular-filemanager.min.js
@@ -0,0 +1,2240 @@
+!function (e, r) {
+ "use strict";
+ r.module("FileManagerApp", ["pascalprecht.translate", "ngFileUpload"]), r.element(e.document).on("shown.bs.modal", ".modal", function () {
+ e.setTimeout(function () {
+ r.element("[autofocus]", this).focus()
+ }.bind(this), 100)
+ }), r.element(e.document).on("click", function () {
+ r.element("#context-menu").hide()
+ }), r.element(e.document).on("contextmenu", '.main-navigation .table-files tr.item-list:has("td"), .item-list', function (n) {
+ var i = r.element("#context-menu");
+ n.pageX >= e.innerWidth - i.width() && (n.pageX -= i.width()), n.pageY >= e.innerHeight - i.height() && (n.pageY -= i.height()), i.hide().css({
+ left: n.pageX,
+ top: n.pageY
+ }).appendTo("body").show(), n.preventDefault()
+ }), Array.prototype.find || (Array.prototype.find = function (e) {
+ if (null == this) throw new TypeError("Array.prototype.find called on null or undefined");
+ if ("function" != typeof e) throw new TypeError("predicate must be a function");
+ for (var r, n = Object(this), i = n.length >>> 0, a = arguments[1], t = 0; t < i; t++) if (r = n[t], e.call(a, r, t, n)) return r
+ })
+}(window, angular), function (e) {
+ "use strict";
+ e.module("FileManagerApp").controller("FileManagerCtrl", ["$scope", "$rootScope", "$window", "$translate", "fileManagerConfig", "item", "fileNavigator", "apiMiddleware", function (r, n, i, a, t, o, s, l) {
+ var d = i.localStorage;
+ r.config = t, r.reverse = !1, r.predicate = ["model.type", "model.name"], r.order = function (e) {
+ r.reverse = r.predicate[1] === e && !r.reverse, r.predicate[1] = e
+ }, r.query = "", r.fileNavigator = new s, r.apiMiddleware = new l, r.uploadFileList = [], r.viewTemplate = d.getItem("viewTemplate") || "main-icons.html", r.fileList = [], r.temps = [], r.$watch("temps", function () {
+ r.singleSelection() ? r.temp = r.singleSelection() : (r.temp = new o({rights: 644}), r.temp.multiple = !0), r.temp.revert()
+ }), r.fileNavigator.onRefresh = function () {
+ r.temps = [], r.query = "", n.selectedModalPath = r.fileNavigator.currentPath
+ }, r.setTemplate = function (e) {
+ d.setItem("viewTemplate", e), r.viewTemplate = e
+ }, r.changeLanguage = function (e) {
+ if (e) return d.setItem("language", e), a.use(e);
+ a.use(d.getItem("language") || t.defaultLang)
+ }, r.isSelected = function (e) {
+ return -1 !== r.temps.indexOf(e)
+ }, r.selectOrUnselect = function (e, n) {
+ var i = r.temps.indexOf(e), a = n && 3 == n.which;
+ if (n && n.target.hasAttribute("prevent")) r.temps = []; else if (!(!e || a && r.isSelected(e))) {
+ if (n && n.shiftKey && !a) {
+ var t = r.fileList, o = t.indexOf(e), s = r.temps[0], l = t.indexOf(s), d = void 0;
+ if (s && t.indexOf(s) < o) {
+ for (r.temps = []; l <= o;) d = t[l], !r.isSelected(d) && r.temps.push(d), l++;
+ return
+ }
+ if (s && t.indexOf(s) > o) {
+ for (r.temps = []; l >= o;) d = t[l], !r.isSelected(d) && r.temps.push(d), l--;
+ return
+ }
+ }
+ !n || a || !n.ctrlKey && !n.metaKey ? r.temps = [e] : r.isSelected(e) ? r.temps.splice(i, 1) : r.temps.push(e)
+ }
+ }, r.singleSelection = function () {
+ return 1 === r.temps.length && r.temps[0]
+ }, r.totalSelecteds = function () {
+ return {total: r.temps.length}
+ }, r.selectionHas = function (e) {
+ return r.temps.find(function (r) {
+ return r && r.model.type === e
+ })
+ }, r.prepareNewFolder = function () {
+ var e = new o(null, r.fileNavigator.currentPath);
+ return r.temps = [e], e
+ }, r.smartClick = function (e) {
+ var n = r.config.allowedActions.pickFiles;
+ if (e.isFolder()) return r.fileNavigator.folderClick(e);
+ if ("function" == typeof r.config.pickCallback && n) {
+ if (!0 === r.config.pickCallback(e.model)) return
+ }
+ return e.isImage() ? r.config.previewImagesInModal ? r.openImagePreview(e) : r.apiMiddleware.download(e, !0) : e.isEditable() ? r.openEditItem(e) : void 0
+ }, r.openImagePreview = function () {
+ var e = r.singleSelection();
+ r.apiMiddleware.apiHandler.inprocess = !0, r.modal("imagepreview", null, !0).find("#imagepreview-target").attr("src", r.getUrl(e)).unbind("load error").on("load error", function () {
+ r.apiMiddleware.apiHandler.inprocess = !1, r.$apply()
+ })
+ }, r.openEditItem = function () {
+ var e = r.singleSelection();
+ r.apiMiddleware.getContent(e).then(function (r) {
+ e.tempModel.content = e.model.content = r.result
+ }), r.modal("edit")
+ }, r.modal = function (n, i, a) {
+ var t = e.element("#" + n);
+ return t.modal(i ? "hide" : "show"), r.apiMiddleware.apiHandler.error = "", r.apiMiddleware.apiHandler.asyncSuccess = !1, !a || t
+ }, r.modalWithPathSelector = function (e) {
+ return n.selectedModalPath = r.fileNavigator.currentPath, r.modal(e)
+ }, r.isInThisPath = function (e) {
+ return -1 !== (r.fileNavigator.currentPath.join("/") + "/").indexOf(e + "/")
+ }, r.edit = function () {
+ r.apiMiddleware.edit(r.singleSelection()).then(function () {
+ r.modal("edit", !0)
+ })
+ }, r.changePermissions = function () {
+ r.apiMiddleware.changePermissions(r.temps, r.temp).then(function () {
+ r.fileNavigator.refresh(), r.modal("changepermissions", !0)
+ })
+ }, r.download = function () {
+ var e = r.singleSelection();
+ if (!r.selectionHas("dir")) return e ? r.apiMiddleware.download(e) : r.apiMiddleware.downloadMultiple(r.temps)
+ }, r.copy = function () {
+ var e = r.singleSelection();
+ if (e) {
+ var i = e.tempModel.name.trim();
+ if (r.fileNavigator.fileNameExists(i) && c(e)) return r.apiMiddleware.apiHandler.error = a.instant("error_invalid_filename"), !1;
+ if (!i) return r.apiMiddleware.apiHandler.error = a.instant("error_invalid_filename"), !1
+ }
+ r.apiMiddleware.copy(r.temps, n.selectedModalPath).then(function () {
+ r.fileNavigator.refresh(), r.modal("copy", !0)
+ })
+ }, r.compress = function () {
+ var e = r.temp.tempModel.name.trim();
+ return r.fileNavigator.fileNameExists(e) && c(r.temp) ? (r.apiMiddleware.apiHandler.error = a.instant("error_invalid_filename"), !1) : e ? void r.apiMiddleware.compress(r.temps, e, n.selectedModalPath).then(function () {
+ if (r.fileNavigator.refresh(), !r.config.compressAsync) return r.modal("compress", !0);
+ r.apiMiddleware.apiHandler.asyncSuccess = !0
+ }, function () {
+ r.apiMiddleware.apiHandler.asyncSuccess = !1
+ }) : (r.apiMiddleware.apiHandler.error = a.instant("error_invalid_filename"), !1)
+ }, r.extract = function () {
+ var e = r.temp, i = r.temp.tempModel.name.trim();
+ return r.fileNavigator.fileNameExists(i) && c(r.temp) ? (r.apiMiddleware.apiHandler.error = a.instant("error_invalid_filename"), !1) : i ? void r.apiMiddleware.extract(e, i, n.selectedModalPath).then(function () {
+ if (r.fileNavigator.refresh(), !r.config.extractAsync) return r.modal("extract", !0);
+ r.apiMiddleware.apiHandler.asyncSuccess = !0
+ }, function () {
+ r.apiMiddleware.apiHandler.asyncSuccess = !1
+ }) : (r.apiMiddleware.apiHandler.error = a.instant("error_invalid_filename"), !1)
+ }, r.remove = function () {
+ r.apiMiddleware.remove(r.temps).then(function () {
+ r.fileNavigator.refresh(), r.modal("remove", !0)
+ })
+ }, r.move = function () {
+ var e = r.singleSelection() || r.temps[0];
+ if (e && c(e)) return r.apiMiddleware.apiHandler.error = a.instant("error_cannot_move_same_path"), !1;
+ r.apiMiddleware.move(r.temps, n.selectedModalPath).then(function () {
+ r.fileNavigator.refresh(), r.modal("move", !0)
+ })
+ }, r.rename = function () {
+ var e = r.singleSelection(), n = e.tempModel.name, i = e.tempModel.path.join("") === e.model.path.join("");
+ if (!n || i && r.fileNavigator.fileNameExists(n)) return r.apiMiddleware.apiHandler.error = a.instant("error_invalid_filename"), !1;
+ r.apiMiddleware.rename(e).then(function () {
+ r.fileNavigator.refresh(), r.modal("rename", !0)
+ })
+ }, r.createFolder = function () {
+ var e = r.singleSelection(), n = e.tempModel.name;
+ if (!n || r.fileNavigator.fileNameExists(n)) return r.apiMiddleware.apiHandler.error = a.instant("error_invalid_filename");
+ r.apiMiddleware.createFolder(e).then(function () {
+ r.fileNavigator.refresh(), r.modal("newfolder", !0)
+ })
+ }, r.addForUpload = function (e) {
+ r.uploadFileList = r.uploadFileList.concat(e), r.modal("uploadfile")
+ }, r.removeFromUpload = function (e) {
+ r.uploadFileList.splice(e, 1)
+ }, r.uploadFiles = function () {
+ r.apiMiddleware.upload(r.uploadFileList, r.fileNavigator.currentPath).then(function () {
+ r.fileNavigator.refresh(), r.uploadFileList = [], r.modal("uploadfile", !0)
+ }, function (e) {
+ var n = e.result && e.result.error || a.instant("error_uploading_files");
+ r.apiMiddleware.apiHandler.error = n
+ })
+ }, r.getUrl = function (e) {
+ return r.apiMiddleware.getUrl(e)
+ };
+ var c = function (e) {
+ var r = n.selectedModalPath.join("");
+ return (e && e.model.path.join("")) === r
+ }, p = function (e) {
+ var r = i.location.search.substr(1).split("&").filter(function (r) {
+ return e === r.split("=")[0]
+ });
+ return r[0] && r[0].split("=")[1] || void 0
+ };
+ r.changeLanguage(p("lang")), r.isWindows = "Windows" === p("server"), r.fileNavigator.refresh()
+ }])
+}(angular), function (e) {
+ "use strict";
+ angular.module("FileManagerApp").controller("ModalFileManagerCtrl", ["$scope", "$rootScope", "fileNavigator", function (e, r, n) {
+ e.reverse = !1, e.predicate = ["model.type", "model.name"], e.fileNavigator = new n, r.selectedModalPath = [], e.order = function (r) {
+ e.reverse = e.predicate[1] === r && !e.reverse, e.predicate[1] = r
+ }, e.select = function (n) {
+ r.selectedModalPath = n.model.fullPath().split("/").filter(Boolean), e.modal("selector", !0)
+ }, e.selectCurrent = function () {
+ r.selectedModalPath = e.fileNavigator.currentPath, e.modal("selector", !0)
+ }, e.selectedFilesAreChildOfPath = function (r) {
+ var n = r.model.fullPath();
+ return e.temps.find(function (e) {
+ var r = e.model.fullPath();
+ if (n == r) return !0
+ })
+ }, r.openNavigator = function (r) {
+ e.fileNavigator.currentPath = r, e.fileNavigator.refresh(), e.modal("selector")
+ }, r.getSelectedPath = function () {
+ var n = "/" + r.selectedModalPath.filter(Boolean).join("/");
+ return e.singleSelection() && !e.singleSelection().isFolder() && (n += "/" + e.singleSelection().tempModel.name), n.replace(/\/\//, "/")
+ }
+ }])
+}(), function (e) {
+ "use strict";
+ var r = angular.module("FileManagerApp");
+ r.directive("angularFilemanager", ["$parse", "fileManagerConfig", function (e, r) {
+ return {restrict: "EA", templateUrl: r.tplPath + "/main.html"}
+ }]), r.directive("ngFile", ["$parse", function (e) {
+ return {
+ restrict: "A", link: function (r, n, i) {
+ var a = e(i.ngFile).assign;
+ n.bind("change", function () {
+ r.$apply(function () {
+ a(r, n[0].files)
+ })
+ })
+ }
+ }
+ }]), r.directive("ngRightClick", ["$parse", function (e) {
+ return function (r, n, i) {
+ var a = e(i.ngRightClick);
+ n.bind("contextmenu", function (e) {
+ r.$apply(function () {
+ e.preventDefault(), a(r, {$event: e})
+ })
+ })
+ }
+ }])
+}(), function (e) {
+ "use strict";
+ angular.module("FileManagerApp").service("chmod", function () {
+ var e = function (e) {
+ if (this.owner = this.getRwxObj(), this.group = this.getRwxObj(), this.others = this.getRwxObj(), e) {
+ var r = isNaN(e) ? this.convertfromCode(e) : this.convertfromOctal(e);
+ if (!r) throw new Error("Invalid chmod input data (%s)".replace("%s", e));
+ this.owner = r.owner, this.group = r.group, this.others = r.others
+ }
+ };
+ return e.prototype.toOctal = function (e, r) {
+ var n = [];
+ return ["owner", "group", "others"].forEach(function (e, r) {
+ n[r] = this[e].read && this.octalValues.read || 0, n[r] += this[e].write && this.octalValues.write || 0, n[r] += this[e].exec && this.octalValues.exec || 0
+ }.bind(this)), (e || "") + n.join("") + (r || "")
+ }, e.prototype.toCode = function (e, r) {
+ var n = [];
+ return ["owner", "group", "others"].forEach(function (e, r) {
+ n[r] = this[e].read && this.codeValues.read || "-", n[r] += this[e].write && this.codeValues.write || "-", n[r] += this[e].exec && this.codeValues.exec || "-"
+ }.bind(this)), (e || "") + n.join("") + (r || "")
+ }, e.prototype.getRwxObj = function () {
+ return {read: !1, write: !1, exec: !1}
+ }, e.prototype.octalValues = {read: 4, write: 2, exec: 1}, e.prototype.codeValues = {
+ read: "r",
+ write: "w",
+ exec: "x"
+ }, e.prototype.convertfromCode = function (e) {
+ if (e = ("" + e).replace(/\s/g, ""), e = 10 === e.length ? e.substr(1) : e, /^[-rwxts]{9}$/.test(e)) {
+ var r = [], n = e.match(/.{1,3}/g);
+ for (var i in n) {
+ var a = this.getRwxObj();
+ a.read = /r/.test(n[i]), a.write = /w/.test(n[i]), a.exec = /x|t/.test(n[i]), r.push(a)
+ }
+ return {owner: r[0], group: r[1], others: r[2]}
+ }
+ }, e.prototype.convertfromOctal = function (e) {
+ if (e = ("" + e).replace(/\s/g, ""), e = 4 === e.length ? e.substr(1) : e, /^[0-7]{3}$/.test(e)) {
+ var r = [], n = e.match(/.{1}/g);
+ for (var i in n) {
+ var a = this.getRwxObj();
+ a.read = /[4567]/.test(n[i]), a.write = /[2367]/.test(n[i]), a.exec = /[1357]/.test(n[i]), r.push(a)
+ }
+ return {owner: r[0], group: r[1], others: r[2]}
+ }
+ }, e
+ })
+}(), function (e) {
+ "use strict";
+ e.module("FileManagerApp").factory("item", ["fileManagerConfig", "chmod", function (r, n) {
+ var i = function (r, i) {
+ var a = {
+ name: r && r.name || "",
+ path: i || [],
+ type: r && r.type || "file",
+ size: r && parseInt(r.size || 0),
+ date: function (e) {
+ var r = (e || "").toString().split(/[- :]/);
+ return new Date(r[0], r[1] - 1, r[2], r[3], r[4], r[5])
+ }(r && r.date),
+ perms: new n(r && r.rights),
+ content: r && r.content || "",
+ recursive: !1,
+ fullPath: function () {
+ return ("/" + this.path.filter(Boolean).join("/") + "/" + this.name).replace(/\/\//, "/")
+ }
+ };
+ this.error = "", this.processing = !1, this.model = e.copy(a), this.tempModel = e.copy(a)
+ };
+ return i.prototype.update = function () {
+ e.extend(this.model, e.copy(this.tempModel))
+ }, i.prototype.revert = function () {
+ e.extend(this.tempModel, e.copy(this.model)), this.error = ""
+ }, i.prototype.isFolder = function () {
+ return "dir" === this.model.type
+ }, i.prototype.isEditable = function () {
+ return !this.isFolder() && r.isEditableFilePattern.test(this.model.name)
+ }, i.prototype.isImage = function () {
+ return r.isImageFilePattern.test(this.model.name)
+ }, i.prototype.isCompressible = function () {
+ return this.isFolder()
+ }, i.prototype.isExtractable = function () {
+ return !this.isFolder() && r.isExtractableFilePattern.test(this.model.name)
+ }, i.prototype.isSelectable = function () {
+ return this.isFolder() && r.allowedActions.pickFolders || !this.isFolder() && r.allowedActions.pickFiles
+ }, i
+ }])
+}(angular), function (e) {
+ "use strict";
+ var r = angular.module("FileManagerApp");
+ r.filter("strLimit", ["$filter", function (e) {
+ return function (r, n, i) {
+ return r.length <= n ? r : e("limitTo")(r, n) + (i || "...")
+ }
+ }]), r.filter("fileExtension", ["$filter", function (e) {
+ return function (r) {
+ return /\./.test(r) && e("strLimit")(r.split(".").pop(), 3, "..") || ""
+ }
+ }]), r.filter("formatDate", ["$filter", function () {
+ return function (e) {
+ return e instanceof Date ? e.toISOString().substring(0, 19).replace("T", " ") : (e.toLocaleString || e.toString).apply(e)
+ }
+ }]), r.filter("humanReadableFileSize", ["$filter", "fileManagerConfig", function (e, r) {
+ var n = [" kB", " MB", " GB", " TB", "PB", "EB", "ZB", "YB"],
+ i = ["KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"];
+ return function (e) {
+ var a = -1, t = e;
+ do {
+ t /= 1024, a++
+ } while (t > 1024);
+ var o = r.useBinarySizePrefixes ? i[a] : n[a];
+ return Math.max(t, .1).toFixed(1) + " " + o
+ }
+ }])
+}(), function (e) {
+ "use strict";
+ e.module("FileManagerApp").provider("fileManagerConfig", function () {
+ var r = {
+ appName: "angular-filemanager v1.5",
+ defaultLang: "zh_cn",
+ listUrl: "/filemanager/list",
+ uploadUrl: "/filemanager/upload",
+ renameUrl: "/filemanager/rename",
+ copyUrl: "/filemanager/copy",
+ moveUrl: "/filemanager/move",
+ removeUrl: "/filemanager/remove",
+ editUrl: "/filemanager/edit",
+ getContentUrl: "/filemanager/content",
+ createFolderUrl: "/filemanager/folder",
+ downloadFileUrl: "/filemanager/download",
+ downloadMultipleUrl: "/filemanager/multidownload",
+ compressUrl: "/filemanager/compress",
+ extractUrl: "/filemanager/extract",
+ permissionsUrl: "/filemanager/permission",
+ basePath: "/",
+ searchForm: !0,
+ sidebar: !0,
+ breadcrumb: !0,
+ allowedActions: {
+ upload: !0,
+ rename: !0,
+ move: !0,
+ copy: !0,
+ edit: !0,
+ changePermissions: !0,
+ compress: !0,
+ compressChooseName: !0,
+ extract: !0,
+ download: !0,
+ downloadMultiple: !0,
+ preview: !0,
+ remove: !0,
+ createFolder: !0,
+ pickFiles: !1,
+ pickFolders: !1
+ },
+ multipleDownloadFileName: "efo-download.zip",
+ filterFileExtensions: [],
+ showExtensionIcons: !0,
+ showSizeForDirectories: !0,
+ useBinarySizePrefixes: !1,
+ downloadFilesByAjax: !0,
+ previewImagesInModal: !0,
+ enablePermissionsRecursive: !0,
+ compressAsync: !1,
+ extractAsync: !1,
+ pickCallback: null,
+ isEditableFilePattern: /\.(txt|diff?|patch|svg|asc|cnf|cfg|conf|html?|.html|cfm|cgi|aspx?|ini|pl|py|md|css|cs|js|jsp|log|htaccess|htpasswd|gitignore|gitattributes|env|json|atom|eml|rss|markdown|sql|xml|xslt?|sh|rb|as|bat|cmd|cob|for|ftn|frm|frx|inc|lisp|scm|coffee|php[3-6]?|java|c|cbl|go|h|scala|vb|tmpl|lock|go|yml|yaml|tsv|lst)$/i,
+ isImageFilePattern: /\.(jpe?g|gif|bmp|png|svg|tiff?)$/i,
+ isExtractableFilePattern: /\.(gz|tar|rar|g?zip)$/i,
+ tplPath: "src/templates"
+ };
+ return {
+ $get: function () {
+ return r
+ }, set: function (n) {
+ e.extend(r, n)
+ }
+ }
+ })
+}(angular), function (e) {
+ "use strict";
+ angular.module("FileManagerApp").config(["$translateProvider", function (e) {
+ e.useSanitizeValueStrategy(null), e.translations("en", {
+ filemanager: "File Manager",
+ language: "Language",
+ english: "English",
+ spanish: "Spanish",
+ portuguese: "Portuguese",
+ french: "French",
+ german: "German",
+ hebrew: "Hebrew",
+ italian: "Italian",
+ slovak: "Slovak",
+ chinese_tw: "Traditional Chinese",
+ chinese_cn: "Simple Chinese",
+ russian: "Russian",
+ ukrainian: "Ukrainian",
+ turkish: "Turkish",
+ persian: "Persian",
+ polish: "Polish",
+ dutch: "Dutch",
+ confirm: "Confirm",
+ cancel: "Cancel",
+ close: "Close",
+ upload_files: "Upload files",
+ files_will_uploaded_to: "Files will be uploaded to",
+ select_files: "Select files",
+ uploading: "Uploading",
+ permissions: "Permissions",
+ select_destination_folder: "Select the destination folder",
+ source: "Source",
+ destination: "Destination",
+ copy_file: "Copy file",
+ sure_to_delete: "Are you sure to delete",
+ change_name_move: "Change name / move",
+ enter_new_name_for: "Enter new name for",
+ extract_item: "Extract item",
+ extraction_started: "Extraction started in a background process",
+ compression_started: "Compression started in a background process",
+ enter_folder_name_for_extraction: "Enter the folder name for the extraction of",
+ enter_file_name_for_compression: "Enter the file name for the compression of",
+ toggle_fullscreen: "Toggle fullscreen",
+ edit_file: "Edit file",
+ file_content: "File content",
+ loading: "Loading",
+ search: "Search",
+ create_folder: "Create folder",
+ create: "Create",
+ folder_name: "Folder name",
+ upload: "Upload",
+ change_permissions: "Change permissions",
+ change: "Change",
+ details: "Details",
+ icons: "Icons",
+ list: "List",
+ name: "Name",
+ size: "Size",
+ actions: "Actions",
+ date: "Date",
+ selection: "Selection",
+ no_files_in_folder: "No files in this folder",
+ no_folders_in_folder: "This folder not contains children folders",
+ select_this: "Select this",
+ go_back: "Go back",
+ wait: "Wait",
+ move: "Move",
+ download: "Download",
+ view_item: "View item",
+ remove: "Delete",
+ edit: "Edit",
+ copy: "Copy",
+ rename: "Rename",
+ extract: "Extract",
+ compress: "Compress",
+ error_invalid_filename: "Invalid filename or already exists, specify another name",
+ error_modifying: "An error occurred modifying the file",
+ error_deleting: "An error occurred deleting the file or folder",
+ error_renaming: "An error occurred renaming the file",
+ error_copying: "An error occurred copying the file",
+ error_compressing: "An error occurred compressing the file or folder",
+ error_extracting: "An error occurred extracting the file",
+ error_creating_folder: "An error occurred creating the folder",
+ error_getting_content: "An error occurred getting the content of the file",
+ error_changing_perms: "An error occurred changing the permissions of the file",
+ error_uploading_files: "An error occurred uploading files",
+ sure_to_start_compression_with: "Are you sure to compress",
+ owner: "Owner",
+ group: "Group",
+ others: "Others",
+ read: "Read",
+ write: "Write",
+ exec: "Exec",
+ original: "Original",
+ changes: "Changes",
+ recursive: "Recursive",
+ preview: "Item preview",
+ open: "Open",
+ these_elements: "these {{total}} elements",
+ new_folder: "New folder",
+ download_as_zip: "Download as ZIP"
+ }), e.translations("nl", {
+ filemanager: "Bestand beheerder",
+ language: "Taal",
+ english: "Engels",
+ spanish: "Spaans",
+ portuguese: "Portugees",
+ french: "Frans",
+ german: "Duits",
+ hebrew: "Hebrews",
+ slovak: "Slowakije",
+ chinese: "Chinees",
+ russian: "Russisch",
+ ukrainian: "Oekraïens",
+ turkish: "Turks",
+ persian: "Perzisch",
+ confirm: "Bevestigen",
+ cancel: "Annuleren",
+ close: "Sluiten",
+ upload_files: "Bestanden uploaden",
+ files_will_uploaded_to: "Bestanden worden geüpload naar",
+ select_files: "Selecteer bestanden",
+ uploading: "Uploaden",
+ permissions: "Rechten",
+ select_destination_folder: "Selecteer de map van bestemming",
+ source: "Bron",
+ destination: "Doel",
+ copy_file: "Kopieer bestand",
+ sure_to_delete: "Weet je zeker dat je wilt verwijderen",
+ change_name_move: "Hernoemen / verplaatsen",
+ enter_new_name_for: "Typ een nieuwe naam voor",
+ extract_item: "Uitpakken",
+ extraction_started: "Uitpakken gestart als achtergrond proces",
+ compression_started: "Inpakken gestart als achtergrond proces",
+ enter_folder_name_for_extraction: "Typ een map naar voor het uitpakken van",
+ enter_file_name_for_compression: "Typ een bestandsnaam voor het inpakken van",
+ toggle_fullscreen: "Volledigscherm",
+ edit_file: "Bewerk bestand",
+ file_content: "Bestandsinhoud",
+ loading: "Laden",
+ search: "Zoeken",
+ create_folder: "Maak map",
+ create: "Maak",
+ folder_name: "Map naam",
+ upload: "Uploaden",
+ change_permissions: "Rechten aanpassen",
+ change: "Aanpassen",
+ details: "Details",
+ icons: "Iconen",
+ list: "Lijst",
+ name: "Naam",
+ size: "Grootte",
+ actions: "Acties",
+ date: "Datum",
+ no_files_in_folder: "Geen bestanden in deze map",
+ no_folders_in_folder: "Deze map bevat geen submappen",
+ select_this: "Selecteer dit",
+ go_back: "Ga terug",
+ wait: "Wacht",
+ move: "Verplaats",
+ download: "Download",
+ view_item: "Bekijk item",
+ remove: "Verwijderen",
+ edit: "Bewerken",
+ copy: "Kopiëren",
+ rename: "Hernoemen",
+ extract: "Uitpakken",
+ compress: "Inpakken",
+ error_invalid_filename: "Ongeldige bestandsnaam of bestand al aanwezig, kies een andere naam",
+ error_modifying: "Er is een fout opgetreden met het bewerken van het bestand",
+ error_deleting: "Er is een fout opgetreden tijdens het verwijderen van de bestand of map",
+ error_renaming: "Er is een fout opgetreden tijdens het hernoemen van het bestand",
+ error_copying: "Er is een fout opgetreden tijdens het kopiëren van het bestand",
+ error_compressing: "Er is een fout opgetreden tijdens het inpakken van het bestand of map",
+ error_extracting: "Er is een fout opgetreden tijdens het uitpakken van het bestand",
+ error_creating_folder: "Er is een fout opgetreden tijdens het maken van de map",
+ error_getting_content: "Er is een fout opgetreden tijdens het ophalen van de inhoud van het bestand",
+ error_changing_perms: "Er is een fout opgetreden tijdens het aanpassen van de rechten van het bestand",
+ error_uploading_files: "Er is een fout opgetreden tijdens het uploaden van de bestanden",
+ sure_to_start_compression_with: "Weet je zeker dat je dit wilt inpakken",
+ owner: "Eigenaar",
+ group: "Groep",
+ others: "Andere",
+ read: "Lees",
+ write: "Schrijf",
+ exec: "Uitvoeren",
+ original: "Origineel",
+ changes: "Aanpassingen",
+ recursive: "Recursieve",
+ preview: "Item bekijken",
+ open: "Openen",
+ these_elements: "Deze {{total}} elementen",
+ new_folder: "Nieuwe map",
+ download_as_zip: "Download als ZIP"
+ }), e.translations("he", {
+ filemanager: "מנהל קבצים",
+ language: "שפה",
+ english: "אנגלית",
+ spanish: "ספרדית",
+ portuguese: "פורטוגזית",
+ french: "צרפתית",
+ german: "גרמנית",
+ hebrew: "עברי",
+ italian: "איטלקי",
+ slovak: "סלובקי",
+ chinese_tw: "סינית מסורתית",
+ chinese_cn: "סינית פשוטה",
+ russian: "רוּסִי",
+ ukrainian: "אוקראיני",
+ turkish: "טורקי",
+ persian: "פַּרסִית",
+ polish: "פולני",
+ confirm: "אשר",
+ cancel: "בטל",
+ close: "סגור",
+ upload_files: "העלה קבצים",
+ files_will_uploaded_to: "הקבצים יעלו ל",
+ select_files: "בחר קבצים",
+ uploading: "מעלה",
+ permissions: "הרשאות",
+ select_destination_folder: "בחר תיקיית יעד",
+ source: "מקור",
+ destination: "יעד",
+ copy_file: "העתק קובץ",
+ sure_to_delete: "האם אתה בטוח שברצונך למחוק",
+ change_name_move: "שנה שם / הזז",
+ enter_new_name_for: "הקלד שם חדש עבור",
+ extract_item: "חלץ פריט",
+ extraction_started: "תהליך החילוץ מתבצע ברקע",
+ compression_started: "תהליך הכיווץ מתבצע ברקע",
+ enter_folder_name_for_extraction: "הקלד שם תיקייה לחילוץ עבור",
+ enter_file_name_for_compression: "הזן את שם הקובץ עבור הדחיסה של",
+ toggle_fullscreen: "הפעל/בטל מסך מלא",
+ edit_file: "ערוך קובץ",
+ file_content: "תוכן הקובץ",
+ loading: "טוען",
+ search: "חפש",
+ create_folder: "צור תיקייה",
+ create: "צור",
+ folder_name: "שם תיקייה",
+ upload: "העלה",
+ change_permissions: "שנה הרשאות",
+ change: "שנה",
+ details: "פרטים",
+ icons: "סמלים",
+ list: "רשימה",
+ name: "שם",
+ size: "גודל",
+ actions: "פעולות",
+ date: "תאריך",
+ selection: "בְּחִירָה",
+ no_files_in_folder: "אין קבצים בתיקייה זו",
+ no_folders_in_folder: "התיקייה הזו אינה כוללת תתי תיקיות",
+ select_this: "בחר את זה",
+ go_back: "חזור אחורה",
+ wait: "חכה",
+ move: "הזז",
+ download: "הורד",
+ view_item: "הצג פריט",
+ remove: "מחק",
+ edit: "ערוך",
+ copy: "העתק",
+ rename: "שנה שם",
+ extract: "חלץ",
+ compress: "כווץ",
+ error_invalid_filename: "שם קובץ אינו תקין או קיים, ציין שם קובץ אחר",
+ error_modifying: "התרחשה שגיאה בעת שינוי הקובץ",
+ error_deleting: "התרחשה שגיאה בעת מחיקת הקובץ או התיקייה",
+ error_renaming: "התרחשה שגיאה בעת שינוי שם הקובץ",
+ error_copying: "התרחשה שגיאה בעת העתקת הקובץ",
+ error_compressing: "התרחשה שגיאה בעת כיווץ הקובץ או התיקייה",
+ error_extracting: "התרחשה שגיאה בעת חילוץ הקובץ או התיקייה",
+ error_creating_folder: "התרחשה שגיאה בעת יצירת התיקייה",
+ error_getting_content: "התרחשה שגיאה בעת בקשת תוכן הקובץ",
+ error_changing_perms: "התרחשה שגיאה בעת שינוי הרשאות הקובץ",
+ error_uploading_files: "התרחשה שגיאה בעת העלאת הקבצים",
+ sure_to_start_compression_with: "האם אתה בטוח שברצונך לכווץ",
+ owner: "בעלים",
+ group: "קבוצה",
+ others: "אחרים",
+ read: "קריאה",
+ write: "כתיבה",
+ exec: "הרצה",
+ original: "מקורי",
+ changes: "שינויים",
+ recursive: "רקורסיה",
+ preview: "הצגת פריט",
+ open: "פתח",
+ new_folder: "תיקיה חדשה",
+ download_as_zip: "להוריד כמו"
+ }), e.translations("pt", {
+ filemanager: "Gerenciador de arquivos",
+ language: "Língua",
+ english: "Inglês",
+ spanish: "Espanhol",
+ portuguese: "Portugues",
+ french: "Francês",
+ german: "Alemão",
+ hebrew: "Hebraico",
+ italian: "Italiano",
+ slovak: "Eslovaco",
+ chinese_tw: "Tradicional Chinesa",
+ chinese_cn: "Chinês Simplificado",
+ russian: "Russo",
+ ukrainian: "Ucraniano",
+ turkish: "Turco",
+ persian: "Persa",
+ polish: "Polonês",
+ confirm: "Confirmar",
+ cancel: "Cancelar",
+ close: "Fechar",
+ upload_files: "Carregar arquivos",
+ files_will_uploaded_to: "Os arquivos serão enviados para",
+ select_files: "Selecione os arquivos",
+ uploading: "Carregar",
+ permissions: "Autorizações",
+ select_destination_folder: "Selecione a pasta de destino",
+ source: "Origem",
+ destination: "Destino",
+ copy_file: "Copiar arquivo",
+ sure_to_delete: "Tem certeza de que deseja apagar",
+ change_name_move: "Renomear / mudança",
+ enter_new_name_for: "Digite o novo nome para",
+ extract_item: "Extrair arquivo",
+ extraction_started: "A extração começou em um processo em segundo plano",
+ compression_started: "A compressão começou em um processo em segundo plano",
+ enter_folder_name_for_extraction: "Digite o nome da pasta para a extração de",
+ enter_file_name_for_compression: "Digite o nome do arquivo para a compressão de",
+ toggle_fullscreen: "Ativar/desativar tela cheia",
+ edit_file: "Editar arquivo",
+ file_content: "Conteúdo do arquivo",
+ loading: "Carregando",
+ search: "Localizar",
+ create_folder: "Criar Pasta",
+ create: "Criar",
+ folder_name: "Nome da pasta",
+ upload: "Fazer",
+ change_permissions: "Alterar permissões",
+ change: "Alterar",
+ details: "Detalhes",
+ icons: "Icones",
+ list: "Lista",
+ name: "Nome",
+ size: "Tamanho",
+ actions: "Ações",
+ date: "Data",
+ selection: "Seleção",
+ no_files_in_folder: "Não há arquivos nesta pasta",
+ no_folders_in_folder: "Esta pasta não contém subpastas",
+ select_this: "Selecione esta",
+ go_back: "Voltar",
+ wait: "Espere",
+ move: "Mover",
+ download: "Baixar",
+ view_item: "Veja o arquivo",
+ remove: "Excluir",
+ edit: "Editar",
+ copy: "Copiar",
+ rename: "Renomear",
+ extract: "Extrair",
+ compress: "Comprimir",
+ error_invalid_filename: "Nome do arquivo inválido ou nome de arquivo já existe, especifique outro nome",
+ error_modifying: "Ocorreu um erro ao modificar o arquivo",
+ error_deleting: "Ocorreu um erro ao excluir o arquivo ou pasta",
+ error_renaming: "Ocorreu um erro ao mudar o nome do arquivo",
+ error_copying: "Ocorreu um erro ao copiar o arquivo",
+ error_compressing: "Ocorreu um erro ao comprimir o arquivo ou pasta",
+ error_extracting: "Ocorreu um erro ao extrair o arquivo",
+ error_creating_folder: "Ocorreu um erro ao criar a pasta",
+ error_getting_content: "Ocorreu um erro ao obter o conteúdo do arquivo",
+ error_changing_perms: "Ocorreu um erro ao alterar as permissões do arquivo",
+ error_uploading_files: "Ocorreu um erro upload de arquivos",
+ sure_to_start_compression_with: "Tem certeza que deseja comprimir",
+ owner: "Proprietário",
+ group: "Grupo",
+ others: "Outros",
+ read: "Leitura",
+ write: "Escrita ",
+ exec: "Execução",
+ original: "Original",
+ changes: "Mudanças",
+ recursive: "Recursiva",
+ preview: "Visualização",
+ open: "Abrir",
+ these_elements: "estes {{total}} elements",
+ new_folder: "Nova pasta",
+ download_as_zip: "Download como ZIP"
+ }), e.translations("es", {
+ filemanager: "Administrador de archivos",
+ language: "Idioma",
+ english: "Ingles",
+ spanish: "Español",
+ portuguese: "Portugues",
+ french: "Francés",
+ german: "Alemán",
+ hebrew: "Hebreo",
+ italian: "Italiano",
+ slovak: "Eslovaco",
+ chinese_tw: "Tradicional China",
+ chinese_cn: "Chino Simplificado",
+ russian: "Ruso",
+ ukrainian: "Ucraniano",
+ turkish: "Turco",
+ persian: "Persa",
+ polish: "Polaco",
+ confirm: "Confirmar",
+ cancel: "Cancelar",
+ close: "Cerrar",
+ upload_files: "Subir archivos",
+ files_will_uploaded_to: "Los archivos seran subidos a",
+ select_files: "Seleccione los archivos",
+ uploading: "Subiendo",
+ permissions: "Permisos",
+ select_destination_folder: "Seleccione la carpeta de destino",
+ source: "Origen",
+ destination: "Destino",
+ copy_file: "Copiar archivo",
+ sure_to_delete: "Esta seguro que desea eliminar",
+ change_name_move: "Renombrar / mover",
+ enter_new_name_for: "Ingrese el nuevo nombre para",
+ extract_item: "Extraer archivo",
+ extraction_started: "La extraccion ha comenzado en un proceso de segundo plano",
+ compression_started: "La compresion ha comenzado en un proceso de segundo plano",
+ enter_folder_name_for_extraction: "Ingrese el nombre de la carpeta para la extraccion de",
+ enter_file_name_for_compression: "Ingrese el nombre del archivo para la compresion de",
+ toggle_fullscreen: "Activar/Desactivar pantalla completa",
+ edit_file: "Editar archivo",
+ file_content: "Contenido del archivo",
+ loading: "Cargando",
+ search: "Buscar",
+ create_folder: "Crear carpeta",
+ create: "Crear",
+ folder_name: "Nombre de la carpeta",
+ upload: "Subir",
+ change_permissions: "Cambiar permisos",
+ change: "Cambiar",
+ details: "Detalles",
+ icons: "Iconos",
+ list: "Lista",
+ name: "Nombre",
+ size: "Tamaño",
+ actions: "Acciones",
+ date: "Fecha",
+ selection: "Selección",
+ no_files_in_folder: "No hay archivos en esta carpeta",
+ no_folders_in_folder: "Esta carpeta no contiene sub-carpetas",
+ select_this: "Seleccionar esta",
+ go_back: "Volver",
+ wait: "Espere",
+ move: "Mover",
+ download: "Descargar",
+ view_item: "Ver archivo",
+ remove: "Eliminar",
+ edit: "Editar",
+ copy: "Copiar",
+ rename: "Renombrar",
+ extract: "Extraer",
+ compress: "Comprimir",
+ error_invalid_filename: "El nombre del archivo es invalido o ya existe",
+ error_modifying: "Ocurrio un error al intentar modificar el archivo",
+ error_deleting: "Ocurrio un error al intentar eliminar el archivo",
+ error_renaming: "Ocurrio un error al intentar renombrar el archivo",
+ error_copying: "Ocurrio un error al intentar copiar el archivo",
+ error_compressing: "Ocurrio un error al intentar comprimir el archivo",
+ error_extracting: "Ocurrio un error al intentar extraer el archivo",
+ error_creating_folder: "Ocurrio un error al intentar crear la carpeta",
+ error_getting_content: "Ocurrio un error al obtener el contenido del archivo",
+ error_changing_perms: "Ocurrio un error al cambiar los permisos del archivo",
+ error_uploading_files: "Ocurrio un error al subir archivos",
+ sure_to_start_compression_with: "Esta seguro que desea comprimir",
+ owner: "Propietario",
+ group: "Grupo",
+ others: "Otros",
+ read: "Lectura",
+ write: "Escritura",
+ exec: "Ejecucion",
+ original: "Original",
+ changes: "Cambios",
+ recursive: "Recursivo",
+ preview: "Vista previa",
+ open: "Abrir",
+ these_elements: "estos {{total}} elementos",
+ new_folder: "Nueva carpeta",
+ download_as_zip: "Descargar como ZIP"
+ }), e.translations("fr", {
+ filemanager: "Gestionnaire de fichier",
+ language: "Langue",
+ english: "Anglais",
+ spanish: "Espagnol",
+ portuguese: "Portugais",
+ french: "Français",
+ german: "Allemand",
+ hebrew: "Hébreu",
+ italian: "Italien",
+ slovak: "Slovaque",
+ chinese_tw: "Traditionnelle Chinoise",
+ chinese_cn: "Chinois Simplifié",
+ russian: "Russe",
+ ukrainian: "Ukrainien",
+ turkish: "Turc",
+ persian: "Persan",
+ polish: "Polonais",
+ confirm: "Confirmer",
+ cancel: "Annuler",
+ close: "Fermer",
+ upload_files: "Télécharger des fichiers",
+ files_will_uploaded_to: "Les fichiers seront uploadé dans",
+ select_files: "Sélectionnez les fichiers",
+ uploading: "Upload en cours",
+ permissions: "Permissions",
+ select_destination_folder: "Sélectionné le dossier de destination",
+ source: "Source",
+ destination: "Destination",
+ copy_file: "Copier le fichier",
+ sure_to_delete: "Êtes-vous sûr de vouloir supprimer",
+ change_name_move: "Renommer / Déplacer",
+ enter_new_name_for: "Entrer le nouveau nom pour",
+ extract_item: "Extraires les éléments",
+ extraction_started: "L'extraction a démarré en tâche de fond",
+ compression_started: "La compression a démarré en tâche de fond",
+ enter_folder_name_for_extraction: "Entrer le nom du dossier pour l'extraction de",
+ enter_file_name_for_compression: "Entrez le nom de fichier pour la compression de",
+ toggle_fullscreen: "Basculer en plein écran",
+ edit_file: "Éditer le fichier",
+ file_content: "Contenu du fichier",
+ loading: "Chargement en cours",
+ search: "Recherche",
+ create_folder: "Créer un dossier",
+ create: "Créer",
+ folder_name: "Nom du dossier",
+ upload: "Upload",
+ change_permissions: "Changer les permissions",
+ change: "Changer",
+ details: "Details",
+ icons: "Icons",
+ list: "Liste",
+ name: "Nom",
+ size: "Taille",
+ actions: "Actions",
+ date: "Date",
+ selection: "Sélection",
+ no_files_in_folder: "Aucun fichier dans ce dossier",
+ no_folders_in_folder: "Ce dossier ne contiens pas de dossier",
+ select_this: "Sélectionner",
+ go_back: "Retour",
+ wait: "Patienter",
+ move: "Déplacer",
+ download: "Télécharger",
+ view_item: "Voir l'élément",
+ remove: "Supprimer",
+ edit: "Éditer",
+ copy: "Copier",
+ rename: "Renommer",
+ extract: "Extraire",
+ compress: "Compresser",
+ error_invalid_filename: "Nom de fichier invalide ou déjà existant, merci de spécifier un autre nom",
+ error_modifying: "Une erreur est survenue pendant la modification du fichier",
+ error_deleting: "Une erreur est survenue pendant la suppression du fichier ou du dossier",
+ error_renaming: "Une erreur est survenue pendant le renommage du fichier",
+ error_copying: "Une erreur est survenue pendant la copie du fichier",
+ error_compressing: "Une erreur est survenue pendant la compression du fichier ou du dossier",
+ error_extracting: "Une erreur est survenue pendant l'extraction du fichier",
+ error_creating_folder: "Une erreur est survenue pendant la création du dossier",
+ error_getting_content: "Une erreur est survenue pendant la récupération du contenu du fichier",
+ error_changing_perms: "Une erreur est survenue pendant le changement des permissions du fichier",
+ error_uploading_files: "Une erreur est survenue pendant l'upload des fichiers",
+ sure_to_start_compression_with: "Êtes-vous sûre de vouloir compresser",
+ owner: "Propriétaire",
+ group: "Groupe",
+ others: "Autres",
+ read: "Lecture",
+ write: "Écriture",
+ exec: "Éxécution",
+ original: "Original",
+ changes: "Modifications",
+ recursive: "Récursif",
+ preview: "Aperçu",
+ open: "Ouvrir",
+ these_elements: "ces {{total}} éléments",
+ new_folder: "Nouveau dossier",
+ download_as_zip: "Télécharger comme ZIP"
+ }), e.translations("de", {
+ filemanager: "Dateimanager",
+ language: "Sprache",
+ english: "Englisch",
+ spanish: "Spanisch",
+ portuguese: "Portugiesisch",
+ french: "Französisch",
+ german: "Deutsch",
+ hebrew: "Hebräisch",
+ italian: "Italienisch",
+ slovak: "Slowakisch",
+ chinese_tw: "Traditionelles Chinesisch",
+ chinese_cn: "Vereinfachtes Chinesisch",
+ russian: "Russisch",
+ ukrainian: "Ukrainisch",
+ turkish: "Türkisch",
+ persian: "Persisch",
+ polish: "Polnisch",
+ confirm: "Bestätigen",
+ cancel: "Abbrechen",
+ close: "Schließen",
+ upload_files: "Hochladen von Dateien",
+ files_will_uploaded_to: "Dateien werden hochgeladen nach",
+ select_files: "Wählen Sie die Dateien",
+ uploading: "Lade hoch",
+ permissions: "Berechtigungen",
+ select_destination_folder: "Wählen Sie einen Zielordner",
+ source: "Quelle",
+ destination: "Ziel",
+ copy_file: "Datei kopieren",
+ sure_to_delete: "Sind Sie sicher, dass Sie die Datei löschen möchten?",
+ change_name_move: "Namen ändern / verschieben",
+ enter_new_name_for: "Geben Sie den neuen Namen ein für",
+ extract_item: "Archiv entpacken",
+ extraction_started: "Entpacken hat im Hintergrund begonnen",
+ compression_started: "Komprimierung hat im Hintergrund begonnen",
+ enter_folder_name_for_extraction: "Geben Sie den Verzeichnisnamen für die Entpackung an von",
+ enter_file_name_for_compression: "Geben Sie den Dateinamen für die Kompression an von",
+ toggle_fullscreen: "Vollbild umschalten",
+ edit_file: "Datei bearbeiten",
+ file_content: "Dateiinhalt",
+ loading: "Lade",
+ search: "Suche",
+ create_folder: "Ordner erstellen",
+ create: "Erstellen",
+ folder_name: "Verzeichnisname",
+ upload: "Hochladen",
+ change_permissions: "Berechtigungen ändern",
+ change: "Ändern",
+ details: "Details",
+ icons: "Symbolansicht",
+ list: "Listenansicht",
+ name: "Name",
+ size: "Größe",
+ actions: "Aktionen",
+ date: "Datum",
+ selection: "Auswahl",
+ no_files_in_folder: "Keine Dateien in diesem Ordner",
+ no_folders_in_folder: "Dieser Ordner enthält keine Unterordner",
+ select_this: "Auswählen",
+ go_back: "Zurück",
+ wait: "Warte",
+ move: "Verschieben",
+ download: "Herunterladen",
+ view_item: "Datei ansehen",
+ remove: "Löschen",
+ edit: "Bearbeiten",
+ copy: "Kopieren",
+ rename: "Umbenennen",
+ extract: "Entpacken",
+ compress: "Komprimieren",
+ error_invalid_filename: "Ungültiger Dateiname oder existiert bereits",
+ error_modifying: "Beim Bearbeiten der Datei ist ein Fehler aufgetreten",
+ error_deleting: "Beim Löschen der Datei oder des Ordners ist ein Fehler aufgetreten",
+ error_renaming: "Beim Umbennenen der Datei ist ein Fehler aufgetreten",
+ error_copying: "Beim Kopieren der Datei ist ein Fehler aufgetreten",
+ error_compressing: "Beim Komprimieren der Datei oder des Ordners ist ein Fehler aufgetreten",
+ error_extracting: "Beim Entpacken der Datei ist ein Fehler aufgetreten",
+ error_creating_folder: "Beim Erstellen des Ordners ist ein Fehler aufgetreten",
+ error_getting_content: "Beim Laden des Dateiinhalts ist ein Fehler aufgetreten",
+ error_changing_perms: "Beim Ändern der Dateiberechtigungen ist ein Fehler aufgetreten",
+ error_uploading_files: "Beim Hochladen der Dateien ist ein Fehler aufgetreten",
+ sure_to_start_compression_with: "Möchten Sie die Datei wirklich komprimieren?",
+ owner: "Besitzer",
+ group: "Gruppe",
+ others: "Andere",
+ read: "Lesen",
+ write: "Schreiben",
+ exec: "Ausführen",
+ original: "Original",
+ changes: "Änderungen",
+ recursive: "Rekursiv",
+ preview: "Dateivorschau",
+ open: "Öffnen",
+ these_elements: "diese {{total}} elemente",
+ new_folder: "Neuer ordner",
+ download_as_zip: "Download als ZIP"
+ }), e.translations("sk", {
+ filemanager: "Správca súborov",
+ language: "Jazyk",
+ english: "Angličtina",
+ spanish: "Španielčina",
+ portuguese: "Portugalčina",
+ french: "Francúzština",
+ german: "Nemčina",
+ hebrew: "Hebrejčina",
+ italian: "Italština",
+ slovak: "Slovenčina",
+ chinese_tw: "Tradičná Čínska",
+ chinese_cn: "Zjednodušená Čínština",
+ russian: "Ruský",
+ ukrainian: "Ukrajinský",
+ turkish: "Turecký",
+ persian: "Perzský",
+ polish: "Poľský",
+ confirm: "Potvrdiť",
+ cancel: "Zrušiť",
+ close: "Zavrieť",
+ upload_files: "Nahrávať súbory",
+ files_will_uploaded_to: "Súbory budú nahrané do",
+ select_files: "Vybrať súbory",
+ uploading: "Nahrávanie",
+ permissions: "Oprávnenia",
+ select_destination_folder: "Vyberte cieľový príečinok",
+ source: "Zdroj",
+ destination: "Cieľ",
+ copy_file: "Kopírovať súbor",
+ sure_to_delete: "Ste si istý, že chcete vymazať",
+ change_name_move: "Premenovať / Premiestniť",
+ enter_new_name_for: "Zadajte nové meno pre",
+ extract_item: "Rozbaliť položku",
+ extraction_started: "Rozbaľovanie začalo v procese na pozadí",
+ compression_started: "Kompresia začala v procese na pzoadí",
+ enter_folder_name_for_extraction: "Zadajte názov priečinka na rozbalenie",
+ enter_file_name_for_compression: "Zadajte názov súboru pre kompresiu",
+ toggle_fullscreen: "Prepnúť režim na celú obrazovku",
+ edit_file: "Upraviť súbor",
+ file_content: "Obsah súboru",
+ loading: "Načítavanie",
+ search: "Hľadať",
+ create_folder: "Vytvoriť priečinok",
+ create: "Vytvoriť",
+ folder_name: "Názov priećinka",
+ upload: "Nahrať",
+ change_permissions: "Zmeniť oprávnenia",
+ change: "Zmeniť",
+ details: "Podrobnosti",
+ icons: "Ikony",
+ list: "Zoznam",
+ name: "Meno",
+ size: "Veľkosť",
+ actions: "Akcie",
+ date: "Dátum",
+ selection: "Výber",
+ no_files_in_folder: "V tom to priečinku nie sú žiadne súbory",
+ no_folders_in_folder: "Tento priečinok neobsahuje žiadne ďalšie priećinky",
+ select_this: "Vybrať tento",
+ go_back: "Ísť späť",
+ wait: "Počkajte",
+ move: "Presunúť",
+ download: "Stiahnuť",
+ view_item: "Zobraziť položku",
+ remove: "Vymazať",
+ edit: "Upraviť",
+ copy: "Kopírovať",
+ rename: "Premenovať",
+ extract: "Rozbaliť",
+ compress: "Komprimovať",
+ error_invalid_filename: "Neplatné alebo duplicitné meno súboru, vyberte iné meno",
+ error_modifying: "Vyskytla sa chyba pri upravovaní súboru",
+ error_deleting: "Vyskytla sa chyba pri mazaní súboru alebo priečinku",
+ error_renaming: "Vyskytla sa chyba pri premenovaní súboru",
+ error_copying: "Vyskytla sa chyba pri kopírovaní súboru",
+ error_compressing: "Vyskytla sa chyba pri komprimovaní súboru alebo priečinka",
+ error_extracting: "Vyskytla sa chyba pri rozbaľovaní súboru",
+ error_creating_folder: "Vyskytla sa chyba pri vytváraní priečinku",
+ error_getting_content: "Vyskytla sa chyba pri získavaní obsahu súboru",
+ error_changing_perms: "Vyskytla sa chyba pri zmene oprávnení súboru",
+ error_uploading_files: "Vyskytla sa chyba pri nahrávaní súborov",
+ sure_to_start_compression_with: "Ste si istý, že chcete komprimovať",
+ owner: "Vlastník",
+ group: "Skupina",
+ others: "Ostatní",
+ read: "Čítanie",
+ write: "Zapisovanie",
+ exec: "Spúštanie",
+ original: "Originál",
+ changes: "Zmeny",
+ recursive: "Rekurzívne",
+ preview: "Náhľad položky",
+ open: "Otvoriť",
+ these_elements: "týchto {{total}} prvkov",
+ new_folder: "Nový priečinok",
+ download_as_zip: "Stiahnuť ako ZIP"
+ }), e.translations("zh_cn", {
+ filemanager: "文档管理器",
+ language: "语言",
+ english: "英语",
+ spanish: "西班牙语",
+ portuguese: "葡萄牙语",
+ french: "法语",
+ german: "德语",
+ hebrew: "希伯来语",
+ italian: "意大利",
+ slovak: "斯洛伐克语",
+ chinese_tw: "正体中文",
+ chinese_cn: "简体中文",
+ russian: "俄語",
+ ukrainian: "烏克蘭",
+ turkish: "土耳其",
+ persian: "波斯語",
+ polish: "波兰语",
+ confirm: "确定",
+ cancel: "取消",
+ close: "关闭",
+ upload_files: "上传文件",
+ files_will_uploaded_to: "文件将上传到",
+ select_files: "选择文件",
+ uploading: "上传中",
+ permissions: "权限",
+ select_destination_folder: "选择目标文件",
+ source: "源自",
+ destination: "目的地",
+ copy_file: "复制文件",
+ sure_to_delete: "确定要删除?",
+ change_name_move: "改名或移动?",
+ enter_new_name_for: "输入新的名称",
+ extract_item: "解压",
+ extraction_started: "解压已经在后台开始",
+ compression_started: "压缩已经在后台开始",
+ enter_folder_name_for_extraction: "输入解压的目标文件夹",
+ enter_file_name_for_compression: "输入要压缩的文件名",
+ toggle_fullscreen: "切换全屏",
+ edit_file: "编辑文件",
+ file_content: "文件内容",
+ loading: "加载中",
+ search: "搜索",
+ create_folder: "创建文件夹",
+ create: "创建",
+ folder_name: "文件夹名称",
+ upload: "上传",
+ change_permissions: "修改权限",
+ change: "修改",
+ details: "详细信息",
+ icons: "图标",
+ list: "列表",
+ name: "名称",
+ size: "尺寸",
+ actions: "操作",
+ date: "日期",
+ selection: "选择",
+ no_files_in_folder: "此文件夹没有文件",
+ no_folders_in_folder: "此文件夹不包含子文件夹",
+ select_this: "选择此文件",
+ go_back: "后退",
+ wait: "等待",
+ move: "移动",
+ download: "下载",
+ view_item: "查看子项",
+ remove: "删除",
+ edit: "编辑",
+ copy: "复制",
+ rename: "重命名",
+ extract: "解压",
+ compress: "压缩",
+ error_invalid_filename: "非法文件名或文件已经存在, 请指定其它名称",
+ error_modifying: "修改文件出错",
+ error_deleting: "删除文件或文件夹出错",
+ error_renaming: "重命名文件出错",
+ error_copying: "复制文件出错",
+ error_compressing: "压缩文件或文件夹出错",
+ error_extracting: "解压文件出错",
+ error_creating_folder: "创建文件夹出错",
+ error_getting_content: "获取文件内容出错",
+ error_changing_perms: "修改文件权限出错",
+ error_uploading_files: "上传文件出错",
+ sure_to_start_compression_with: "确定要压缩?",
+ owner: "拥有者",
+ group: "群组",
+ others: "其他",
+ read: "读取",
+ write: "写入",
+ exec: "执行",
+ original: "原始",
+ changes: "变化",
+ recursive: "递归",
+ preview: "成员预览",
+ open: "打开",
+ these_elements: "共 {{total}} 个",
+ new_folder: "新文件夹",
+ download_as_zip: "下载的ZIP"
+ }), e.translations("zh_tw", {
+ filemanager: "檔案管理員",
+ language: "語言",
+ english: "英語",
+ spanish: "西班牙語",
+ portuguese: "葡萄牙語",
+ french: "法語",
+ german: "德語",
+ hebrew: "希伯來語",
+ italian: "意大利",
+ slovak: "斯洛伐克語",
+ chinese_tw: "正體中文",
+ chinese_cn: "簡體中文",
+ russian: "俄語",
+ ukrainian: "烏克蘭",
+ turkish: "土耳其",
+ persian: "波斯語",
+ polish: "波蘭語",
+ confirm: "確定",
+ cancel: "取消",
+ close: "關閉",
+ upload_files: "上傳檔案",
+ files_will_uploaded_to: "檔案將上傳到",
+ select_files: "選擇檔案",
+ uploading: "上傳中",
+ permissions: "權限",
+ select_destination_folder: "選擇目標檔案",
+ source: "來自",
+ destination: "目的地",
+ copy_file: "複製檔案",
+ sure_to_delete: "確定要刪除?",
+ change_name_move: "更名或移動?",
+ enter_new_name_for: "輸入新的名稱",
+ extract_item: "解壓",
+ extraction_started: "解壓已經在後台開始",
+ compression_started: "壓縮已經在後台開始",
+ enter_folder_name_for_extraction: "輸入解壓的目標資料匣",
+ enter_file_name_for_compression: "輸入要壓縮的檔名",
+ toggle_fullscreen: "切換全螢幕",
+ edit_file: "編輯檔案",
+ file_content: "檔案內容",
+ loading: "載入中",
+ search: "尋找",
+ create_folder: "建立資料匣",
+ create: "建立",
+ folder_name: "資料匣名稱",
+ upload: "上傳",
+ change_permissions: "修改權限",
+ change: "修改",
+ details: "詳細內容",
+ icons: "圖示",
+ list: "列表",
+ name: "名稱",
+ size: "大小",
+ actions: "操作",
+ date: "日期",
+ selection: "選擇",
+ no_files_in_folder: "此資料匣沒有文件",
+ no_folders_in_folder: "此資料匣不包含子資料匣",
+ select_this: "選擇此資料匣",
+ go_back: "後退",
+ wait: "等待",
+ move: "移動",
+ download: "下載",
+ view_item: "檢視",
+ remove: "刪除",
+ edit: "存檔",
+ copy: "複製",
+ rename: "更改名稱",
+ extract: "解壓",
+ compress: "壓縮",
+ error_invalid_filename: "非法檔名或檔案已經存在, 請指定其它檔名",
+ error_modifying: "修改檔案出錯",
+ error_deleting: "刪除檔案或資料夾出錯",
+ error_renaming: "更改名稱發生出錯",
+ error_copying: "複製檔案出錯",
+ error_compressing: "壓縮檔案或資料匣出錯",
+ error_extracting: "解壓檔案出錯",
+ error_creating_folder: "建立資料匣出錯",
+ error_getting_content: "獲取檔案內容出錯",
+ error_changing_perms: "修改檔案權限出錯",
+ error_uploading_files: "上傳檔案出錯",
+ sure_to_start_compression_with: "確定要壓縮?",
+ owner: "擁有者",
+ group: "群組",
+ others: "其他",
+ read: "讀取",
+ write: "寫入",
+ exec: "執行",
+ original: "現行",
+ changes: "變更為",
+ recursive: "包含所有子資料匣",
+ preview: "預覽",
+ open: "開啟",
+ these_elements: "共 {{total}} 個",
+ new_folder: "新資料匣",
+ download_as_zip: "以ZIP下載"
+ }), e.translations("ru", {
+ filemanager: "Файловый менеджер",
+ language: "Язык",
+ english: "Английский",
+ spanish: "Испанский",
+ portuguese: "Португальский",
+ french: "Французкий",
+ german: "Немецкий",
+ hebrew: "Хинди",
+ italian: "итальянский",
+ slovak: "Словацкий",
+ chinese_tw: "Традиционный Китайский",
+ chinese_cn: "Упрощенный Китайский",
+ russian: "русский",
+ ukrainian: "украинец",
+ turkish: "турецкий",
+ persian: "персидский",
+ polish: "Польский",
+ confirm: "Подьвердить",
+ cancel: "Отменить",
+ close: "Закрыть",
+ upload_files: "Загрузка файлов",
+ files_will_uploaded_to: "Файлы будут загружены в: ",
+ select_files: "Выберите файлы",
+ uploading: "Загрузка",
+ permissions: "Разрешения",
+ select_destination_folder: "Выберите папку назначения",
+ source: "Источкик",
+ destination: "Цель",
+ copy_file: "Скопировать файл",
+ sure_to_delete: "Действительно удалить?",
+ change_name_move: "Переименовать / переместить",
+ enter_new_name_for: "Новое имя для",
+ extract_item: "Извлечь",
+ extraction_started: "Извлечение начато",
+ compression_started: "Сжатие начато",
+ enter_folder_name_for_extraction: "Извлечь в укананную папку",
+ enter_file_name_for_compression: "Введите имя архива",
+ toggle_fullscreen: "На весь экран",
+ edit_file: "Редактировать",
+ file_content: "Содержимое файла",
+ loading: "Загрузка",
+ search: "Поиск",
+ create_folder: "Создать папку",
+ create: "Создать",
+ folder_name: "Имя папки",
+ upload: "Загрузить",
+ change_permissions: "Изменить разрешения",
+ change: "Изменить",
+ details: "Свойства",
+ icons: "Иконки",
+ list: "Список",
+ name: "Имя",
+ size: "Размер",
+ actions: "Действия",
+ date: "Дата",
+ selection: "выбор",
+ no_files_in_folder: "Пустая папка",
+ no_folders_in_folder: "Пустая папка",
+ select_this: "Выбрать",
+ go_back: "Назад",
+ wait: "Подождите",
+ move: "Переместить",
+ download: "Скачать",
+ view_item: "Отобразить содержимое",
+ remove: "Удалить",
+ edit: "Редактировать",
+ copy: "Скопировать",
+ rename: "Переименовать",
+ extract: "Извлечь",
+ compress: "Сжать",
+ error_invalid_filename: "Имя неверное или уже существует, выберите другое",
+ error_modifying: "Произошла ошибка при модифицировании файла",
+ error_deleting: "Произошла ошибка при удалении",
+ error_renaming: "Произошла ошибка при переименовании файла",
+ error_copying: "Произошла ошибка при копировании файла",
+ error_compressing: "Произошла ошибка при сжатии",
+ error_extracting: "Произошла ошибка при извлечении",
+ error_creating_folder: "Произошла ошибка при создании папки",
+ error_getting_content: "Произошла ошибка при получении содержимого",
+ error_changing_perms: "Произошла ошибка при изменении разрешений",
+ error_uploading_files: "Произошла ошибка при загрузке",
+ sure_to_start_compression_with: "Действительно сжать",
+ owner: "Владелец",
+ group: "Группа",
+ others: "Другие",
+ read: "Чтение",
+ write: "Запись",
+ exec: "Выполнение",
+ original: "По-умолчанию",
+ changes: "Изменения",
+ recursive: "Рекурсивно",
+ preview: "Просмотр",
+ open: "Открыть",
+ these_elements: "всего {{total}} елементов",
+ new_folder: "Новая папка",
+ download_as_zip: "Download as ZIP"
+ }), e.translations("ua", {
+ filemanager: "Файловий менеджер",
+ language: "Мова",
+ english: "Англійська",
+ spanish: "Іспанська",
+ portuguese: "Португальська",
+ french: "Французька",
+ german: "Німецька",
+ hebrew: "Хінді",
+ italian: "італійський",
+ slovak: "Словацька",
+ chinese_tw: "традиційний Китайський",
+ chinese_cn: "Cпрощена Китайська",
+ russian: "російський",
+ ukrainian: "український",
+ turkish: "турецька",
+ persian: "перський",
+ polish: "Польська",
+ confirm: "Підтвердити",
+ cancel: "Відмінити",
+ close: "Закрити",
+ upload_files: "Завантаження файлів",
+ files_will_uploaded_to: "Файли будуть завантажені у: ",
+ select_files: "Виберіть файли",
+ uploading: "Завантаження",
+ permissions: "Дозволи",
+ select_destination_folder: "Виберіть папку призначення",
+ source: "Джерело",
+ destination: "Ціль",
+ copy_file: "Скопіювати файл",
+ sure_to_delete: "Дійсно удалить?",
+ change_name_move: "Перейменувати / перемістити",
+ enter_new_name_for: "Нове ім'я для",
+ extract_item: "Извлечь",
+ extraction_started: "Извлечение начато",
+ compression_started: "Архівацію почато",
+ enter_folder_name_for_extraction: "Извлечь в укананную папку",
+ enter_file_name_for_compression: "Введите имя архива",
+ toggle_fullscreen: "На весь экран",
+ edit_file: "Редагувати",
+ file_content: "Вміст файлу",
+ loading: "Завантаження",
+ search: "Пошук",
+ create_folder: "Створити папку",
+ create: "Створити",
+ folder_name: "Ім'я папки",
+ upload: "Завантижити",
+ change_permissions: "Змінити дозволи",
+ change: "Редагувати",
+ details: "Властивості",
+ icons: "Іконки",
+ list: "Список",
+ name: "Ім'я",
+ size: "Розмір",
+ actions: "Дії",
+ date: "Дата",
+ selection: "вибір",
+ no_files_in_folder: "Пуста папка",
+ no_folders_in_folder: "Пуста папка",
+ select_this: "Выбрати",
+ go_back: "Назад",
+ wait: "Зачекайте",
+ move: "Перемістити",
+ download: "Скачати",
+ view_item: "Показати вміст",
+ remove: "Видалити",
+ edit: "Редагувати",
+ copy: "Копіювати",
+ rename: "Переіменувати",
+ extract: "Розархівувати",
+ compress: "Архівувати",
+ error_invalid_filename: "Ім'я певірне або вже існує, виберіть інше",
+ error_modifying: "Виникла помилка при редагуванні файлу",
+ error_deleting: "Виникла помилка при видаленні",
+ error_renaming: "Виникла помилка при зміні імені файлу",
+ error_copying: "Виникла помилка при коміюванні файлу",
+ error_compressing: "Виникла помилка при стисненні",
+ error_extracting: "Виникла помилка при розархівації",
+ error_creating_folder: "Виникла помилка при створенні папки",
+ error_getting_content: "Виникла помилка при отриманні вмісту",
+ error_changing_perms: "Виникла помилка при зміні дозволів",
+ error_uploading_files: "Виникла помилка при завантаженні",
+ sure_to_start_compression_with: "Дійсно стиснути",
+ owner: "Власник",
+ group: "Група",
+ others: "Інші",
+ read: "Читання",
+ write: "Запис",
+ exec: "Виконання",
+ original: "За замовчуванням",
+ changes: "Зміни",
+ recursive: "Рекурсивно",
+ preview: "Перегляд",
+ open: "Відкрити",
+ these_elements: "усього {{total}} елементів",
+ new_folder: "Нова папка",
+ download_as_zip: "Download as ZIP"
+ }), e.translations("tr", {
+ filemanager: "Dosya Yöneticisi",
+ language: "Dil",
+ english: "İngilizce",
+ spanish: "İspanyolca",
+ portuguese: "Portekizce",
+ french: "Fransızca",
+ german: "Almanca",
+ hebrew: "İbranice",
+ italian: "İtalyanca",
+ slovak: "Slovakça",
+ chinese_tw: "Geleneksel Çin",
+ chinese_cn: "Basitleştirilmiş Çince",
+ russian: "Rusça",
+ ukrainian: "Ukraynaca",
+ turkish: "Türkçe",
+ persian: "Farsça",
+ polish: "Lehçe",
+ confirm: "Onayla",
+ cancel: "İptal Et",
+ close: "Kapat",
+ upload_files: "Dosya yükle",
+ files_will_uploaded_to: "Dosyalar yüklenecektir.",
+ select_files: "Dosya Seç",
+ uploading: "Yükleniyor",
+ permissions: "İzinler",
+ select_destination_folder: "Hedef klasör seçin",
+ source: "Kaynak",
+ destination: "Hedef",
+ copy_file: "Dosyayı kopyala",
+ sure_to_delete: "Silmek istediğinden emin misin",
+ change_name_move: "İsmini değiştir / taşı",
+ enter_new_name_for: "Yeni ad girin",
+ extract_item: "Dosya çıkar",
+ extraction_started: "Çıkarma işlemi arkaplanda devam ediyor",
+ compression_started: "Sıkıştırma işlemi arkaplanda başladı",
+ enter_folder_name_for_extraction: "Çıkarılması için klasör adı girin",
+ enter_file_name_for_compression: "Sıkıştırılması için dosya adı girin",
+ toggle_fullscreen: "Tam ekran moduna geç",
+ edit_file: "Dosyayı düzenle",
+ file_content: "Dosya içeriği",
+ loading: "Yükleniyor",
+ search: "Ara",
+ create_folder: "Klasör oluştur",
+ create: "Oluştur",
+ folder_name: "Klasör adı",
+ upload: "Yükle",
+ change_permissions: "İzinleri değiştir",
+ change: "Değiştir",
+ details: "Detaylar",
+ icons: "simgeler",
+ list: "Liste",
+ name: "Adı",
+ size: "Boyutu",
+ actions: "İşlemler",
+ date: "Tarih",
+ selection: "Seçim",
+ no_files_in_folder: "Klasörde hiç dosya yok",
+ no_folders_in_folder: "Bu klasör alt klasör içermez",
+ select_this: "Bunu seç",
+ go_back: "Geri git",
+ wait: "Bekle",
+ move: "Taşı",
+ download: "İndir",
+ view_item: "Dosyayı görüntüle",
+ remove: "Sil",
+ edit: "Düzenle",
+ copy: "Kopyala",
+ rename: "Yeniden Adlandır",
+ extract: "Çıkart",
+ compress: "Sıkıştır",
+ error_invalid_filename: "Geçersiz dosya adı, bu dosya adına sahip dosya mevcut",
+ error_modifying: "Dosya düzenlenirken bir hata oluştu",
+ error_deleting: "Klasör veya dosya silinirken bir hata oluştu",
+ error_renaming: "Dosya yeniden adlandırılırken bir hata oluştu",
+ error_copying: "Dosya kopyalanırken bir hata oluştu",
+ error_compressing: "Dosya veya klasör sıkıştırılırken bir hata oluştu",
+ error_extracting: "Çıkartılırken bir hata oluştu",
+ error_creating_folder: "Klasör oluşturulurken bir hata oluştu",
+ error_getting_content: "Dosya detayları alınırken bir hata oluştu",
+ error_changing_perms: "Dosyanın izini değiştirilirken bir hata oluştu",
+ error_uploading_files: "Dosyalar yüklenirken bir hata oluştu",
+ sure_to_start_compression_with: "Sıkıştırmak istediğinden emin misin",
+ owner: "Sahip",
+ group: "Grup",
+ others: "Diğerleri",
+ read: "Okuma",
+ write: "Yazma",
+ exec: "Gerçekleştir",
+ original: "Orjinal",
+ changes: "Değişiklikler",
+ recursive: "Yinemeli",
+ preview: "Dosyayı önizle",
+ open: "Aç",
+ these_elements: "{{total}} eleman",
+ new_folder: "Yeni Klasör",
+ download_as_zip: "ZIP olarak indir"
+ }), e.translations("fa", {
+ filemanager: "مدیریت فایل ها",
+ language: "زبان",
+ english: "انگلیسی",
+ spanish: "اسپانیایی",
+ portuguese: "پرتغالی",
+ french: "فرانسه",
+ german: "آلمانی",
+ hebrew: "عبری",
+ italian: "ایتالیایی",
+ slovak: "اسلواک",
+ chinese_tw: "چینی سنتی",
+ chinese_cn: "چینی ساده شده",
+ russian: "روسی",
+ ukrainian: "اوکراینی",
+ turkish: "ترکی",
+ persian: "فارسی",
+ polish: "لهستانی",
+ confirm: "تایید",
+ cancel: "رد",
+ close: "بستن",
+ upload_files: "آپلود فایل",
+ files_will_uploaded_to: "فایل ها آپلود می شوند به",
+ select_files: "انتخاب فایل ها",
+ uploading: "در حال آپلود",
+ permissions: "مجوز ها",
+ select_destination_folder: "پوشه مقصد را انتخاب کنید",
+ source: "مبدا",
+ destination: "مقصد",
+ copy_file: "کپی فایل",
+ sure_to_delete: "مطمين هستید می خواهید حذف کنید؟",
+ change_name_move: "تغییر نام و جابجایی",
+ enter_new_name_for: "نام جدیدی وارد کنید برای",
+ extract_item: "خارج کردن از حالت فشرده",
+ extraction_started: "یک پروسه در پس زمینه شروع به خارج کردن از حالت فشرده کرد",
+ compression_started: "یک پروسه در پس زمینه شروع به فشرده سازی کرد",
+ enter_folder_name_for_extraction: "نام پوشه مقصد برای خارج کردن از حالت فشرده را وارد کنید",
+ enter_file_name_for_compression: "نام پوشه مقصد برای فشرده سازی را وارد کنید",
+ toggle_fullscreen: "تعویض حالت تمام صفحه",
+ edit_file: "ویرایش",
+ file_content: "محتویات",
+ loading: "در حال بارگذاری",
+ search: "جستجو",
+ create_folder: "پوشه جدید",
+ create: "ساختن",
+ folder_name: "نام پوشه",
+ upload: "آپلود",
+ change_permissions: "تغییر مجوز ها",
+ change: "تغییر",
+ details: "جزییات",
+ icons: "آیکون ها",
+ list: "لیست",
+ name: "نام",
+ size: "سایز",
+ actions: "اعمال",
+ date: "تاریخ",
+ selection: "انتخاب",
+ no_files_in_folder: "هیچ فایلی در این پوشه نیست",
+ no_folders_in_folder: "هیچ پوشه ای داخل این پوشه قرار ندارد",
+ select_this: "انتخاب",
+ go_back: "بازگشت",
+ wait: "منتظر بمانید",
+ move: "جابجایی",
+ download: "دانلود",
+ view_item: "مشاهده این مورد",
+ remove: "حذف",
+ edit: "ویرایش",
+ copy: "کپی",
+ rename: "تغییر نام",
+ extract: "خروج از حالت فشرده",
+ compress: "فشرده سازی",
+ error_invalid_filename: "نام فایل مورد درست نیست و یا قبلا استفاده شده است، لطفا نام دیگری وارد کنید",
+ error_modifying: "در هنگام تغییر فایل خطایی پیش آمد",
+ error_deleting: "در هنگام حذف فایل خطایی پیش آمد",
+ error_renaming: "در هنگام تغییر نام فایل خطایی پیش آمد",
+ error_copying: "در هنگام کپی کردن فایل خطایی پیش آمد",
+ error_compressing: "در هنگام فشرده سازی فایل خطایی پیش آمد",
+ error_extracting: "در هنگام خارک کردن فایل از حالت فشرده خطایی پیش آمد",
+ error_creating_folder: "در هنگام ساخت پوشه خطایی پیش امد",
+ error_getting_content: "در هنگام بارگذاری محتویات فایل خطایی رخ داد",
+ error_changing_perms: "در هنگام تغییر مجوز های فایل خطایی رخ داد",
+ error_uploading_files: "در آپلود فایل خطایی رخ داد",
+ sure_to_start_compression_with: "مطمئن هستید فشرده سازی انجام شد؟",
+ owner: "مالک فایل",
+ group: "گروه",
+ others: "دیگران",
+ read: "خواندن",
+ write: "نوشتن",
+ exec: "اجرا کردن",
+ original: "اصلی",
+ changes: "تغییرات",
+ recursive: "بازگشتی",
+ preview: "پیش نمایش",
+ open: "باز کردن",
+ these_elements: "تعداد {{total}} مورد",
+ new_folder: "پوشه جدید",
+ download_as_zip: "به عنوان فایل فشرده دانلود شود"
+ }), e.translations("pl", {
+ filemanager: "Menadżer plików",
+ language: "Język",
+ english: "Angielski",
+ spanish: "Hiszpański",
+ portuguese: "Portugalski",
+ french: "Francuski",
+ german: "Niemiecki",
+ hebrew: "Hebrajski",
+ italian: "Włoski",
+ slovak: "Słowacki",
+ chinese_tw: "Tradycyjny Chiński",
+ chinese_cn: "Chiński Uproszczony",
+ russian: "Rosyjski",
+ ukrainian: "Ukraiński",
+ turkish: "Turecki",
+ persian: "Perski",
+ polish: "Polski",
+ confirm: "Potwierdź",
+ cancel: "Anuluj",
+ close: "Zamknij",
+ upload_files: "Wgraj pliki",
+ files_will_uploaded_to: "Pliki będą umieszczone w katalogu",
+ select_files: "Wybierz pliki",
+ uploading: "Ładowanie",
+ permissions: "Uprawnienia",
+ select_destination_folder: "Wybierz folder docelowy",
+ source: "Źródło",
+ destination: "Cel",
+ copy_file: "Kopiuj plik",
+ sure_to_delete: "Jesteś pewien, że chcesz skasować",
+ change_name_move: "Zmień nazwę / przenieś",
+ enter_new_name_for: "Wpisz nową nazwę dla",
+ extract_item: "Rozpakuj element",
+ extraction_started: "Rozpakowywanie rozpoczęło się w tle",
+ compression_started: "Kompresowanie rozpoczęło się w tle",
+ enter_folder_name_for_extraction: "Wpisz nazwę folderu do rozpakowania",
+ enter_file_name_for_compression: "Wpisz nazwę folderu do skompresowania",
+ toggle_fullscreen: "Tryb pełnoekranowy",
+ edit_file: "Edytuj plik",
+ file_content: "Zawartość pliku",
+ loading: "Ładowanie",
+ search: "Szukaj",
+ create_folder: "Stwórz folder",
+ create: "Utwórz",
+ folder_name: "Nazwa folderu",
+ upload: "Wgraj",
+ change_permissions: "Zmień uprawnienia",
+ change: "Zmień",
+ details: "Szczegóły",
+ icons: "Ikony",
+ list: "Lista",
+ name: "Nazwa",
+ size: "Rozmiar",
+ actions: "Akcje",
+ date: "Data",
+ selection: "Zaznaczone",
+ no_files_in_folder: "Brak plików w tym folderze",
+ no_folders_in_folder: "Ten folder nie zawiera podfolderów",
+ select_this: "Wybierz ten",
+ go_back: "W górę",
+ wait: "Wait",
+ move: "Przenieś",
+ download: "Pobierz",
+ view_item: "Wyświetl",
+ remove: "Usuń",
+ edit: "Edycja",
+ copy: "Kopiuj",
+ rename: "Zmień nazwę",
+ extract: "Rozpakuj",
+ compress: "Skompresuj",
+ error_invalid_filename: "Błędna nazwa pliku lub plik o takiej nazwie już istnieje, proszę użyć innej nazwy",
+ error_modifying: "Wystąpił błąd podczas modyfikowania pliku",
+ error_deleting: "Wystąpił błąd podczas usuwania pliku lub folderu",
+ error_renaming: "Wystąpił błąd podczas zmiany nazwy pliku",
+ error_copying: "Wystąpił błąd podczas kopiowania pliku",
+ error_compressing: "Wystąpił błąd podczas kompresowania pliku lub folderu",
+ error_extracting: "Wystąpił błąd podczas rozpakowywania pliku",
+ error_creating_folder: "Wystąpił błąd podczas tworzenia nowego folderu",
+ error_getting_content: "Wystąpił błąd podczas pobierania zawartości pliku",
+ error_changing_perms: "Wystąpił błąd podczas zmiany uprawnień pliku",
+ error_uploading_files: "Wystąpił błąd podczas wgrywania plików",
+ sure_to_start_compression_with: "Jesteś pewien, że chcesz skompresować",
+ owner: "Właściciel",
+ group: "Grupa",
+ others: "Inni",
+ read: "Odczyt",
+ write: "Zapis",
+ exec: "Wykonywanie",
+ original: "Oryginał",
+ changes: "Zmiany",
+ recursive: "Rekursywnie",
+ preview: "Podgląd elementu",
+ open: "Otwórz",
+ these_elements: "te {{total}} elementy?",
+ new_folder: "Nowy folder",
+ download_as_zip: "Pobierz jako ZIP"
+ }), e.translations("it", {
+ filemanager: "Gestore File",
+ language: "Lingua",
+ english: "Inglese",
+ spanish: "Spagnolo",
+ portuguese: "Portoghese",
+ french: "Francese",
+ german: "Tedesco",
+ hebrew: "Ebraico",
+ slovak: "Slovacco",
+ chinese_tw: "Cinese Tradizionale",
+ chinese_cn: "Cinese",
+ russian: "Russo",
+ ukrainian: "Ucraino",
+ turkish: "Turco",
+ persian: "Persiano",
+ polish: "Polacco",
+ confirm: "Conferma",
+ cancel: "Annulla",
+ close: "Chiudi",
+ upload_files: "Carica files",
+ files_will_uploaded_to: "I files saranno caricati in",
+ select_files: "Seleziona i files",
+ uploading: "Trasferimento",
+ permissions: "Permessi",
+ select_destination_folder: "Select carterlla di destinazione",
+ source: "Sorgente",
+ destination: "Destinazione",
+ copy_file: "Copia file",
+ sure_to_delete: "Sicuro di voler eliminare",
+ change_name_move: "Rinomina / sposta",
+ enter_new_name_for: "Inserisci nuovo nome per",
+ extract_item: "Estrai elemento",
+ extraction_started: "Decompressione avviata da un processo in background",
+ compression_started: "Compressione avviata da un processo in background",
+ enter_folder_name_for_extraction: "Inserisci nome cartella per l'estrazione di",
+ enter_file_name_for_compression: "Inserisci nome file per la compressione di",
+ toggle_fullscreen: "Passa a schermo intero",
+ edit_file: "Modifica file",
+ file_content: "Contenuto del file",
+ loading: "Caricamento",
+ search: "Cerca",
+ create_folder: "Crea cartella",
+ create: "Crea",
+ folder_name: "Nome cartella",
+ upload: "Upload",
+ change_permissions: "Modifica permessi",
+ change: "Modifica",
+ details: "Dettagli",
+ icons: "Icone",
+ list: "Lista",
+ name: "Nome",
+ size: "Dimensione",
+ actions: "Azioni",
+ date: "Data",
+ selection: "Selezione",
+ no_files_in_folder: "Nessun file nella cartella",
+ no_folders_in_folder: "Questa cartella non contiene altre cartelle",
+ select_this: "Seleziona questo",
+ go_back: "Indietro",
+ wait: "Attendere",
+ move: "Sposta",
+ download: "Scarica",
+ view_item: "Visualizza elemento",
+ remove: "Elimina",
+ edit: "Modifica",
+ copy: "Copia",
+ rename: "Rinomina",
+ extract: "Estrai",
+ compress: "Comprimi",
+ error_invalid_filename: "Nome file non valido o già esistente, specificarne un'altro",
+ error_modifying: "Errore durante la modifica del file",
+ error_deleting: "Errore durante l'eliminazione del file o della cartella",
+ error_renaming: "Errore durante la rinomina del file",
+ error_copying: "Errore durante la copia del file",
+ error_compressing: "Errore durante la compressione del file o della cartella",
+ error_extracting: "Errore durante l'estrazione del file",
+ error_creating_folder: "Errore nella creazione della cartella",
+ error_getting_content: "Errore nel recupero del contenuto del file",
+ error_changing_perms: "Errore durante la modifica dei permessi del file",
+ error_uploading_files: "Errore durante il trasferimento dei files",
+ sure_to_start_compression_with: "Sicuro di voler comprimere",
+ owner: "Proprietario",
+ group: "Gruppo",
+ others: "Altri",
+ read: "Lettura",
+ write: "Scrittura",
+ exec: "Esecuzione",
+ original: "Originario",
+ changes: "Cambiamenti",
+ recursive: "Ricorsivo",
+ preview: "Anteprima",
+ open: "Apri",
+ these_elements: "questi {{total}} elementi",
+ new_folder: "Nuova cartella",
+ download_as_zip: "Scarica come file ZIP"
+ })
+ }])
+}(), function (e) {
+ "use strict";
+ angular.module("FileManagerApp").service("apiHandler", ["$http", "$q", "$window", "$translate", "$httpParamSerializer", "Upload", function (e, r, n, i, a, t) {
+ e.defaults.headers.common["X-Requested-With"] = "XMLHttpRequest";
+ var o = function () {
+ this.inprocess = !1, this.asyncSuccess = !1, this.error = ""
+ };
+ return o.prototype.deferredHandler = function (e, r, n, i) {
+ return e && "object" == typeof e || (this.error = "Error %s - Bridge response error, please check the API docs or this ajax response.".replace("%s", n)), 404 == n && (this.error = "Error 404 - Backend bridge is not working, please check the ajax response."), e.result && e.result.error && (this.error = e.result.error), !this.error && e.error && (this.error = e.error.message), !this.error && i && (this.error = i), this.error ? r.reject(e) : r.resolve(e)
+ }, o.prototype.list = function (n, i, a, t) {
+ var o = this, s = a || o.deferredHandler, l = r.defer(),
+ d = {action: "list", path: i, fileExtensions: t && t.length ? t : void 0};
+ return o.inprocess = !0, o.error = "", e.post(n, d).then(function (e) {
+ s(e.data, l, e.status)
+ }, function (e) {
+ s(e.data, l, e.status, "Unknown error listing, check the response")
+ }).finally(function () {
+ o.inprocess = !1
+ }), l.promise
+ }, o.prototype.copy = function (n, a, t, o) {
+ var s = this, l = r.defer(), d = {action: "copy", items: a, newPath: t};
+ return o && 1 === a.length && (d.singleFilename = o), s.inprocess = !0, s.error = "", e.post(n, d).then(function (e) {
+ s.deferredHandler(e.data, l, e.status)
+ }, function (e) {
+ s.deferredHandler(e.data, l, e.status, i.instant("error_copying"))
+ }).finally(function () {
+ s.inprocess = !1
+ }), l.promise
+ }, o.prototype.move = function (n, a, t) {
+ var o = this, s = r.defer(), l = {action: "move", items: a, newPath: t};
+ return o.inprocess = !0, o.error = "", e.post(n, l).then(function (e) {
+ o.deferredHandler(e.data, s, e.status)
+ }, function (e) {
+ o.deferredHandler(e.data, s, e.status, i.instant("error_moving"))
+ }).finally(function () {
+ o.inprocess = !1
+ }), s.promise
+ }, o.prototype.remove = function (n, a) {
+ var t = this, o = r.defer(), s = {action: "remove", items: a};
+ return t.inprocess = !0, t.error = "", e.post(n, s).then(function (e) {
+ t.deferredHandler(e.data, o, e.status)
+ }, function (e) {
+ t.deferredHandler(e.data, o, e.status, i.instant("error_deleting"))
+ }).finally(function () {
+ t.inprocess = !1
+ }), o.promise
+ }, o.prototype.upload = function (e, n, i) {
+ var a = this, o = r.defer();
+ a.inprocess = !0, a.progress = 0, a.error = "";
+ for (var s = {destination: n}, l = 0; l < i.length; l++) s["file-" + l] = i[l];
+ return i && i.length && t.upload({url: e, data: s}).then(function (e) {
+ a.deferredHandler(e.data, o, e.status)
+ }, function (e) {
+ a.deferredHandler(e.data, o, e.status, "Unknown error uploading files")
+ }, function (e) {
+ a.progress = Math.min(100, parseInt(100 * e.loaded / e.total)) - 1
+ }).finally(function () {
+ a.inprocess = !1, a.progress = 0
+ }), o.promise
+ }, o.prototype.getContent = function (n, a) {
+ var t = this, o = r.defer(), s = {action: "getContent", item: a};
+ return t.inprocess = !0, t.error = "", e.post(n, s).then(function (e) {
+ t.deferredHandler(e.data, o, e.status)
+ }, function (e) {
+ t.deferredHandler(e.data, o, e.status, i.instant("error_getting_content"))
+ }).finally(function () {
+ t.inprocess = !1
+ }), o.promise
+ }, o.prototype.edit = function (n, a, t) {
+ var o = this, s = r.defer(), l = {action: "edit", item: a, content: t};
+ return o.inprocess = !0, o.error = "", e.post(n, l).then(function (e) {
+ o.deferredHandler(e.data, s, e.status)
+ }, function (e) {
+ o.deferredHandler(e.data, s, e.status, i.instant("error_modifying"))
+ }).finally(function () {
+ o.inprocess = !1
+ }), s.promise
+ }, o.prototype.rename = function (n, a, t) {
+ var o = this, s = r.defer(), l = {action: "rename", item: a, newItemPath: t};
+ return o.inprocess = !0, o.error = "", e.post(n, l).then(function (e) {
+ o.deferredHandler(e.data, s, e.status)
+ }, function (e) {
+ o.deferredHandler(e.data, s, e.status, i.instant("error_renaming"))
+ }).finally(function () {
+ o.inprocess = !1
+ }), s.promise
+ }, o.prototype.getUrl = function (e, r) {
+ return r && [e, a({action: "download", path: r})].join("?")
+ }, o.prototype.download = function (a, t, o, s, l) {
+ var d = this, c = this.getUrl(a, t);
+ if (!s || l || !n.saveAs) return !n.saveAs && n.console.log("Your browser dont support ajax download, downloading by default"), !!n.open(c, "_blank", "");
+ var p = r.defer();
+ return d.inprocess = !0, e.get(c).then(function (e) {
+ var r = new n.Blob([e.data]);
+ p.resolve(e.data), n.saveAs(r, o)
+ }, function (e) {
+ d.deferredHandler(e.data, p, e.status, i.instant("error_downloading"))
+ }).finally(function () {
+ d.inprocess = !1
+ }), p.promise
+ }, o.prototype.downloadMultiple = function (t, o, s, l, d) {
+ var c = this, p = r.defer(), m = [t, a({action: "downloadMultiple", items: o, toFilename: s})].join("?");
+ return l && !d && n.saveAs ? (c.inprocess = !0, e.get(t).then(function (e) {
+ var r = new n.Blob([e.data]);
+ p.resolve(e.data), n.saveAs(r, s)
+ }, function (e) {
+ c.deferredHandler(e.data, p, e.status, i.instant("error_downloading"))
+ }).finally(function () {
+ c.inprocess = !1
+ }), p.promise) : (!n.saveAs && n.console.log("Your browser dont support ajax download, downloading by default"), !!n.open(m, "_blank", ""))
+ }, o.prototype.compress = function (n, a, t, o) {
+ var s = this, l = r.defer(), d = {action: "compress", items: a, destination: o, compressedFilename: t};
+ return s.inprocess = !0, s.error = "", e.post(n, d).then(function (e) {
+ s.deferredHandler(e.data, l, e.status)
+ }, function (e) {
+ s.deferredHandler(e.data, l, e.status, i.instant("error_compressing"))
+ }).finally(function () {
+ s.inprocess = !1
+ }), l.promise
+ }, o.prototype.extract = function (n, a, t, o) {
+ var s = this, l = r.defer(), d = {action: "extract", item: a, destination: o, folderName: t};
+ return s.inprocess = !0, s.error = "", e.post(n, d).then(function (e) {
+ s.deferredHandler(e.data, l, e.status)
+ }, function (e) {
+ s.deferredHandler(e.data, l, e.status, i.instant("error_extracting"))
+ }).finally(function () {
+ s.inprocess = !1
+ }), l.promise
+ }, o.prototype.changePermissions = function (n, a, t, o, s) {
+ var l = this, d = r.defer(),
+ c = {action: "changePermissions", items: a, perms: t, permsCode: o, recursive: !!s};
+ return l.inprocess = !0, l.error = "", e.post(n, c).then(function (e) {
+ l.deferredHandler(e.data, d, e.status)
+ }, function (e) {
+ l.deferredHandler(e.data, d, e.status, i.instant("error_changing_perms"))
+ }).finally(function () {
+ l.inprocess = !1
+ }), d.promise
+ }, o.prototype.createFolder = function (n, a) {
+ var t = this, o = r.defer(), s = {action: "createFolder", newPath: a};
+ return t.inprocess = !0, t.error = "", e.post(n, s).then(function (e) {
+ t.deferredHandler(e.data, o, e.status)
+ }, function (e) {
+ t.deferredHandler(e.data, o, e.status, i.instant("error_creating_folder"))
+ }).finally(function () {
+ t.inprocess = !1
+ }), o.promise
+ }, o
+ }])
+}(), function (e) {
+ "use strict";
+ angular.module("FileManagerApp").service("apiMiddleware", ["$window", "fileManagerConfig", "apiHandler", function (e, r, n) {
+ var i = function () {
+ this.apiHandler = new n
+ };
+ return i.prototype.getPath = function (e) {
+ return "/" + e.join("/")
+ }, i.prototype.getFileList = function (e) {
+ return (e || []).map(function (e) {
+ return e && e.model.fullPath()
+ })
+ }, i.prototype.getFilePath = function (e) {
+ return e && e.model.fullPath()
+ }, i.prototype.list = function (e, n) {
+ return this.apiHandler.list(r.listUrl, this.getPath(e), n)
+ }, i.prototype.copy = function (e, n) {
+ var i = this.getFileList(e), a = 1 === i.length ? e[0].tempModel.name : void 0;
+ return this.apiHandler.copy(r.copyUrl, i, this.getPath(n), a)
+ }, i.prototype.move = function (e, n) {
+ var i = this.getFileList(e);
+ return this.apiHandler.move(r.moveUrl, i, this.getPath(n))
+ }, i.prototype.remove = function (e) {
+ var n = this.getFileList(e);
+ return this.apiHandler.remove(r.removeUrl, n)
+ }, i.prototype.upload = function (n, i) {
+ if (!e.FormData) throw new Error("Unsupported browser version");
+ var a = this.getPath(i);
+ return this.apiHandler.upload(r.uploadUrl, a, n)
+ }, i.prototype.getContent = function (e) {
+ var n = this.getFilePath(e);
+ return this.apiHandler.getContent(r.getContentUrl, n)
+ }, i.prototype.edit = function (e) {
+ var n = this.getFilePath(e);
+ return this.apiHandler.edit(r.editUrl, n, e.tempModel.content)
+ }, i.prototype.rename = function (e) {
+ var n = this.getFilePath(e), i = e.tempModel.fullPath();
+ return this.apiHandler.rename(r.renameUrl, n, i)
+ }, i.prototype.getUrl = function (e) {
+ var n = this.getFilePath(e);
+ return this.apiHandler.getUrl(r.downloadFileUrl, n)
+ }, i.prototype.download = function (e, n) {
+ var i = this.getFilePath(e), a = e.model.name;
+ if (!e.isFolder()) return this.apiHandler.download(r.downloadFileUrl, i, a, r.downloadFilesByAjax, n)
+ }, i.prototype.downloadMultiple = function (e, n) {
+ var i = this.getFileList(e),
+ a = (new Date).getTime().toString().substr(8, 13) + "-" + r.multipleDownloadFileName;
+ return this.apiHandler.downloadMultiple(r.downloadMultipleUrl, i, a, r.downloadFilesByAjax, n)
+ }, i.prototype.compress = function (e, n, i) {
+ var a = this.getFileList(e);
+ return this.apiHandler.compress(r.compressUrl, a, n, this.getPath(i))
+ }, i.prototype.extract = function (e, n, i) {
+ var a = this.getFilePath(e);
+ return this.apiHandler.extract(r.extractUrl, a, n, this.getPath(i))
+ }, i.prototype.changePermissions = function (e, n) {
+ var i = this.getFileList(e), a = n.tempModel.perms.toCode(), t = n.tempModel.perms.toOctal(),
+ o = !!n.tempModel.recursive;
+ return this.apiHandler.changePermissions(r.permissionsUrl, i, a, t, o)
+ }, i.prototype.createFolder = function (e) {
+ var n = e.tempModel.fullPath();
+ return this.apiHandler.createFolder(r.createFolderUrl, n)
+ }, i
+ }])
+}(), function (e) {
+ "use strict";
+ angular.module("FileManagerApp").service("fileNavigator", ["apiMiddleware", "fileManagerConfig", "item", function (e, r, n) {
+ var i = function () {
+ this.apiMiddleware = new e, this.requesting = !1, this.fileList = [], this.currentPath = this.getBasePath(), this.history = [], this.error = "", this.onRefresh = function () {
+ }
+ };
+ return i.prototype.getBasePath = function () {
+ var e = (r.basePath || "").replace(/^\//, "");
+ return e.trim() ? e.split("/") : []
+ }, i.prototype.deferredHandler = function (e, r, n, i) {
+ return e && "object" == typeof e || (this.error = "Error %s - Bridge response error, please check the API docs or this ajax response.".replace("%s", n)), 404 == n && (this.error = "Error 404 - Backend bridge is not working, please check the ajax response."), 200 == n && (this.error = null), !this.error && e.result && e.result.error && (this.error = e.result.error), !this.error && e.error && (this.error = e.error.message), !this.error && i && (this.error = i), this.error ? r.reject(e) : r.resolve(e)
+ }, i.prototype.list = function () {
+ return this.apiMiddleware.list(this.currentPath, this.deferredHandler.bind(this))
+ }, i.prototype.refresh = function () {
+ var e = this;
+ e.currentPath.length || (e.currentPath = this.getBasePath());
+ var r = e.currentPath.join("/");
+ return e.requesting = !0, e.fileList = [], e.list().then(function (i) {
+ e.fileList = (i.result || []).map(function (r) {
+ return new n(r, e.currentPath)
+ }), e.buildTree(r), e.onRefresh()
+ }).finally(function () {
+ e.requesting = !1
+ })
+ }, i.prototype.buildTree = function (e) {
+ function r(e, n, i) {
+ var a = i ? i + "/" + n.model.name : n.model.name;
+ if (e.name && e.name.trim() && 0 !== i.trim().indexOf(e.name) && (e.nodes = []), e.name !== i) e.nodes.forEach(function (e) {
+ r(e, n, i)
+ }); else {
+ for (var t in e.nodes) if (e.nodes[t].name === a) return;
+ e.nodes.push({item: n, name: a, nodes: []})
+ }
+ e.nodes = e.nodes.sort(function (e, r) {
+ return e.name.toLowerCase() < r.name.toLowerCase() ? -1 : e.name.toLowerCase() === r.name.toLowerCase() ? 0 : 1
+ })
+ }
+
+ function i(e, r) {
+ r.push(e);
+ for (var n in e.nodes) i(e.nodes[n], r)
+ }
+
+ var a = [], t = {};
+ !this.history.length && this.history.push({
+ name: this.getBasePath()[0] || "",
+ nodes: []
+ }), i(this.history[0], a), (t = function (e, r) {
+ return e.filter(function (e) {
+ return e.name === r
+ })[0]
+ }(a, e)) && (t.nodes = []);
+ for (var o in this.fileList) {
+ var s = this.fileList[o];
+ s instanceof n && s.isFolder() && r(this.history[0], s, e)
+ }
+ }, i.prototype.folderClick = function (e) {
+ this.currentPath = [], e && e.isFolder() && (this.currentPath = e.model.fullPath().split("/").splice(1)), this.refresh()
+ }, i.prototype.upDir = function () {
+ this.currentPath[0] && (this.currentPath = this.currentPath.slice(0, -1), this.refresh())
+ }, i.prototype.goTo = function (e) {
+ this.currentPath = this.currentPath.slice(0, e + 1), this.refresh()
+ }, i.prototype.fileNameExists = function (e) {
+ return this.fileList.find(function (r) {
+ return e && r.model.name.trim() === e.trim()
+ })
+ }, i.prototype.listHasFolders = function () {
+ return this.fileList.find(function (e) {
+ return "dir" === e.model.type
+ })
+ }, i.prototype.getCurrentFolderName = function () {
+ return this.currentPath.slice(-1)[0] || "/"
+ }, i
+ }])
+}(), angular.module("FileManagerApp").run(["$templateCache", function (e) {
+ e.put("src/templates/current-folder-breadcrumb.html", '<ol class="breadcrumb">\r\n <li>\r\n <a href="" ng-click="fileNavigator.goTo(-1)">\r\n {{"filemanager" | translate}}\r\n </a>\r\n </li>\r\n <li ng-repeat="(key, dir) in fileNavigator.currentPath track by key" ng-class="{\'active\':$last}" class="animated fast fadeIn">\r\n <a href="" ng-show="!$last" ng-click="fileNavigator.goTo(key)">\r\n {{dir | strLimit : 8}}\r\n </a>\r\n <span ng-show="$last">\r\n {{dir | strLimit : 12}}\r\n </span>\r\n </li>\r\n</ol>'), e.put("src/templates/item-context-menu.html", '<div id="context-menu" class="dropdown clearfix animated fast fadeIn">\r\n <ul class="dropdown-menu dropdown-right-click" role="menu" aria-labelledby="dropdownMenu" ng-show="temps.length">\r\n\r\n <li ng-show="singleSelection() && singleSelection().isFolder()">\r\n <a href="" tabindex="-1" ng-click="smartClick(singleSelection())">\r\n <i class="glyphicon glyphicon-folder-open"></i> {{\'open\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li ng-show="config.pickCallback && singleSelection() && singleSelection().isSelectable()">\r\n <a href="" tabindex="-1" ng-click="config.pickCallback(singleSelection().model)">\r\n <i class="glyphicon glyphicon-hand-up"></i> {{\'select_this\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li ng-show="config.allowedActions.download && !selectionHas(\'dir\') && singleSelection()">\r\n <a href="" tabindex="-1" ng-click="download()">\r\n <i class="glyphicon glyphicon-cloud-download"></i> {{\'download\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li ng-show="config.allowedActions.downloadMultiple && !selectionHas(\'dir\') && !singleSelection()">\r\n <a href="" tabindex="-1" ng-click="download()">\r\n <i class="glyphicon glyphicon-cloud-download"></i> {{\'download_as_zip\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li ng-show="config.allowedActions.preview && singleSelection().isImage() && singleSelection()">\r\n <a href="" tabindex="-1" ng-click="openImagePreview()">\r\n <i class="glyphicon glyphicon-picture"></i> {{\'view_item\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li ng-show="config.allowedActions.rename && singleSelection()">\r\n <a href="" tabindex="-1" ng-click="modal(\'rename\')">\r\n <i class="glyphicon glyphicon-edit"></i> {{\'rename\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li ng-show="config.allowedActions.move">\r\n <a href="" tabindex="-1" ng-click="modalWithPathSelector(\'move\')">\r\n <i class="glyphicon glyphicon-arrow-right"></i> {{\'move\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li ng-show="config.allowedActions.copy && !selectionHas(\'dir\')">\r\n <a href="" tabindex="-1" ng-click="modalWithPathSelector(\'copy\')">\r\n <i class="glyphicon glyphicon-log-out"></i> {{\'copy\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li ng-show="config.allowedActions.edit && singleSelection() && singleSelection().isEditable()">\r\n <a href="" tabindex="-1" ng-click="openEditItem()">\r\n <i class="glyphicon glyphicon-pencil"></i> {{\'edit\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li ng-show="config.allowedActions.changePermissions">\r\n <a href="" tabindex="-1" ng-click="modal(\'changepermissions\')">\r\n <i class="glyphicon glyphicon-lock"></i> {{\'permissions\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li ng-show="config.allowedActions.compress && (!singleSelection() || selectionHas(\'dir\'))">\r\n <a href="" tabindex="-1" ng-click="modal(\'compress\')">\r\n <i class="glyphicon glyphicon-compressed"></i> {{\'compress\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li ng-show="config.allowedActions.extract && singleSelection() && singleSelection().isExtractable()">\r\n <a href="" tabindex="-1" ng-click="modal(\'extract\')">\r\n <i class="glyphicon glyphicon-export"></i> {{\'extract\' | translate}}\r\n </a>\r\n </li>\r\n\r\n <li class="divider" ng-show="config.allowedActions.remove"></li>\r\n \r\n <li ng-show="config.allowedActions.remove">\r\n <a href="" tabindex="-1" ng-click="modal(\'remove\')">\r\n <i class="glyphicon glyphicon-trash"></i> {{\'remove\' | translate}}\r\n </a>\r\n </li>\r\n\r\n </ul>\r\n\r\n <ul class="dropdown-menu dropdown-right-click" role="menu" aria-labelledby="dropdownMenu" ng-show="!temps.length">\r\n <li ng-show="config.allowedActions.createFolder">\r\n <a href="" tabindex="-1" ng-click="modal(\'newfolder\') && prepareNewFolder()">\r\n <i class="glyphicon glyphicon-plus"></i> {{\'new_folder\' | translate}}\r\n </a>\r\n </li>\r\n <li ng-show="config.allowedActions.upload">\r\n <a href="" tabindex="-1" ng-click="modal(\'uploadfile\')">\r\n <i class="glyphicon glyphicon-cloud-upload"></i> {{\'upload_files\' | translate}}\r\n </a>\r\n </li>\r\n </ul>\r\n</div>'), e.put("src/templates/main-icons.html", '<div class="iconset noselect">\r\n <div class="item-list clearfix" ng-click="selectOrUnselect(null, $event)" ng-right-click="selectOrUnselect(null, $event)" prevent="true">\r\n <div class="col-120" ng-repeat="item in $parent.fileList = (fileNavigator.fileList | filter: {model:{name: query}})" ng-show="!fileNavigator.requesting && !fileNavigator.error">\r\n <a href="" class="thumbnail text-center" ng-click="selectOrUnselect(item, $event)" ng-dblclick="smartClick(item)" ng-right-click="selectOrUnselect(item, $event)" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})" ng-class="{selected: isSelected(item)}">\r\n <div class="item-icon">\r\n <i class="glyphicon glyphicon-folder-open" ng-show="item.model.type === \'dir\'"></i>\r\n <i class="glyphicon glyphicon-file" data-ext="{{ item.model.name | fileExtension }}" ng-show="item.model.type === \'file\'" ng-class="{\'item-extension\': config.showExtensionIcons}"></i>\r\n </div>\r\n {{item.model.name | strLimit : 11 }}\r\n </a>\r\n </div>\r\n </div>\r\n\r\n <div ng-show="fileNavigator.requesting">\r\n <div ng-include="config.tplPath + \'/spinner.html\'"></div>\r\n </div>\r\n\r\n <div class="alert alert-warning" ng-show="!fileNavigator.requesting && fileNavigator.fileList.length < 1 && !fileNavigator.error">\r\n {{"no_files_in_folder" | translate}}...\r\n </div>\r\n \r\n <div class="alert alert-danger" ng-show="!fileNavigator.requesting && fileNavigator.error">\r\n {{ fileNavigator.error }}\r\n </div>\r\n</div>'), e.put("src/templates/main-table-modal.html", '<table class="table table-condensed table-modal-condensed mb0">\r\n <thead>\r\n <tr>\r\n <th>\r\n <a href="" ng-click="order(\'model.name\')">\r\n {{"name" | translate}}\r\n <span class="sortorder" ng-show="predicate[1] === \'model.name\'" ng-class="{reverse:reverse}"></span>\r\n </a>\r\n </th>\r\n <th class="text-right"></th>\r\n </tr>\r\n </thead>\r\n <tbody class="file-item">\r\n <tr ng-show="fileNavigator.requesting">\r\n <td colspan="2">\r\n <div ng-include="config.tplPath + \'/spinner.html\'"></div>\r\n </td>\r\n </tr>\r\n <tr ng-show="!fileNavigator.requesting && !fileNavigator.listHasFolders() && !fileNavigator.error">\r\n <td>\r\n {{"no_folders_in_folder" | translate}}...\r\n </td>\r\n <td class="text-right">\r\n <button class="btn btn-sm btn-default" ng-click="fileNavigator.upDir()">{{"go_back" | translate}}</button>\r\n </td>\r\n </tr>\r\n <tr ng-show="!fileNavigator.requesting && fileNavigator.error">\r\n <td colspan="2">\r\n {{ fileNavigator.error }}\r\n </td>\r\n </tr>\r\n <tr ng-repeat="item in fileNavigator.fileList | orderBy:predicate:reverse" ng-show="!fileNavigator.requesting && item.model.type === \'dir\'" ng-if="!selectedFilesAreChildOfPath(item)">\r\n <td>\r\n <a href="" ng-click="fileNavigator.folderClick(item)" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})">\r\n <i class="glyphicon glyphicon-folder-close"></i>\r\n {{item.model.name | strLimit : 32}}\r\n </a>\r\n </td>\r\n <td class="text-right">\r\n <button class="btn btn-sm btn-default" ng-click="select(item)">\r\n <i class="glyphicon glyphicon-hand-up"></i> {{"select_this" | translate}}\r\n </button>\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>'), e.put("src/templates/main-table.html", '<table class="table mb0 table-files noselect">\r\n <thead>\r\n <tr>\r\n <th>\r\n <a href="" ng-click="order(\'model.name\')">\r\n {{"name" | translate}}\r\n <span class="sortorder" ng-show="predicate[1] === \'model.name\'" ng-class="{reverse:reverse}"></span>\r\n </a>\r\n </th>\r\n <th class="hidden-xs" ng-hide="config.hideSize">\r\n <a href="" ng-click="order(\'model.size\')">\r\n {{"size" | translate}}\r\n <span class="sortorder" ng-show="predicate[1] === \'model.size\'" ng-class="{reverse:reverse}"></span>\r\n </a>\r\n </th>\r\n <th class="hidden-sm hidden-xs" ng-hide="config.hideDate">\r\n <a href="" ng-click="order(\'model.date\')">\r\n {{"date" | translate}}\r\n <span class="sortorder" ng-show="predicate[1] === \'model.date\'" ng-class="{reverse:reverse}"></span>\r\n </a>\r\n </th>\r\n <th class="hidden-sm hidden-xs" ng-hide="config.hidePermissions">\r\n <a href="" ng-click="order(\'model.permissions\')">\r\n {{"permissions" | translate}}\r\n <span class="sortorder" ng-show="predicate[1] === \'model.permissions\'" ng-class="{reverse:reverse}"></span>\r\n </a>\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody class="file-item">\r\n <tr ng-show="fileNavigator.requesting">\r\n <td colspan="5">\r\n <div ng-include="config.tplPath + \'/spinner.html\'"></div>\r\n </td>\r\n </tr>\r\n <tr ng-show="!fileNavigator.requesting &amp;&amp; fileNavigator.fileList.length < 1 &amp;&amp; !fileNavigator.error">\r\n <td colspan="5">\r\n {{"no_files_in_folder" | translate}}...\r\n </td>\r\n </tr>\r\n <tr ng-show="!fileNavigator.requesting &amp;&amp; fileNavigator.error">\r\n <td colspan="5">\r\n {{ fileNavigator.error }}\r\n </td>\r\n </tr>\r\n <tr class="item-list" ng-repeat="item in $parent.fileList = (fileNavigator.fileList | filter: {model:{name: query}} | orderBy:predicate:reverse)" ng-show="!fileNavigator.requesting" ng-click="selectOrUnselect(item, $event)" ng-dblclick="smartClick(item)" ng-right-click="selectOrUnselect(item, $event)" ng-class="{selected: isSelected(item)}">\r\n <td>\r\n <a href="" title="{{item.model.name}} ({{item.model.size | humanReadableFileSize}})">\r\n <i class="glyphicon glyphicon-folder-close" ng-show="item.model.type === \'dir\'"></i>\r\n <i class="glyphicon glyphicon-file" ng-show="item.model.type === \'file\'"></i>\r\n {{item.model.name | strLimit : 64}}\r\n </a>\r\n </td>\r\n <td class="hidden-xs">\r\n <span ng-show="item.model.type !== \'dir\' || config.showSizeForDirectories">\r\n {{item.model.size | humanReadableFileSize}}\r\n </span>\r\n </td>\r\n <td class="hidden-sm hidden-xs" ng-hide="config.hideDate">\r\n {{item.model.date | formatDate }}\r\n </td>\r\n <td class="hidden-sm hidden-xs" ng-hide="config.hidePermissions">\r\n {{item.model.perms.toCode(item.model.type === \'dir\'?\'d\':\'-\')}}\r\n </td>\r\n </tr>\r\n </tbody>\r\n</table>\r\n'), e.put("src/templates/main.html", '<div ng-controller="FileManagerCtrl">\r\n <div ng-include="config.tplPath + \'/navbar.html\'"></div>\r\n\r\n <div class="container-fluid">\r\n <div class="row">\r\n\r\n <div class="col-sm-4 col-md-3 sidebar file-tree animated slow fadeIn" ng-include="config.tplPath + \'/sidebar.html\'" ng-show="config.sidebar &amp;&amp; fileNavigator.history[0]">\r\n </div>\r\n\r\n <div class="main" ng-class="config.sidebar &amp;&amp; fileNavigator.history[0] &amp;&amp; \'col-sm-8 col-md-9\'" ngf-model-options="{updateOn: \'drop\', allowInvalid: false, debounce: 0}" ngf-drop="addForUpload($files)" ngf-drag-over-class="\'upload-dragover\'" ngf-multiple="true">\r\n <div ng-include="config.tplPath + \'/\' + viewTemplate" class="main-navigation clearfix"></div>\r\n </div>\r\n </div>\r\n </div>\r\n\r\n <div ng-include="config.tplPath + \'/modals.html\'"></div>\r\n <div ng-include="config.tplPath + \'/item-context-menu.html\'"></div>\r\n</div>\r\n'), e.put("src/templates/modals.html", '<div class="modal animated fadeIn" id="imagepreview">\r\n <div class="modal-dialog">\r\n <div class="modal-content">\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{"preview" | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n <div class="text-center">\r\n <img id="imagepreview-target" class="preview" alt="{{singleSelection().model.name}}" ng-class="{\'loading\': apiMiddleware.apiHandler.inprocess}">\r\n <span class="label label-warning" ng-show="apiMiddleware.apiHandler.inprocess">{{\'loading\' | translate}} ...</span>\r\n </div>\r\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n </div>\r\n <div class="modal-footer">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="remove">\r\n <div class="modal-dialog">\r\n <div class="modal-content">\r\n <form ng-submit="remove()">\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{"confirm" | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n {{\'sure_to_delete\' | translate}} <span ng-include data-src="\'selected-files-msg\'"></span>\r\n\r\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n </div>\r\n <div class="modal-footer">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess" autofocus="autofocus">{{"remove" | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="move">\r\n <div class="modal-dialog">\r\n <div class="modal-content">\r\n <form ng-submit="move()">\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{\'move\' | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n <div ng-include data-src="\'path-selector\'" class="clearfix"></div>\r\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n </div>\r\n <div class="modal-footer">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'move\' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n\r\n<div class="modal animated fadeIn" id="rename">\r\n <div class="modal-dialog">\r\n <div class="modal-content">\r\n <form ng-submit="rename()">\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{\'rename\' | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n <label class="radio">{{\'enter_new_name_for\' | translate}} <b>{{singleSelection() && singleSelection().model.name}}</b></label>\r\n <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n\r\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n </div>\r\n <div class="modal-footer">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'rename\' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="copy">\r\n <div class="modal-dialog">\r\n <div class="modal-content">\r\n <form ng-submit="copy()">\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{\'copy_file\' | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n <div ng-show="singleSelection()">\r\n <label class="radio">{{\'enter_new_name_for\' | translate}} <b>{{singleSelection().model.name}}</b></label>\r\n <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n </div>\r\n\r\n <div ng-include data-src="\'path-selector\'" class="clearfix"></div>\r\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n </div>\r\n <div class="modal-footer">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"copy" | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="compress">\r\n <div class="modal-dialog">\r\n <div class="modal-content">\r\n <form ng-submit="compress()">\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{\'compress\' | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n <div class="label label-success error-msg">{{\'compression_started\' | translate}}</div>\r\n </div>\r\n <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n <div ng-hide="config.allowedActions.compressChooseName">\r\n {{\'sure_to_start_compression_with\' | translate}} <b>{{singleSelection().model.name}}</b> ?\r\n </div>\r\n <div ng-show="config.allowedActions.compressChooseName">\r\n <label class="radio">\r\n {{\'enter_file_name_for_compression\' | translate}}\r\n <span ng-include data-src="\'selected-files-msg\'"></span>\r\n </label>\r\n <input class="form-control" ng-model="temp.tempModel.name" autofocus="autofocus">\r\n </div>\r\n </div>\r\n\r\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n </div>\r\n <div class="modal-footer">\r\n <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n </div>\r\n <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'compress\' | translate}}</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="extract" ng-init="singleSelection().emptyName()">\r\n <div class="modal-dialog">\r\n <div class="modal-content">\r\n <form ng-submit="extract()">\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{\'extract_item\' | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n <div class="label label-success error-msg">{{\'extraction_started\' | translate}}</div>\r\n </div>\r\n <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n <label class="radio">{{\'enter_folder_name_for_extraction\' | translate}} <b>{{singleSelection().model.name}}</b></label>\r\n <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n </div>\r\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n </div>\r\n <div class="modal-footer">\r\n <div ng-show="apiMiddleware.apiHandler.asyncSuccess">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n </div>\r\n <div ng-hide="apiMiddleware.apiHandler.asyncSuccess">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'extract\' | translate}}</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="edit" ng-class="{\'modal-fullscreen\': fullscreen}">\r\n <div class="modal-dialog modal-lg">\r\n <div class="modal-content">\r\n <form ng-submit="edit()">\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <button type="button" class="close fullscreen" ng-click="fullscreen=!fullscreen">\r\n <i class="glyphicon glyphicon-fullscreen"></i>\r\n <span class="sr-only">{{\'toggle_fullscreen\' | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{\'edit_file\' | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n <label class="radio bold">{{ singleSelection().model.fullPath() }}</label>\r\n <span class="label label-warning" ng-show="apiMiddleware.apiHandler.inprocess">{{\'loading\' | translate}} ...</span>\r\n <textarea class="form-control code" ng-model="singleSelection().tempModel.content" ng-show="!apiMiddleware.apiHandler.inprocess" autofocus="autofocus"></textarea>\r\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n </div>\r\n <div class="modal-footer">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'close\' | translate}}</button>\r\n <button type="submit" class="btn btn-primary" ng-show="config.allowedActions.edit" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'edit\' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="newfolder">\r\n <div class="modal-dialog">\r\n <div class="modal-content">\r\n <form ng-submit="createFolder()">\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{\'new_folder\' | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n <label class="radio">{{\'folder_name\' | translate}}</label>\r\n <input class="form-control" ng-model="singleSelection().tempModel.name" autofocus="autofocus">\r\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n </div>\r\n <div class="modal-footer">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"cancel" | translate}}</button>\r\n <button type="submit" class="btn btn-primary" ng-disabled="apiMiddleware.apiHandler.inprocess">{{\'create\' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="uploadfile">\r\n <div class="modal-dialog">\r\n <div class="modal-content">\r\n <form>\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{"upload_files" | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n <label class="radio">\r\n {{"files_will_uploaded_to" | translate}} \r\n <b>/{{fileNavigator.currentPath.join(\'/\')}}</b>\r\n </label>\r\n <button class="btn btn-default btn-block" ngf-select="$parent.addForUpload($files)" ngf-multiple="true">\r\n {{"select_files" | translate}}\r\n </button>\r\n \r\n <div class="upload-list">\r\n <ul class="list-group">\r\n <li class="list-group-item" ng-repeat="(index, uploadFile) in $parent.uploadFileList">\r\n <button class="btn btn-sm btn-danger pull-right" ng-click="$parent.removeFromUpload(index)">\r\n &times;\r\n </button>\r\n <h5 class="list-group-item-heading">{{uploadFile.name}}</h5>\r\n <p class="list-group-item-text">{{uploadFile.size | humanReadableFileSize}}</p>\r\n </li>\r\n </ul>\r\n <div ng-show="apiMiddleware.apiHandler.inprocess">\r\n <em>{{"uploading" | translate}}... {{apiMiddleware.apiHandler.progress}}%</em>\r\n <div class="progress mb0">\r\n <div class="progress-bar active" role="progressbar" aria-valuenow="{{apiMiddleware.apiHandler.progress}}" aria-valuemin="0" aria-valuemax="100" style="width: {{apiMiddleware.apiHandler.progress}}%"></div>\r\n </div>\r\n </div>\r\n </div>\r\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n </div>\r\n <div class="modal-footer">\r\n <div>\r\n <button type="button" class="btn btn-default" data-dismiss="modal">{{"cancel" | translate}}</button>\r\n <button type="submit" class="btn btn-primary" ng-disabled="!$parent.uploadFileList.length || apiMiddleware.apiHandler.inprocess" ng-click="uploadFiles()">{{\'upload\' | translate}}</button>\r\n </div>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="changepermissions">\r\n <div class="modal-dialog">\r\n <div class="modal-content">\r\n <form ng-submit="changePermissions()">\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{\'change_permissions\' | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n <table class="table mb0">\r\n <thead>\r\n <tr>\r\n <th>{{\'permissions\' | translate}}</th>\r\n <th class="col-xs-1 text-center">{{\'read\' | translate}}</th>\r\n <th class="col-xs-1 text-center">{{\'write\' | translate}}</th>\r\n <th class="col-xs-1 text-center">{{\'exec\' | translate}}</th>\r\n </tr>\r\n </thead>\r\n <tbody>\r\n <tr ng-repeat="(permTypeKey, permTypeValue) in temp.tempModel.perms">\r\n <td>{{permTypeKey | translate}}</td>\r\n <td ng-repeat="(permKey, permValue) in permTypeValue" class="col-xs-1 text-center" ng-click="main()">\r\n <label class="col-xs-12">\r\n <input type="checkbox" ng-model="temp.tempModel.perms[permTypeKey][permKey]">\r\n </label>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n <div class="checkbox" ng-show="config.enablePermissionsRecursive && selectionHas(\'dir\')">\r\n <label>\r\n <input type="checkbox" ng-model="temp.tempModel.recursive"> {{\'recursive\' | translate}}\r\n </label>\r\n </div>\r\n <div class="clearfix mt10">\r\n <span class="label label-primary pull-left" ng-hide="temp.multiple">\r\n {{\'original\' | translate}}: \r\n {{temp.model.perms.toCode(selectionHas(\'dir\') ? \'d\':\'-\')}} \r\n ({{temp.model.perms.toOctal()}})\r\n </span>\r\n <span class="label label-primary pull-right">\r\n {{\'changes\' | translate}}: \r\n {{temp.tempModel.perms.toCode(selectionHas(\'dir\') ? \'d\':\'-\')}} \r\n ({{temp.tempModel.perms.toOctal()}})\r\n </span>\r\n </div>\r\n <div ng-include data-src="\'error-bar\'" class="clearfix"></div>\r\n </div>\r\n <div class="modal-footer">\r\n <button type="button" class="btn btn-default" data-dismiss="modal">{{"cancel" | translate}}</button>\r\n <button type="submit" class="btn btn-primary" ng-disabled="">{{\'change\' | translate}}</button>\r\n </div>\r\n </form>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<div class="modal animated fadeIn" id="selector" ng-controller="ModalFileManagerCtrl">\r\n <div class="modal-dialog">\r\n <div class="modal-content">\r\n <div class="modal-header">\r\n <button type="button" class="close" data-dismiss="modal">\r\n <span aria-hidden="true">&times;</span>\r\n <span class="sr-only">{{"close" | translate}}</span>\r\n </button>\r\n <h4 class="modal-title">{{"select_destination_folder" | translate}}</h4>\r\n </div>\r\n <div class="modal-body">\r\n <div>\r\n <div ng-include="config.tplPath + \'/current-folder-breadcrumb.html\'"></div>\r\n <div ng-include="config.tplPath + \'/main-table-modal.html\'"></div>\r\n <hr />\r\n <button class="btn btn-sm btn-default" ng-click="selectCurrent()">\r\n <i class="glyphicon"></i> {{"select_this" | translate}}\r\n </button>\r\n </div>\r\n </div>\r\n <div class="modal-footer">\r\n <button type="button" class="btn btn-default" data-dismiss="modal" ng-disabled="apiMiddleware.apiHandler.inprocess">{{"close" | translate}}</button>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<script type="text/ng-template" id="path-selector">\r\n <div class="panel panel-primary mt10 mb0">\r\n <div class="panel-body">\r\n <div class="detail-sources">\r\n <div class="like-code mr5"><b>{{"selection" | translate}}:</b>\r\n <span ng-include="\'selected-files-msg\'"></span>\r\n </div>\r\n </div>\r\n <div class="detail-sources">\r\n <div class="like-code mr5">\r\n <b>{{"destination" | translate}}:</b> {{ getSelectedPath() }}\r\n </div>\r\n <a href="" class="label label-primary" ng-click="openNavigator(fileNavigator.currentPath)">\r\n {{\'change\' | translate}}\r\n </a>\r\n </div>\r\n </div>\r\n </div>\r\n<\/script>\r\n\r\n<script type="text/ng-template" id="error-bar">\r\n <div class="label label-danger error-msg pull-left animated fadeIn" ng-show="apiMiddleware.apiHandler.error">\r\n <i class="glyphicon glyphicon-remove-circle"></i>\r\n <span>{{apiMiddleware.apiHandler.error}}</span>\r\n </div>\r\n<\/script>\r\n\r\n<script type="text/ng-template" id="selected-files-msg">\r\n <span ng-show="temps.length == 1">\r\n {{singleSelection().model.name}}\r\n </span>\r\n <span ng-show="temps.length > 1">\r\n {{\'these_elements\' | translate:totalSelecteds()}}\r\n <a href="" class="label label-primary" ng-click="showDetails = !showDetails">\r\n {{showDetails ? \'-\' : \'+\'}} {{\'details\' | translate}}\r\n </a>\r\n </span>\r\n <div ng-show="temps.length > 1 &amp;&amp; showDetails">\r\n <ul class="selected-file-details">\r\n <li ng-repeat="tempItem in temps">\r\n <b>{{tempItem.model.name}}</b>\r\n </li>\r\n </ul>\r\n </div>\r\n<\/script>\r\n'), e.put("src/templates/navbar.html", '<nav class="navbar navbar-inverse">\r\n <div class="container-fluid">\r\n <div class="row">\r\n <div class="col-sm-9 col-md-10 hidden-xs">\r\n <div ng-show="!config.breadcrumb">\r\n <a class="navbar-brand hidden-xs ng-binding" href="">angular-{{"filemanager" | translate}}</a>\r\n </div>\r\n <div ng-include="config.tplPath + \'/current-folder-breadcrumb.html\'" ng-show="config.breadcrumb">\r\n </div>\r\n </div>\r\n <div class="col-sm-3 col-md-2">\r\n <div class="navbar-collapse">\r\n <div class="navbar-form navbar-right text-right">\r\n <div class="pull-left visible-xs" ng-if="fileNavigator.currentPath.length">\r\n <button class="btn btn-primary btn-flat" ng-click="fileNavigator.upDir()">\r\n <i class="glyphicon glyphicon-chevron-left"></i>\r\n </button>\r\n {{fileNavigator.getCurrentFolderName() | strLimit : 12}}\r\n </div>\r\n <div class="btn-group">\r\n <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="dropDownMenuSearch" data-toggle="dropdown" aria-expanded="true">\r\n <i class="glyphicon glyphicon-search mr2"></i>\r\n </button>\r\n <div class="dropdown-menu animated fast fadeIn pull-right" role="menu" aria-labelledby="dropDownMenuLang">\r\n <input type="text" class="form-control" ng-show="config.searchForm" placeholder="{{\'search\' | translate}}..." ng-model="$parent.query">\r\n </div>\r\n </div>\r\n\r\n <button class="btn btn-flat btn-sm" ng-click="$parent.setTemplate(\'main-icons.html\')" ng-show="$parent.viewTemplate !==\'main-icons.html\'" title="{{\'icons\' | translate}}">\r\n <i class="glyphicon glyphicon-th-large"></i>\r\n </button>\r\n\r\n <button class="btn btn-flat btn-sm" ng-click="$parent.setTemplate(\'main-table.html\')" ng-show="$parent.viewTemplate !==\'main-table.html\'" title="{{\'list\' | translate}}">\r\n <i class="glyphicon glyphicon-th-list"></i>\r\n </button>\r\n\r\n <div class="btn-group">\r\n <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="dropDownMenuLang" data-toggle="dropdown" aria-expanded="true">\r\n <i class="glyphicon glyphicon-globe mr2"></i>\r\n </button>\r\n\r\n <ul class="dropdown-menu scrollable-menu animated fast fadeIn pull-right" role="menu" aria-labelledby="dropDownMenuLang">\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'en\')">English</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'zh_tw\')">正體中文</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'zh_cn\')">简体中文</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'es\')">Español</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'nl\')">Nederlands</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'pt\')">Portugues</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'fr\')">Français</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'de\')">Deutsch</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'he\')">עברי</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'it\')">italiano</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'sk\')">Slovenčina</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'ru\')">русский</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'ua\')">український</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'tr\')">Türkçe</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'fa\')">فارسی</a></li>\r\n <li role="presentation"><a role="menuitem" tabindex="-1" href="" ng-click="changeLanguage(\'pl\')">Polski</a></li>\r\n </ul>\r\n </div>\r\n\r\n <div class="btn-group">\r\n <button class="btn btn-flat btn-sm dropdown-toggle" type="button" id="more" data-toggle="dropdown" aria-expanded="true">\r\n <i class="glyphicon glyphicon-option-vertical"></i>\r\n </button>\r\n\r\n <ul class="dropdown-menu scrollable-menu animated fast fadeIn pull-right" role="menu" aria-labelledby="more">\r\n <li role="presentation" ng-show="config.allowedActions.createFolder" ng-click="modal(\'newfolder\') && prepareNewFolder()">\r\n <a href="" role="menuitem" tabindex="-1">\r\n <i class="glyphicon glyphicon-plus"></i> {{"new_folder" | translate}}\r\n </a>\r\n </li>\r\n <li role="presentation" ng-show="config.allowedActions.upload" ng-click="modal(\'uploadfile\')">\r\n <a href="" role="menuitem" tabindex="-1">\r\n <i class="glyphicon glyphicon-cloud-upload"></i> {{"upload_files" | translate}}\r\n </a>\r\n </li>\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</nav>\r\n'), e.put("src/templates/sidebar.html", '<ul class="nav nav-sidebar file-tree-root">\r\n <li ng-repeat="item in fileNavigator.history" ng-include="\'folder-branch-item\'" ng-class="{\'active\': item.name == fileNavigator.currentPath.join(\'/\')}"></li>\r\n</ul>\r\n\r\n<script type="text/ng-template" id="folder-branch-item">\r\n <a href="" ng-click="fileNavigator.folderClick(item.item)" class="animated fast fadeInDown">\r\n\r\n <span class="point">\r\n <i class="glyphicon glyphicon-chevron-down" ng-show="isInThisPath(item.name)"></i>\r\n <i class="glyphicon glyphicon-chevron-right" ng-show="!isInThisPath(item.name)"></i>\r\n </span>\r\n\r\n <i class="glyphicon glyphicon-folder-open mr2" ng-show="isInThisPath(item.name)"></i>\r\n <i class="glyphicon glyphicon-folder-close mr2" ng-show="!isInThisPath(item.name)"></i>\r\n {{ (item.name.split(\'/\').pop() || fileNavigator.getBasePath().join(\'/\') || \'/\') | strLimit : 30 }}\r\n </a>\r\n <ul class="nav nav-sidebar">\r\n <li ng-repeat="item in item.nodes" ng-include="\'folder-branch-item\'" ng-class="{\'active\': item.name == fileNavigator.currentPath.join(\'/\')}"></li>\r\n </ul>\r\n<\/script>'), e.put("src/templates/spinner.html", '<div class="spinner-wrapper col-xs-12">\r\n <svg class="spinner-container" style="width:65px;height:65px" viewBox="0 0 44 44">\r\n <circle class="path" cx="22" cy="22" r="20" fill="none" stroke-width="4"></circle>\r\n </svg>\r\n</div>')
+}]); \ No newline at end of file
diff --git a/src/main/resources/assets/js/angular-translate.min.js b/src/main/resources/assets/js/angular-translate.min.js
new file mode 100644
index 0000000..e749f17
--- /dev/null
+++ b/src/main/resources/assets/js/angular-translate.min.js
@@ -0,0 +1,6 @@
+/*!
+ * angular-translate - v2.15.2 - 2017-06-22
+ *
+ * Copyright (c) 2017 The angular-translate team, Pascal Precht; Licensed MIT
+ */
+!function(a,b){"function"==typeof define&&define.amd?define([],function(){return b()}):"object"==typeof module&&module.exports?module.exports=b():b()}(0,function(){function a(a){"use strict";var b=a.storageKey(),c=a.storage(),d=function(){var d=a.preferredLanguage();angular.isString(d)?a.use(d):c.put(b,a.use())};d.displayName="fallbackFromIncorrectStorageValue",c?c.get(b)?a.use(c.get(b)).catch(d):d():angular.isString(a.preferredLanguage())&&a.use(a.preferredLanguage())}function b(){"use strict";var a,b,c,d=null,e=!1,f=!1;c={sanitize:function(a,b){return"text"===b&&(a=h(a)),a},escape:function(a,b){return"text"===b&&(a=g(a)),a},sanitizeParameters:function(a,b){return"params"===b&&(a=j(a,h)),a},escapeParameters:function(a,b){return"params"===b&&(a=j(a,g)),a},sce:function(a,b,c){return"text"===b?a=i(a):"params"===b&&"filter"!==c&&(a=j(a,g)),a},sceParameters:function(a,b){return"params"===b&&(a=j(a,i)),a}},c.escaped=c.escapeParameters,this.addStrategy=function(a,b){return c[a]=b,this},this.removeStrategy=function(a){return delete c[a],this},this.useStrategy=function(a){return e=!0,d=a,this},this.$get=["$injector","$log",function(g,h){var i={},j=function(a,b,d,e){return angular.forEach(e,function(e){if(angular.isFunction(e))a=e(a,b,d);else if(angular.isFunction(c[e]))a=c[e](a,b,d);else{if(!angular.isString(c[e]))throw new Error("pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: '"+e+"'");if(!i[c[e]])try{i[c[e]]=g.get(c[e])}catch(a){throw i[c[e]]=function(){},new Error("pascalprecht.translate.$translateSanitization: Unknown sanitization strategy: '"+e+"'")}a=i[c[e]](a,b,d)}}),a},k=function(){e||f||(h.warn("pascalprecht.translate.$translateSanitization: No sanitization strategy has been configured. This can have serious security implications. See http://angular-translate.github.io/docs/#/guide/19_security for details."),f=!0)};return g.has("$sanitize")&&(a=g.get("$sanitize")),g.has("$sce")&&(b=g.get("$sce")),{useStrategy:function(a){return function(b){a.useStrategy(b)}}(this),sanitize:function(a,b,c,e){if(d||k(),c||null===c||(c=d),!c)return a;e||(e="service");var f=angular.isArray(c)?c:[c];return j(a,b,e,f)}}}];var g=function(a){var b=angular.element("<div></div>");return b.text(a),b.html()},h=function(b){if(!a)throw new Error("pascalprecht.translate.$translateSanitization: Error cannot find $sanitize service. Either include the ngSanitize module (https://docs.angularjs.org/api/ngSanitize) or use a sanitization strategy which does not depend on $sanitize, such as 'escape'.");return a(b)},i=function(a){if(!b)throw new Error("pascalprecht.translate.$translateSanitization: Error cannot find $sce service.");return b.trustAsHtml(a)},j=function(a,b,c){if(angular.isDate(a))return a;if(angular.isObject(a)){var d=angular.isArray(a)?[]:{};if(c){if(c.indexOf(a)>-1)throw new Error("pascalprecht.translate.$translateSanitization: Error cannot interpolate parameter due recursive object")}else c=[];return c.push(a),angular.forEach(a,function(a,e){angular.isFunction(a)||(d[e]=j(a,b,c))}),c.splice(-1,1),d}return angular.isNumber(a)?a:!0===a||!1===a?a:angular.isUndefined(a)||null===a?a:b(a)}}function c(a,b,c,d){"use strict";var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u={},v=[],w=a,x=[],y="translate-cloak",z=!1,A=!1,B=".",C=!1,D=!1,E=0,F=!0,G="default",H={default:function(a){return(a||"").split("-").join("_")},java:function(a){var b=(a||"").split("-").join("_"),c=b.split("_");return c.length>1?c[0].toLowerCase()+"_"+c[1].toUpperCase():b},bcp47:function(a){var b=(a||"").split("_").join("-"),c=b.split("-");return c.length>1?c[0].toLowerCase()+"-"+c[1].toUpperCase():b},"iso639-1":function(a){return(a||"").split("_").join("-").split("-")[0].toLowerCase()}},I=function(){if(angular.isFunction(d.getLocale))return d.getLocale();var a,c,e=b.$get().navigator,f=["language","browserLanguage","systemLanguage","userLanguage"];if(angular.isArray(e.languages))for(a=0;a<e.languages.length;a++)if((c=e.languages[a])&&c.length)return c;for(a=0;a<f.length;a++)if((c=e[f[a]])&&c.length)return c;return null};I.displayName="angular-translate/service: getFirstBrowserLanguage";var J=function(){var a=I()||"";return H[G]&&(a=H[G](a)),a};J.displayName="angular-translate/service: getLocale";var K=function(a,b){for(var c=0,d=a.length;c<d;c++)if(a[c]===b)return c;return-1},L=function(){return this.toString().replace(/^\s+|\s+$/g,"")},M=function(a){if(a){for(var b=[],c=angular.lowercase(a),d=0,e=v.length;d<e;d++)b.push(angular.lowercase(v[d]));if(K(b,c)>-1)return a;if(f){var g;for(var h in f)if(f.hasOwnProperty(h)){var i=!1,j=Object.prototype.hasOwnProperty.call(f,h)&&angular.lowercase(h)===angular.lowercase(a);if("*"===h.slice(-1)&&(i=h.slice(0,-1)===a.slice(0,h.length-1)),(j||i)&&(g=f[h],K(b,angular.lowercase(g))>-1))return g}}var k=a.split("_");return k.length>1&&K(b,angular.lowercase(k[0]))>-1?k[0]:void 0}},N=function(a,b){if(!a&&!b)return u;if(a&&!b){if(angular.isString(a))return u[a]}else angular.isObject(u[a])||(u[a]={}),angular.extend(u[a],O(b));return this};this.translations=N,this.cloakClassName=function(a){return a?(y=a,this):y},this.nestedObjectDelimeter=function(a){return a?(B=a,this):B};var O=function(a,b,c,d){var e,f,g,h;b||(b=[]),c||(c={});for(e in a)Object.prototype.hasOwnProperty.call(a,e)&&(h=a[e],angular.isObject(h)?O(h,b.concat(e),c,e):(f=b.length?""+b.join(B)+B+e:e,b.length&&e===d&&(g=""+b.join(B),c[g]="@:"+f),c[f]=h));return c};O.displayName="flatObject",this.addInterpolation=function(a){return x.push(a),this},this.useMessageFormatInterpolation=function(){return this.useInterpolation("$translateMessageFormatInterpolation")},this.useInterpolation=function(a){return n=a,this},this.useSanitizeValueStrategy=function(a){return c.useStrategy(a),this},this.preferredLanguage=function(a){return a?(P(a),this):e};var P=function(a){return a&&(e=a),e};this.translationNotFoundIndicator=function(a){return this.translationNotFoundIndicatorLeft(a),this.translationNotFoundIndicatorRight(a),this},this.translationNotFoundIndicatorLeft=function(a){return a?(q=a,this):q},this.translationNotFoundIndicatorRight=function(a){return a?(r=a,this):r},this.fallbackLanguage=function(a){return Q(a),this};var Q=function(a){return a?(angular.isString(a)?(h=!0,g=[a]):angular.isArray(a)&&(h=!1,g=a),angular.isString(e)&&K(g,e)<0&&g.push(e),this):h?g[0]:g};this.use=function(a){if(a){if(!u[a]&&!o)throw new Error("$translateProvider couldn't find translationTable for langKey: '"+a+"'");return i=a,this}return i},this.resolveClientLocale=function(){return J()};var R=function(a){return a?(w=a,this):l?l+w:w};this.storageKey=R,this.useUrlLoader=function(a,b){return this.useLoader("$translateUrlLoader",angular.extend({url:a},b))},this.useStaticFilesLoader=function(a){return this.useLoader("$translateStaticFilesLoader",a)},this.useLoader=function(a,b){return o=a,p=b||{},this},this.useLocalStorage=function(){return this.useStorage("$translateLocalStorage")},this.useCookieStorage=function(){return this.useStorage("$translateCookieStorage")},this.useStorage=function(a){return k=a,this},this.storagePrefix=function(a){return a?(l=a,this):a},this.useMissingTranslationHandlerLog=function(){return this.useMissingTranslationHandler("$translateMissingTranslationHandlerLog")},this.useMissingTranslationHandler=function(a){return m=a,this},this.usePostCompiling=function(a){return z=!!a,this},this.forceAsyncReload=function(a){return A=!!a,this},this.uniformLanguageTag=function(a){return a?angular.isString(a)&&(a={standard:a}):a={},G=a.standard,this},this.determinePreferredLanguage=function(a){var b=a&&angular.isFunction(a)?a():J();return e=v.length?M(b)||b:b,this},this.registerAvailableLanguageKeys=function(a,b){return a?(v=a,b&&(f=b),this):v},this.useLoaderCache=function(a){return!1===a?s=void 0:!0===a?s=!0:void 0===a?s="$translationCache":a&&(s=a),this},this.directivePriority=function(a){return void 0===a?E:(E=a,this)},this.statefulFilter=function(a){return void 0===a?F:(F=a,this)},this.postProcess=function(a){return t=a||void 0,this},this.keepContent=function(a){return D=!!a,this},this.$get=["$log","$injector","$rootScope","$q",function(a,b,c,d){var f,l,G,H=b.get(n||"$translateDefaultInterpolation"),I=!1,S={},T={},U=function(a,b,c,h,j){!i&&e&&(i=e);var m=j&&j!==i?M(j)||j:i;if(j&&ja(j),angular.isArray(a)){return function(a){for(var e={},f=[],g=0,i=a.length;g<i;g++)f.push(function(a){var f=d.defer(),g=function(b){e[a]=b,f.resolve([a,b])};return U(a,b,c,h,j).then(g,g),f.promise}(a[g]));return d.all(f).then(function(){return e})}(a)}var n=d.defer();a&&(a=L.apply(a));var o=function(){var a=e?T[e]:T[m];if(l=0,k&&!a){var b=f.get(w);if(a=T[b],g&&g.length){var c=K(g,b);l=0===c?1:0,K(g,e)<0&&g.push(e)}}return a}();if(o){var p=function(){j||(m=i),fa(a,b,c,h,m).then(n.resolve,n.reject)};p.displayName="promiseResolved",o.finally(p).catch(angular.noop)}else fa(a,b,c,h,m).then(n.resolve,n.reject);return n.promise},V=function(a){return q&&(a=[q,a].join(" ")),r&&(a=[a,r].join(" ")),a},W=function(a){i=a,k&&f.put(U.storageKey(),i),c.$emit("$translateChangeSuccess",{language:a}),H.setLocale(i);var b=function(a,b){S[b].setLocale(i)};b.displayName="eachInterpolatorLocaleSetter",angular.forEach(S,b),c.$emit("$translateChangeEnd",{language:a})},X=function(a){if(!a)throw"No language key specified for loading.";var e=d.defer();c.$emit("$translateLoadingStart",{language:a}),I=!0;var f=s;"string"==typeof f&&(f=b.get(f));var g=angular.extend({},p,{key:a,$http:angular.extend({},{cache:f},p.$http)}),h=function(b){var d={};c.$emit("$translateLoadingSuccess",{language:a}),angular.isArray(b)?angular.forEach(b,function(a){angular.extend(d,O(a))}):angular.extend(d,O(b)),I=!1,e.resolve({key:a,table:d}),c.$emit("$translateLoadingEnd",{language:a})};h.displayName="onLoaderSuccess";var i=function(a){c.$emit("$translateLoadingError",{language:a}),e.reject(a),c.$emit("$translateLoadingEnd",{language:a})};return i.displayName="onLoaderError",b.get(o)(g).then(h,i),e.promise};if(k&&(f=b.get(k),!f.get||!f.put))throw new Error("Couldn't use storage '"+k+"', missing get() or put() method!");if(x.length){var Y=function(a){var c=b.get(a);c.setLocale(e||i),S[c.getInterpolationIdentifier()]=c};Y.displayName="interpolationFactoryAdder",angular.forEach(x,Y)}var Z=function(a){var b=d.defer();if(Object.prototype.hasOwnProperty.call(u,a))b.resolve(u[a]);else if(T[a]){var c=function(a){N(a.key,a.table),b.resolve(a.table)};c.displayName="translationTableResolver",T[a].then(c,b.reject)}else b.reject();return b.promise},$=function(a,b,c,e,f){var g=d.defer(),h=function(d){if(Object.prototype.hasOwnProperty.call(d,b)&&null!==d[b]){e.setLocale(a);var h=d[b];if("@:"===h.substr(0,2))$(a,h.substr(2),c,e,f).then(g.resolve,g.reject);else{var j=e.interpolate(d[b],c,"service",f,b);j=ia(b,d[b],j,c,a),g.resolve(j)}e.setLocale(i)}else g.reject()};return h.displayName="fallbackTranslationResolver",Z(a).then(h,g.reject),g.promise},_=function(a,b,c,d,e){var f,g=u[a];if(g&&Object.prototype.hasOwnProperty.call(g,b)&&null!==g[b]){if(d.setLocale(a),f=d.interpolate(g[b],c,"filter",e,b),f=ia(b,g[b],f,c,a,e),!angular.isString(f)&&angular.isFunction(f.$$unwrapTrustedValue)){var h=f.$$unwrapTrustedValue();if("@:"===h.substr(0,2))return _(a,h.substr(2),c,d,e)}else if("@:"===f.substr(0,2))return _(a,f.substr(2),c,d,e);d.setLocale(i)}return f},aa=function(a,c,d,e){return m?b.get(m)(a,i,c,d,e):a},ba=function(a,b,c,e,f,h){var i=d.defer();if(a<g.length){var j=g[a];$(j,b,c,e,h).then(function(a){i.resolve(a)},function(){return ba(a+1,b,c,e,f,h).then(i.resolve,i.reject)})}else if(f)i.resolve(f);else{var k=aa(b,c,f);m&&k?i.resolve(k):i.reject(V(b))}return i.promise},ca=function(a,b,c,d,e){var f;if(a<g.length){var h=g[a];f=_(h,b,c,d,e),f||""===f||(f=ca(a+1,b,c,d))}return f},da=function(a,b,c,d,e){return ba(G>0?G:l,a,b,c,d,e)},ea=function(a,b,c,d){return ca(G>0?G:l,a,b,c,d)},fa=function(a,b,c,e,f,h){var i=d.defer(),j=f?u[f]:u,k=c?S[c]:H;if(j&&Object.prototype.hasOwnProperty.call(j,a)&&null!==j[a]){var l=j[a];if("@:"===l.substr(0,2))U(l.substr(2),b,c,e,f).then(i.resolve,i.reject);else{var n=k.interpolate(l,b,"service",h,a);n=ia(a,l,n,b,f),i.resolve(n)}}else{var o;m&&!I&&(o=aa(a,b,e)),f&&g&&g.length?da(a,b,k,e,h).then(function(a){i.resolve(a)},function(a){i.reject(V(a))}):m&&!I&&o?e?i.resolve(e):i.resolve(o):e?i.resolve(e):i.reject(V(a))}return i.promise},ga=function(a,b,c,d,e){var f,h=d?u[d]:u,i=H;if(S&&Object.prototype.hasOwnProperty.call(S,c)&&(i=S[c]),h&&Object.prototype.hasOwnProperty.call(h,a)&&null!==h[a]){var j=h[a];"@:"===j.substr(0,2)?f=ga(j.substr(2),b,c,d,e):(f=i.interpolate(j,b,"filter",e,a),f=ia(a,j,f,b,d,e))}else{var k;m&&!I&&(k=aa(a,b,e)),d&&g&&g.length?(l=0,f=ea(a,b,i,e)):f=m&&!I&&k?k:V(a)}return f},ha=function(a){j===a&&(j=void 0),T[a]=void 0},ia=function(a,c,d,e,f,g){var h=t;return h&&("string"==typeof h&&(h=b.get(h)),h)?h(a,c,d,e,f,g):d},ja=function(a){u[a]||!o||T[a]||(T[a]=X(a).then(function(a){return N(a.key,a.table),a}))};U.preferredLanguage=function(a){return a&&P(a),e},U.cloakClassName=function(){return y},U.nestedObjectDelimeter=function(){return B},U.fallbackLanguage=function(a){if(void 0!==a&&null!==a){if(Q(a),o&&g&&g.length)for(var b=0,c=g.length;b<c;b++)T[g[b]]||(T[g[b]]=X(g[b]));U.use(U.use())}return h?g[0]:g},U.useFallbackLanguage=function(a){if(void 0!==a&&null!==a)if(a){var b=K(g,a);b>-1&&(G=b)}else G=0},U.proposedLanguage=function(){return j},U.storage=function(){return f},U.negotiateLocale=M,U.use=function(a){if(!a)return i;var b=d.defer();b.promise.then(null,angular.noop),c.$emit("$translateChangeStart",{language:a});var e=M(a);return v.length>0&&!e?d.reject(a):(e&&(a=e),j=a,!A&&u[a]||!o||T[a]?T[a]?T[a].then(function(a){return j===a.key&&W(a.key),b.resolve(a.key),a},function(a){return!i&&g&&g.length>0&&g[0]!==a?U.use(g[0]).then(b.resolve,b.reject):b.reject(a)}):(b.resolve(a),W(a)):(T[a]=X(a).then(function(c){return N(c.key,c.table),b.resolve(c.key),j===a&&W(c.key),c},function(a){return c.$emit("$translateChangeError",{language:a}),b.reject(a),c.$emit("$translateChangeEnd",{language:a}),d.reject(a)}),T[a].finally(function(){ha(a)}).catch(angular.noop)),b.promise)},U.resolveClientLocale=function(){return J()},U.storageKey=function(){return R()},U.isPostCompilingEnabled=function(){return z},U.isForceAsyncReloadEnabled=function(){return A},U.isKeepContent=function(){return D},U.refresh=function(a){function b(a){var b=X(a);return T[a]=b,b.then(function(b){u[a]={},N(a,b.table),f[a]=!0},angular.noop),b}if(!o)throw new Error("Couldn't refresh translation table, no loader registered!");c.$emit("$translateRefreshStart",{language:a});var e=d.defer(),f={};if(e.promise.then(function(){for(var a in u)u.hasOwnProperty(a)&&(a in f||delete u[a]);i&&W(i)},angular.noop).finally(function(){c.$emit("$translateRefreshEnd",{language:a})}),a)u[a]?b(a).then(e.resolve,e.reject):e.reject();else{var h=g&&g.slice()||[];i&&-1===h.indexOf(i)&&h.push(i),d.all(h.map(b)).then(e.resolve,e.reject)}return e.promise},U.instant=function(a,b,c,d,f){var h=d&&d!==i?M(d)||d:i;if(null===a||angular.isUndefined(a))return a;if(d&&ja(d),angular.isArray(a)){for(var j={},k=0,l=a.length;k<l;k++)j[a[k]]=U.instant(a[k],b,c,d,f);return j}if(angular.isString(a)&&a.length<1)return a;a&&(a=L.apply(a));var n,o=[];e&&o.push(e),h&&o.push(h),g&&g.length&&(o=o.concat(g));for(var p=0,s=o.length;p<s;p++){var t=o[p];if(u[t]&&void 0!==u[t][a]&&(n=ga(a,b,c,h,f)),void 0!==n)break}if(!n&&""!==n)if(q||r)n=V(a);else{n=H.interpolate(a,b,"filter",f);var v;m&&!I&&(v=aa(a,b,f)),m&&!I&&v&&(n=v)}return n},U.versionInfo=function(){return"2.15.2"},U.loaderCache=function(){return s},U.directivePriority=function(){return E},U.statefulFilter=function(){return F},U.isReady=function(){return C};var ka=d.defer();ka.promise.then(function(){C=!0}),U.onReady=function(a){var b=d.defer();return angular.isFunction(a)&&b.promise.then(a),C?b.resolve():ka.promise.then(b.resolve),b.promise},U.getAvailableLanguageKeys=function(){return v.length>0?v:null},U.getTranslationTable=function(a){return a=a||U.use(),a&&u[a]?angular.copy(u[a]):null};var la=c.$on("$translateReady",function(){ka.resolve(),la(),la=null}),ma=c.$on("$translateChangeEnd",function(){ka.resolve(),ma(),ma=null});if(o){if(angular.equals(u,{})&&U.use()&&U.use(U.use()),g&&g.length)for(var na=function(a){return N(a.key,a.table),c.$emit("$translateChangeEnd",{language:a.key}),a},oa=0,pa=g.length;oa<pa;oa++){var qa=g[oa];!A&&u[qa]||(T[qa]=X(qa).then(na))}}else c.$emit("$translateReady",{language:U.use()});return U}]}function d(a,b){"use strict";var c,d={};return d.setLocale=function(a){c=a},d.getInterpolationIdentifier=function(){return"default"},d.useSanitizeValueStrategy=function(a){return b.useStrategy(a),this},d.interpolate=function(c,d,e,f,g){d=d||{},d=b.sanitize(d,"params",f,e);var h;return angular.isNumber(c)?h=""+c:angular.isString(c)?(h=a(c)(d),h=b.sanitize(h,"text",f,e)):h="",h},d}function e(a,b,c,d,e){"use strict";var g=function(){return this.toString().replace(/^\s+|\s+$/g,"")};return{restrict:"AE",scope:!0,priority:a.directivePriority(),compile:function(h,i){var j=i.translateValues?i.translateValues:void 0,k=i.translateInterpolation?i.translateInterpolation:void 0,l=h[0].outerHTML.match(/translate-value-+/i),m="^(.*)("+b.startSymbol()+".*"+b.endSymbol()+")(.*)",n="^(.*)"+b.startSymbol()+"(.*)"+b.endSymbol()+"(.*)";return function(h,o,p){h.interpolateParams={},h.preText="",h.postText="",h.translateNamespace=f(h);var q={},r=function(a){if(angular.isFunction(r._unwatchOld)&&(r._unwatchOld(),r._unwatchOld=void 0),angular.equals(a,"")||!angular.isDefined(a)){var c=g.apply(o.text()),d=c.match(m);if(angular.isArray(d)){h.preText=d[1],h.postText=d[3],q.translate=b(d[2])(h.$parent);var e=c.match(n);angular.isArray(e)&&e[2]&&e[2].length&&(r._unwatchOld=h.$watch(e[2],function(a){q.translate=a,v()}))}else q.translate=c||void 0}else q.translate=a;v()};!function(a,b,c){if(b.translateValues&&angular.extend(a,d(b.translateValues)(h.$parent)),l)for(var e in c)if(Object.prototype.hasOwnProperty.call(b,e)&&"translateValue"===e.substr(0,14)&&"translateValues"!==e){var f=angular.lowercase(e.substr(14,1))+e.substr(15);a[f]=c[e]}}(h.interpolateParams,p,i);var s=!0;p.$observe("translate",function(a){void 0===a?r(""):""===a&&s||(q.translate=a,v()),s=!1});for(var t in p)p.hasOwnProperty(t)&&"translateAttr"===t.substr(0,13)&&t.length>13&&function(a){p.$observe(a,function(b){q[a]=b,v()})}(t);if(p.$observe("translateDefault",function(a){h.defaultText=a,v()}),j&&p.$observe("translateValues",function(a){a&&h.$parent.$watch(function(){angular.extend(h.interpolateParams,d(a)(h.$parent))})}),l){for(var u in p)Object.prototype.hasOwnProperty.call(p,u)&&"translateValue"===u.substr(0,14)&&"translateValues"!==u&&function(a){p.$observe(a,function(b){var c=angular.lowercase(a.substr(14,1))+a.substr(15);h.interpolateParams[c]=b})}(u)}var v=function(){for(var a in q)q.hasOwnProperty(a)&&void 0!==q[a]&&w(a,q[a],h,h.interpolateParams,h.defaultText,h.translateNamespace)},w=function(b,c,d,e,f,g){c?(g&&"."===c.charAt(0)&&(c=g+c),a(c,e,k,f,d.translateLanguage).then(function(a){x(a,d,!0,b)},function(a){x(a,d,!1,b)})):x(c,d,!1,b)},x=function(b,d,e,f){if(e||void 0!==d.defaultText&&(b=d.defaultText),"translate"===f){(e||!e&&!a.isKeepContent()&&void 0===p.translateKeepContent)&&o.empty().append(d.preText+b+d.postText);var g=a.isPostCompilingEnabled(),h=void 0!==i.translateCompile,j=h&&"false"!==i.translateCompile;(g&&!h||j)&&c(o.contents())(d)}else{var k=p.$attr[f];"data-"===k.substr(0,5)&&(k=k.substr(5)),k=k.substr(15),o.attr(k,b)}};(j||l||p.translateDefault)&&h.$watch("interpolateParams",v,!0),h.$on("translateLanguageChanged",v);var y=e.$on("$translateChangeSuccess",v);o.text().length?r(p.translate?p.translate:""):p.translate&&r(p.translate),v(),h.$on("$destroy",y)}}}}function f(a){"use strict";return a.translateNamespace?a.translateNamespace:a.$parent?f(a.$parent):void 0}function g(a,b){"use strict";return{restrict:"A",priority:a.directivePriority(),link:function(c,d,e){var f,g,i={},j=function(){angular.forEach(f,function(b,f){b&&(i[f]=!0,c.translateNamespace&&"."===b.charAt(0)&&(b=c.translateNamespace+b),a(b,g,e.translateInterpolation,void 0,c.translateLanguage).then(function(a){d.attr(f,a)},function(a){d.attr(f,a)}))}),angular.forEach(i,function(a,b){f[b]||(d.removeAttr(b),delete i[b])})};h(c,e.translateAttr,function(a){f=a},j),h(c,e.translateValues,function(a){g=a},j),e.translateValues&&c.$watch(e.translateValues,j,!0),c.$on("translateLanguageChanged",j);var k=b.$on("$translateChangeSuccess",j);j(),c.$on("$destroy",k)}}}function h(a,b,c,d){"use strict";b&&("::"===b.substr(0,2)?b=b.substr(2):a.$watch(b,function(a){c(a),d()},!0),c(a.$eval(b)))}function i(a,b){"use strict";return{compile:function(c){var d=function(b){b.addClass(a.cloakClassName())},e=function(b){b.removeClass(a.cloakClassName())};return d(c),function(c,f,g){var h=e.bind(this,f),i=d.bind(this,f);g.translateCloak&&g.translateCloak.length?(g.$observe("translateCloak",function(b){a(b).then(h,i)}),b.$on("$translateChangeSuccess",function(){a(g.translateCloak).then(h,i)})):a.onReady(h)}}}}function j(){"use strict";return{restrict:"A",scope:!0,compile:function(){return{pre:function(a,b,c){a.translateNamespace=f(a),a.translateNamespace&&"."===c.translateNamespace.charAt(0)?a.translateNamespace+=c.translateNamespace:a.translateNamespace=c.translateNamespace}}}}}function f(a){"use strict";return a.translateNamespace?a.translateNamespace:a.$parent?f(a.$parent):void 0}function k(){"use strict";return{restrict:"A",scope:!0,compile:function(){return function(a,b,c){c.$observe("translateLanguage",function(b){a.translateLanguage=b}),a.$watch("translateLanguage",function(){a.$broadcast("translateLanguageChanged")})}}}}function l(a,b){"use strict";var c=function(c,d,e,f){if(!angular.isObject(d)){var g=this||{__SCOPE_IS_NOT_AVAILABLE:"More info at https://github.com/angular/angular.js/commit/8863b9d04c722b278fa93c5d66ad1e578ad6eb1f"};d=a(d)(g)}return b.instant(c,d,e,f)};return b.statefulFilter()&&(c.$stateful=!0),c}function m(a){"use strict";return a("translations")}return a.$inject=["$translate"],c.$inject=["$STORAGE_KEY","$windowProvider","$translateSanitizationProvider","pascalprechtTranslateOverrider"],d.$inject=["$interpolate","$translateSanitization"],e.$inject=["$translate","$interpolate","$compile","$parse","$rootScope"],g.$inject=["$translate","$rootScope"],i.$inject=["$translate","$rootScope"],l.$inject=["$parse","$translate"],m.$inject=["$cacheFactory"],angular.module("pascalprecht.translate",["ng"]).run(a),a.displayName="runTranslate",angular.module("pascalprecht.translate").provider("$translateSanitization",b),angular.module("pascalprecht.translate").constant("pascalprechtTranslateOverrider",{}).provider("$translate",c),c.displayName="displayName",angular.module("pascalprecht.translate").factory("$translateDefaultInterpolation",d),d.displayName="$translateDefaultInterpolation",angular.module("pascalprecht.translate").constant("$STORAGE_KEY","NG_TRANSLATE_LANG_KEY"),angular.module("pascalprecht.translate").directive("translate",e),e.displayName="translateDirective",angular.module("pascalprecht.translate").directive("translateAttr",g),g.displayName="translateAttrDirective",angular.module("pascalprecht.translate").directive("translateCloak",i),i.displayName="translateCloakDirective",angular.module("pascalprecht.translate").directive("translateNamespace",j),j.displayName="translateNamespaceDirective",angular.module("pascalprecht.translate").directive("translateLanguage",k),k.displayName="translateLanguageDirective",angular.module("pascalprecht.translate").filter("translate",l),l.displayName="translateFilterFactory",angular.module("pascalprecht.translate").factory("$translationCache",m),m.displayName="$translationCache","pascalprecht.translate"}); \ No newline at end of file
diff --git a/src/main/resources/assets/js/angular.min.js b/src/main/resources/assets/js/angular.min.js
new file mode 100644
index 0000000..7836905
--- /dev/null
+++ b/src/main/resources/assets/js/angular.min.js
@@ -0,0 +1,335 @@
+/*
+ AngularJS v1.6.7
+ (c) 2010-2017 Google, Inc. http://angularjs.org
+ License: MIT
+*/
+(function(u){'use strict';function oe(a){if(E(a))t(a.objectMaxDepth)&&(Mc.objectMaxDepth=Vb(a.objectMaxDepth)?a.objectMaxDepth:NaN);else return Mc}function Vb(a){return Y(a)&&0<a}function M(a,b){b=b||Error;return function(){var d=arguments[0],c;c="["+(a?a+":":"")+d+"] http://errors.angularjs.org/1.6.7/"+(a?a+"/":"")+d;for(d=1;d<arguments.length;d++){c=c+(1==d?"?":"&")+"p"+(d-1)+"=";var e=encodeURIComponent,f;f=arguments[d];f="function"==typeof f?f.toString().replace(/ \{[\s\S]*$/,""):"undefined"==
+typeof f?"undefined":"string"!=typeof f?JSON.stringify(f):f;c+=e(f)}return new b(c)}}function xa(a){if(null==a||$a(a))return!1;if(I(a)||D(a)||A&&a instanceof A)return!0;var b="length"in Object(a)&&a.length;return Y(b)&&(0<=b&&(b-1 in a||a instanceof Array)||"function"===typeof a.item)}function p(a,b,d){var c,e;if(a)if(B(a))for(c in a)"prototype"!==c&&"length"!==c&&"name"!==c&&a.hasOwnProperty(c)&&b.call(d,a[c],c,a);else if(I(a)||xa(a)){var f="object"!==typeof a;c=0;for(e=a.length;c<e;c++)(f||c in
+a)&&b.call(d,a[c],c,a)}else if(a.forEach&&a.forEach!==p)a.forEach(b,d,a);else if(Nc(a))for(c in a)b.call(d,a[c],c,a);else if("function"===typeof a.hasOwnProperty)for(c in a)a.hasOwnProperty(c)&&b.call(d,a[c],c,a);else for(c in a)ra.call(a,c)&&b.call(d,a[c],c,a);return a}function Oc(a,b,d){for(var c=Object.keys(a).sort(),e=0;e<c.length;e++)b.call(d,a[c[e]],c[e]);return c}function Wb(a){return function(b,d){a(d,b)}}function pe(){return++rb}function Xb(a,b,d){for(var c=a.$$hashKey,e=0,f=b.length;e<f;++e){var g=
+b[e];if(E(g)||B(g))for(var k=Object.keys(g),h=0,l=k.length;h<l;h++){var m=k[h],n=g[m];d&&E(n)?ea(n)?a[m]=new Date(n.valueOf()):ab(n)?a[m]=new RegExp(n):n.nodeName?a[m]=n.cloneNode(!0):Yb(n)?a[m]=n.clone():(E(a[m])||(a[m]=I(n)?[]:{}),Xb(a[m],[n],!0)):a[m]=n}}c?a.$$hashKey=c:delete a.$$hashKey;return a}function Q(a){return Xb(a,ya.call(arguments,1),!1)}function qe(a){return Xb(a,ya.call(arguments,1),!0)}function Z(a){return parseInt(a,10)}function Zb(a,b){return Q(Object.create(a),b)}function C(){}
+function bb(a){return a}function ka(a){return function(){return a}}function $b(a){return B(a.toString)&&a.toString!==ha}function w(a){return"undefined"===typeof a}function t(a){return"undefined"!==typeof a}function E(a){return null!==a&&"object"===typeof a}function Nc(a){return null!==a&&"object"===typeof a&&!Pc(a)}function D(a){return"string"===typeof a}function Y(a){return"number"===typeof a}function ea(a){return"[object Date]"===ha.call(a)}function ac(a){switch(ha.call(a)){case "[object Error]":return!0;
+case "[object Exception]":return!0;case "[object DOMException]":return!0;default:return a instanceof Error}}function B(a){return"function"===typeof a}function ab(a){return"[object RegExp]"===ha.call(a)}function $a(a){return a&&a.window===a}function cb(a){return a&&a.$evalAsync&&a.$watch}function Na(a){return"boolean"===typeof a}function re(a){return a&&Y(a.length)&&se.test(ha.call(a))}function Yb(a){return!(!a||!(a.nodeName||a.prop&&a.attr&&a.find))}function te(a){var b={};a=a.split(",");var d;for(d=
+0;d<a.length;d++)b[a[d]]=!0;return b}function za(a){return N(a.nodeName||a[0]&&a[0].nodeName)}function db(a,b){var d=a.indexOf(b);0<=d&&a.splice(d,1);return d}function pa(a,b,d){function c(a,b,c){c--;if(0>c)return"...";var d=b.$$hashKey,g;if(I(a)){g=0;for(var f=a.length;g<f;g++)b.push(e(a[g],c))}else if(Nc(a))for(g in a)b[g]=e(a[g],c);else if(a&&"function"===typeof a.hasOwnProperty)for(g in a)a.hasOwnProperty(g)&&(b[g]=e(a[g],c));else for(g in a)ra.call(a,g)&&(b[g]=e(a[g],c));d?b.$$hashKey=d:delete b.$$hashKey;
+return b}function e(a,b){if(!E(a))return a;var d=g.indexOf(a);if(-1!==d)return k[d];if($a(a)||cb(a))throw qa("cpws");var d=!1,e=f(a);void 0===e&&(e=I(a)?[]:Object.create(Pc(a)),d=!0);g.push(a);k.push(e);return d?c(a,e,b):e}function f(a){switch(ha.call(a)){case "[object Int8Array]":case "[object Int16Array]":case "[object Int32Array]":case "[object Float32Array]":case "[object Float64Array]":case "[object Uint8Array]":case "[object Uint8ClampedArray]":case "[object Uint16Array]":case "[object Uint32Array]":return new a.constructor(e(a.buffer),
+a.byteOffset,a.length);case "[object ArrayBuffer]":if(!a.slice){var b=new ArrayBuffer(a.byteLength);(new Uint8Array(b)).set(new Uint8Array(a));return b}return a.slice(0);case "[object Boolean]":case "[object Number]":case "[object String]":case "[object Date]":return new a.constructor(a.valueOf());case "[object RegExp]":return b=new RegExp(a.source,a.toString().match(/[^/]*$/)[0]),b.lastIndex=a.lastIndex,b;case "[object Blob]":return new a.constructor([a],{type:a.type})}if(B(a.cloneNode))return a.cloneNode(!0)}
+var g=[],k=[];d=Vb(d)?d:NaN;if(b){if(re(b)||"[object ArrayBuffer]"===ha.call(b))throw qa("cpta");if(a===b)throw qa("cpi");I(b)?b.length=0:p(b,function(a,c){"$$hashKey"!==c&&delete b[c]});g.push(a);k.push(b);return c(a,b,d)}return e(a,d)}function bc(a,b){return a===b||a!==a&&b!==b}function sa(a,b){if(a===b)return!0;if(null===a||null===b)return!1;if(a!==a&&b!==b)return!0;var d=typeof a,c;if(d===typeof b&&"object"===d)if(I(a)){if(!I(b))return!1;if((d=a.length)===b.length){for(c=0;c<d;c++)if(!sa(a[c],
+b[c]))return!1;return!0}}else{if(ea(a))return ea(b)?bc(a.getTime(),b.getTime()):!1;if(ab(a))return ab(b)?a.toString()===b.toString():!1;if(cb(a)||cb(b)||$a(a)||$a(b)||I(b)||ea(b)||ab(b))return!1;d=T();for(c in a)if("$"!==c.charAt(0)&&!B(a[c])){if(!sa(a[c],b[c]))return!1;d[c]=!0}for(c in b)if(!(c in d)&&"$"!==c.charAt(0)&&t(b[c])&&!B(b[c]))return!1;return!0}return!1}function eb(a,b,d){return a.concat(ya.call(b,d))}function Ra(a,b){var d=2<arguments.length?ya.call(arguments,2):[];return!B(b)||b instanceof
+RegExp?b:d.length?function(){return arguments.length?b.apply(a,eb(d,arguments,0)):b.apply(a,d)}:function(){return arguments.length?b.apply(a,arguments):b.call(a)}}function Qc(a,b){var d=b;"string"===typeof a&&"$"===a.charAt(0)&&"$"===a.charAt(1)?d=void 0:$a(b)?d="$WINDOW":b&&u.document===b?d="$DOCUMENT":cb(b)&&(d="$SCOPE");return d}function fb(a,b){if(!w(a))return Y(b)||(b=b?2:null),JSON.stringify(a,Qc,b)}function Rc(a){return D(a)?JSON.parse(a):a}function Sc(a,b){a=a.replace(ue,"");var d=Date.parse("Jan 01, 1970 00:00:00 "+
+a)/6E4;return U(d)?b:d}function cc(a,b,d){d=d?-1:1;var c=a.getTimezoneOffset();b=Sc(b,c);d*=b-c;a=new Date(a.getTime());a.setMinutes(a.getMinutes()+d);return a}function Aa(a){a=A(a).clone().empty();var b=A("<div>").append(a).html();try{return a[0].nodeType===Oa?N(b):b.match(/^(<[^>]+>)/)[1].replace(/^<([\w-]+)/,function(a,b){return"<"+N(b)})}catch(d){return N(b)}}function Tc(a){try{return decodeURIComponent(a)}catch(b){}}function dc(a){var b={};p((a||"").split("&"),function(a){var c,e,f;a&&(e=a=a.replace(/\+/g,
+"%20"),c=a.indexOf("="),-1!==c&&(e=a.substring(0,c),f=a.substring(c+1)),e=Tc(e),t(e)&&(f=t(f)?Tc(f):!0,ra.call(b,e)?I(b[e])?b[e].push(f):b[e]=[b[e],f]:b[e]=f))});return b}function ec(a){var b=[];p(a,function(a,c){I(a)?p(a,function(a){b.push(ia(c,!0)+(!0===a?"":"="+ia(a,!0)))}):b.push(ia(c,!0)+(!0===a?"":"="+ia(a,!0)))});return b.length?b.join("&"):""}function gb(a){return ia(a,!0).replace(/%26/gi,"&").replace(/%3D/gi,"=").replace(/%2B/gi,"+")}function ia(a,b){return encodeURIComponent(a).replace(/%40/gi,
+"@").replace(/%3A/gi,":").replace(/%24/g,"$").replace(/%2C/gi,",").replace(/%3B/gi,";").replace(/%20/g,b?"%20":"+")}function ve(a,b){var d,c,e=Ha.length;for(c=0;c<e;++c)if(d=Ha[c]+b,D(d=a.getAttribute(d)))return d;return null}function we(a,b){var d,c,e={};p(Ha,function(b){b+="app";!d&&a.hasAttribute&&a.hasAttribute(b)&&(d=a,c=a.getAttribute(b))});p(Ha,function(b){b+="app";var e;!d&&(e=a.querySelector("["+b.replace(":","\\:")+"]"))&&(d=e,c=e.getAttribute(b))});d&&(xe?(e.strictDi=null!==ve(d,"strict-di"),
+b(d,c?[c]:[],e)):u.console.error("Angular: disabling automatic bootstrap. <script> protocol indicates an extension, document.location.href does not match."))}function Uc(a,b,d){E(d)||(d={});d=Q({strictDi:!1},d);var c=function(){a=A(a);if(a.injector()){var c=a[0]===u.document?"document":Aa(a);throw qa("btstrpd",c.replace(/</,"&lt;").replace(/>/,"&gt;"));}b=b||[];b.unshift(["$provide",function(b){b.value("$rootElement",a)}]);d.debugInfoEnabled&&b.push(["$compileProvider",function(a){a.debugInfoEnabled(!0)}]);
+b.unshift("ng");c=hb(b,d.strictDi);c.invoke(["$rootScope","$rootElement","$compile","$injector",function(a,b,c,d){a.$apply(function(){b.data("$injector",d);c(b)(a)})}]);return c},e=/^NG_ENABLE_DEBUG_INFO!/,f=/^NG_DEFER_BOOTSTRAP!/;u&&e.test(u.name)&&(d.debugInfoEnabled=!0,u.name=u.name.replace(e,""));if(u&&!f.test(u.name))return c();u.name=u.name.replace(f,"");$.resumeBootstrap=function(a){p(a,function(a){b.push(a)});return c()};B($.resumeDeferredBootstrap)&&$.resumeDeferredBootstrap()}function ye(){u.name=
+"NG_ENABLE_DEBUG_INFO!"+u.name;u.location.reload()}function ze(a){a=$.element(a).injector();if(!a)throw qa("test");return a.get("$$testability")}function Vc(a,b){b=b||"_";return a.replace(Ae,function(a,c){return(c?b:"")+a.toLowerCase()})}function Be(){var a;if(!Wc){var b=sb();(la=w(b)?u.jQuery:b?u[b]:void 0)&&la.fn.on?(A=la,Q(la.fn,{scope:Sa.scope,isolateScope:Sa.isolateScope,controller:Sa.controller,injector:Sa.injector,inheritedData:Sa.inheritedData}),a=la.cleanData,la.cleanData=function(b){for(var c,
+e=0,f;null!=(f=b[e]);e++)(c=la._data(f,"events"))&&c.$destroy&&la(f).triggerHandler("$destroy");a(b)}):A=V;$.element=A;Wc=!0}}function ib(a,b,d){if(!a)throw qa("areq",b||"?",d||"required");return a}function tb(a,b,d){d&&I(a)&&(a=a[a.length-1]);ib(B(a),b,"not a function, got "+(a&&"object"===typeof a?a.constructor.name||"Object":typeof a));return a}function Ia(a,b){if("hasOwnProperty"===a)throw qa("badname",b);}function Xc(a,b,d){if(!b)return a;b=b.split(".");for(var c,e=a,f=b.length,g=0;g<f;g++)c=
+b[g],a&&(a=(e=a)[c]);return!d&&B(a)?Ra(e,a):a}function ub(a){for(var b=a[0],d=a[a.length-1],c,e=1;b!==d&&(b=b.nextSibling);e++)if(c||a[e]!==b)c||(c=A(ya.call(a,0,e))),c.push(b);return c||a}function T(){return Object.create(null)}function fc(a){if(null==a)return"";switch(typeof a){case "string":break;case "number":a=""+a;break;default:a=!$b(a)||I(a)||ea(a)?fb(a):a.toString()}return a}function Ce(a){function b(a,b,c){return a[b]||(a[b]=c())}var d=M("$injector"),c=M("ng");a=b(a,"angular",Object);a.$$minErr=
+a.$$minErr||M;return b(a,"module",function(){var a={};return function(f,g,k){var h={};if("hasOwnProperty"===f)throw c("badname","module");g&&a.hasOwnProperty(f)&&(a[f]=null);return b(a,f,function(){function a(b,c,d,g){g||(g=e);return function(){g[d||"push"]([b,c,arguments]);return p}}function b(a,c,d){d||(d=e);return function(b,e){e&&B(e)&&(e.$$moduleName=f);d.push([a,c,arguments]);return p}}if(!g)throw d("nomod",f);var e=[],q=[],G=[],L=a("$injector","invoke","push",q),p={_invokeQueue:e,_configBlocks:q,
+_runBlocks:G,info:function(a){if(t(a)){if(!E(a))throw c("aobj","value");h=a;return this}return h},requires:g,name:f,provider:b("$provide","provider"),factory:b("$provide","factory"),service:b("$provide","service"),value:a("$provide","value"),constant:a("$provide","constant","unshift"),decorator:b("$provide","decorator",q),animation:b("$animateProvider","register"),filter:b("$filterProvider","register"),controller:b("$controllerProvider","register"),directive:b("$compileProvider","directive"),component:b("$compileProvider",
+"component"),config:L,run:function(a){G.push(a);return this}};k&&L(k);return p})}})}function ja(a,b){if(I(a)){b=b||[];for(var d=0,c=a.length;d<c;d++)b[d]=a[d]}else if(E(a))for(d in b=b||{},a)if("$"!==d.charAt(0)||"$"!==d.charAt(1))b[d]=a[d];return b||a}function De(a,b){var d=[];Vb(b)&&(a=$.copy(a,null,b));return JSON.stringify(a,function(a,b){b=Qc(a,b);if(E(b)){if(0<=d.indexOf(b))return"...";d.push(b)}return b})}function Ee(a){Q(a,{errorHandlingConfig:oe,bootstrap:Uc,copy:pa,extend:Q,merge:qe,equals:sa,
+element:A,forEach:p,injector:hb,noop:C,bind:Ra,toJson:fb,fromJson:Rc,identity:bb,isUndefined:w,isDefined:t,isString:D,isFunction:B,isObject:E,isNumber:Y,isElement:Yb,isArray:I,version:Fe,isDate:ea,lowercase:N,uppercase:vb,callbacks:{$$counter:0},getTestability:ze,reloadWithDebugInfo:ye,$$minErr:M,$$csp:Ja,$$encodeUriSegment:gb,$$encodeUriQuery:ia,$$stringify:fc});gc=Ce(u);gc("ng",["ngLocale"],["$provide",function(a){a.provider({$$sanitizeUri:Ge});a.provider("$compile",Yc).directive({a:He,input:Zc,
+textarea:Zc,form:Ie,script:Je,select:Ke,option:Le,ngBind:Me,ngBindHtml:Ne,ngBindTemplate:Oe,ngClass:Pe,ngClassEven:Qe,ngClassOdd:Re,ngCloak:Se,ngController:Te,ngForm:Ue,ngHide:Ve,ngIf:We,ngInclude:Xe,ngInit:Ye,ngNonBindable:Ze,ngPluralize:$e,ngRepeat:af,ngShow:bf,ngStyle:cf,ngSwitch:df,ngSwitchWhen:ef,ngSwitchDefault:ff,ngOptions:gf,ngTransclude:hf,ngModel:jf,ngList:kf,ngChange:lf,pattern:$c,ngPattern:$c,required:ad,ngRequired:ad,minlength:bd,ngMinlength:bd,maxlength:cd,ngMaxlength:cd,ngValue:mf,
+ngModelOptions:nf}).directive({ngInclude:of}).directive(wb).directive(dd);a.provider({$anchorScroll:pf,$animate:qf,$animateCss:rf,$$animateJs:sf,$$animateQueue:tf,$$AnimateRunner:uf,$$animateAsyncRun:vf,$browser:wf,$cacheFactory:xf,$controller:yf,$document:zf,$$isDocumentHidden:Af,$exceptionHandler:Bf,$filter:ed,$$forceReflow:Cf,$interpolate:Df,$interval:Ef,$http:Ff,$httpParamSerializer:Gf,$httpParamSerializerJQLike:Hf,$httpBackend:If,$xhrFactory:Jf,$jsonpCallbacks:Kf,$location:Lf,$log:Mf,$parse:Nf,
+$rootScope:Of,$q:Pf,$$q:Qf,$sce:Rf,$sceDelegate:Sf,$sniffer:Tf,$templateCache:Uf,$templateRequest:Vf,$$testability:Wf,$timeout:Xf,$window:Yf,$$rAF:Zf,$$jqLite:$f,$$Map:ag,$$cookieReader:bg})}]).info({angularVersion:"1.6.7"})}function xb(a,b){return b.toUpperCase()}function yb(a){return a.replace(cg,xb)}function hc(a){a=a.nodeType;return 1===a||!a||9===a}function fd(a,b){var d,c,e=b.createDocumentFragment(),f=[];if(ic.test(a)){d=e.appendChild(b.createElement("div"));c=(dg.exec(a)||["",""])[1].toLowerCase();
+c=aa[c]||aa._default;d.innerHTML=c[1]+a.replace(eg,"<$1></$2>")+c[2];for(c=c[0];c--;)d=d.lastChild;f=eb(f,d.childNodes);d=e.firstChild;d.textContent=""}else f.push(b.createTextNode(a));e.textContent="";e.innerHTML="";p(f,function(a){e.appendChild(a)});return e}function V(a){if(a instanceof V)return a;var b;D(a)&&(a=R(a),b=!0);if(!(this instanceof V)){if(b&&"<"!==a.charAt(0))throw jc("nosel");return new V(a)}if(b){b=u.document;var d;a=(d=fg.exec(a))?[b.createElement(d[1])]:(d=fd(a,b))?d.childNodes:
+[];kc(this,a)}else B(a)?gd(a):kc(this,a)}function lc(a){return a.cloneNode(!0)}function zb(a,b){!b&&hc(a)&&A.cleanData([a]);a.querySelectorAll&&A.cleanData(a.querySelectorAll("*"))}function hd(a,b,d,c){if(t(c))throw jc("offargs");var e=(c=Ab(a))&&c.events,f=c&&c.handle;if(f)if(b){var g=function(b){var c=e[b];t(d)&&db(c||[],d);t(d)&&c&&0<c.length||(a.removeEventListener(b,f),delete e[b])};p(b.split(" "),function(a){g(a);Bb[a]&&g(Bb[a])})}else for(b in e)"$destroy"!==b&&a.removeEventListener(b,f),delete e[b]}
+function mc(a,b){var d=a.ng339,c=d&&jb[d];c&&(b?delete c.data[b]:(c.handle&&(c.events.$destroy&&c.handle({},"$destroy"),hd(a)),delete jb[d],a.ng339=void 0))}function Ab(a,b){var d=a.ng339,d=d&&jb[d];b&&!d&&(a.ng339=d=++gg,d=jb[d]={events:{},data:{},handle:void 0});return d}function nc(a,b,d){if(hc(a)){var c,e=t(d),f=!e&&b&&!E(b),g=!b;a=(a=Ab(a,!f))&&a.data;if(e)a[yb(b)]=d;else{if(g)return a;if(f)return a&&a[yb(b)];for(c in b)a[yb(c)]=b[c]}}}function Cb(a,b){return a.getAttribute?-1<(" "+(a.getAttribute("class")||
+"")+" ").replace(/[\n\t]/g," ").indexOf(" "+b+" "):!1}function Db(a,b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," "),c=d;p(b.split(" "),function(a){a=R(a);c=c.replace(" "+a+" "," ")});c!==d&&a.setAttribute("class",R(c))}}function Eb(a,b){if(b&&a.setAttribute){var d=(" "+(a.getAttribute("class")||"")+" ").replace(/[\n\t]/g," "),c=d;p(b.split(" "),function(a){a=R(a);-1===c.indexOf(" "+a+" ")&&(c+=a+" ")});c!==d&&a.setAttribute("class",R(c))}}function kc(a,
+b){if(b)if(b.nodeType)a[a.length++]=b;else{var d=b.length;if("number"===typeof d&&b.window!==b){if(d)for(var c=0;c<d;c++)a[a.length++]=b[c]}else a[a.length++]=b}}function id(a,b){return Fb(a,"$"+(b||"ngController")+"Controller")}function Fb(a,b,d){9===a.nodeType&&(a=a.documentElement);for(b=I(b)?b:[b];a;){for(var c=0,e=b.length;c<e;c++)if(t(d=A.data(a,b[c])))return d;a=a.parentNode||11===a.nodeType&&a.host}}function jd(a){for(zb(a,!0);a.firstChild;)a.removeChild(a.firstChild)}function Gb(a,b){b||
+zb(a);var d=a.parentNode;d&&d.removeChild(a)}function hg(a,b){b=b||u;if("complete"===b.document.readyState)b.setTimeout(a);else A(b).on("load",a)}function gd(a){function b(){u.document.removeEventListener("DOMContentLoaded",b);u.removeEventListener("load",b);a()}"complete"===u.document.readyState?u.setTimeout(a):(u.document.addEventListener("DOMContentLoaded",b),u.addEventListener("load",b))}function kd(a,b){var d=Hb[b.toLowerCase()];return d&&ld[za(a)]&&d}function ig(a,b){var d=function(c,d){c.isDefaultPrevented=
+function(){return c.defaultPrevented};var f=b[d||c.type],g=f?f.length:0;if(g){if(w(c.immediatePropagationStopped)){var k=c.stopImmediatePropagation;c.stopImmediatePropagation=function(){c.immediatePropagationStopped=!0;c.stopPropagation&&c.stopPropagation();k&&k.call(c)}}c.isImmediatePropagationStopped=function(){return!0===c.immediatePropagationStopped};var h=f.specialHandlerWrapper||jg;1<g&&(f=ja(f));for(var l=0;l<g;l++)c.isImmediatePropagationStopped()||h(a,c,f[l])}};d.elem=a;return d}function jg(a,
+b,d){d.call(a,b)}function kg(a,b,d){var c=b.relatedTarget;c&&(c===a||lg.call(a,c))||d.call(a,b)}function $f(){this.$get=function(){return Q(V,{hasClass:function(a,b){a.attr&&(a=a[0]);return Cb(a,b)},addClass:function(a,b){a.attr&&(a=a[0]);return Eb(a,b)},removeClass:function(a,b){a.attr&&(a=a[0]);return Db(a,b)}})}}function Pa(a,b){var d=a&&a.$$hashKey;if(d)return"function"===typeof d&&(d=a.$$hashKey()),d;d=typeof a;return d="function"===d||"object"===d&&null!==a?a.$$hashKey=d+":"+(b||pe)():d+":"+
+a}function md(){this._keys=[];this._values=[];this._lastKey=NaN;this._lastIndex=-1}function nd(a){a=Function.prototype.toString.call(a).replace(mg,"");return a.match(ng)||a.match(og)}function pg(a){return(a=nd(a))?"function("+(a[1]||"").replace(/[\s\r\n]+/," ")+")":"fn"}function hb(a,b){function d(a){return function(b,c){if(E(b))p(b,Wb(a));else return a(b,c)}}function c(a,b){Ia(a,"service");if(B(b)||I(b))b=q.instantiate(b);if(!b.$get)throw Ba("pget",a);return n[a+"Provider"]=b}function e(a,b){return function(){var c=
+z.invoke(b,this);if(w(c))throw Ba("undef",a);return c}}function f(a,b,d){return c(a,{$get:!1!==d?e(a,b):b})}function g(a){ib(w(a)||I(a),"modulesToLoad","not an array");var b=[],c;p(a,function(a){function d(a){var b,c;b=0;for(c=a.length;b<c;b++){var e=a[b],g=q.get(e[0]);g[e[1]].apply(g,e[2])}}if(!m.get(a)){m.set(a,!0);try{D(a)?(c=gc(a),z.modules[a]=c,b=b.concat(g(c.requires)).concat(c._runBlocks),d(c._invokeQueue),d(c._configBlocks)):B(a)?b.push(q.invoke(a)):I(a)?b.push(q.invoke(a)):tb(a,"module")}catch(e){throw I(a)&&
+(a=a[a.length-1]),e.message&&e.stack&&-1===e.stack.indexOf(e.message)&&(e=e.message+"\n"+e.stack),Ba("modulerr",a,e.stack||e.message||e);}}});return b}function k(a,c){function d(b,e){if(a.hasOwnProperty(b)){if(a[b]===h)throw Ba("cdep",b+" <- "+l.join(" <- "));return a[b]}try{return l.unshift(b),a[b]=h,a[b]=c(b,e),a[b]}catch(g){throw a[b]===h&&delete a[b],g;}finally{l.shift()}}function e(a,c,g){var f=[];a=hb.$$annotate(a,b,g);for(var h=0,k=a.length;h<k;h++){var l=a[h];if("string"!==typeof l)throw Ba("itkn",
+l);f.push(c&&c.hasOwnProperty(l)?c[l]:d(l,g))}return f}return{invoke:function(a,b,c,d){"string"===typeof c&&(d=c,c=null);c=e(a,c,d);I(a)&&(a=a[a.length-1]);d=a;if(Ca||"function"!==typeof d)d=!1;else{var g=d.$$ngIsClass;Na(g)||(g=d.$$ngIsClass=/^(?:class\b|constructor\()/.test(Function.prototype.toString.call(d)));d=g}return d?(c.unshift(null),new (Function.prototype.bind.apply(a,c))):a.apply(b,c)},instantiate:function(a,b,c){var d=I(a)?a[a.length-1]:a;a=e(a,b,c);a.unshift(null);return new (Function.prototype.bind.apply(d,
+a))},get:d,annotate:hb.$$annotate,has:function(b){return n.hasOwnProperty(b+"Provider")||a.hasOwnProperty(b)}}}b=!0===b;var h={},l=[],m=new Ib,n={$provide:{provider:d(c),factory:d(f),service:d(function(a,b){return f(a,["$injector",function(a){return a.instantiate(b)}])}),value:d(function(a,b){return f(a,ka(b),!1)}),constant:d(function(a,b){Ia(a,"constant");n[a]=b;G[a]=b}),decorator:function(a,b){var c=q.get(a+"Provider"),d=c.$get;c.$get=function(){var a=z.invoke(d,c);return z.invoke(b,null,{$delegate:a})}}}},
+q=n.$injector=k(n,function(a,b){$.isString(b)&&l.push(b);throw Ba("unpr",l.join(" <- "));}),G={},L=k(G,function(a,b){var c=q.get(a+"Provider",b);return z.invoke(c.$get,c,void 0,a)}),z=L;n.$injectorProvider={$get:ka(L)};z.modules=q.modules=T();var v=g(a),z=L.get("$injector");z.strictDi=b;p(v,function(a){a&&z.invoke(a)});z.loadNewModules=function(a){p(g(a),function(a){a&&z.invoke(a)})};return z}function pf(){var a=!0;this.disableAutoScrolling=function(){a=!1};this.$get=["$window","$location","$rootScope",
+function(b,d,c){function e(a){var b=null;Array.prototype.some.call(a,function(a){if("a"===za(a))return b=a,!0});return b}function f(a){if(a){a.scrollIntoView();var c;c=g.yOffset;B(c)?c=c():Yb(c)?(c=c[0],c="fixed"!==b.getComputedStyle(c).position?0:c.getBoundingClientRect().bottom):Y(c)||(c=0);c&&(a=a.getBoundingClientRect().top,b.scrollBy(0,a-c))}else b.scrollTo(0,0)}function g(a){a=D(a)?a:Y(a)?a.toString():d.hash();var b;a?(b=k.getElementById(a))?f(b):(b=e(k.getElementsByName(a)))?f(b):"top"===a&&
+f(null):f(null)}var k=b.document;a&&c.$watch(function(){return d.hash()},function(a,b){a===b&&""===a||hg(function(){c.$evalAsync(g)})});return g}]}function kb(a,b){if(!a&&!b)return"";if(!a)return b;if(!b)return a;I(a)&&(a=a.join(" "));I(b)&&(b=b.join(" "));return a+" "+b}function qg(a){D(a)&&(a=a.split(" "));var b=T();p(a,function(a){a.length&&(b[a]=!0)});return b}function Ka(a){return E(a)?a:{}}function rg(a,b,d,c){function e(a){try{a.apply(null,ya.call(arguments,1))}finally{if(L--,0===L)for(;z.length;)try{z.pop()()}catch(b){d.error(b)}}}
+function f(){y=null;k()}function g(){v=J();v=w(v)?null:v;sa(v,K)&&(v=K);s=K=v}function k(){var a=s;g();if(Ta!==h.url()||a!==v)Ta=h.url(),s=v,p(H,function(a){a(h.url(),v)})}var h=this,l=a.location,m=a.history,n=a.setTimeout,q=a.clearTimeout,G={};h.isMock=!1;var L=0,z=[];h.$$completeOutstandingRequest=e;h.$$incOutstandingRequestCount=function(){L++};h.notifyWhenNoOutstandingRequests=function(a){0===L?a():z.push(a)};var v,s,Ta=l.href,ma=b.find("base"),y=null,J=c.history?function(){try{return m.state}catch(a){}}:
+C;g();h.url=function(b,d,e){w(e)&&(e=null);l!==a.location&&(l=a.location);m!==a.history&&(m=a.history);if(b){var f=s===e;if(Ta===b&&(!c.history||f))return h;var k=Ta&&La(Ta)===La(b);Ta=b;s=e;!c.history||k&&f?(k||(y=b),d?l.replace(b):k?(d=l,e=b.indexOf("#"),e=-1===e?"":b.substr(e),d.hash=e):l.href=b,l.href!==b&&(y=b)):(m[d?"replaceState":"pushState"](e,"",b),g());y&&(y=b);return h}return y||l.href.replace(/%27/g,"'")};h.state=function(){return v};var H=[],ta=!1,K=null;h.onUrlChange=function(b){if(!ta){if(c.history)A(a).on("popstate",
+f);A(a).on("hashchange",f);ta=!0}H.push(b);return b};h.$$applicationDestroyed=function(){A(a).off("hashchange popstate",f)};h.$$checkUrlChange=k;h.baseHref=function(){var a=ma.attr("href");return a?a.replace(/^(https?:)?\/\/[^/]*/,""):""};h.defer=function(a,b){var c;L++;c=n(function(){delete G[c];e(a)},b||0);G[c]=!0;return c};h.defer.cancel=function(a){return G[a]?(delete G[a],q(a),e(C),!0):!1}}function wf(){this.$get=["$window","$log","$sniffer","$document",function(a,b,d,c){return new rg(a,c,b,
+d)}]}function xf(){this.$get=function(){function a(a,c){function e(a){a!==n&&(q?q===a&&(q=a.n):q=a,f(a.n,a.p),f(a,n),n=a,n.n=null)}function f(a,b){a!==b&&(a&&(a.p=b),b&&(b.n=a))}if(a in b)throw M("$cacheFactory")("iid",a);var g=0,k=Q({},c,{id:a}),h=T(),l=c&&c.capacity||Number.MAX_VALUE,m=T(),n=null,q=null;return b[a]={put:function(a,b){if(!w(b)){if(l<Number.MAX_VALUE){var c=m[a]||(m[a]={key:a});e(c)}a in h||g++;h[a]=b;g>l&&this.remove(q.key);return b}},get:function(a){if(l<Number.MAX_VALUE){var b=
+m[a];if(!b)return;e(b)}return h[a]},remove:function(a){if(l<Number.MAX_VALUE){var b=m[a];if(!b)return;b===n&&(n=b.p);b===q&&(q=b.n);f(b.n,b.p);delete m[a]}a in h&&(delete h[a],g--)},removeAll:function(){h=T();g=0;m=T();n=q=null},destroy:function(){m=k=h=null;delete b[a]},info:function(){return Q({},k,{size:g})}}}var b={};a.info=function(){var a={};p(b,function(b,e){a[e]=b.info()});return a};a.get=function(a){return b[a]};return a}}function Uf(){this.$get=["$cacheFactory",function(a){return a("templates")}]}
+function Yc(a,b){function d(a,b,c){var d=/^\s*([@&<]|=(\*?))(\??)\s*([\w$]*)\s*$/,e=T();p(a,function(a,g){if(a in n)e[g]=n[a];else{var f=a.match(d);if(!f)throw ba("iscp",b,g,a,c?"controller bindings definition":"isolate scope definition");e[g]={mode:f[1][0],collection:"*"===f[2],optional:"?"===f[3],attrName:f[4]||g};f[4]&&(n[a]=e[g])}});return e}function c(a){var b=a.charAt(0);if(!b||b!==N(b))throw ba("baddir",a);if(a!==a.trim())throw ba("baddir",a);}function e(a){var b=a.require||a.controller&&a.name;
+!I(b)&&E(b)&&p(b,function(a,c){var d=a.match(l);a.substring(d[0].length)||(b[c]=d[0]+c)});return b}var f={},g=/^\s*directive:\s*([\w-]+)\s+(.*)$/,k=/(([\w-]+)(?::([^;]+))?;?)/,h=te("ngSrc,ngSrcset,src,srcset"),l=/^(?:(\^\^?)?(\?)?(\^\^?)?)?/,m=/^(on[a-z]+|formaction)$/,n=T();this.directive=function ma(b,d){ib(b,"name");Ia(b,"directive");D(b)?(c(b),ib(d,"directiveFactory"),f.hasOwnProperty(b)||(f[b]=[],a.factory(b+"Directive",["$injector","$exceptionHandler",function(a,c){var d=[];p(f[b],function(g,
+f){try{var h=a.invoke(g);B(h)?h={compile:ka(h)}:!h.compile&&h.link&&(h.compile=ka(h.link));h.priority=h.priority||0;h.index=f;h.name=h.name||b;h.require=e(h);var k=h,l=h.restrict;if(l&&(!D(l)||!/[EACM]/.test(l)))throw ba("badrestrict",l,b);k.restrict=l||"EA";h.$$moduleName=g.$$moduleName;d.push(h)}catch(m){c(m)}});return d}])),f[b].push(d)):p(b,Wb(ma));return this};this.component=function y(a,b){function c(a){function e(b){return B(b)||I(b)?function(c,d){return a.invoke(b,this,{$element:c,$attrs:d})}:
+b}var g=b.template||b.templateUrl?b.template:"",f={controller:d,controllerAs:sg(b.controller)||b.controllerAs||"$ctrl",template:e(g),templateUrl:e(b.templateUrl),transclude:b.transclude,scope:{},bindToController:b.bindings||{},restrict:"E",require:b.require};p(b,function(a,b){"$"===b.charAt(0)&&(f[b]=a)});return f}if(!D(a))return p(a,Wb(Ra(this,y))),this;var d=b.controller||function(){};p(b,function(a,b){"$"===b.charAt(0)&&(c[b]=a,B(d)&&(d[b]=a))});c.$inject=["$injector"];return this.directive(a,
+c)};this.aHrefSanitizationWhitelist=function(a){return t(a)?(b.aHrefSanitizationWhitelist(a),this):b.aHrefSanitizationWhitelist()};this.imgSrcSanitizationWhitelist=function(a){return t(a)?(b.imgSrcSanitizationWhitelist(a),this):b.imgSrcSanitizationWhitelist()};var q=!0;this.debugInfoEnabled=function(a){return t(a)?(q=a,this):q};var G=!1;this.preAssignBindingsEnabled=function(a){return t(a)?(G=a,this):G};var L=!1;this.strictComponentBindingsEnabled=function(a){return t(a)?(L=a,this):L};var z=10;this.onChangesTtl=
+function(a){return arguments.length?(z=a,this):z};var v=!0;this.commentDirectivesEnabled=function(a){return arguments.length?(v=a,this):v};var s=!0;this.cssClassDirectivesEnabled=function(a){return arguments.length?(s=a,this):s};this.$get=["$injector","$interpolate","$exceptionHandler","$templateRequest","$parse","$controller","$rootScope","$sce","$animate","$$sanitizeUri",function(a,b,c,e,n,F,S,x,O,r){function P(){try{if(!--Fa)throw ga=void 0,ba("infchng",z);S.$apply(function(){for(var a=[],b=0,
+c=ga.length;b<c;++b)try{ga[b]()}catch(d){a.push(d)}ga=void 0;if(a.length)throw a;})}finally{Fa++}}function oc(a,b){if(b){var c=Object.keys(b),d,e,g;d=0;for(e=c.length;d<e;d++)g=c[d],this[g]=b[g]}else this.$attr={};this.$$element=a}function Ua(a,b,c){Ba.innerHTML="<span "+b+">";b=Ba.firstChild.attributes;var d=b[0];b.removeNamedItem(d.name);d.value=c;a.attributes.setNamedItem(d)}function na(a,b){try{a.addClass(b)}catch(c){}}function ca(a,b,c,d,e){a instanceof A||(a=A(a));var g=Va(a,b,a,c,d,e);ca.$$addScopeClass(a);
+var f=null;return function(b,c,d){if(!a)throw ba("multilink");ib(b,"scope");e&&e.needsNewScope&&(b=b.$parent.$new());d=d||{};var h=d.parentBoundTranscludeFn,k=d.transcludeControllers;d=d.futureParentElement;h&&h.$$boundTransclude&&(h=h.$$boundTransclude);f||(f=(d=d&&d[0])?"foreignobject"!==za(d)&&ha.call(d).match(/SVG/)?"svg":"html":"html");d="html"!==f?A(ja(f,A("<div>").append(a).html())):c?Sa.clone.call(a):a;if(k)for(var l in k)d.data("$"+l+"Controller",k[l].instance);ca.$$addScopeInfo(d,b);c&&
+c(d,b);g&&g(b,d,d,h);c||(a=g=null);return d}}function Va(a,b,c,d,e,g){function f(a,c,d,e){var g,k,l,m,q,n,H;if(s)for(H=Array(c.length),m=0;m<h.length;m+=3)g=h[m],H[g]=c[g];else H=c;m=0;for(q=h.length;m<q;)k=H[h[m++]],c=h[m++],g=h[m++],c?(c.scope?(l=a.$new(),ca.$$addScopeInfo(A(k),l)):l=a,n=c.transcludeOnThisElement?Ma(a,c.transclude,e):!c.templateOnThisElement&&e?e:!e&&b?Ma(a,b):null,c(g,l,k,d,n)):g&&g(a,k.childNodes,void 0,e)}for(var h=[],k=I(a)||a instanceof A,l,m,q,n,s,H=0;H<a.length;H++){l=new oc;
+11===Ca&&Da(a,H,k);m=M(a[H],[],l,0===H?d:void 0,e);(g=m.length?Y(m,a[H],l,b,c,null,[],[],g):null)&&g.scope&&ca.$$addScopeClass(l.$$element);l=g&&g.terminal||!(q=a[H].childNodes)||!q.length?null:Va(q,g?(g.transcludeOnThisElement||!g.templateOnThisElement)&&g.transclude:b);if(g||l)h.push(H,g,l),n=!0,s=s||g;g=null}return n?f:null}function Da(a,b,c){var d=a[b],e=d.parentNode,g;if(d.nodeType===Oa)for(;;){g=e?d.nextSibling:a[b+1];if(!g||g.nodeType!==Oa)break;d.nodeValue+=g.nodeValue;g.parentNode&&g.parentNode.removeChild(g);
+c&&g===a[b+1]&&a.splice(b+1,1)}}function Ma(a,b,c){function d(e,g,f,h,k){e||(e=a.$new(!1,k),e.$$transcluded=!0);return b(e,g,{parentBoundTranscludeFn:c,transcludeControllers:f,futureParentElement:h})}var e=d.$$slots=T(),g;for(g in b.$$slots)e[g]=b.$$slots[g]?Ma(a,b.$$slots[g],c):null;return d}function M(a,b,c,d,e){var g=c.$attr,f;switch(a.nodeType){case 1:f=za(a);U(b,Ea(f),"E",d,e);for(var h,l,m,q,n=a.attributes,s=0,H=n&&n.length;s<H;s++){var J=!1,G=!1;h=n[s];l=h.name;m=h.value;h=Ea(l);(q=Pa.test(h))&&
+(l=l.replace(od,"").substr(8).replace(/_(.)/g,function(a,b){return b.toUpperCase()}));(h=h.match(Qa))&&$(h[1])&&(J=l,G=l.substr(0,l.length-5)+"end",l=l.substr(0,l.length-6));h=Ea(l.toLowerCase());g[h]=l;if(q||!c.hasOwnProperty(h))c[h]=m,kd(a,h)&&(c[h]=!0);xa(a,b,m,h,q);U(b,h,"A",d,e,J,G)}"input"===f&&"hidden"===a.getAttribute("type")&&a.setAttribute("autocomplete","off");if(!La)break;g=a.className;E(g)&&(g=g.animVal);if(D(g)&&""!==g)for(;a=k.exec(g);)h=Ea(a[2]),U(b,h,"C",d,e)&&(c[h]=R(a[3])),g=g.substr(a.index+
+a[0].length);break;case Oa:oa(b,a.nodeValue);break;case 8:if(!Ka)break;pc(a,b,c,d,e)}b.sort(ka);return b}function pc(a,b,c,d,e){try{var f=g.exec(a.nodeValue);if(f){var h=Ea(f[1]);U(b,h,"M",d,e)&&(c[h]=R(f[2]))}}catch(k){}}function pd(a,b,c){var d=[],e=0;if(b&&a.hasAttribute&&a.hasAttribute(b)){do{if(!a)throw ba("uterdir",b,c);1===a.nodeType&&(a.hasAttribute(b)&&e++,a.hasAttribute(c)&&e--);d.push(a);a=a.nextSibling}while(0<e)}else d.push(a);return A(d)}function V(a,b,c){return function(d,e,g,f,h){e=
+pd(e[0],b,c);return a(d,e,g,f,h)}}function W(a,b,c,d,e,g){var f;return a?ca(b,c,d,e,g):function(){f||(f=ca(b,c,d,e,g),b=c=g=null);return f.apply(this,arguments)}}function Y(a,b,d,e,g,f,h,k,l){function m(a,b,c,d){if(a){c&&(a=V(a,c,d));a.require=x.require;a.directiveName=z;if(K===x||x.$$isolateScope)a=ua(a,{isolateScope:!0});h.push(a)}if(b){c&&(b=V(b,c,d));b.require=x.require;b.directiveName=z;if(K===x||x.$$isolateScope)b=ua(b,{isolateScope:!0});k.push(b)}}function q(a,e,g,f,l){function m(a,b,c,d){var e;
+cb(a)||(d=c,c=b,b=a,a=void 0);ta&&(e=L);c||(c=ta?fa.parent():fa);if(d){var g=l.$$slots[d];if(g)return g(a,b,e,c,P);if(w(g))throw ba("noslot",d,Aa(fa));}else return l(a,b,e,c,P)}var n,x,F,y,S,L,O,fa;b===g?(f=d,fa=d.$$element):(fa=A(g),f=new oc(fa,d));S=e;K?y=e.$new(!0):s&&(S=e.$parent);l&&(O=m,O.$$boundTransclude=l,O.isSlotFilled=function(a){return!!l.$$slots[a]});J&&(L=da(fa,f,O,J,y,e,K));K&&(ca.$$addScopeInfo(fa,y,!0,!(v&&(v===K||v===K.$$originalDirective))),ca.$$addScopeClass(fa,!0),y.$$isolateBindings=
+K.$$isolateBindings,x=qa(e,f,y,y.$$isolateBindings,K),x.removeWatches&&y.$on("$destroy",x.removeWatches));for(n in L){x=J[n];F=L[n];var z=x.$$bindings.bindToController;if(G){F.bindingInfo=z?qa(S,f,F.instance,z,x):{};var r=F();r!==F.instance&&(F.instance=r,fa.data("$"+x.name+"Controller",r),F.bindingInfo.removeWatches&&F.bindingInfo.removeWatches(),F.bindingInfo=qa(S,f,F.instance,z,x))}else F.instance=F(),fa.data("$"+x.name+"Controller",F.instance),F.bindingInfo=qa(S,f,F.instance,z,x)}p(J,function(a,
+b){var c=a.require;a.bindToController&&!I(c)&&E(c)&&Q(L[b].instance,X(b,c,fa,L))});p(L,function(a){var b=a.instance;if(B(b.$onChanges))try{b.$onChanges(a.bindingInfo.initialChanges)}catch(d){c(d)}if(B(b.$onInit))try{b.$onInit()}catch(e){c(e)}B(b.$doCheck)&&(S.$watch(function(){b.$doCheck()}),b.$doCheck());B(b.$onDestroy)&&S.$on("$destroy",function(){b.$onDestroy()})});n=0;for(x=h.length;n<x;n++)F=h[n],wa(F,F.isolateScope?y:e,fa,f,F.require&&X(F.directiveName,F.require,fa,L),O);var P=e;K&&(K.template||
+null===K.templateUrl)&&(P=y);a&&a(P,g.childNodes,void 0,l);for(n=k.length-1;0<=n;n--)F=k[n],wa(F,F.isolateScope?y:e,fa,f,F.require&&X(F.directiveName,F.require,fa,L),O);p(L,function(a){a=a.instance;B(a.$postLink)&&a.$postLink()})}l=l||{};for(var n=-Number.MAX_VALUE,s=l.newScopeDirective,J=l.controllerDirectives,K=l.newIsolateScopeDirective,v=l.templateDirective,y=l.nonTlbTranscludeDirective,S=!1,L=!1,ta=l.hasElementTranscludeDirective,F=d.$$element=A(b),x,z,O,r=e,P,t=!1,Jb=!1,u,Da=0,C=a.length;Da<
+C;Da++){x=a[Da];var Ua=x.$$start,D=x.$$end;Ua&&(F=pd(b,Ua,D));O=void 0;if(n>x.priority)break;if(u=x.scope)x.templateUrl||(E(u)?(aa("new/isolated scope",K||s,x,F),K=x):aa("new/isolated scope",K,x,F)),s=s||x;z=x.name;if(!t&&(x.replace&&(x.templateUrl||x.template)||x.transclude&&!x.$$tlb)){for(u=Da+1;t=a[u++];)if(t.transclude&&!t.$$tlb||t.replace&&(t.templateUrl||t.template)){Jb=!0;break}t=!0}!x.templateUrl&&x.controller&&(J=J||T(),aa("'"+z+"' controller",J[z],x,F),J[z]=x);if(u=x.transclude)if(S=!0,
+x.$$tlb||(aa("transclusion",y,x,F),y=x),"element"===u)ta=!0,n=x.priority,O=F,F=d.$$element=A(ca.$$createComment(z,d[z])),b=F[0],la(g,ya.call(O,0),b),O[0].$$parentNode=O[0].parentNode,r=W(Jb,O,e,n,f&&f.name,{nonTlbTranscludeDirective:y});else{var na=T();if(E(u)){O=[];var Va=T(),Ma=T();p(u,function(a,b){var c="?"===a.charAt(0);a=c?a.substring(1):a;Va[a]=b;na[b]=null;Ma[b]=c});p(F.contents(),function(a){var b=Va[Ea(za(a))];b?(Ma[b]=!0,na[b]=na[b]||[],na[b].push(a)):O.push(a)});p(Ma,function(a,b){if(!a)throw ba("reqslot",
+b);});for(var N in na)na[N]&&(na[N]=W(Jb,na[N],e))}else O=A(lc(b)).contents();F.empty();r=W(Jb,O,e,void 0,void 0,{needsNewScope:x.$$isolateScope||x.$$newScope});r.$$slots=na}if(x.template)if(L=!0,aa("template",v,x,F),v=x,u=B(x.template)?x.template(F,d):x.template,u=Ia(u),x.replace){f=x;O=ic.test(u)?qd(ja(x.templateNamespace,R(u))):[];b=O[0];if(1!==O.length||1!==b.nodeType)throw ba("tplrt",z,"");la(g,F,b);C={$attr:{}};u=M(b,[],C);var pc=a.splice(Da+1,a.length-(Da+1));(K||s)&&Z(u,K,s);a=a.concat(u).concat(pc);
+ea(d,C);C=a.length}else F.html(u);if(x.templateUrl)L=!0,aa("template",v,x,F),v=x,x.replace&&(f=x),q=ia(a.splice(Da,a.length-Da),F,d,g,S&&r,h,k,{controllerDirectives:J,newScopeDirective:s!==x&&s,newIsolateScopeDirective:K,templateDirective:v,nonTlbTranscludeDirective:y}),C=a.length;else if(x.compile)try{P=x.compile(F,d,r);var U=x.$$originalDirective||x;B(P)?m(null,Ra(U,P),Ua,D):P&&m(Ra(U,P.pre),Ra(U,P.post),Ua,D)}catch($){c($,Aa(F))}x.terminal&&(q.terminal=!0,n=Math.max(n,x.priority))}q.scope=s&&!0===
+s.scope;q.transcludeOnThisElement=S;q.templateOnThisElement=L;q.transclude=r;l.hasElementTranscludeDirective=ta;return q}function X(a,b,c,d){var e;if(D(b)){var g=b.match(l);b=b.substring(g[0].length);var f=g[1]||g[3],g="?"===g[2];"^^"===f?c=c.parent():e=(e=d&&d[b])&&e.instance;if(!e){var h="$"+b+"Controller";e=f?c.inheritedData(h):c.data(h)}if(!e&&!g)throw ba("ctreq",b,a);}else if(I(b))for(e=[],f=0,g=b.length;f<g;f++)e[f]=X(a,b[f],c,d);else E(b)&&(e={},p(b,function(b,g){e[g]=X(a,b,c,d)}));return e||
+null}function da(a,b,c,d,e,g,f){var h=T(),k;for(k in d){var l=d[k],m={$scope:l===f||l.$$isolateScope?e:g,$element:a,$attrs:b,$transclude:c},n=l.controller;"@"===n&&(n=b[l.name]);m=F(n,m,!0,l.controllerAs);h[l.name]=m;a.data("$"+l.name+"Controller",m.instance)}return h}function Z(a,b,c){for(var d=0,e=a.length;d<e;d++)a[d]=Zb(a[d],{$$isolateScope:b,$$newScope:c})}function U(b,c,e,g,h,k,l){if(c===h)return null;var m=null;if(f.hasOwnProperty(c)){h=a.get(c+"Directive");for(var n=0,q=h.length;n<q;n++)if(c=
+h[n],(w(g)||g>c.priority)&&-1!==c.restrict.indexOf(e)){k&&(c=Zb(c,{$$start:k,$$end:l}));if(!c.$$bindings){var s=m=c,H=c.name,J={isolateScope:null,bindToController:null};E(s.scope)&&(!0===s.bindToController?(J.bindToController=d(s.scope,H,!0),J.isolateScope={}):J.isolateScope=d(s.scope,H,!1));E(s.bindToController)&&(J.bindToController=d(s.bindToController,H,!0));if(J.bindToController&&!s.controller)throw ba("noctrl",H);m=m.$$bindings=J;E(m.isolateScope)&&(c.$$isolateBindings=m.isolateScope)}b.push(c);
+m=c}}return m}function $(b){if(f.hasOwnProperty(b))for(var c=a.get(b+"Directive"),d=0,e=c.length;d<e;d++)if(b=c[d],b.multiElement)return!0;return!1}function ea(a,b){var c=b.$attr,d=a.$attr;p(a,function(d,e){"$"!==e.charAt(0)&&(b[e]&&b[e]!==d&&(d=d.length?d+(("style"===e?";":" ")+b[e]):b[e]),a.$set(e,d,!0,c[e]))});p(b,function(b,e){a.hasOwnProperty(e)||"$"===e.charAt(0)||(a[e]=b,"class"!==e&&"style"!==e&&(d[e]=c[e]))})}function ia(a,b,d,g,f,h,k,l){var m=[],n,q,s=b[0],J=a.shift(),x=Zb(J,{templateUrl:null,
+transclude:null,replace:null,$$originalDirective:J}),G=B(J.templateUrl)?J.templateUrl(b,d):J.templateUrl,F=J.templateNamespace;b.empty();e(G).then(function(c){var e,H;c=Ia(c);if(J.replace){c=ic.test(c)?qd(ja(F,R(c))):[];e=c[0];if(1!==c.length||1!==e.nodeType)throw ba("tplrt",J.name,G);c={$attr:{}};la(g,b,e);var K=M(e,[],c);E(J.scope)&&Z(K,!0);a=K.concat(a);ea(d,c)}else e=s,b.html(c);a.unshift(x);n=Y(a,e,d,f,b,J,h,k,l);p(g,function(a,c){a===e&&(g[c]=b[0])});for(q=Va(b[0].childNodes,f);m.length;){c=
+m.shift();H=m.shift();var v=m.shift(),y=m.shift(),K=b[0];if(!c.$$destroyed){if(H!==s){var L=H.className;l.hasElementTranscludeDirective&&J.replace||(K=lc(e));la(v,A(H),K);na(A(K),L)}H=n.transcludeOnThisElement?Ma(c,n.transclude,y):y;n(q,c,K,g,H)}}m=null}).catch(function(a){ac(a)&&c(a)});return function(a,b,c,d,e){a=e;b.$$destroyed||(m?m.push(b,c,d,a):(n.transcludeOnThisElement&&(a=Ma(b,n.transclude,e)),n(q,b,c,d,a)))}}function ka(a,b){var c=b.priority-a.priority;return 0!==c?c:a.name!==b.name?a.name<
+b.name?-1:1:a.index-b.index}function aa(a,b,c,d){function e(a){return a?" (module: "+a+")":""}if(b)throw ba("multidir",b.name,e(b.$$moduleName),c.name,e(c.$$moduleName),a,Aa(d));}function oa(a,c){var d=b(c,!0);d&&a.push({priority:0,compile:function(a){a=a.parent();var b=!!a.length;b&&ca.$$addBindingClass(a);return function(a,c){var e=c.parent();b||ca.$$addBindingClass(e);ca.$$addBindingInfo(e,d.expressions);a.$watch(d,function(a){c[0].nodeValue=a})}}})}function ja(a,b){a=N(a||"html");switch(a){case "svg":case "math":var c=
+u.document.createElement("div");c.innerHTML="<"+a+">"+b+"</"+a+">";return c.childNodes[0].childNodes;default:return b}}function va(a,b){if("srcdoc"===b)return x.HTML;var c=za(a);if("src"===b||"ngSrc"===b){if(-1===["img","video","audio","source","track"].indexOf(c))return x.RESOURCE_URL}else if("xlinkHref"===b||"form"===c&&"action"===b||"link"===c&&"href"===b)return x.RESOURCE_URL}function xa(a,c,d,e,g){var f=va(a,e),k=h[e]||g,l=b(d,!g,f,k);if(l){if("multiple"===e&&"select"===za(a))throw ba("selmulti",
+Aa(a));if(m.test(e))throw ba("nodomevents");c.push({priority:100,compile:function(){return{pre:function(a,c,g){c=g.$$observers||(g.$$observers=T());var h=g[e];h!==d&&(l=h&&b(h,!0,f,k),d=h);l&&(g[e]=l(a),(c[e]||(c[e]=[])).$$inter=!0,(g.$$observers&&g.$$observers[e].$$scope||a).$watch(l,function(a,b){"class"===e&&a!==b?g.$updateClass(a,b):g.$set(e,a)}))}}}})}}function la(a,b,c){var d=b[0],e=b.length,g=d.parentNode,f,h;if(a)for(f=0,h=a.length;f<h;f++)if(a[f]===d){a[f++]=c;h=f+e-1;for(var k=a.length;f<
+k;f++,h++)h<k?a[f]=a[h]:delete a[f];a.length-=e-1;a.context===d&&(a.context=c);break}g&&g.replaceChild(c,d);a=u.document.createDocumentFragment();for(f=0;f<e;f++)a.appendChild(b[f]);A.hasData(d)&&(A.data(c,A.data(d)),A(d).off("$destroy"));A.cleanData(a.querySelectorAll("*"));for(f=1;f<e;f++)delete b[f];b[0]=c;b.length=1}function ua(a,b){return Q(function(){return a.apply(null,arguments)},a,b)}function wa(a,b,d,e,g,f){try{a(b,d,e,g,f)}catch(h){c(h,Aa(d))}}function pa(a,b){if(L)throw ba("missingattr",
+a,b);}function qa(a,c,d,e,g){function f(b,c,e){B(d.$onChanges)&&!bc(c,e)&&(ga||(a.$$postDigest(P),ga=[]),m||(m={},ga.push(h)),m[b]&&(e=m[b].previousValue),m[b]=new Kb(e,c))}function h(){d.$onChanges(m);m=void 0}var k=[],l={},m;p(e,function(e,h){var m=e.attrName,q=e.optional,s,H,x,G;switch(e.mode){case "@":q||ra.call(c,m)||(pa(m,g.name),d[h]=c[m]=void 0);q=c.$observe(m,function(a){if(D(a)||Na(a))f(h,a,d[h]),d[h]=a});c.$$observers[m].$$scope=a;s=c[m];D(s)?d[h]=b(s)(a):Na(s)&&(d[h]=s);l[h]=new Kb(qc,
+d[h]);k.push(q);break;case "=":if(!ra.call(c,m)){if(q)break;pa(m,g.name);c[m]=void 0}if(q&&!c[m])break;H=n(c[m]);G=H.literal?sa:bc;x=H.assign||function(){s=d[h]=H(a);throw ba("nonassign",c[m],m,g.name);};s=d[h]=H(a);q=function(b){G(b,d[h])||(G(b,s)?x(a,b=d[h]):d[h]=b);return s=b};q.$stateful=!0;q=e.collection?a.$watchCollection(c[m],q):a.$watch(n(c[m],q),null,H.literal);k.push(q);break;case "<":if(!ra.call(c,m)){if(q)break;pa(m,g.name);c[m]=void 0}if(q&&!c[m])break;H=n(c[m]);var F=H.literal,v=d[h]=
+H(a);l[h]=new Kb(qc,d[h]);q=a.$watch(H,function(a,b){if(b===a){if(b===v||F&&sa(b,v))return;b=v}f(h,a,b);d[h]=a},F);k.push(q);break;case "&":q||ra.call(c,m)||pa(m,g.name);H=c.hasOwnProperty(m)?n(c[m]):C;if(H===C&&q)break;d[h]=function(b){return H(a,b)}}});return{initialChanges:l,removeWatches:k.length&&function(){for(var a=0,b=k.length;a<b;++a)k[a]()}}}var Ja=/^\w/,Ba=u.document.createElement("div"),Ka=v,La=s,Fa=z,ga;oc.prototype={$normalize:Ea,$addClass:function(a){a&&0<a.length&&O.addClass(this.$$element,
+a)},$removeClass:function(a){a&&0<a.length&&O.removeClass(this.$$element,a)},$updateClass:function(a,b){var c=rd(a,b);c&&c.length&&O.addClass(this.$$element,c);(c=rd(b,a))&&c.length&&O.removeClass(this.$$element,c)},$set:function(a,b,d,e){var g=kd(this.$$element[0],a),f=sd[a],h=a;g?(this.$$element.prop(a,b),e=g):f&&(this[f]=b,h=f);this[a]=b;e?this.$attr[a]=e:(e=this.$attr[a])||(this.$attr[a]=e=Vc(a,"-"));g=za(this.$$element);if("a"===g&&("href"===a||"xlinkHref"===a)||"img"===g&&"src"===a)this[a]=
+b=r(b,"src"===a);else if("img"===g&&"srcset"===a&&t(b)){for(var g="",f=R(b),k=/(\s+\d+x\s*,|\s+\d+w\s*,|\s+,|,\s+)/,k=/\s/.test(f)?k:/(,)/,f=f.split(k),k=Math.floor(f.length/2),l=0;l<k;l++)var m=2*l,g=g+r(R(f[m]),!0),g=g+(" "+R(f[m+1]));f=R(f[2*l]).split(/\s/);g+=r(R(f[0]),!0);2===f.length&&(g+=" "+R(f[1]));this[a]=b=g}!1!==d&&(null===b||w(b)?this.$$element.removeAttr(e):Ja.test(e)?this.$$element.attr(e,b):Ua(this.$$element[0],e,b));(a=this.$$observers)&&p(a[h],function(a){try{a(b)}catch(d){c(d)}})},
+$observe:function(a,b){var c=this,d=c.$$observers||(c.$$observers=T()),e=d[a]||(d[a]=[]);e.push(b);S.$evalAsync(function(){e.$$inter||!c.hasOwnProperty(a)||w(c[a])||b(c[a])});return function(){db(e,b)}}};var Ga=b.startSymbol(),Ha=b.endSymbol(),Ia="{{"===Ga&&"}}"===Ha?bb:function(a){return a.replace(/\{\{/g,Ga).replace(/}}/g,Ha)},Pa=/^ngAttr[A-Z]/,Qa=/^(.+)Start$/;ca.$$addBindingInfo=q?function(a,b){var c=a.data("$binding")||[];I(b)?c=c.concat(b):c.push(b);a.data("$binding",c)}:C;ca.$$addBindingClass=
+q?function(a){na(a,"ng-binding")}:C;ca.$$addScopeInfo=q?function(a,b,c,d){a.data(c?d?"$isolateScopeNoTemplate":"$isolateScope":"$scope",b)}:C;ca.$$addScopeClass=q?function(a,b){na(a,b?"ng-isolate-scope":"ng-scope")}:C;ca.$$createComment=function(a,b){var c="";q&&(c=" "+(a||"")+": ",b&&(c+=b+" "));return u.document.createComment(c)};return ca}]}function Kb(a,b){this.previousValue=a;this.currentValue=b}function Ea(a){return a.replace(od,"").replace(tg,function(a,d,c){return c?d.toUpperCase():d})}function rd(a,
+b){var d="",c=a.split(/\s+/),e=b.split(/\s+/),f=0;a:for(;f<c.length;f++){for(var g=c[f],k=0;k<e.length;k++)if(g===e[k])continue a;d+=(0<d.length?" ":"")+g}return d}function qd(a){a=A(a);var b=a.length;if(1>=b)return a;for(;b--;){var d=a[b];(8===d.nodeType||d.nodeType===Oa&&""===d.nodeValue.trim())&&ug.call(a,b,1)}return a}function sg(a,b){if(b&&D(b))return b;if(D(a)){var d=td.exec(a);if(d)return d[3]}}function yf(){var a={},b=!1;this.has=function(b){return a.hasOwnProperty(b)};this.register=function(b,
+c){Ia(b,"controller");E(b)?Q(a,b):a[b]=c};this.allowGlobals=function(){b=!0};this.$get=["$injector","$window",function(d,c){function e(a,b,c,d){if(!a||!E(a.$scope))throw M("$controller")("noscp",d,b);a.$scope[b]=c}return function(f,g,k,h){var l,m,n;k=!0===k;h&&D(h)&&(n=h);if(D(f)){h=f.match(td);if(!h)throw ud("ctrlfmt",f);m=h[1];n=n||h[3];f=a.hasOwnProperty(m)?a[m]:Xc(g.$scope,m,!0)||(b?Xc(c,m,!0):void 0);if(!f)throw ud("ctrlreg",m);tb(f,m,!0)}if(k)return k=(I(f)?f[f.length-1]:f).prototype,l=Object.create(k||
+null),n&&e(g,n,l,m||f.name),Q(function(){var a=d.invoke(f,l,g,m);a!==l&&(E(a)||B(a))&&(l=a,n&&e(g,n,l,m||f.name));return l},{instance:l,identifier:n});l=d.instantiate(f,g,m);n&&e(g,n,l,m||f.name);return l}}]}function zf(){this.$get=["$window",function(a){return A(a.document)}]}function Af(){this.$get=["$document","$rootScope",function(a,b){function d(){e=c.hidden}var c=a[0],e=c&&c.hidden;a.on("visibilitychange",d);b.$on("$destroy",function(){a.off("visibilitychange",d)});return function(){return e}}]}
+function Bf(){this.$get=["$log",function(a){return function(b,d){a.error.apply(a,arguments)}}]}function rc(a){return E(a)?ea(a)?a.toISOString():fb(a):a}function Gf(){this.$get=function(){return function(a){if(!a)return"";var b=[];Oc(a,function(a,c){null===a||w(a)||B(a)||(I(a)?p(a,function(a){b.push(ia(c)+"="+ia(rc(a)))}):b.push(ia(c)+"="+ia(rc(a))))});return b.join("&")}}}function Hf(){this.$get=function(){return function(a){function b(a,e,f){null===a||w(a)||(I(a)?p(a,function(a,c){b(a,e+"["+(E(a)?
+c:"")+"]")}):E(a)&&!ea(a)?Oc(a,function(a,c){b(a,e+(f?"":"[")+c+(f?"":"]"))}):d.push(ia(e)+"="+ia(rc(a))))}if(!a)return"";var d=[];b(a,"",!0);return d.join("&")}}}function sc(a,b){if(D(a)){var d=a.replace(vg,"").trim();if(d){var c=b("Content-Type"),c=c&&0===c.indexOf(vd),e;(e=c)||(e=(e=d.match(wg))&&xg[e[0]].test(d));if(e)try{a=Rc(d)}catch(f){if(!c)return a;throw Lb("baddata",a,f);}}}return a}function wd(a){var b=T(),d;D(a)?p(a.split("\n"),function(a){d=a.indexOf(":");var e=N(R(a.substr(0,d)));a=
+R(a.substr(d+1));e&&(b[e]=b[e]?b[e]+", "+a:a)}):E(a)&&p(a,function(a,d){var f=N(d),g=R(a);f&&(b[f]=b[f]?b[f]+", "+g:g)});return b}function xd(a){var b;return function(d){b||(b=wd(a));return d?(d=b[N(d)],void 0===d&&(d=null),d):b}}function yd(a,b,d,c){if(B(c))return c(a,b,d);p(c,function(c){a=c(a,b,d)});return a}function Ff(){var a=this.defaults={transformResponse:[sc],transformRequest:[function(a){return E(a)&&"[object File]"!==ha.call(a)&&"[object Blob]"!==ha.call(a)&&"[object FormData]"!==ha.call(a)?
+fb(a):a}],headers:{common:{Accept:"application/json, text/plain, */*"},post:ja(tc),put:ja(tc),patch:ja(tc)},xsrfCookieName:"XSRF-TOKEN",xsrfHeaderName:"X-XSRF-TOKEN",paramSerializer:"$httpParamSerializer",jsonpCallbackParam:"callback"},b=!1;this.useApplyAsync=function(a){return t(a)?(b=!!a,this):b};var d=this.interceptors=[];this.$get=["$browser","$httpBackend","$$cookieReader","$cacheFactory","$rootScope","$q","$injector","$sce",function(c,e,f,g,k,h,l,m){function n(b){function d(a,b){for(var c=0,
+e=b.length;c<e;){var g=b[c++],f=b[c++];a=a.then(g,f)}b.length=0;return a}function e(a,b){var c,d={};p(a,function(a,e){B(a)?(c=a(b),null!=c&&(d[e]=c)):d[e]=a});return d}function g(a){var b=Q({},a);b.data=yd(a.data,a.headers,a.status,f.transformResponse);a=a.status;return 200<=a&&300>a?b:h.reject(b)}if(!E(b))throw M("$http")("badreq",b);if(!D(m.valueOf(b.url)))throw M("$http")("badreq",b.url);var f=Q({method:"get",transformRequest:a.transformRequest,transformResponse:a.transformResponse,paramSerializer:a.paramSerializer,
+jsonpCallbackParam:a.jsonpCallbackParam},b);f.headers=function(b){var c=a.headers,d=Q({},b.headers),g,f,h,c=Q({},c.common,c[N(b.method)]);a:for(g in c){f=N(g);for(h in d)if(N(h)===f)continue a;d[g]=c[g]}return e(d,ja(b))}(b);f.method=vb(f.method);f.paramSerializer=D(f.paramSerializer)?l.get(f.paramSerializer):f.paramSerializer;c.$$incOutstandingRequestCount();var k=[],n=[];b=h.resolve(f);p(v,function(a){(a.request||a.requestError)&&k.unshift(a.request,a.requestError);(a.response||a.responseError)&&
+n.push(a.response,a.responseError)});b=d(b,k);b=b.then(function(b){var c=b.headers,d=yd(b.data,xd(c),void 0,b.transformRequest);w(d)&&p(c,function(a,b){"content-type"===N(b)&&delete c[b]});w(b.withCredentials)&&!w(a.withCredentials)&&(b.withCredentials=a.withCredentials);return q(b,d).then(g,g)});b=d(b,n);return b=b.finally(function(){c.$$completeOutstandingRequest(C)})}function q(c,d){function g(a){if(a){var c={};p(a,function(a,d){c[d]=function(c){function d(){a(c)}b?k.$applyAsync(d):k.$$phase?d():
+k.$apply(d)}});return c}}function l(a,c,d,e,g){function f(){q(c,a,d,e,g)}S&&(200<=a&&300>a?S.put(P,[a,c,wd(d),e,g]):S.remove(P));b?k.$applyAsync(f):(f(),k.$$phase||k.$apply())}function q(a,b,d,e,g){b=-1<=b?b:0;(200<=b&&300>b?K.resolve:K.reject)({data:a,status:b,headers:xd(d),config:c,statusText:e,xhrStatus:g})}function H(a){q(a.data,a.status,ja(a.headers()),a.statusText,a.xhrStatus)}function v(){var a=n.pendingRequests.indexOf(c);-1!==a&&n.pendingRequests.splice(a,1)}var K=h.defer(),F=K.promise,S,
+x,O=c.headers,r="jsonp"===N(c.method),P=c.url;r?P=m.getTrustedResourceUrl(P):D(P)||(P=m.valueOf(P));P=G(P,c.paramSerializer(c.params));r&&(P=L(P,c.jsonpCallbackParam));n.pendingRequests.push(c);F.then(v,v);!c.cache&&!a.cache||!1===c.cache||"GET"!==c.method&&"JSONP"!==c.method||(S=E(c.cache)?c.cache:E(a.cache)?a.cache:z);S&&(x=S.get(P),t(x)?x&&B(x.then)?x.then(H,H):I(x)?q(x[1],x[0],ja(x[2]),x[3],x[4]):q(x,200,{},"OK","complete"):S.put(P,F));w(x)&&((x=zd(c.url)?f()[c.xsrfCookieName||a.xsrfCookieName]:
+void 0)&&(O[c.xsrfHeaderName||a.xsrfHeaderName]=x),e(c.method,P,d,l,O,c.timeout,c.withCredentials,c.responseType,g(c.eventHandlers),g(c.uploadEventHandlers)));return F}function G(a,b){0<b.length&&(a+=(-1===a.indexOf("?")?"?":"&")+b);return a}function L(a,b){var c=a.split("?");if(2<c.length)throw Lb("badjsonp",a);c=dc(c[1]);p(c,function(c,d){if("JSON_CALLBACK"===c)throw Lb("badjsonp",a);if(d===b)throw Lb("badjsonp",b,a);});return a+=(-1===a.indexOf("?")?"?":"&")+b+"=JSON_CALLBACK"}var z=g("$http");
+a.paramSerializer=D(a.paramSerializer)?l.get(a.paramSerializer):a.paramSerializer;var v=[];p(d,function(a){v.unshift(D(a)?l.get(a):l.invoke(a))});n.pendingRequests=[];(function(a){p(arguments,function(a){n[a]=function(b,c){return n(Q({},c||{},{method:a,url:b}))}})})("get","delete","head","jsonp");(function(a){p(arguments,function(a){n[a]=function(b,c,d){return n(Q({},d||{},{method:a,url:b,data:c}))}})})("post","put","patch");n.defaults=a;return n}]}function Jf(){this.$get=function(){return function(){return new u.XMLHttpRequest}}}
+function If(){this.$get=["$browser","$jsonpCallbacks","$document","$xhrFactory",function(a,b,d,c){return yg(a,c,a.defer,b,d[0])}]}function yg(a,b,d,c,e){function f(a,b,d){a=a.replace("JSON_CALLBACK",b);var f=e.createElement("script"),m=null;f.type="text/javascript";f.src=a;f.async=!0;m=function(a){f.removeEventListener("load",m);f.removeEventListener("error",m);e.body.removeChild(f);f=null;var g=-1,G="unknown";a&&("load"!==a.type||c.wasCalled(b)||(a={type:"error"}),G=a.type,g="error"===a.type?404:
+200);d&&d(g,G)};f.addEventListener("load",m);f.addEventListener("error",m);e.body.appendChild(f);return m}return function(e,k,h,l,m,n,q,G,L,z){function v(){ma&&ma();y&&y.abort()}function s(a,b,c,e,g,f){t(H)&&d.cancel(H);ma=y=null;a(b,c,e,g,f)}k=k||a.url();if("jsonp"===N(e))var r=c.createCallback(k),ma=f(k,r,function(a,b){var d=200===a&&c.getResponse(r);s(l,a,d,"",b,"complete");c.removeCallback(r)});else{var y=b(e,k);y.open(e,k,!0);p(m,function(a,b){t(a)&&y.setRequestHeader(b,a)});y.onload=function(){var a=
+y.statusText||"",b="response"in y?y.response:y.responseText,c=1223===y.status?204:y.status;0===c&&(c=b?200:"file"===ua(k).protocol?404:0);s(l,c,b,y.getAllResponseHeaders(),a,"complete")};y.onerror=function(){s(l,-1,null,null,"","error")};y.onabort=function(){s(l,-1,null,null,"","abort")};y.ontimeout=function(){s(l,-1,null,null,"","timeout")};p(L,function(a,b){y.addEventListener(b,a)});p(z,function(a,b){y.upload.addEventListener(b,a)});q&&(y.withCredentials=!0);if(G)try{y.responseType=G}catch(J){if("json"!==
+G)throw J;}y.send(w(h)?null:h)}if(0<n)var H=d(v,n);else n&&B(n.then)&&n.then(v)}}function Df(){var a="{{",b="}}";this.startSymbol=function(b){return b?(a=b,this):a};this.endSymbol=function(a){return a?(b=a,this):b};this.$get=["$parse","$exceptionHandler","$sce",function(d,c,e){function f(a){return"\\\\\\"+a}function g(c){return c.replace(n,a).replace(q,b)}function k(a,b,c,d){var e=a.$watch(function(a){e();return d(a)},b,c);return e}function h(f,h,q,n){function s(a){try{var b=a;a=q?e.getTrusted(q,
+b):e.valueOf(b);return n&&!t(a)?a:fc(a)}catch(d){c(Fa.interr(f,d))}}if(!f.length||-1===f.indexOf(a)){var p;h||(h=g(f),p=ka(h),p.exp=f,p.expressions=[],p.$$watchDelegate=k);return p}n=!!n;var r,y,J=0,H=[],ta=[];p=f.length;for(var K=[],F=[];J<p;)if(-1!==(r=f.indexOf(a,J))&&-1!==(y=f.indexOf(b,r+l)))J!==r&&K.push(g(f.substring(J,r))),J=f.substring(r+l,y),H.push(J),ta.push(d(J,s)),J=y+m,F.push(K.length),K.push("");else{J!==p&&K.push(g(f.substring(J)));break}q&&1<K.length&&Fa.throwNoconcat(f);if(!h||H.length){var S=
+function(a){for(var b=0,c=H.length;b<c;b++){if(n&&w(a[b]))return;K[F[b]]=a[b]}return K.join("")};return Q(function(a){var b=0,d=H.length,e=Array(d);try{for(;b<d;b++)e[b]=ta[b](a);return S(e)}catch(g){c(Fa.interr(f,g))}},{exp:f,expressions:H,$$watchDelegate:function(a,b){var c;return a.$watchGroup(ta,function(d,e){var g=S(d);B(b)&&b.call(this,g,d!==e?c:g,a);c=g})}})}}var l=a.length,m=b.length,n=new RegExp(a.replace(/./g,f),"g"),q=new RegExp(b.replace(/./g,f),"g");h.startSymbol=function(){return a};
+h.endSymbol=function(){return b};return h}]}function Ef(){this.$get=["$rootScope","$window","$q","$$q","$browser",function(a,b,d,c,e){function f(f,h,l,m){function n(){q?f.apply(null,G):f(v)}var q=4<arguments.length,G=q?ya.call(arguments,4):[],p=b.setInterval,z=b.clearInterval,v=0,s=t(m)&&!m,r=(s?c:d).defer(),ma=r.promise;l=t(l)?l:0;ma.$$intervalId=p(function(){s?e.defer(n):a.$evalAsync(n);r.notify(v++);0<l&&v>=l&&(r.resolve(v),z(ma.$$intervalId),delete g[ma.$$intervalId]);s||a.$apply()},h);g[ma.$$intervalId]=
+r;return ma}var g={};f.cancel=function(a){return a&&a.$$intervalId in g?(g[a.$$intervalId].promise.$$state.pur=!0,g[a.$$intervalId].reject("canceled"),b.clearInterval(a.$$intervalId),delete g[a.$$intervalId],!0):!1};return f}]}function uc(a){a=a.split("/");for(var b=a.length;b--;)a[b]=gb(a[b].replace(/%2F/g,"/"));return a.join("/")}function Ad(a,b){var d=ua(a);b.$$protocol=d.protocol;b.$$host=d.hostname;b.$$port=Z(d.port)||zg[d.protocol]||null}function Bd(a,b,d){if(Ag.test(a))throw lb("badpath",a);
+var c="/"!==a.charAt(0);c&&(a="/"+a);a=ua(a);for(var c=(c&&"/"===a.pathname.charAt(0)?a.pathname.substring(1):a.pathname).split("/"),e=c.length;e--;)c[e]=decodeURIComponent(c[e]),d&&(c[e]=c[e].replace(/\//g,"%2F"));d=c.join("/");b.$$path=d;b.$$search=dc(a.search);b.$$hash=decodeURIComponent(a.hash);b.$$path&&"/"!==b.$$path.charAt(0)&&(b.$$path="/"+b.$$path)}function vc(a,b){return a.slice(0,b.length)===b}function va(a,b){if(vc(b,a))return b.substr(a.length)}function La(a){var b=a.indexOf("#");return-1===
+b?a:a.substr(0,b)}function mb(a){return a.replace(/(#.+)|#$/,"$1")}function wc(a,b,d){this.$$html5=!0;d=d||"";Ad(a,this);this.$$parse=function(a){var d=va(b,a);if(!D(d))throw lb("ipthprfx",a,b);Bd(d,this,!0);this.$$path||(this.$$path="/");this.$$compose()};this.$$compose=function(){var a=ec(this.$$search),d=this.$$hash?"#"+gb(this.$$hash):"";this.$$url=uc(this.$$path)+(a?"?"+a:"")+d;this.$$absUrl=b+this.$$url.substr(1);this.$$urlUpdatedByLocation=!0};this.$$parseLinkUrl=function(c,e){if(e&&"#"===
+e[0])return this.hash(e.slice(1)),!0;var f,g;t(f=va(a,c))?(g=f,g=d&&t(f=va(d,f))?b+(va("/",f)||f):a+g):t(f=va(b,c))?g=b+f:b===c+"/"&&(g=b);g&&this.$$parse(g);return!!g}}function xc(a,b,d){Ad(a,this);this.$$parse=function(c){var e=va(a,c)||va(b,c),f;w(e)||"#"!==e.charAt(0)?this.$$html5?f=e:(f="",w(e)&&(a=c,this.replace())):(f=va(d,e),w(f)&&(f=e));Bd(f,this,!1);c=this.$$path;var e=a,g=/^\/[A-Z]:(\/.*)/;vc(f,e)&&(f=f.replace(e,""));g.exec(f)||(c=(f=g.exec(c))?f[1]:c);this.$$path=c;this.$$compose()};
+this.$$compose=function(){var b=ec(this.$$search),e=this.$$hash?"#"+gb(this.$$hash):"";this.$$url=uc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+(this.$$url?d+this.$$url:"");this.$$urlUpdatedByLocation=!0};this.$$parseLinkUrl=function(b,d){return La(a)===La(b)?(this.$$parse(b),!0):!1}}function Cd(a,b,d){this.$$html5=!0;xc.apply(this,arguments);this.$$parseLinkUrl=function(c,e){if(e&&"#"===e[0])return this.hash(e.slice(1)),!0;var f,g;a===La(c)?f=c:(g=va(b,c))?f=a+d+g:b===c+"/"&&(f=b);f&&this.$$parse(f);
+return!!f};this.$$compose=function(){var b=ec(this.$$search),e=this.$$hash?"#"+gb(this.$$hash):"";this.$$url=uc(this.$$path)+(b?"?"+b:"")+e;this.$$absUrl=a+d+this.$$url;this.$$urlUpdatedByLocation=!0}}function Mb(a){return function(){return this[a]}}function Dd(a,b){return function(d){if(w(d))return this[a];this[a]=b(d);this.$$compose();return this}}function Lf(){var a="!",b={enabled:!1,requireBase:!0,rewriteLinks:!0};this.hashPrefix=function(b){return t(b)?(a=b,this):a};this.html5Mode=function(a){if(Na(a))return b.enabled=
+a,this;if(E(a)){Na(a.enabled)&&(b.enabled=a.enabled);Na(a.requireBase)&&(b.requireBase=a.requireBase);if(Na(a.rewriteLinks)||D(a.rewriteLinks))b.rewriteLinks=a.rewriteLinks;return this}return b};this.$get=["$rootScope","$browser","$sniffer","$rootElement","$window",function(d,c,e,f,g){function k(a,b,d){var e=l.url(),g=l.$$state;try{c.url(a,b,d),l.$$state=c.state()}catch(f){throw l.url(e),l.$$state=g,f;}}function h(a,b){d.$broadcast("$locationChangeSuccess",l.absUrl(),a,l.$$state,b)}var l,m;m=c.baseHref();
+var n=c.url(),q;if(b.enabled){if(!m&&b.requireBase)throw lb("nobase");q=n.substring(0,n.indexOf("/",n.indexOf("//")+2))+(m||"/");m=e.history?wc:Cd}else q=La(n),m=xc;var G=q.substr(0,La(q).lastIndexOf("/")+1);l=new m(q,G,"#"+a);l.$$parseLinkUrl(n,n);l.$$state=c.state();var p=/^\s*(javascript|mailto):/i;f.on("click",function(a){var e=b.rewriteLinks;if(e&&!a.ctrlKey&&!a.metaKey&&!a.shiftKey&&2!==a.which&&2!==a.button){for(var h=A(a.target);"a"!==za(h[0]);)if(h[0]===f[0]||!(h=h.parent())[0])return;if(!D(e)||
+!w(h.attr(e))){var e=h.prop("href"),k=h.attr("href")||h.attr("xlink:href");E(e)&&"[object SVGAnimatedString]"===e.toString()&&(e=ua(e.animVal).href);p.test(e)||!e||h.attr("target")||a.isDefaultPrevented()||!l.$$parseLinkUrl(e,k)||(a.preventDefault(),l.absUrl()!==c.url()&&(d.$apply(),g.angular["ff-684208-preventDefault"]=!0))}}});mb(l.absUrl())!==mb(n)&&c.url(l.absUrl(),!0);var r=!0;c.onUrlChange(function(a,b){vc(a,G)?(d.$evalAsync(function(){var c=l.absUrl(),e=l.$$state,g;a=mb(a);l.$$parse(a);l.$$state=
+b;g=d.$broadcast("$locationChangeStart",a,c,b,e).defaultPrevented;l.absUrl()===a&&(g?(l.$$parse(c),l.$$state=e,k(c,!1,e)):(r=!1,h(c,e)))}),d.$$phase||d.$digest()):g.location.href=a});d.$watch(function(){if(r||l.$$urlUpdatedByLocation){l.$$urlUpdatedByLocation=!1;var a=mb(c.url()),b=mb(l.absUrl()),g=c.state(),f=l.$$replace,m=a!==b||l.$$html5&&e.history&&g!==l.$$state;if(r||m)r=!1,d.$evalAsync(function(){var b=l.absUrl(),c=d.$broadcast("$locationChangeStart",b,a,l.$$state,g).defaultPrevented;l.absUrl()===
+b&&(c?(l.$$parse(a),l.$$state=g):(m&&k(b,f,g===l.$$state?null:l.$$state),h(a,g)))})}l.$$replace=!1});return l}]}function Mf(){var a=!0,b=this;this.debugEnabled=function(b){return t(b)?(a=b,this):a};this.$get=["$window",function(d){function c(a){ac(a)&&(a.stack&&f?a=a.message&&-1===a.stack.indexOf(a.message)?"Error: "+a.message+"\n"+a.stack:a.stack:a.sourceURL&&(a=a.message+"\n"+a.sourceURL+":"+a.line));return a}function e(a){var b=d.console||{},e=b[a]||b.log||C;return function(){var a=[];p(arguments,
+function(b){a.push(c(b))});return Function.prototype.apply.call(e,b,a)}}var f=Ca||/\bEdge\//.test(d.navigator&&d.navigator.userAgent);return{log:e("log"),info:e("info"),warn:e("warn"),error:e("error"),debug:function(){var c=e("debug");return function(){a&&c.apply(b,arguments)}}()}}]}function Bg(a){return a+""}function Cg(a,b){return"undefined"!==typeof a?a:b}function Ed(a,b){return"undefined"===typeof a?b:"undefined"===typeof b?a:a+b}function Dg(a,b){switch(a.type){case r.MemberExpression:if(a.computed)return!1;
+break;case r.UnaryExpression:return 1;case r.BinaryExpression:return"+"!==a.operator?1:!1;case r.CallExpression:return!1}return void 0===b?Fd:b}function W(a,b,d){var c,e,f=a.isPure=Dg(a,d);switch(a.type){case r.Program:c=!0;p(a.body,function(a){W(a.expression,b,f);c=c&&a.expression.constant});a.constant=c;break;case r.Literal:a.constant=!0;a.toWatch=[];break;case r.UnaryExpression:W(a.argument,b,f);a.constant=a.argument.constant;a.toWatch=a.argument.toWatch;break;case r.BinaryExpression:W(a.left,
+b,f);W(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.left.toWatch.concat(a.right.toWatch);break;case r.LogicalExpression:W(a.left,b,f);W(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=a.constant?[]:[a];break;case r.ConditionalExpression:W(a.test,b,f);W(a.alternate,b,f);W(a.consequent,b,f);a.constant=a.test.constant&&a.alternate.constant&&a.consequent.constant;a.toWatch=a.constant?[]:[a];break;case r.Identifier:a.constant=!1;a.toWatch=[a];break;case r.MemberExpression:W(a.object,
+b,f);a.computed&&W(a.property,b,f);a.constant=a.object.constant&&(!a.computed||a.property.constant);a.toWatch=a.constant?[]:[a];break;case r.CallExpression:c=d=a.filter?!b(a.callee.name).$stateful:!1;e=[];p(a.arguments,function(a){W(a,b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c;a.toWatch=d?e:[a];break;case r.AssignmentExpression:W(a.left,b,f);W(a.right,b,f);a.constant=a.left.constant&&a.right.constant;a.toWatch=[a];break;case r.ArrayExpression:c=!0;e=[];p(a.elements,function(a){W(a,
+b,f);c=c&&a.constant;e.push.apply(e,a.toWatch)});a.constant=c;a.toWatch=e;break;case r.ObjectExpression:c=!0;e=[];p(a.properties,function(a){W(a.value,b,f);c=c&&a.value.constant;e.push.apply(e,a.value.toWatch);a.computed&&(W(a.key,b,!1),c=c&&a.key.constant,e.push.apply(e,a.key.toWatch))});a.constant=c;a.toWatch=e;break;case r.ThisExpression:a.constant=!1;a.toWatch=[];break;case r.LocalsExpression:a.constant=!1,a.toWatch=[]}}function Gd(a){if(1===a.length){a=a[0].expression;var b=a.toWatch;return 1!==
+b.length?b:b[0]!==a?b:void 0}}function Hd(a){return a.type===r.Identifier||a.type===r.MemberExpression}function Id(a){if(1===a.body.length&&Hd(a.body[0].expression))return{type:r.AssignmentExpression,left:a.body[0].expression,right:{type:r.NGValueParameter},operator:"="}}function Jd(a){this.$filter=a}function Kd(a){this.$filter=a}function yc(a,b,d){this.ast=new r(a,d);this.astCompiler=d.csp?new Kd(b):new Jd(b)}function zc(a){return B(a.valueOf)?a.valueOf():Eg.call(a)}function Nf(){var a=T(),b={"true":!0,
+"false":!1,"null":null,undefined:void 0},d,c;this.addLiteral=function(a,c){b[a]=c};this.setIdentifierFns=function(a,b){d=a;c=b;return this};this.$get=["$filter",function(e){function f(a,b,c){return null==a||null==b?a===b:"object"!==typeof a||(a=zc(a),"object"!==typeof a||c)?a===b||a!==a&&b!==b:!1}function g(a,b,c,d,e){var g=d.inputs,h;if(1===g.length){var k=f,g=g[0];return a.$watch(function(a){var b=g(a);f(b,k,g.isPure)||(h=d(a,void 0,void 0,[b]),k=b&&zc(b));return h},b,c,e)}for(var l=[],m=[],n=0,
+p=g.length;n<p;n++)l[n]=f,m[n]=null;return a.$watch(function(a){for(var b=!1,c=0,e=g.length;c<e;c++){var k=g[c](a);if(b||(b=!f(k,l[c],g[c].isPure)))m[c]=k,l[c]=k&&zc(k)}b&&(h=d(a,void 0,void 0,m));return h},b,c,e)}function k(a,b,c,d,e){function f(a){return d(a)}function h(a,c,d){l=a;B(b)&&b(a,c,d);t(a)&&d.$$postDigest(function(){t(l)&&k()})}var k,l;return k=d.inputs?g(a,h,c,d,e):a.$watch(f,h,c)}function h(a,b,c,d){function e(a){var b=!0;p(a,function(a){t(a)||(b=!1)});return b}var g,f;return g=a.$watch(function(a){return d(a)},
+function(a,c,d){f=a;B(b)&&b(a,c,d);e(a)&&d.$$postDigest(function(){e(f)&&g()})},c)}function l(a,b,c,d){var e=a.$watch(function(a){e();return d(a)},b,c);return e}function m(a,b){if(!b)return a;var c=a.$$watchDelegate,d=!1,e=c!==h&&c!==k?function(c,e,g,f){g=d&&f?f[0]:a(c,e,g,f);return b(g,c,e)}:function(c,d,e,g){e=a(c,d,e,g);c=b(e,c,d);return t(e)?c:e},d=!a.inputs;c&&c!==g?(e.$$watchDelegate=c,e.inputs=a.inputs):b.$stateful||(e.$$watchDelegate=g,e.inputs=a.inputs?a.inputs:[a]);e.inputs&&(e.inputs=e.inputs.map(function(a){return a.isPure===
+Fd?function(b){return a(b)}:a}));return e}var n={csp:Ja().noUnsafeEval,literals:pa(b),isIdentifierStart:B(d)&&d,isIdentifierContinue:B(c)&&c};return function(b,c){var d,f,p;switch(typeof b){case "string":return p=b=b.trim(),d=a[p],d||(":"===b.charAt(0)&&":"===b.charAt(1)&&(f=!0,b=b.substring(2)),d=new Ac(n),d=(new yc(d,e,n)).parse(b),d.constant?d.$$watchDelegate=l:f?d.$$watchDelegate=d.literal?h:k:d.inputs&&(d.$$watchDelegate=g),a[p]=d),m(d,c);case "function":return m(b,c);default:return m(C,c)}}}]}
+function Pf(){var a=!0;this.$get=["$rootScope","$exceptionHandler",function(b,d){return Ld(function(a){b.$evalAsync(a)},d,a)}];this.errorOnUnhandledRejections=function(b){return t(b)?(a=b,this):a}}function Qf(){var a=!0;this.$get=["$browser","$exceptionHandler",function(b,d){return Ld(function(a){b.defer(a)},d,a)}];this.errorOnUnhandledRejections=function(b){return t(b)?(a=b,this):a}}function Ld(a,b,d){function c(){return new e}function e(){var a=this.promise=new f;this.resolve=function(b){h(a,b)};
+this.reject=function(b){m(a,b)};this.notify=function(b){q(a,b)}}function f(){this.$$state={status:0}}function g(){for(;!t&&u.length;){var a=u.shift();if(!a.pur){a.pur=!0;var c=a.value,c="Possibly unhandled rejection: "+("function"===typeof c?c.toString().replace(/ \{[\s\S]*$/,""):w(c)?"undefined":"string"!==typeof c?De(c,void 0):c);ac(a.value)?b(a.value,c):b(c)}}}function k(c){!d||c.pending||2!==c.status||c.pur||(0===t&&0===u.length&&a(g),u.push(c));!c.processScheduled&&c.pending&&(c.processScheduled=
+!0,++t,a(function(){var e,f,k;k=c.pending;c.processScheduled=!1;c.pending=void 0;try{for(var l=0,n=k.length;l<n;++l){c.pur=!0;f=k[l][0];e=k[l][c.status];try{B(e)?h(f,e(c.value)):1===c.status?h(f,c.value):m(f,c.value)}catch(q){m(f,q),q&&!0===q.$$passToExceptionHandler&&b(q)}}}finally{--t,d&&0===t&&a(g)}}))}function h(a,b){a.$$state.status||(b===a?n(a,s("qcycle",b)):l(a,b))}function l(a,b){function c(b){f||(f=!0,l(a,b))}function d(b){f||(f=!0,n(a,b))}function e(b){q(a,b)}var g,f=!1;try{if(E(b)||B(b))g=
+b.then;B(g)?(a.$$state.status=-1,g.call(b,c,d,e)):(a.$$state.value=b,a.$$state.status=1,k(a.$$state))}catch(h){d(h)}}function m(a,b){a.$$state.status||n(a,b)}function n(a,b){a.$$state.value=b;a.$$state.status=2;k(a.$$state)}function q(c,d){var e=c.$$state.pending;0>=c.$$state.status&&e&&e.length&&a(function(){for(var a,c,g=0,f=e.length;g<f;g++){c=e[g][0];a=e[g][3];try{q(c,B(a)?a(d):d)}catch(h){b(h)}}})}function G(a){var b=new f;m(b,a);return b}function r(a,b,c){var d=null;try{B(c)&&(d=c())}catch(e){return G(e)}return d&&
+B(d.then)?d.then(function(){return b(a)},G):b(a)}function z(a,b,c,d){var e=new f;h(e,a);return e.then(b,c,d)}function v(a){if(!B(a))throw s("norslvr",a);var b=new f;a(function(a){h(b,a)},function(a){m(b,a)});return b}var s=M("$q",TypeError),t=0,u=[];Q(f.prototype,{then:function(a,b,c){if(w(a)&&w(b)&&w(c))return this;var d=new f;this.$$state.pending=this.$$state.pending||[];this.$$state.pending.push([d,a,b,c]);0<this.$$state.status&&k(this.$$state);return d},"catch":function(a){return this.then(null,
+a)},"finally":function(a,b){return this.then(function(b){return r(b,y,a)},function(b){return r(b,G,a)},b)}});var y=z;v.prototype=f.prototype;v.defer=c;v.reject=G;v.when=z;v.resolve=y;v.all=function(a){var b=new f,c=0,d=I(a)?[]:{};p(a,function(a,e){c++;z(a).then(function(a){d[e]=a;--c||h(b,d)},function(a){m(b,a)})});0===c&&h(b,d);return b};v.race=function(a){var b=c();p(a,function(a){z(a).then(b.resolve,b.reject)});return b.promise};return v}function Zf(){this.$get=["$window","$timeout",function(a,
+b){var d=a.requestAnimationFrame||a.webkitRequestAnimationFrame,c=a.cancelAnimationFrame||a.webkitCancelAnimationFrame||a.webkitCancelRequestAnimationFrame,e=!!d,f=e?function(a){var b=d(a);return function(){c(b)}}:function(a){var c=b(a,16.66,!1);return function(){b.cancel(c)}};f.supported=e;return f}]}function Of(){function a(a){function b(){this.$$watchers=this.$$nextSibling=this.$$childHead=this.$$childTail=null;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$id=++rb;this.$$ChildScope=
+null}b.prototype=a;return b}var b=10,d=M("$rootScope"),c=null,e=null;this.digestTtl=function(a){arguments.length&&(b=a);return b};this.$get=["$exceptionHandler","$parse","$browser",function(f,g,k){function h(a){a.currentScope.$$destroyed=!0}function l(a){9===Ca&&(a.$$childHead&&l(a.$$childHead),a.$$nextSibling&&l(a.$$nextSibling));a.$parent=a.$$nextSibling=a.$$prevSibling=a.$$childHead=a.$$childTail=a.$root=a.$$watchers=null}function m(){this.$id=++rb;this.$$phase=this.$parent=this.$$watchers=this.$$nextSibling=
+this.$$prevSibling=this.$$childHead=this.$$childTail=null;this.$root=this;this.$$destroyed=!1;this.$$listeners={};this.$$listenerCount={};this.$$watchersCount=0;this.$$isolateBindings=null}function n(a){if(s.$$phase)throw d("inprog",s.$$phase);s.$$phase=a}function q(a,b){do a.$$watchersCount+=b;while(a=a.$parent)}function G(a,b,c){do a.$$listenerCount[c]-=b,0===a.$$listenerCount[c]&&delete a.$$listenerCount[c];while(a=a.$parent)}function r(){}function z(){for(;y.length;)try{y.shift()()}catch(a){f(a)}e=
+null}function v(){null===e&&(e=k.defer(function(){s.$apply(z)}))}m.prototype={constructor:m,$new:function(b,c){var d;c=c||this;b?(d=new m,d.$root=this.$root):(this.$$ChildScope||(this.$$ChildScope=a(this)),d=new this.$$ChildScope);d.$parent=c;d.$$prevSibling=c.$$childTail;c.$$childHead?(c.$$childTail.$$nextSibling=d,c.$$childTail=d):c.$$childHead=c.$$childTail=d;(b||c!==this)&&d.$on("$destroy",h);return d},$watch:function(a,b,d,e){var f=g(a);if(f.$$watchDelegate)return f.$$watchDelegate(this,b,d,
+f,a);var h=this,k=h.$$watchers,l={fn:b,last:r,get:f,exp:e||a,eq:!!d};c=null;B(b)||(l.fn=C);k||(k=h.$$watchers=[],k.$$digestWatchIndex=-1);k.unshift(l);k.$$digestWatchIndex++;q(this,1);return function(){var a=db(k,l);0<=a&&(q(h,-1),a<k.$$digestWatchIndex&&k.$$digestWatchIndex--);c=null}},$watchGroup:function(a,b){function c(){h=!1;k?(k=!1,b(e,e,f)):b(e,d,f)}var d=Array(a.length),e=Array(a.length),g=[],f=this,h=!1,k=!0;if(!a.length){var l=!0;f.$evalAsync(function(){l&&b(e,e,f)});return function(){l=
+!1}}if(1===a.length)return this.$watch(a[0],function(a,c,g){e[0]=a;d[0]=c;b(e,a===c?e:d,g)});p(a,function(a,b){var k=f.$watch(a,function(a,g){e[b]=a;d[b]=g;h||(h=!0,f.$evalAsync(c))});g.push(k)});return function(){for(;g.length;)g.shift()()}},$watchCollection:function(a,b){function c(a){e=a;var b,d,g,h;if(!w(e)){if(E(e))if(xa(e))for(f!==n&&(f=n,p=f.length=0,l++),a=e.length,p!==a&&(l++,f.length=p=a),b=0;b<a;b++)h=f[b],g=e[b],d=h!==h&&g!==g,d||h===g||(l++,f[b]=g);else{f!==q&&(f=q={},p=0,l++);a=0;for(b in e)ra.call(e,
+b)&&(a++,g=e[b],h=f[b],b in f?(d=h!==h&&g!==g,d||h===g||(l++,f[b]=g)):(p++,f[b]=g,l++));if(p>a)for(b in l++,f)ra.call(e,b)||(p--,delete f[b])}else f!==e&&(f=e,l++);return l}}c.$stateful=!0;var d=this,e,f,h,k=1<b.length,l=0,m=g(a,c),n=[],q={},s=!0,p=0;return this.$watch(m,function(){s?(s=!1,b(e,e,d)):b(e,h,d);if(k)if(E(e))if(xa(e)){h=Array(e.length);for(var a=0;a<e.length;a++)h[a]=e[a]}else for(a in h={},e)ra.call(e,a)&&(h[a]=e[a]);else h=e})},$digest:function(){var a,g,h,l,m,q,p,G=b,y,v=[],w,A;n("$digest");
+k.$$checkUrlChange();this===s&&null!==e&&(k.defer.cancel(e),z());c=null;do{p=!1;y=this;for(q=0;q<t.length;q++){try{A=t[q],l=A.fn,l(A.scope,A.locals)}catch(C){f(C)}c=null}t.length=0;a:do{if(q=y.$$watchers)for(q.$$digestWatchIndex=q.length;q.$$digestWatchIndex--;)try{if(a=q[q.$$digestWatchIndex])if(m=a.get,(g=m(y))!==(h=a.last)&&!(a.eq?sa(g,h):U(g)&&U(h)))p=!0,c=a,a.last=a.eq?pa(g,null):g,l=a.fn,l(g,h===r?g:h,y),5>G&&(w=4-G,v[w]||(v[w]=[]),v[w].push({msg:B(a.exp)?"fn: "+(a.exp.name||a.exp.toString()):
+a.exp,newVal:g,oldVal:h}));else if(a===c){p=!1;break a}}catch(E){f(E)}if(!(q=y.$$watchersCount&&y.$$childHead||y!==this&&y.$$nextSibling))for(;y!==this&&!(q=y.$$nextSibling);)y=y.$parent}while(y=q);if((p||t.length)&&!G--)throw s.$$phase=null,d("infdig",b,v);}while(p||t.length);for(s.$$phase=null;J<u.length;)try{u[J++]()}catch(D){f(D)}u.length=J=0;k.$$checkUrlChange()},$destroy:function(){if(!this.$$destroyed){var a=this.$parent;this.$broadcast("$destroy");this.$$destroyed=!0;this===s&&k.$$applicationDestroyed();
+q(this,-this.$$watchersCount);for(var b in this.$$listenerCount)G(this,this.$$listenerCount[b],b);a&&a.$$childHead===this&&(a.$$childHead=this.$$nextSibling);a&&a.$$childTail===this&&(a.$$childTail=this.$$prevSibling);this.$$prevSibling&&(this.$$prevSibling.$$nextSibling=this.$$nextSibling);this.$$nextSibling&&(this.$$nextSibling.$$prevSibling=this.$$prevSibling);this.$destroy=this.$digest=this.$apply=this.$evalAsync=this.$applyAsync=C;this.$on=this.$watch=this.$watchGroup=function(){return C};this.$$listeners=
+{};this.$$nextSibling=null;l(this)}},$eval:function(a,b){return g(a)(this,b)},$evalAsync:function(a,b){s.$$phase||t.length||k.defer(function(){t.length&&s.$digest()});t.push({scope:this,fn:g(a),locals:b})},$$postDigest:function(a){u.push(a)},$apply:function(a){try{n("$apply");try{return this.$eval(a)}finally{s.$$phase=null}}catch(b){f(b)}finally{try{s.$digest()}catch(c){throw f(c),c;}}},$applyAsync:function(a){function b(){c.$eval(a)}var c=this;a&&y.push(b);a=g(a);v()},$on:function(a,b){var c=this.$$listeners[a];
+c||(this.$$listeners[a]=c=[]);c.push(b);var d=this;do d.$$listenerCount[a]||(d.$$listenerCount[a]=0),d.$$listenerCount[a]++;while(d=d.$parent);var e=this;return function(){var d=c.indexOf(b);-1!==d&&(delete c[d],G(e,1,a))}},$emit:function(a,b){var c=[],d,e=this,g=!1,h={name:a,targetScope:e,stopPropagation:function(){g=!0},preventDefault:function(){h.defaultPrevented=!0},defaultPrevented:!1},k=eb([h],arguments,1),l,m;do{d=e.$$listeners[a]||c;h.currentScope=e;l=0;for(m=d.length;l<m;l++)if(d[l])try{d[l].apply(null,
+k)}catch(n){f(n)}else d.splice(l,1),l--,m--;if(g)break;e=e.$parent}while(e);h.currentScope=null;return h},$broadcast:function(a,b){var c=this,d=this,e={name:a,targetScope:this,preventDefault:function(){e.defaultPrevented=!0},defaultPrevented:!1};if(!this.$$listenerCount[a])return e;for(var g=eb([e],arguments,1),h,k;c=d;){e.currentScope=c;d=c.$$listeners[a]||[];h=0;for(k=d.length;h<k;h++)if(d[h])try{d[h].apply(null,g)}catch(l){f(l)}else d.splice(h,1),h--,k--;if(!(d=c.$$listenerCount[a]&&c.$$childHead||
+c!==this&&c.$$nextSibling))for(;c!==this&&!(d=c.$$nextSibling);)c=c.$parent}e.currentScope=null;return e}};var s=new m,t=s.$$asyncQueue=[],u=s.$$postDigestQueue=[],y=s.$$applyAsyncQueue=[],J=0;return s}]}function Ge(){var a=/^\s*(https?|s?ftp|mailto|tel|file):/,b=/^\s*((https?|ftp|file|blob):|data:image\/)/;this.aHrefSanitizationWhitelist=function(b){return t(b)?(a=b,this):a};this.imgSrcSanitizationWhitelist=function(a){return t(a)?(b=a,this):b};this.$get=function(){return function(d,c){var e=c?b:
+a,f;f=ua(d&&d.trim()).href;return""===f||f.match(e)?d:"unsafe:"+f}}}function Fg(a){if("self"===a)return a;if(D(a)){if(-1<a.indexOf("***"))throw wa("iwcard",a);a=Md(a).replace(/\\\*\\\*/g,".*").replace(/\\\*/g,"[^:/.?&;]*");return new RegExp("^"+a+"$")}if(ab(a))return new RegExp("^"+a.source+"$");throw wa("imatcher");}function Nd(a){var b=[];t(a)&&p(a,function(a){b.push(Fg(a))});return b}function Sf(){this.SCE_CONTEXTS=oa;var a=["self"],b=[];this.resourceUrlWhitelist=function(b){arguments.length&&
+(a=Nd(b));return a};this.resourceUrlBlacklist=function(a){arguments.length&&(b=Nd(a));return b};this.$get=["$injector",function(d){function c(a,b){return"self"===a?zd(b):!!a.exec(b.href)}function e(a){var b=function(a){this.$$unwrapTrustedValue=function(){return a}};a&&(b.prototype=new a);b.prototype.valueOf=function(){return this.$$unwrapTrustedValue()};b.prototype.toString=function(){return this.$$unwrapTrustedValue().toString()};return b}var f=function(a){throw wa("unsafe");};d.has("$sanitize")&&
+(f=d.get("$sanitize"));var g=e(),k={};k[oa.HTML]=e(g);k[oa.CSS]=e(g);k[oa.URL]=e(g);k[oa.JS]=e(g);k[oa.RESOURCE_URL]=e(k[oa.URL]);return{trustAs:function(a,b){var c=k.hasOwnProperty(a)?k[a]:null;if(!c)throw wa("icontext",a,b);if(null===b||w(b)||""===b)return b;if("string"!==typeof b)throw wa("itype",a);return new c(b)},getTrusted:function(d,e){if(null===e||w(e)||""===e)return e;var g=k.hasOwnProperty(d)?k[d]:null;if(g&&e instanceof g)return e.$$unwrapTrustedValue();if(d===oa.RESOURCE_URL){var g=ua(e.toString()),
+n,q,p=!1;n=0;for(q=a.length;n<q;n++)if(c(a[n],g)){p=!0;break}if(p)for(n=0,q=b.length;n<q;n++)if(c(b[n],g)){p=!1;break}if(p)return e;throw wa("insecurl",e.toString());}if(d===oa.HTML)return f(e);throw wa("unsafe");},valueOf:function(a){return a instanceof g?a.$$unwrapTrustedValue():a}}}]}function Rf(){var a=!0;this.enabled=function(b){arguments.length&&(a=!!b);return a};this.$get=["$parse","$sceDelegate",function(b,d){if(a&&8>Ca)throw wa("iequirks");var c=ja(oa);c.isEnabled=function(){return a};c.trustAs=
+d.trustAs;c.getTrusted=d.getTrusted;c.valueOf=d.valueOf;a||(c.trustAs=c.getTrusted=function(a,b){return b},c.valueOf=bb);c.parseAs=function(a,d){var e=b(d);return e.literal&&e.constant?e:b(d,function(b){return c.getTrusted(a,b)})};var e=c.parseAs,f=c.getTrusted,g=c.trustAs;p(oa,function(a,b){var d=N(b);c[("parse_as_"+d).replace(Bc,xb)]=function(b){return e(a,b)};c[("get_trusted_"+d).replace(Bc,xb)]=function(b){return f(a,b)};c[("trust_as_"+d).replace(Bc,xb)]=function(b){return g(a,b)}});return c}]}
+function Tf(){this.$get=["$window","$document",function(a,b){var d={},c=!((!a.nw||!a.nw.process)&&a.chrome&&(a.chrome.app&&a.chrome.app.runtime||!a.chrome.app&&a.chrome.runtime&&a.chrome.runtime.id))&&a.history&&a.history.pushState,e=Z((/android (\d+)/.exec(N((a.navigator||{}).userAgent))||[])[1]),f=/Boxee/i.test((a.navigator||{}).userAgent),g=b[0]||{},k=g.body&&g.body.style,h=!1,l=!1;k&&(h=!!("transition"in k||"webkitTransition"in k),l=!!("animation"in k||"webkitAnimation"in k));return{history:!(!c||
+4>e||f),hasEvent:function(a){if("input"===a&&Ca)return!1;if(w(d[a])){var b=g.createElement("div");d[a]="on"+a in b}return d[a]},csp:Ja(),transitions:h,animations:l,android:e}}]}function Vf(){var a;this.httpOptions=function(b){return b?(a=b,this):a};this.$get=["$exceptionHandler","$templateCache","$http","$q","$sce",function(b,d,c,e,f){function g(k,h){g.totalPendingRequests++;if(!D(k)||w(d.get(k)))k=f.getTrustedResourceUrl(k);var l=c.defaults&&c.defaults.transformResponse;I(l)?l=l.filter(function(a){return a!==
+sc}):l===sc&&(l=null);return c.get(k,Q({cache:d,transformResponse:l},a)).finally(function(){g.totalPendingRequests--}).then(function(a){d.put(k,a.data);return a.data},function(a){h||(a=Gg("tpload",k,a.status,a.statusText),b(a));return e.reject(a)})}g.totalPendingRequests=0;return g}]}function Wf(){this.$get=["$rootScope","$browser","$location",function(a,b,d){return{findBindings:function(a,b,d){a=a.getElementsByClassName("ng-binding");var g=[];p(a,function(a){var c=$.element(a).data("$binding");c&&
+p(c,function(c){d?(new RegExp("(^|\\s)"+Md(b)+"(\\s|\\||$)")).test(c)&&g.push(a):-1!==c.indexOf(b)&&g.push(a)})});return g},findModels:function(a,b,d){for(var g=["ng-","data-ng-","ng\\:"],k=0;k<g.length;++k){var h=a.querySelectorAll("["+g[k]+"model"+(d?"=":"*=")+'"'+b+'"]');if(h.length)return h}},getLocation:function(){return d.url()},setLocation:function(b){b!==d.url()&&(d.url(b),a.$digest())},whenStable:function(a){b.notifyWhenNoOutstandingRequests(a)}}}]}function Xf(){this.$get=["$rootScope","$browser",
+"$q","$$q","$exceptionHandler",function(a,b,d,c,e){function f(f,h,l){B(f)||(l=h,h=f,f=C);var m=ya.call(arguments,3),n=t(l)&&!l,q=(n?c:d).defer(),p=q.promise,r;r=b.defer(function(){try{q.resolve(f.apply(null,m))}catch(b){q.reject(b),e(b)}finally{delete g[p.$$timeoutId]}n||a.$apply()},h);p.$$timeoutId=r;g[r]=q;return p}var g={};f.cancel=function(a){return a&&a.$$timeoutId in g?(g[a.$$timeoutId].promise.$$state.pur=!0,g[a.$$timeoutId].reject("canceled"),delete g[a.$$timeoutId],b.defer.cancel(a.$$timeoutId)):
+!1};return f}]}function ua(a){Ca&&(X.setAttribute("href",a),a=X.href);X.setAttribute("href",a);return{href:X.href,protocol:X.protocol?X.protocol.replace(/:$/,""):"",host:X.host,search:X.search?X.search.replace(/^\?/,""):"",hash:X.hash?X.hash.replace(/^#/,""):"",hostname:X.hostname,port:X.port,pathname:"/"===X.pathname.charAt(0)?X.pathname:"/"+X.pathname}}function zd(a){a=D(a)?ua(a):a;return a.protocol===Od.protocol&&a.host===Od.host}function Yf(){this.$get=ka(u)}function Pd(a){function b(a){try{return decodeURIComponent(a)}catch(b){return a}}
+var d=a[0]||{},c={},e="";return function(){var a,g,k,h,l;try{a=d.cookie||""}catch(m){a=""}if(a!==e)for(e=a,a=e.split("; "),c={},k=0;k<a.length;k++)g=a[k],h=g.indexOf("="),0<h&&(l=b(g.substring(0,h)),w(c[l])&&(c[l]=b(g.substring(h+1))));return c}}function bg(){this.$get=Pd}function ed(a){function b(d,c){if(E(d)){var e={};p(d,function(a,c){e[c]=b(c,a)});return e}return a.factory(d+"Filter",c)}this.register=b;this.$get=["$injector",function(a){return function(b){return a.get(b+"Filter")}}];b("currency",
+Qd);b("date",Rd);b("filter",Hg);b("json",Ig);b("limitTo",Jg);b("lowercase",Kg);b("number",Sd);b("orderBy",Td);b("uppercase",Lg)}function Hg(){return function(a,b,d,c){if(!xa(a)){if(null==a)return a;throw M("filter")("notarray",a);}c=c||"$";var e;switch(Cc(b)){case "function":break;case "boolean":case "null":case "number":case "string":e=!0;case "object":b=Mg(b,d,c,e);break;default:return a}return Array.prototype.filter.call(a,b)}}function Mg(a,b,d,c){var e=E(a)&&d in a;!0===b?b=sa:B(b)||(b=function(a,
+b){if(w(a))return!1;if(null===a||null===b)return a===b;if(E(b)||E(a)&&!$b(a))return!1;a=N(""+a);b=N(""+b);return-1!==a.indexOf(b)});return function(f){return e&&!E(f)?ga(f,a[d],b,d,!1):ga(f,a,b,d,c)}}function ga(a,b,d,c,e,f){var g=Cc(a),k=Cc(b);if("string"===k&&"!"===b.charAt(0))return!ga(a,b.substring(1),d,c,e);if(I(a))return a.some(function(a){return ga(a,b,d,c,e)});switch(g){case "object":var h;if(e){for(h in a)if(h.charAt&&"$"!==h.charAt(0)&&ga(a[h],b,d,c,!0))return!0;return f?!1:ga(a,b,d,c,!1)}if("object"===
+k){for(h in b)if(f=b[h],!B(f)&&!w(f)&&(g=h===c,!ga(g?a:a[h],f,d,c,g,g)))return!1;return!0}return d(a,b);case "function":return!1;default:return d(a,b)}}function Cc(a){return null===a?"null":typeof a}function Qd(a){var b=a.NUMBER_FORMATS;return function(a,c,e){w(c)&&(c=b.CURRENCY_SYM);w(e)&&(e=b.PATTERNS[1].maxFrac);return null==a?a:Ud(a,b.PATTERNS[1],b.GROUP_SEP,b.DECIMAL_SEP,e).replace(/\u00A4/g,c)}}function Sd(a){var b=a.NUMBER_FORMATS;return function(a,c){return null==a?a:Ud(a,b.PATTERNS[0],b.GROUP_SEP,
+b.DECIMAL_SEP,c)}}function Ng(a){var b=0,d,c,e,f,g;-1<(c=a.indexOf(Vd))&&(a=a.replace(Vd,""));0<(e=a.search(/e/i))?(0>c&&(c=e),c+=+a.slice(e+1),a=a.substring(0,e)):0>c&&(c=a.length);for(e=0;a.charAt(e)===Dc;e++);if(e===(g=a.length))d=[0],c=1;else{for(g--;a.charAt(g)===Dc;)g--;c-=e;d=[];for(f=0;e<=g;e++,f++)d[f]=+a.charAt(e)}c>Wd&&(d=d.splice(0,Wd-1),b=c-1,c=1);return{d:d,e:b,i:c}}function Og(a,b,d,c){var e=a.d,f=e.length-a.i;b=w(b)?Math.min(Math.max(d,f),c):+b;d=b+a.i;c=e[d];if(0<d){e.splice(Math.max(a.i,
+d));for(var g=d;g<e.length;g++)e[g]=0}else for(f=Math.max(0,f),a.i=1,e.length=Math.max(1,d=b+1),e[0]=0,g=1;g<d;g++)e[g]=0;if(5<=c)if(0>d-1){for(c=0;c>d;c--)e.unshift(0),a.i++;e.unshift(1);a.i++}else e[d-1]++;for(;f<Math.max(0,b);f++)e.push(0);if(b=e.reduceRight(function(a,b,c,d){b+=a;d[c]=b%10;return Math.floor(b/10)},0))e.unshift(b),a.i++}function Ud(a,b,d,c,e){if(!D(a)&&!Y(a)||isNaN(a))return"";var f=!isFinite(a),g=!1,k=Math.abs(a)+"",h="";if(f)h="\u221e";else{g=Ng(k);Og(g,e,b.minFrac,b.maxFrac);
+h=g.d;k=g.i;e=g.e;f=[];for(g=h.reduce(function(a,b){return a&&!b},!0);0>k;)h.unshift(0),k++;0<k?f=h.splice(k,h.length):(f=h,h=[0]);k=[];for(h.length>=b.lgSize&&k.unshift(h.splice(-b.lgSize,h.length).join(""));h.length>b.gSize;)k.unshift(h.splice(-b.gSize,h.length).join(""));h.length&&k.unshift(h.join(""));h=k.join(d);f.length&&(h+=c+f.join(""));e&&(h+="e+"+e)}return 0>a&&!g?b.negPre+h+b.negSuf:b.posPre+h+b.posSuf}function Nb(a,b,d,c){var e="";if(0>a||c&&0>=a)c?a=-a+1:(a=-a,e="-");for(a=""+a;a.length<
+b;)a=Dc+a;d&&(a=a.substr(a.length-b));return e+a}function da(a,b,d,c,e){d=d||0;return function(f){f=f["get"+a]();if(0<d||f>-d)f+=d;0===f&&-12===d&&(f=12);return Nb(f,b,c,e)}}function nb(a,b,d){return function(c,e){var f=c["get"+a](),g=vb((d?"STANDALONE":"")+(b?"SHORT":"")+a);return e[g][f]}}function Xd(a){var b=(new Date(a,0,1)).getDay();return new Date(a,0,(4>=b?5:12)-b)}function Yd(a){return function(b){var d=Xd(b.getFullYear());b=+new Date(b.getFullYear(),b.getMonth(),b.getDate()+(4-b.getDay()))-
++d;b=1+Math.round(b/6048E5);return Nb(b,a)}}function Ec(a,b){return 0>=a.getFullYear()?b.ERAS[0]:b.ERAS[1]}function Rd(a){function b(a){var b;if(b=a.match(d)){a=new Date(0);var f=0,g=0,k=b[8]?a.setUTCFullYear:a.setFullYear,h=b[8]?a.setUTCHours:a.setHours;b[9]&&(f=Z(b[9]+b[10]),g=Z(b[9]+b[11]));k.call(a,Z(b[1]),Z(b[2])-1,Z(b[3]));f=Z(b[4]||0)-f;g=Z(b[5]||0)-g;k=Z(b[6]||0);b=Math.round(1E3*parseFloat("0."+(b[7]||0)));h.call(a,f,g,k,b)}return a}var d=/^(\d{4})-?(\d\d)-?(\d\d)(?:T(\d\d)(?::?(\d\d)(?::?(\d\d)(?:\.(\d+))?)?)?(Z|([+-])(\d\d):?(\d\d))?)?$/;
+return function(c,d,f){var g="",k=[],h,l;d=d||"mediumDate";d=a.DATETIME_FORMATS[d]||d;D(c)&&(c=Pg.test(c)?Z(c):b(c));Y(c)&&(c=new Date(c));if(!ea(c)||!isFinite(c.getTime()))return c;for(;d;)(l=Qg.exec(d))?(k=eb(k,l,1),d=k.pop()):(k.push(d),d=null);var m=c.getTimezoneOffset();f&&(m=Sc(f,m),c=cc(c,f,!0));p(k,function(b){h=Rg[b];g+=h?h(c,a.DATETIME_FORMATS,m):"''"===b?"'":b.replace(/(^'|'$)/g,"").replace(/''/g,"'")});return g}}function Ig(){return function(a,b){w(b)&&(b=2);return fb(a,b)}}function Jg(){return function(a,
+b,d){b=Infinity===Math.abs(Number(b))?Number(b):Z(b);if(U(b))return a;Y(a)&&(a=a.toString());if(!xa(a))return a;d=!d||isNaN(d)?0:Z(d);d=0>d?Math.max(0,a.length+d):d;return 0<=b?Fc(a,d,d+b):0===d?Fc(a,b,a.length):Fc(a,Math.max(0,d+b),d)}}function Fc(a,b,d){return D(a)?a.slice(b,d):ya.call(a,b,d)}function Td(a){function b(b){return b.map(function(b){var c=1,d=bb;if(B(b))d=b;else if(D(b)){if("+"===b.charAt(0)||"-"===b.charAt(0))c="-"===b.charAt(0)?-1:1,b=b.substring(1);if(""!==b&&(d=a(b),d.constant))var e=
+d(),d=function(a){return a[e]}}return{get:d,descending:c}})}function d(a){switch(typeof a){case "number":case "boolean":case "string":return!0;default:return!1}}function c(a,b){var c=0,d=a.type,h=b.type;if(d===h){var h=a.value,l=b.value;"string"===d?(h=h.toLowerCase(),l=l.toLowerCase()):"object"===d&&(E(h)&&(h=a.index),E(l)&&(l=b.index));h!==l&&(c=h<l?-1:1)}else c=d<h?-1:1;return c}return function(a,f,g,k){if(null==a)return a;if(!xa(a))throw M("orderBy")("notarray",a);I(f)||(f=[f]);0===f.length&&
+(f=["+"]);var h=b(f),l=g?-1:1,m=B(k)?k:c;a=Array.prototype.map.call(a,function(a,b){return{value:a,tieBreaker:{value:b,type:"number",index:b},predicateValues:h.map(function(c){var e=c.get(a);c=typeof e;if(null===e)c="string",e="null";else if("object"===c)a:{if(B(e.valueOf)&&(e=e.valueOf(),d(e)))break a;$b(e)&&(e=e.toString(),d(e))}return{value:e,type:c,index:b}})}});a.sort(function(a,b){for(var d=0,e=h.length;d<e;d++){var g=m(a.predicateValues[d],b.predicateValues[d]);if(g)return g*h[d].descending*
+l}return(m(a.tieBreaker,b.tieBreaker)||c(a.tieBreaker,b.tieBreaker))*l});return a=a.map(function(a){return a.value})}}function Qa(a){B(a)&&(a={link:a});a.restrict=a.restrict||"AC";return ka(a)}function Ob(a,b,d,c,e){this.$$controls=[];this.$error={};this.$$success={};this.$pending=void 0;this.$name=e(b.name||b.ngForm||"")(d);this.$dirty=!1;this.$valid=this.$pristine=!0;this.$submitted=this.$invalid=!1;this.$$parentForm=Pb;this.$$element=a;this.$$animate=c;Zd(this)}function Zd(a){a.$$classCache={};
+a.$$classCache[$d]=!(a.$$classCache[ob]=a.$$element.hasClass(ob))}function ae(a){function b(a,b,c){c&&!a.$$classCache[b]?(a.$$animate.addClass(a.$$element,b),a.$$classCache[b]=!0):!c&&a.$$classCache[b]&&(a.$$animate.removeClass(a.$$element,b),a.$$classCache[b]=!1)}function d(a,c,d){c=c?"-"+Vc(c,"-"):"";b(a,ob+c,!0===d);b(a,$d+c,!1===d)}var c=a.set,e=a.unset;a.clazz.prototype.$setValidity=function(a,g,k){w(g)?(this.$pending||(this.$pending={}),c(this.$pending,a,k)):(this.$pending&&e(this.$pending,
+a,k),be(this.$pending)&&(this.$pending=void 0));Na(g)?g?(e(this.$error,a,k),c(this.$$success,a,k)):(c(this.$error,a,k),e(this.$$success,a,k)):(e(this.$error,a,k),e(this.$$success,a,k));this.$pending?(b(this,"ng-pending",!0),this.$valid=this.$invalid=void 0,d(this,"",null)):(b(this,"ng-pending",!1),this.$valid=be(this.$error),this.$invalid=!this.$valid,d(this,"",this.$valid));g=this.$pending&&this.$pending[a]?void 0:this.$error[a]?!1:this.$$success[a]?!0:null;d(this,a,g);this.$$parentForm.$setValidity(a,
+g,this)}}function be(a){if(a)for(var b in a)if(a.hasOwnProperty(b))return!1;return!0}function Gc(a){a.$formatters.push(function(b){return a.$isEmpty(b)?b:b.toString()})}function Wa(a,b,d,c,e,f){var g=N(b[0].type);if(!e.android){var k=!1;b.on("compositionstart",function(){k=!0});b.on("compositionend",function(){k=!1;l()})}var h,l=function(a){h&&(f.defer.cancel(h),h=null);if(!k){var e=b.val();a=a&&a.type;"password"===g||d.ngTrim&&"false"===d.ngTrim||(e=R(e));(c.$viewValue!==e||""===e&&c.$$hasNativeValidators)&&
+c.$setViewValue(e,a)}};if(e.hasEvent("input"))b.on("input",l);else{var m=function(a,b,c){h||(h=f.defer(function(){h=null;b&&b.value===c||l(a)}))};b.on("keydown",function(a){var b=a.keyCode;91===b||15<b&&19>b||37<=b&&40>=b||m(a,this,this.value)});if(e.hasEvent("paste"))b.on("paste cut",m)}b.on("change",l);if(ce[g]&&c.$$hasNativeValidators&&g===d.type)b.on("keydown wheel mousedown",function(a){if(!h){var b=this.validity,c=b.badInput,d=b.typeMismatch;h=f.defer(function(){h=null;b.badInput===c&&b.typeMismatch===
+d||l(a)})}});c.$render=function(){var a=c.$isEmpty(c.$viewValue)?"":c.$viewValue;b.val()!==a&&b.val(a)}}function Qb(a,b){return function(d,c){var e,f;if(ea(d))return d;if(D(d)){'"'===d.charAt(0)&&'"'===d.charAt(d.length-1)&&(d=d.substring(1,d.length-1));if(Sg.test(d))return new Date(d);a.lastIndex=0;if(e=a.exec(d))return e.shift(),f=c?{yyyy:c.getFullYear(),MM:c.getMonth()+1,dd:c.getDate(),HH:c.getHours(),mm:c.getMinutes(),ss:c.getSeconds(),sss:c.getMilliseconds()/1E3}:{yyyy:1970,MM:1,dd:1,HH:0,mm:0,
+ss:0,sss:0},p(e,function(a,c){c<b.length&&(f[b[c]]=+a)}),new Date(f.yyyy,f.MM-1,f.dd,f.HH,f.mm,f.ss||0,1E3*f.sss||0)}return NaN}}function pb(a,b,d,c){return function(e,f,g,k,h,l,m){function n(a){return a&&!(a.getTime&&a.getTime()!==a.getTime())}function q(a){return t(a)&&!ea(a)?d(a)||void 0:a}Hc(e,f,g,k);Wa(e,f,g,k,h,l);var p=k&&k.$options.getOption("timezone"),r;k.$$parserName=a;k.$parsers.push(function(a){if(k.$isEmpty(a))return null;if(b.test(a))return a=d(a,r),p&&(a=cc(a,p)),a});k.$formatters.push(function(a){if(a&&
+!ea(a))throw qb("datefmt",a);if(n(a))return(r=a)&&p&&(r=cc(r,p,!0)),m("date")(a,c,p);r=null;return""});if(t(g.min)||g.ngMin){var z;k.$validators.min=function(a){return!n(a)||w(z)||d(a)>=z};g.$observe("min",function(a){z=q(a);k.$validate()})}if(t(g.max)||g.ngMax){var v;k.$validators.max=function(a){return!n(a)||w(v)||d(a)<=v};g.$observe("max",function(a){v=q(a);k.$validate()})}}}function Hc(a,b,d,c){(c.$$hasNativeValidators=E(b[0].validity))&&c.$parsers.push(function(a){var c=b.prop("validity")||{};
+return c.badInput||c.typeMismatch?void 0:a})}function de(a){a.$$parserName="number";a.$parsers.push(function(b){if(a.$isEmpty(b))return null;if(Tg.test(b))return parseFloat(b)});a.$formatters.push(function(b){if(!a.$isEmpty(b)){if(!Y(b))throw qb("numfmt",b);b=b.toString()}return b})}function Xa(a){t(a)&&!Y(a)&&(a=parseFloat(a));return U(a)?void 0:a}function Ic(a){var b=a.toString(),d=b.indexOf(".");return-1===d?-1<a&&1>a&&(a=/e-(\d+)$/.exec(b))?Number(a[1]):0:b.length-d-1}function ee(a,b,d){a=Number(a);
+var c=(a|0)!==a,e=(b|0)!==b,f=(d|0)!==d;if(c||e||f){var g=c?Ic(a):0,k=e?Ic(b):0,h=f?Ic(d):0,g=Math.max(g,k,h),g=Math.pow(10,g);a*=g;b*=g;d*=g;c&&(a=Math.round(a));e&&(b=Math.round(b));f&&(d=Math.round(d))}return 0===(a-b)%d}function fe(a,b,d,c,e){if(t(c)){a=a(c);if(!a.constant)throw qb("constexpr",d,c);return a(b)}return e}function Jc(a,b){function d(a,b){if(!a||!a.length)return[];if(!b||!b.length)return a;var c=[],d=0;a:for(;d<a.length;d++){for(var e=a[d],f=0;f<b.length;f++)if(e===b[f])continue a;
+c.push(e)}return c}function c(a){var b=a;I(a)?b=a.map(c).join(" "):E(a)&&(b=Object.keys(a).filter(function(b){return a[b]}).join(" "));return b}function e(a){var b=a;if(I(a))b=a.map(e);else if(E(a)){var c=!1,b=Object.keys(a).filter(function(b){b=a[b];!c&&w(b)&&(c=!0);return b});c&&b.push(void 0)}return b}a="ngClass"+a;var f;return["$parse",function(g){return{restrict:"AC",link:function(k,h,l){function m(a,b){var c=[];p(a,function(a){if(0<b||s[a])s[a]=(s[a]||0)+b,s[a]===+(0<b)&&c.push(a)});return c.join(" ")}
+function n(a){if(a===b){var c=w,c=m(c&&c.split(" "),1);l.$addClass(c)}else c=w,c=m(c&&c.split(" "),-1),l.$removeClass(c);u=a}function q(a){a=c(a);a!==w&&r(a)}function r(a){if(u===b){var c=w&&w.split(" "),e=a&&a.split(" "),g=d(c,e),c=d(e,c),g=m(g,-1),c=m(c,1);l.$addClass(c);l.$removeClass(g)}w=a}var t=l[a].trim(),z=":"===t.charAt(0)&&":"===t.charAt(1),t=g(t,z?e:c),v=z?q:r,s=h.data("$classCounts"),u=!0,w;s||(s=T(),h.data("$classCounts",s));"ngClass"!==a&&(f||(f=g("$index",function(a){return a&1})),
+k.$watch(f,n));k.$watch(t,v,z)}}}]}function Rb(a,b,d,c,e,f,g,k,h){this.$modelValue=this.$viewValue=Number.NaN;this.$$rawModelValue=void 0;this.$validators={};this.$asyncValidators={};this.$parsers=[];this.$formatters=[];this.$viewChangeListeners=[];this.$untouched=!0;this.$touched=!1;this.$pristine=!0;this.$dirty=!1;this.$valid=!0;this.$invalid=!1;this.$error={};this.$$success={};this.$pending=void 0;this.$name=h(d.name||"",!1)(a);this.$$parentForm=Pb;this.$options=Sb;this.$$parsedNgModel=e(d.ngModel);
+this.$$parsedNgModelAssign=this.$$parsedNgModel.assign;this.$$ngModelGet=this.$$parsedNgModel;this.$$ngModelSet=this.$$parsedNgModelAssign;this.$$pendingDebounce=null;this.$$parserValid=void 0;this.$$currentValidationRunId=0;Object.defineProperty(this,"$$scope",{value:a});this.$$attr=d;this.$$element=c;this.$$animate=f;this.$$timeout=g;this.$$parse=e;this.$$q=k;this.$$exceptionHandler=b;Zd(this);Ug(this)}function Ug(a){a.$$scope.$watch(function(b){b=a.$$ngModelGet(b);b===a.$modelValue||a.$modelValue!==
+a.$modelValue&&b!==b||a.$$setModelValue(b);return b})}function Kc(a){this.$$options=a}function ge(a,b){p(b,function(b,c){t(a[c])||(a[c]=b)})}function Ga(a,b){a.prop("selected",b);a.attr("selected",b)}var Mc={objectMaxDepth:5},Vg=/^\/(.+)\/([a-z]*)$/,ra=Object.prototype.hasOwnProperty,N=function(a){return D(a)?a.toLowerCase():a},vb=function(a){return D(a)?a.toUpperCase():a},Ca,A,la,ya=[].slice,ug=[].splice,Wg=[].push,ha=Object.prototype.toString,Pc=Object.getPrototypeOf,qa=M("ng"),$=u.angular||(u.angular=
+{}),gc,rb=0;Ca=u.document.documentMode;var U=Number.isNaN||function(a){return a!==a};C.$inject=[];bb.$inject=[];var I=Array.isArray,se=/^\[object (?:Uint8|Uint8Clamped|Uint16|Uint32|Int8|Int16|Int32|Float32|Float64)Array]$/,R=function(a){return D(a)?a.trim():a},Md=function(a){return a.replace(/([-()[\]{}+?*.$^|,:#<!\\])/g,"\\$1").replace(/\x08/g,"\\x08")},Ja=function(){if(!t(Ja.rules)){var a=u.document.querySelector("[ng-csp]")||u.document.querySelector("[data-ng-csp]");if(a){var b=a.getAttribute("ng-csp")||
+a.getAttribute("data-ng-csp");Ja.rules={noUnsafeEval:!b||-1!==b.indexOf("no-unsafe-eval"),noInlineStyle:!b||-1!==b.indexOf("no-inline-style")}}else{a=Ja;try{new Function(""),b=!1}catch(d){b=!0}a.rules={noUnsafeEval:b,noInlineStyle:!1}}}return Ja.rules},sb=function(){if(t(sb.name_))return sb.name_;var a,b,d=Ha.length,c,e;for(b=0;b<d;++b)if(c=Ha[b],a=u.document.querySelector("["+c.replace(":","\\:")+"jq]")){e=a.getAttribute(c+"jq");break}return sb.name_=e},ue=/:/g,Ha=["ng-","data-ng-","ng:","x-ng-"],
+xe=function(a){var b=a.currentScript;if(!b)return!0;if(!(b instanceof u.HTMLScriptElement||b instanceof u.SVGScriptElement))return!1;b=b.attributes;return[b.getNamedItem("src"),b.getNamedItem("href"),b.getNamedItem("xlink:href")].every(function(b){if(!b)return!0;if(!b.value)return!1;var c=a.createElement("a");c.href=b.value;if(a.location.origin===c.origin)return!0;switch(c.protocol){case "http:":case "https:":case "ftp:":case "blob:":case "file:":case "data:":return!0;default:return!1}})}(u.document),
+Ae=/[A-Z]/g,Wc=!1,Oa=3,Fe={full:"1.6.7",major:1,minor:6,dot:7,codeName:"imperial-backstroke"};V.expando="ng339";var jb=V.cache={},gg=1;V._data=function(a){return this.cache[a[this.expando]]||{}};var cg=/-([a-z])/g,Xg=/^-ms-/,Bb={mouseleave:"mouseout",mouseenter:"mouseover"},jc=M("jqLite"),fg=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,ic=/<|&#?\w+;/,dg=/<([\w:-]+)/,eg=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,aa={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,"",""]};aa.optgroup=aa.option;aa.tbody=aa.tfoot=aa.colgroup=aa.caption=aa.thead;aa.th=aa.td;var lg=u.Node.prototype.contains||function(a){return!!(this.compareDocumentPosition(a)&16)},Sa=V.prototype={ready:gd,toString:function(){var a=[];p(this,function(b){a.push(""+b)});return"["+a.join(", ")+"]"},eq:function(a){return 0<=
+a?A(this[a]):A(this[this.length+a])},length:0,push:Wg,sort:[].sort,splice:[].splice},Hb={};p("multiple selected checked disabled readOnly required open".split(" "),function(a){Hb[N(a)]=a});var ld={};p("input select option textarea button form details".split(" "),function(a){ld[a]=!0});var sd={ngMinlength:"minlength",ngMaxlength:"maxlength",ngMin:"min",ngMax:"max",ngPattern:"pattern",ngStep:"step"};p({data:nc,removeData:mc,hasData:function(a){for(var b in jb[a.ng339])return!0;return!1},cleanData:function(a){for(var b=
+0,d=a.length;b<d;b++)mc(a[b])}},function(a,b){V[b]=a});p({data:nc,inheritedData:Fb,scope:function(a){return A.data(a,"$scope")||Fb(a.parentNode||a,["$isolateScope","$scope"])},isolateScope:function(a){return A.data(a,"$isolateScope")||A.data(a,"$isolateScopeNoTemplate")},controller:id,injector:function(a){return Fb(a,"$injector")},removeAttr:function(a,b){a.removeAttribute(b)},hasClass:Cb,css:function(a,b,d){b=yb(b.replace(Xg,"ms-"));if(t(d))a.style[b]=d;else return a.style[b]},attr:function(a,b,
+d){var c=a.nodeType;if(c!==Oa&&2!==c&&8!==c&&a.getAttribute){var c=N(b),e=Hb[c];if(t(d))null===d||!1===d&&e?a.removeAttribute(b):a.setAttribute(b,e?c:d);else return a=a.getAttribute(b),e&&null!==a&&(a=c),null===a?void 0:a}},prop:function(a,b,d){if(t(d))a[b]=d;else return a[b]},text:function(){function a(a,d){if(w(d)){var c=a.nodeType;return 1===c||c===Oa?a.textContent:""}a.textContent=d}a.$dv="";return a}(),val:function(a,b){if(w(b)){if(a.multiple&&"select"===za(a)){var d=[];p(a.options,function(a){a.selected&&
+d.push(a.value||a.text)});return d}return a.value}a.value=b},html:function(a,b){if(w(b))return a.innerHTML;zb(a,!0);a.innerHTML=b},empty:jd},function(a,b){V.prototype[b]=function(b,c){var e,f,g=this.length;if(a!==jd&&w(2===a.length&&a!==Cb&&a!==id?b:c)){if(E(b)){for(e=0;e<g;e++)if(a===nc)a(this[e],b);else for(f in b)a(this[e],f,b[f]);return this}e=a.$dv;g=w(e)?Math.min(g,1):g;for(f=0;f<g;f++){var k=a(this[f],b,c);e=e?e+k:k}return e}for(e=0;e<g;e++)a(this[e],b,c);return this}});p({removeData:mc,on:function(a,
+b,d,c){if(t(c))throw jc("onargs");if(hc(a)){c=Ab(a,!0);var e=c.events,f=c.handle;f||(f=c.handle=ig(a,e));c=0<=b.indexOf(" ")?b.split(" "):[b];for(var g=c.length,k=function(b,c,g){var k=e[b];k||(k=e[b]=[],k.specialHandlerWrapper=c,"$destroy"===b||g||a.addEventListener(b,f));k.push(d)};g--;)b=c[g],Bb[b]?(k(Bb[b],kg),k(b,void 0,!0)):k(b)}},off:hd,one:function(a,b,d){a=A(a);a.on(b,function e(){a.off(b,d);a.off(b,e)});a.on(b,d)},replaceWith:function(a,b){var d,c=a.parentNode;zb(a);p(new V(b),function(b){d?
+c.insertBefore(b,d.nextSibling):c.replaceChild(b,a);d=b})},children:function(a){var b=[];p(a.childNodes,function(a){1===a.nodeType&&b.push(a)});return b},contents:function(a){return a.contentDocument||a.childNodes||[]},append:function(a,b){var d=a.nodeType;if(1===d||11===d){b=new V(b);for(var d=0,c=b.length;d<c;d++)a.appendChild(b[d])}},prepend:function(a,b){if(1===a.nodeType){var d=a.firstChild;p(new V(b),function(b){a.insertBefore(b,d)})}},wrap:function(a,b){var d=A(b).eq(0).clone()[0],c=a.parentNode;
+c&&c.replaceChild(d,a);d.appendChild(a)},remove:Gb,detach:function(a){Gb(a,!0)},after:function(a,b){var d=a,c=a.parentNode;if(c){b=new V(b);for(var e=0,f=b.length;e<f;e++){var g=b[e];c.insertBefore(g,d.nextSibling);d=g}}},addClass:Eb,removeClass:Db,toggleClass:function(a,b,d){b&&p(b.split(" "),function(b){var e=d;w(e)&&(e=!Cb(a,b));(e?Eb:Db)(a,b)})},parent:function(a){return(a=a.parentNode)&&11!==a.nodeType?a:null},next:function(a){return a.nextElementSibling},find:function(a,b){return a.getElementsByTagName?
+a.getElementsByTagName(b):[]},clone:lc,triggerHandler:function(a,b,d){var c,e,f=b.type||b,g=Ab(a);if(g=(g=g&&g.events)&&g[f])c={preventDefault:function(){this.defaultPrevented=!0},isDefaultPrevented:function(){return!0===this.defaultPrevented},stopImmediatePropagation:function(){this.immediatePropagationStopped=!0},isImmediatePropagationStopped:function(){return!0===this.immediatePropagationStopped},stopPropagation:C,type:f,target:a},b.type&&(c=Q(c,b)),b=ja(g),e=d?[c].concat(d):[c],p(b,function(b){c.isImmediatePropagationStopped()||
+b.apply(a,e)})}},function(a,b){V.prototype[b]=function(b,c,e){for(var f,g=0,k=this.length;g<k;g++)w(f)?(f=a(this[g],b,c,e),t(f)&&(f=A(f))):kc(f,a(this[g],b,c,e));return t(f)?f:this}});V.prototype.bind=V.prototype.on;V.prototype.unbind=V.prototype.off;var Yg=Object.create(null);md.prototype={_idx:function(a){if(a===this._lastKey)return this._lastIndex;this._lastKey=a;return this._lastIndex=this._keys.indexOf(a)},_transformKey:function(a){return U(a)?Yg:a},get:function(a){a=this._transformKey(a);a=
+this._idx(a);if(-1!==a)return this._values[a]},set:function(a,b){a=this._transformKey(a);var d=this._idx(a);-1===d&&(d=this._lastIndex=this._keys.length);this._keys[d]=a;this._values[d]=b},delete:function(a){a=this._transformKey(a);a=this._idx(a);if(-1===a)return!1;this._keys.splice(a,1);this._values.splice(a,1);this._lastKey=NaN;this._lastIndex=-1;return!0}};var Ib=md,ag=[function(){this.$get=[function(){return Ib}]}],ng=/^([^(]+?)=>/,og=/^[^(]*\(\s*([^)]*)\)/m,Zg=/,/,$g=/^\s*(_?)(\S+?)\1\s*$/,mg=
+/((\/\/.*$)|(\/\*[\s\S]*?\*\/))/mg,Ba=M("$injector");hb.$$annotate=function(a,b,d){var c;if("function"===typeof a){if(!(c=a.$inject)){c=[];if(a.length){if(b)throw D(d)&&d||(d=a.name||pg(a)),Ba("strictdi",d);b=nd(a);p(b[1].split(Zg),function(a){a.replace($g,function(a,b,d){c.push(d)})})}a.$inject=c}}else I(a)?(b=a.length-1,tb(a[b],"fn"),c=a.slice(0,b)):tb(a,"fn",!0);return c};var he=M("$animate"),sf=function(){this.$get=C},tf=function(){var a=new Ib,b=[];this.$get=["$$AnimateRunner","$rootScope",function(d,
+c){function e(a,b,c){var d=!1;b&&(b=D(b)?b.split(" "):I(b)?b:[],p(b,function(b){b&&(d=!0,a[b]=c)}));return d}function f(){p(b,function(b){var c=a.get(b);if(c){var d=qg(b.attr("class")),e="",f="";p(c,function(a,b){a!==!!d[b]&&(a?e+=(e.length?" ":"")+b:f+=(f.length?" ":"")+b)});p(b,function(a){e&&Eb(a,e);f&&Db(a,f)});a.delete(b)}});b.length=0}return{enabled:C,on:C,off:C,pin:C,push:function(g,k,h,l){l&&l();h=h||{};h.from&&g.css(h.from);h.to&&g.css(h.to);if(h.addClass||h.removeClass)if(k=h.addClass,l=
+h.removeClass,h=a.get(g)||{},k=e(h,k,!0),l=e(h,l,!1),k||l)a.set(g,h),b.push(g),1===b.length&&c.$$postDigest(f);g=new d;g.complete();return g}}}]},qf=["$provide",function(a){var b=this,d=null,c=null;this.$$registeredAnimations=Object.create(null);this.register=function(c,d){if(c&&"."!==c.charAt(0))throw he("notcsel",c);var g=c+"-animation";b.$$registeredAnimations[c.substr(1)]=g;a.factory(g,d)};this.customFilter=function(a){1===arguments.length&&(c=B(a)?a:null);return c};this.classNameFilter=function(a){if(1===
+arguments.length&&(d=a instanceof RegExp?a:null)&&/[(\s|\/)]ng-animate[(\s|\/)]/.test(d.toString()))throw d=null,he("nongcls","ng-animate");return d};this.$get=["$$animateQueue",function(a){function b(a,c,d){if(d){var e;a:{for(e=0;e<d.length;e++){var f=d[e];if(1===f.nodeType){e=f;break a}}e=void 0}!e||e.parentNode||e.previousElementSibling||(d=null)}d?d.after(a):c.prepend(a)}return{on:a.on,off:a.off,pin:a.pin,enabled:a.enabled,cancel:function(a){a.end&&a.end()},enter:function(c,d,h,l){d=d&&A(d);h=
+h&&A(h);d=d||h.parent();b(c,d,h);return a.push(c,"enter",Ka(l))},move:function(c,d,h,l){d=d&&A(d);h=h&&A(h);d=d||h.parent();b(c,d,h);return a.push(c,"move",Ka(l))},leave:function(b,c){return a.push(b,"leave",Ka(c),function(){b.remove()})},addClass:function(b,c,d){d=Ka(d);d.addClass=kb(d.addclass,c);return a.push(b,"addClass",d)},removeClass:function(b,c,d){d=Ka(d);d.removeClass=kb(d.removeClass,c);return a.push(b,"removeClass",d)},setClass:function(b,c,d,f){f=Ka(f);f.addClass=kb(f.addClass,c);f.removeClass=
+kb(f.removeClass,d);return a.push(b,"setClass",f)},animate:function(b,c,d,f,m){m=Ka(m);m.from=m.from?Q(m.from,c):c;m.to=m.to?Q(m.to,d):d;m.tempClasses=kb(m.tempClasses,f||"ng-inline-animate");return a.push(b,"animate",m)}}}]}],vf=function(){this.$get=["$$rAF",function(a){function b(b){d.push(b);1<d.length||a(function(){for(var a=0;a<d.length;a++)d[a]();d=[]})}var d=[];return function(){var a=!1;b(function(){a=!0});return function(d){a?d():b(d)}}}]},uf=function(){this.$get=["$q","$sniffer","$$animateAsyncRun",
+"$$isDocumentHidden","$timeout",function(a,b,d,c,e){function f(a){this.setHost(a);var b=d();this._doneCallbacks=[];this._tick=function(a){c()?e(a,0,!1):b(a)};this._state=0}f.chain=function(a,b){function c(){if(d===a.length)b(!0);else a[d](function(a){!1===a?b(!1):(d++,c())})}var d=0;c()};f.all=function(a,b){function c(f){e=e&&f;++d===a.length&&b(e)}var d=0,e=!0;p(a,function(a){a.done(c)})};f.prototype={setHost:function(a){this.host=a||{}},done:function(a){2===this._state?a():this._doneCallbacks.push(a)},
+progress:C,getPromise:function(){if(!this.promise){var b=this;this.promise=a(function(a,c){b.done(function(b){!1===b?c():a()})})}return this.promise},then:function(a,b){return this.getPromise().then(a,b)},"catch":function(a){return this.getPromise()["catch"](a)},"finally":function(a){return this.getPromise()["finally"](a)},pause:function(){this.host.pause&&this.host.pause()},resume:function(){this.host.resume&&this.host.resume()},end:function(){this.host.end&&this.host.end();this._resolve(!0)},cancel:function(){this.host.cancel&&
+this.host.cancel();this._resolve(!1)},complete:function(a){var b=this;0===b._state&&(b._state=1,b._tick(function(){b._resolve(a)}))},_resolve:function(a){2!==this._state&&(p(this._doneCallbacks,function(b){b(a)}),this._doneCallbacks.length=0,this._state=2)}};return f}]},rf=function(){this.$get=["$$rAF","$q","$$AnimateRunner",function(a,b,d){return function(b,e){function f(){a(function(){g.addClass&&(b.addClass(g.addClass),g.addClass=null);g.removeClass&&(b.removeClass(g.removeClass),g.removeClass=
+null);g.to&&(b.css(g.to),g.to=null);k||h.complete();k=!0});return h}var g=e||{};g.$$prepared||(g=pa(g));g.cleanupStyles&&(g.from=g.to=null);g.from&&(b.css(g.from),g.from=null);var k,h=new d;return{start:f,end:f}}}]},ba=M("$compile"),qc=new function(){};Yc.$inject=["$provide","$$sanitizeUriProvider"];Kb.prototype.isFirstChange=function(){return this.previousValue===qc};var od=/^((?:x|data)[:\-_])/i,tg=/[:\-_]+(.)/g,ud=M("$controller"),td=/^(\S+)(\s+as\s+([\w$]+))?$/,Cf=function(){this.$get=["$document",
+function(a){return function(b){b?!b.nodeType&&b instanceof A&&(b=b[0]):b=a[0].body;return b.offsetWidth+1}}]},vd="application/json",tc={"Content-Type":vd+";charset=utf-8"},wg=/^\[|^\{(?!\{)/,xg={"[":/]$/,"{":/}$/},vg=/^\)]\}',?\n/,Lb=M("$http"),Fa=$.$interpolateMinErr=M("$interpolate");Fa.throwNoconcat=function(a){throw Fa("noconcat",a);};Fa.interr=function(a,b){return Fa("interr",a,b.toString())};var Kf=function(){this.$get=function(){function a(a){var b=function(a){b.data=a;b.called=!0};b.id=a;
+return b}var b=$.callbacks,d={};return{createCallback:function(c){c="_"+(b.$$counter++).toString(36);var e="angular.callbacks."+c,f=a(c);d[e]=b[c]=f;return e},wasCalled:function(a){return d[a].called},getResponse:function(a){return d[a].data},removeCallback:function(a){delete b[d[a].id];delete d[a]}}}},ah=/^([^?#]*)(\?([^#]*))?(#(.*))?$/,zg={http:80,https:443,ftp:21},lb=M("$location"),Ag=/^\s*[\\/]{2,}/,bh={$$absUrl:"",$$html5:!1,$$replace:!1,absUrl:Mb("$$absUrl"),url:function(a){if(w(a))return this.$$url;
+var b=ah.exec(a);(b[1]||""===a)&&this.path(decodeURI(b[1]));(b[2]||b[1]||""===a)&&this.search(b[3]||"");this.hash(b[5]||"");return this},protocol:Mb("$$protocol"),host:Mb("$$host"),port:Mb("$$port"),path:Dd("$$path",function(a){a=null!==a?a.toString():"";return"/"===a.charAt(0)?a:"/"+a}),search:function(a,b){switch(arguments.length){case 0:return this.$$search;case 1:if(D(a)||Y(a))a=a.toString(),this.$$search=dc(a);else if(E(a))a=pa(a,{}),p(a,function(b,c){null==b&&delete a[c]}),this.$$search=a;else throw lb("isrcharg");
+break;default:w(b)||null===b?delete this.$$search[a]:this.$$search[a]=b}this.$$compose();return this},hash:Dd("$$hash",function(a){return null!==a?a.toString():""}),replace:function(){this.$$replace=!0;return this}};p([Cd,xc,wc],function(a){a.prototype=Object.create(bh);a.prototype.state=function(b){if(!arguments.length)return this.$$state;if(a!==wc||!this.$$html5)throw lb("nostate");this.$$state=w(b)?null:b;this.$$urlUpdatedByLocation=!0;return this}});var Ya=M("$parse"),Eg={}.constructor.prototype.valueOf,
+Tb=T();p("+ - * / % === !== == != < > <= >= && || ! = |".split(" "),function(a){Tb[a]=!0});var ch={n:"\n",f:"\f",r:"\r",t:"\t",v:"\v","'":"'",'"':'"'},Ac=function(a){this.options=a};Ac.prototype={constructor:Ac,lex:function(a){this.text=a;this.index=0;for(this.tokens=[];this.index<this.text.length;)if(a=this.text.charAt(this.index),'"'===a||"'"===a)this.readString(a);else if(this.isNumber(a)||"."===a&&this.isNumber(this.peek()))this.readNumber();else if(this.isIdentifierStart(this.peekMultichar()))this.readIdent();
+else if(this.is(a,"(){}[].,;:?"))this.tokens.push({index:this.index,text:a}),this.index++;else if(this.isWhitespace(a))this.index++;else{var b=a+this.peek(),d=b+this.peek(2),c=Tb[b],e=Tb[d];Tb[a]||c||e?(a=e?d:c?b:a,this.tokens.push({index:this.index,text:a,operator:!0}),this.index+=a.length):this.throwError("Unexpected next character ",this.index,this.index+1)}return this.tokens},is:function(a,b){return-1!==b.indexOf(a)},peek:function(a){a=a||1;return this.index+a<this.text.length?this.text.charAt(this.index+
+a):!1},isNumber:function(a){return"0"<=a&&"9">=a&&"string"===typeof a},isWhitespace:function(a){return" "===a||"\r"===a||"\t"===a||"\n"===a||"\v"===a||"\u00a0"===a},isIdentifierStart:function(a){return this.options.isIdentifierStart?this.options.isIdentifierStart(a,this.codePointAt(a)):this.isValidIdentifierStart(a)},isValidIdentifierStart:function(a){return"a"<=a&&"z">=a||"A"<=a&&"Z">=a||"_"===a||"$"===a},isIdentifierContinue:function(a){return this.options.isIdentifierContinue?this.options.isIdentifierContinue(a,
+this.codePointAt(a)):this.isValidIdentifierContinue(a)},isValidIdentifierContinue:function(a,b){return this.isValidIdentifierStart(a,b)||this.isNumber(a)},codePointAt:function(a){return 1===a.length?a.charCodeAt(0):(a.charCodeAt(0)<<10)+a.charCodeAt(1)-56613888},peekMultichar:function(){var a=this.text.charAt(this.index),b=this.peek();if(!b)return a;var d=a.charCodeAt(0),c=b.charCodeAt(0);return 55296<=d&&56319>=d&&56320<=c&&57343>=c?a+b:a},isExpOperator:function(a){return"-"===a||"+"===a||this.isNumber(a)},
+throwError:function(a,b,d){d=d||this.index;b=t(b)?"s "+b+"-"+this.index+" ["+this.text.substring(b,d)+"]":" "+d;throw Ya("lexerr",a,b,this.text);},readNumber:function(){for(var a="",b=this.index;this.index<this.text.length;){var d=N(this.text.charAt(this.index));if("."===d||this.isNumber(d))a+=d;else{var c=this.peek();if("e"===d&&this.isExpOperator(c))a+=d;else if(this.isExpOperator(d)&&c&&this.isNumber(c)&&"e"===a.charAt(a.length-1))a+=d;else if(!this.isExpOperator(d)||c&&this.isNumber(c)||"e"!==
+a.charAt(a.length-1))break;else this.throwError("Invalid exponent")}this.index++}this.tokens.push({index:b,text:a,constant:!0,value:Number(a)})},readIdent:function(){var a=this.index;for(this.index+=this.peekMultichar().length;this.index<this.text.length;){var b=this.peekMultichar();if(!this.isIdentifierContinue(b))break;this.index+=b.length}this.tokens.push({index:a,text:this.text.slice(a,this.index),identifier:!0})},readString:function(a){var b=this.index;this.index++;for(var d="",c=a,e=!1;this.index<
+this.text.length;){var f=this.text.charAt(this.index),c=c+f;if(e)"u"===f?(e=this.text.substring(this.index+1,this.index+5),e.match(/[\da-f]{4}/i)||this.throwError("Invalid unicode escape [\\u"+e+"]"),this.index+=4,d+=String.fromCharCode(parseInt(e,16))):d+=ch[f]||f,e=!1;else if("\\"===f)e=!0;else{if(f===a){this.index++;this.tokens.push({index:b,text:c,constant:!0,value:d});return}d+=f}this.index++}this.throwError("Unterminated quote",b)}};var r=function(a,b){this.lexer=a;this.options=b};r.Program=
+"Program";r.ExpressionStatement="ExpressionStatement";r.AssignmentExpression="AssignmentExpression";r.ConditionalExpression="ConditionalExpression";r.LogicalExpression="LogicalExpression";r.BinaryExpression="BinaryExpression";r.UnaryExpression="UnaryExpression";r.CallExpression="CallExpression";r.MemberExpression="MemberExpression";r.Identifier="Identifier";r.Literal="Literal";r.ArrayExpression="ArrayExpression";r.Property="Property";r.ObjectExpression="ObjectExpression";r.ThisExpression="ThisExpression";
+r.LocalsExpression="LocalsExpression";r.NGValueParameter="NGValueParameter";r.prototype={ast:function(a){this.text=a;this.tokens=this.lexer.lex(a);a=this.program();0!==this.tokens.length&&this.throwError("is an unexpected token",this.tokens[0]);return a},program:function(){for(var a=[];;)if(0<this.tokens.length&&!this.peek("}",")",";","]")&&a.push(this.expressionStatement()),!this.expect(";"))return{type:r.Program,body:a}},expressionStatement:function(){return{type:r.ExpressionStatement,expression:this.filterChain()}},
+filterChain:function(){for(var a=this.expression();this.expect("|");)a=this.filter(a);return a},expression:function(){return this.assignment()},assignment:function(){var a=this.ternary();if(this.expect("=")){if(!Hd(a))throw Ya("lval");a={type:r.AssignmentExpression,left:a,right:this.assignment(),operator:"="}}return a},ternary:function(){var a=this.logicalOR(),b,d;return this.expect("?")&&(b=this.expression(),this.consume(":"))?(d=this.expression(),{type:r.ConditionalExpression,test:a,alternate:b,
+consequent:d}):a},logicalOR:function(){for(var a=this.logicalAND();this.expect("||");)a={type:r.LogicalExpression,operator:"||",left:a,right:this.logicalAND()};return a},logicalAND:function(){for(var a=this.equality();this.expect("&&");)a={type:r.LogicalExpression,operator:"&&",left:a,right:this.equality()};return a},equality:function(){for(var a=this.relational(),b;b=this.expect("==","!=","===","!==");)a={type:r.BinaryExpression,operator:b.text,left:a,right:this.relational()};return a},relational:function(){for(var a=
+this.additive(),b;b=this.expect("<",">","<=",">=");)a={type:r.BinaryExpression,operator:b.text,left:a,right:this.additive()};return a},additive:function(){for(var a=this.multiplicative(),b;b=this.expect("+","-");)a={type:r.BinaryExpression,operator:b.text,left:a,right:this.multiplicative()};return a},multiplicative:function(){for(var a=this.unary(),b;b=this.expect("*","/","%");)a={type:r.BinaryExpression,operator:b.text,left:a,right:this.unary()};return a},unary:function(){var a;return(a=this.expect("+",
+"-","!"))?{type:r.UnaryExpression,operator:a.text,prefix:!0,argument:this.unary()}:this.primary()},primary:function(){var a;this.expect("(")?(a=this.filterChain(),this.consume(")")):this.expect("[")?a=this.arrayDeclaration():this.expect("{")?a=this.object():this.selfReferential.hasOwnProperty(this.peek().text)?a=pa(this.selfReferential[this.consume().text]):this.options.literals.hasOwnProperty(this.peek().text)?a={type:r.Literal,value:this.options.literals[this.consume().text]}:this.peek().identifier?
+a=this.identifier():this.peek().constant?a=this.constant():this.throwError("not a primary expression",this.peek());for(var b;b=this.expect("(","[",".");)"("===b.text?(a={type:r.CallExpression,callee:a,arguments:this.parseArguments()},this.consume(")")):"["===b.text?(a={type:r.MemberExpression,object:a,property:this.expression(),computed:!0},this.consume("]")):"."===b.text?a={type:r.MemberExpression,object:a,property:this.identifier(),computed:!1}:this.throwError("IMPOSSIBLE");return a},filter:function(a){a=
+[a];for(var b={type:r.CallExpression,callee:this.identifier(),arguments:a,filter:!0};this.expect(":");)a.push(this.expression());return b},parseArguments:function(){var a=[];if(")"!==this.peekToken().text){do a.push(this.filterChain());while(this.expect(","))}return a},identifier:function(){var a=this.consume();a.identifier||this.throwError("is not a valid identifier",a);return{type:r.Identifier,name:a.text}},constant:function(){return{type:r.Literal,value:this.consume().value}},arrayDeclaration:function(){var a=
+[];if("]"!==this.peekToken().text){do{if(this.peek("]"))break;a.push(this.expression())}while(this.expect(","))}this.consume("]");return{type:r.ArrayExpression,elements:a}},object:function(){var a=[],b;if("}"!==this.peekToken().text){do{if(this.peek("}"))break;b={type:r.Property,kind:"init"};this.peek().constant?(b.key=this.constant(),b.computed=!1,this.consume(":"),b.value=this.expression()):this.peek().identifier?(b.key=this.identifier(),b.computed=!1,this.peek(":")?(this.consume(":"),b.value=this.expression()):
+b.value=b.key):this.peek("[")?(this.consume("["),b.key=this.expression(),this.consume("]"),b.computed=!0,this.consume(":"),b.value=this.expression()):this.throwError("invalid key",this.peek());a.push(b)}while(this.expect(","))}this.consume("}");return{type:r.ObjectExpression,properties:a}},throwError:function(a,b){throw Ya("syntax",b.text,a,b.index+1,this.text,this.text.substring(b.index));},consume:function(a){if(0===this.tokens.length)throw Ya("ueoe",this.text);var b=this.expect(a);b||this.throwError("is unexpected, expecting ["+
+a+"]",this.peek());return b},peekToken:function(){if(0===this.tokens.length)throw Ya("ueoe",this.text);return this.tokens[0]},peek:function(a,b,d,c){return this.peekAhead(0,a,b,d,c)},peekAhead:function(a,b,d,c,e){if(this.tokens.length>a){a=this.tokens[a];var f=a.text;if(f===b||f===d||f===c||f===e||!(b||d||c||e))return a}return!1},expect:function(a,b,d,c){return(a=this.peek(a,b,d,c))?(this.tokens.shift(),a):!1},selfReferential:{"this":{type:r.ThisExpression},$locals:{type:r.LocalsExpression}}};var Fd=
+2;Jd.prototype={compile:function(a){var b=this;this.state={nextId:0,filters:{},fn:{vars:[],body:[],own:{}},assign:{vars:[],body:[],own:{}},inputs:[]};W(a,b.$filter);var d="",c;this.stage="assign";if(c=Id(a))this.state.computing="assign",d=this.nextId(),this.recurse(c,d),this.return_(d),d="fn.assign="+this.generateFunction("assign","s,v,l");c=Gd(a.body);b.stage="inputs";p(c,function(a,c){var d="fn"+c;b.state[d]={vars:[],body:[],own:{}};b.state.computing=d;var k=b.nextId();b.recurse(a,k);b.return_(k);
+b.state.inputs.push({name:d,isPure:a.isPure});a.watchId=c});this.state.computing="fn";this.stage="main";this.recurse(a);a='"'+this.USE+" "+this.STRICT+'";\n'+this.filterPrefix()+"var fn="+this.generateFunction("fn","s,l,a,i")+d+this.watchFns()+"return fn;";a=(new Function("$filter","getStringValue","ifDefined","plus",a))(this.$filter,Bg,Cg,Ed);this.state=this.stage=void 0;return a},USE:"use",STRICT:"strict",watchFns:function(){var a=[],b=this.state.inputs,d=this;p(b,function(b){a.push("var "+b.name+
+"="+d.generateFunction(b.name,"s"));b.isPure&&a.push(b.name,".isPure="+JSON.stringify(b.isPure)+";")});b.length&&a.push("fn.inputs=["+b.map(function(a){return a.name}).join(",")+"];");return a.join("")},generateFunction:function(a,b){return"function("+b+"){"+this.varsPrefix(a)+this.body(a)+"};"},filterPrefix:function(){var a=[],b=this;p(this.state.filters,function(d,c){a.push(d+"=$filter("+b.escape(c)+")")});return a.length?"var "+a.join(",")+";":""},varsPrefix:function(a){return this.state[a].vars.length?
+"var "+this.state[a].vars.join(",")+";":""},body:function(a){return this.state[a].body.join("")},recurse:function(a,b,d,c,e,f){var g,k,h=this,l,m,n;c=c||C;if(!f&&t(a.watchId))b=b||this.nextId(),this.if_("i",this.lazyAssign(b,this.computedMember("i",a.watchId)),this.lazyRecurse(a,b,d,c,e,!0));else switch(a.type){case r.Program:p(a.body,function(b,c){h.recurse(b.expression,void 0,void 0,function(a){k=a});c!==a.body.length-1?h.current().body.push(k,";"):h.return_(k)});break;case r.Literal:m=this.escape(a.value);
+this.assign(b,m);c(b||m);break;case r.UnaryExpression:this.recurse(a.argument,void 0,void 0,function(a){k=a});m=a.operator+"("+this.ifDefined(k,0)+")";this.assign(b,m);c(m);break;case r.BinaryExpression:this.recurse(a.left,void 0,void 0,function(a){g=a});this.recurse(a.right,void 0,void 0,function(a){k=a});m="+"===a.operator?this.plus(g,k):"-"===a.operator?this.ifDefined(g,0)+a.operator+this.ifDefined(k,0):"("+g+")"+a.operator+"("+k+")";this.assign(b,m);c(m);break;case r.LogicalExpression:b=b||this.nextId();
+h.recurse(a.left,b);h.if_("&&"===a.operator?b:h.not(b),h.lazyRecurse(a.right,b));c(b);break;case r.ConditionalExpression:b=b||this.nextId();h.recurse(a.test,b);h.if_(b,h.lazyRecurse(a.alternate,b),h.lazyRecurse(a.consequent,b));c(b);break;case r.Identifier:b=b||this.nextId();d&&(d.context="inputs"===h.stage?"s":this.assign(this.nextId(),this.getHasOwnProperty("l",a.name)+"?l:s"),d.computed=!1,d.name=a.name);h.if_("inputs"===h.stage||h.not(h.getHasOwnProperty("l",a.name)),function(){h.if_("inputs"===
+h.stage||"s",function(){e&&1!==e&&h.if_(h.isNull(h.nonComputedMember("s",a.name)),h.lazyAssign(h.nonComputedMember("s",a.name),"{}"));h.assign(b,h.nonComputedMember("s",a.name))})},b&&h.lazyAssign(b,h.nonComputedMember("l",a.name)));c(b);break;case r.MemberExpression:g=d&&(d.context=this.nextId())||this.nextId();b=b||this.nextId();h.recurse(a.object,g,void 0,function(){h.if_(h.notNull(g),function(){a.computed?(k=h.nextId(),h.recurse(a.property,k),h.getStringValue(k),e&&1!==e&&h.if_(h.not(h.computedMember(g,
+k)),h.lazyAssign(h.computedMember(g,k),"{}")),m=h.computedMember(g,k),h.assign(b,m),d&&(d.computed=!0,d.name=k)):(e&&1!==e&&h.if_(h.isNull(h.nonComputedMember(g,a.property.name)),h.lazyAssign(h.nonComputedMember(g,a.property.name),"{}")),m=h.nonComputedMember(g,a.property.name),h.assign(b,m),d&&(d.computed=!1,d.name=a.property.name))},function(){h.assign(b,"undefined")});c(b)},!!e);break;case r.CallExpression:b=b||this.nextId();a.filter?(k=h.filter(a.callee.name),l=[],p(a.arguments,function(a){var b=
+h.nextId();h.recurse(a,b);l.push(b)}),m=k+"("+l.join(",")+")",h.assign(b,m),c(b)):(k=h.nextId(),g={},l=[],h.recurse(a.callee,k,g,function(){h.if_(h.notNull(k),function(){p(a.arguments,function(b){h.recurse(b,a.constant?void 0:h.nextId(),void 0,function(a){l.push(a)})});m=g.name?h.member(g.context,g.name,g.computed)+"("+l.join(",")+")":k+"("+l.join(",")+")";h.assign(b,m)},function(){h.assign(b,"undefined")});c(b)}));break;case r.AssignmentExpression:k=this.nextId();g={};this.recurse(a.left,void 0,
+g,function(){h.if_(h.notNull(g.context),function(){h.recurse(a.right,k);m=h.member(g.context,g.name,g.computed)+a.operator+k;h.assign(b,m);c(b||m)})},1);break;case r.ArrayExpression:l=[];p(a.elements,function(b){h.recurse(b,a.constant?void 0:h.nextId(),void 0,function(a){l.push(a)})});m="["+l.join(",")+"]";this.assign(b,m);c(b||m);break;case r.ObjectExpression:l=[];n=!1;p(a.properties,function(a){a.computed&&(n=!0)});n?(b=b||this.nextId(),this.assign(b,"{}"),p(a.properties,function(a){a.computed?
+(g=h.nextId(),h.recurse(a.key,g)):g=a.key.type===r.Identifier?a.key.name:""+a.key.value;k=h.nextId();h.recurse(a.value,k);h.assign(h.member(b,g,a.computed),k)})):(p(a.properties,function(b){h.recurse(b.value,a.constant?void 0:h.nextId(),void 0,function(a){l.push(h.escape(b.key.type===r.Identifier?b.key.name:""+b.key.value)+":"+a)})}),m="{"+l.join(",")+"}",this.assign(b,m));c(b||m);break;case r.ThisExpression:this.assign(b,"s");c(b||"s");break;case r.LocalsExpression:this.assign(b,"l");c(b||"l");break;
+case r.NGValueParameter:this.assign(b,"v"),c(b||"v")}},getHasOwnProperty:function(a,b){var d=a+"."+b,c=this.current().own;c.hasOwnProperty(d)||(c[d]=this.nextId(!1,a+"&&("+this.escape(b)+" in "+a+")"));return c[d]},assign:function(a,b){if(a)return this.current().body.push(a,"=",b,";"),a},filter:function(a){this.state.filters.hasOwnProperty(a)||(this.state.filters[a]=this.nextId(!0));return this.state.filters[a]},ifDefined:function(a,b){return"ifDefined("+a+","+this.escape(b)+")"},plus:function(a,
+b){return"plus("+a+","+b+")"},return_:function(a){this.current().body.push("return ",a,";")},if_:function(a,b,d){if(!0===a)b();else{var c=this.current().body;c.push("if(",a,"){");b();c.push("}");d&&(c.push("else{"),d(),c.push("}"))}},not:function(a){return"!("+a+")"},isNull:function(a){return a+"==null"},notNull:function(a){return a+"!=null"},nonComputedMember:function(a,b){var d=/[^$_a-zA-Z0-9]/g;return/^[$_a-zA-Z][$_a-zA-Z0-9]*$/.test(b)?a+"."+b:a+'["'+b.replace(d,this.stringEscapeFn)+'"]'},computedMember:function(a,
+b){return a+"["+b+"]"},member:function(a,b,d){return d?this.computedMember(a,b):this.nonComputedMember(a,b)},getStringValue:function(a){this.assign(a,"getStringValue("+a+")")},lazyRecurse:function(a,b,d,c,e,f){var g=this;return function(){g.recurse(a,b,d,c,e,f)}},lazyAssign:function(a,b){var d=this;return function(){d.assign(a,b)}},stringEscapeRegex:/[^ a-zA-Z0-9]/g,stringEscapeFn:function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)},escape:function(a){if(D(a))return"'"+a.replace(this.stringEscapeRegex,
+this.stringEscapeFn)+"'";if(Y(a))return a.toString();if(!0===a)return"true";if(!1===a)return"false";if(null===a)return"null";if("undefined"===typeof a)return"undefined";throw Ya("esc");},nextId:function(a,b){var d="v"+this.state.nextId++;a||this.current().vars.push(d+(b?"="+b:""));return d},current:function(){return this.state[this.state.computing]}};Kd.prototype={compile:function(a){var b=this;W(a,b.$filter);var d,c;if(d=Id(a))c=this.recurse(d);d=Gd(a.body);var e;d&&(e=[],p(d,function(a,c){var d=
+b.recurse(a);d.isPure=a.isPure;a.input=d;e.push(d);a.watchId=c}));var f=[];p(a.body,function(a){f.push(b.recurse(a.expression))});a=0===a.body.length?C:1===a.body.length?f[0]:function(a,b){var c;p(f,function(d){c=d(a,b)});return c};c&&(a.assign=function(a,b,d){return c(a,d,b)});e&&(a.inputs=e);return a},recurse:function(a,b,d){var c,e,f=this,g;if(a.input)return this.inputs(a.input,a.watchId);switch(a.type){case r.Literal:return this.value(a.value,b);case r.UnaryExpression:return e=this.recurse(a.argument),
+this["unary"+a.operator](e,b);case r.BinaryExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case r.LogicalExpression:return c=this.recurse(a.left),e=this.recurse(a.right),this["binary"+a.operator](c,e,b);case r.ConditionalExpression:return this["ternary?:"](this.recurse(a.test),this.recurse(a.alternate),this.recurse(a.consequent),b);case r.Identifier:return f.identifier(a.name,b,d);case r.MemberExpression:return c=this.recurse(a.object,!1,!!d),a.computed||
+(e=a.property.name),a.computed&&(e=this.recurse(a.property)),a.computed?this.computedMember(c,e,b,d):this.nonComputedMember(c,e,b,d);case r.CallExpression:return g=[],p(a.arguments,function(a){g.push(f.recurse(a))}),a.filter&&(e=this.$filter(a.callee.name)),a.filter||(e=this.recurse(a.callee,!0)),a.filter?function(a,c,d,f){for(var n=[],q=0;q<g.length;++q)n.push(g[q](a,c,d,f));a=e.apply(void 0,n,f);return b?{context:void 0,name:void 0,value:a}:a}:function(a,c,d,f){var n=e(a,c,d,f),q;if(null!=n.value){q=
+[];for(var p=0;p<g.length;++p)q.push(g[p](a,c,d,f));q=n.value.apply(n.context,q)}return b?{value:q}:q};case r.AssignmentExpression:return c=this.recurse(a.left,!0,1),e=this.recurse(a.right),function(a,d,f,g){var n=c(a,d,f,g);a=e(a,d,f,g);n.context[n.name]=a;return b?{value:a}:a};case r.ArrayExpression:return g=[],p(a.elements,function(a){g.push(f.recurse(a))}),function(a,c,d,e){for(var f=[],q=0;q<g.length;++q)f.push(g[q](a,c,d,e));return b?{value:f}:f};case r.ObjectExpression:return g=[],p(a.properties,
+function(a){a.computed?g.push({key:f.recurse(a.key),computed:!0,value:f.recurse(a.value)}):g.push({key:a.key.type===r.Identifier?a.key.name:""+a.key.value,computed:!1,value:f.recurse(a.value)})}),function(a,c,d,e){for(var f={},q=0;q<g.length;++q)g[q].computed?f[g[q].key(a,c,d,e)]=g[q].value(a,c,d,e):f[g[q].key]=g[q].value(a,c,d,e);return b?{value:f}:f};case r.ThisExpression:return function(a){return b?{value:a}:a};case r.LocalsExpression:return function(a,c){return b?{value:c}:c};case r.NGValueParameter:return function(a,
+c,d){return b?{value:d}:d}}},"unary+":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=t(d)?+d:0;return b?{value:d}:d}},"unary-":function(a,b){return function(d,c,e,f){d=a(d,c,e,f);d=t(d)?-d:-0;return b?{value:d}:d}},"unary!":function(a,b){return function(d,c,e,f){d=!a(d,c,e,f);return b?{value:d}:d}},"binary+":function(a,b,d){return function(c,e,f,g){var k=a(c,e,f,g);c=b(c,e,f,g);k=Ed(k,c);return d?{value:k}:k}},"binary-":function(a,b,d){return function(c,e,f,g){var k=a(c,e,f,g);c=b(c,e,f,g);
+k=(t(k)?k:0)-(t(c)?c:0);return d?{value:k}:k}},"binary*":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)*b(c,e,f,g);return d?{value:c}:c}},"binary/":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)/b(c,e,f,g);return d?{value:c}:c}},"binary%":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)%b(c,e,f,g);return d?{value:c}:c}},"binary===":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)===b(c,e,f,g);return d?{value:c}:c}},"binary!==":function(a,b,d){return function(c,e,f,g){c=a(c,
+e,f,g)!==b(c,e,f,g);return d?{value:c}:c}},"binary==":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)==b(c,e,f,g);return d?{value:c}:c}},"binary!=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)!=b(c,e,f,g);return d?{value:c}:c}},"binary<":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)<b(c,e,f,g);return d?{value:c}:c}},"binary>":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>b(c,e,f,g);return d?{value:c}:c}},"binary<=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,
+g)<=b(c,e,f,g);return d?{value:c}:c}},"binary>=":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)>=b(c,e,f,g);return d?{value:c}:c}},"binary&&":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)&&b(c,e,f,g);return d?{value:c}:c}},"binary||":function(a,b,d){return function(c,e,f,g){c=a(c,e,f,g)||b(c,e,f,g);return d?{value:c}:c}},"ternary?:":function(a,b,d,c){return function(e,f,g,k){e=a(e,f,g,k)?b(e,f,g,k):d(e,f,g,k);return c?{value:e}:e}},value:function(a,b){return function(){return b?{context:void 0,
+name:void 0,value:a}:a}},identifier:function(a,b,d){return function(c,e,f,g){c=e&&a in e?e:c;d&&1!==d&&c&&null==c[a]&&(c[a]={});e=c?c[a]:void 0;return b?{context:c,name:a,value:e}:e}},computedMember:function(a,b,d,c){return function(e,f,g,k){var h=a(e,f,g,k),l,m;null!=h&&(l=b(e,f,g,k),l+="",c&&1!==c&&h&&!h[l]&&(h[l]={}),m=h[l]);return d?{context:h,name:l,value:m}:m}},nonComputedMember:function(a,b,d,c){return function(e,f,g,k){e=a(e,f,g,k);c&&1!==c&&e&&null==e[b]&&(e[b]={});f=null!=e?e[b]:void 0;
+return d?{context:e,name:b,value:f}:f}},inputs:function(a,b){return function(d,c,e,f){return f?f[b]:a(d,c,e)}}};yc.prototype={constructor:yc,parse:function(a){a=this.ast.ast(a);var b=this.astCompiler.compile(a);b.literal=0===a.body.length||1===a.body.length&&(a.body[0].expression.type===r.Literal||a.body[0].expression.type===r.ArrayExpression||a.body[0].expression.type===r.ObjectExpression);b.constant=a.constant;return b}};var wa=M("$sce"),oa={HTML:"html",CSS:"css",URL:"url",RESOURCE_URL:"resourceUrl",
+JS:"js"},Bc=/_([a-z])/g,Gg=M("$compile"),X=u.document.createElement("a"),Od=ua(u.location.href);Pd.$inject=["$document"];ed.$inject=["$provide"];var Wd=22,Vd=".",Dc="0";Qd.$inject=["$locale"];Sd.$inject=["$locale"];var Rg={yyyy:da("FullYear",4,0,!1,!0),yy:da("FullYear",2,0,!0,!0),y:da("FullYear",1,0,!1,!0),MMMM:nb("Month"),MMM:nb("Month",!0),MM:da("Month",2,1),M:da("Month",1,1),LLLL:nb("Month",!1,!0),dd:da("Date",2),d:da("Date",1),HH:da("Hours",2),H:da("Hours",1),hh:da("Hours",2,-12),h:da("Hours",
+1,-12),mm:da("Minutes",2),m:da("Minutes",1),ss:da("Seconds",2),s:da("Seconds",1),sss:da("Milliseconds",3),EEEE:nb("Day"),EEE:nb("Day",!0),a:function(a,b){return 12>a.getHours()?b.AMPMS[0]:b.AMPMS[1]},Z:function(a,b,d){a=-1*d;return a=(0<=a?"+":"")+(Nb(Math[0<a?"floor":"ceil"](a/60),2)+Nb(Math.abs(a%60),2))},ww:Yd(2),w:Yd(1),G:Ec,GG:Ec,GGG:Ec,GGGG:function(a,b){return 0>=a.getFullYear()?b.ERANAMES[0]:b.ERANAMES[1]}},Qg=/((?:[^yMLdHhmsaZEwG']+)|(?:'(?:[^']|'')*')|(?:E+|y+|M+|L+|d+|H+|h+|m+|s+|a|Z|G+|w+))([\s\S]*)/,
+Pg=/^-?\d+$/;Rd.$inject=["$locale"];var Kg=ka(N),Lg=ka(vb);Td.$inject=["$parse"];var He=ka({restrict:"E",compile:function(a,b){if(!b.href&&!b.xlinkHref)return function(a,b){if("a"===b[0].nodeName.toLowerCase()){var e="[object SVGAnimatedString]"===ha.call(b.prop("href"))?"xlink:href":"href";b.on("click",function(a){b.attr(e)||a.preventDefault()})}}}}),wb={};p(Hb,function(a,b){function d(a,d,e){a.$watch(e[c],function(a){e.$set(b,!!a)})}if("multiple"!==a){var c=Ea("ng-"+b),e=d;"checked"===a&&(e=function(a,
+b,e){e.ngModel!==e[c]&&d(a,b,e)});wb[c]=function(){return{restrict:"A",priority:100,link:e}}}});p(sd,function(a,b){wb[b]=function(){return{priority:100,link:function(a,c,e){if("ngPattern"===b&&"/"===e.ngPattern.charAt(0)&&(c=e.ngPattern.match(Vg))){e.$set("ngPattern",new RegExp(c[1],c[2]));return}a.$watch(e[b],function(a){e.$set(b,a)})}}}});p(["src","srcset","href"],function(a){var b=Ea("ng-"+a);wb[b]=function(){return{priority:99,link:function(d,c,e){var f=a,g=a;"href"===a&&"[object SVGAnimatedString]"===
+ha.call(c.prop("href"))&&(g="xlinkHref",e.$attr[g]="xlink:href",f=null);e.$observe(b,function(b){b?(e.$set(g,b),Ca&&f&&c.prop(f,e[g])):"href"===a&&e.$set(g,null)})}}}});var Pb={$addControl:C,$$renameControl:function(a,b){a.$name=b},$removeControl:C,$setValidity:C,$setDirty:C,$setPristine:C,$setSubmitted:C};Ob.$inject=["$element","$attrs","$scope","$animate","$interpolate"];Ob.prototype={$rollbackViewValue:function(){p(this.$$controls,function(a){a.$rollbackViewValue()})},$commitViewValue:function(){p(this.$$controls,
+function(a){a.$commitViewValue()})},$addControl:function(a){Ia(a.$name,"input");this.$$controls.push(a);a.$name&&(this[a.$name]=a);a.$$parentForm=this},$$renameControl:function(a,b){var d=a.$name;this[d]===a&&delete this[d];this[b]=a;a.$name=b},$removeControl:function(a){a.$name&&this[a.$name]===a&&delete this[a.$name];p(this.$pending,function(b,d){this.$setValidity(d,null,a)},this);p(this.$error,function(b,d){this.$setValidity(d,null,a)},this);p(this.$$success,function(b,d){this.$setValidity(d,null,
+a)},this);db(this.$$controls,a);a.$$parentForm=Pb},$setDirty:function(){this.$$animate.removeClass(this.$$element,Za);this.$$animate.addClass(this.$$element,Ub);this.$dirty=!0;this.$pristine=!1;this.$$parentForm.$setDirty()},$setPristine:function(){this.$$animate.setClass(this.$$element,Za,Ub+" ng-submitted");this.$dirty=!1;this.$pristine=!0;this.$submitted=!1;p(this.$$controls,function(a){a.$setPristine()})},$setUntouched:function(){p(this.$$controls,function(a){a.$setUntouched()})},$setSubmitted:function(){this.$$animate.addClass(this.$$element,
+"ng-submitted");this.$submitted=!0;this.$$parentForm.$setSubmitted()}};ae({clazz:Ob,set:function(a,b,d){var c=a[b];c?-1===c.indexOf(d)&&c.push(d):a[b]=[d]},unset:function(a,b,d){var c=a[b];c&&(db(c,d),0===c.length&&delete a[b])}});var ie=function(a){return["$timeout","$parse",function(b,d){function c(a){return""===a?d('this[""]').assign:d(a).assign||C}return{name:"form",restrict:a?"EAC":"E",require:["form","^^?form"],controller:Ob,compile:function(d,f){d.addClass(Za).addClass(ob);var g=f.name?"name":
+a&&f.ngForm?"ngForm":!1;return{pre:function(a,d,e,f){var n=f[0];if(!("action"in e)){var q=function(b){a.$apply(function(){n.$commitViewValue();n.$setSubmitted()});b.preventDefault()};d[0].addEventListener("submit",q);d.on("$destroy",function(){b(function(){d[0].removeEventListener("submit",q)},0,!1)})}(f[1]||n.$$parentForm).$addControl(n);var p=g?c(n.$name):C;g&&(p(a,n),e.$observe(g,function(b){n.$name!==b&&(p(a,void 0),n.$$parentForm.$$renameControl(n,b),p=c(n.$name),p(a,n))}));d.on("$destroy",function(){n.$$parentForm.$removeControl(n);
+p(a,void 0);Q(n,Pb)})}}}}}]},Ie=ie(),Ue=ie(!0),Sg=/^\d{4,}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+(?:[+-][0-2]\d:[0-5]\d|Z)$/,dh=/^[a-z][a-z\d.+-]*:\/*(?:[^:@]+(?::[^@]+)?@)?(?:[^\s:/?#]+|\[[a-f\d:]+])(?::\d+)?(?:\/[^?#]*)?(?:\?[^#]*)?(?:#.*)?$/i,eh=/^(?=.{1,254}$)(?=.{1,64}@)[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+(\.[-!#$%&'*+/0-9=?A-Z^_`a-z{|}~]+)*@[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?(\.[A-Za-z0-9]([A-Za-z0-9-]{0,61}[A-Za-z0-9])?)*$/,Tg=/^\s*(-|\+)?(\d+|(\d*(\.\d*)))([eE][+-]?\d+)?\s*$/,je=/^(\d{4,})-(\d{2})-(\d{2})$/,
+ke=/^(\d{4,})-(\d\d)-(\d\d)T(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,Lc=/^(\d{4,})-W(\d\d)$/,le=/^(\d{4,})-(\d\d)$/,me=/^(\d\d):(\d\d)(?::(\d\d)(\.\d{1,3})?)?$/,ce=T();p(["date","datetime-local","month","time","week"],function(a){ce[a]=!0});var ne={text:function(a,b,d,c,e,f){Wa(a,b,d,c,e,f);Gc(c)},date:pb("date",je,Qb(je,["yyyy","MM","dd"]),"yyyy-MM-dd"),"datetime-local":pb("datetimelocal",ke,Qb(ke,"yyyy MM dd HH mm ss sss".split(" ")),"yyyy-MM-ddTHH:mm:ss.sss"),time:pb("time",me,Qb(me,["HH","mm",
+"ss","sss"]),"HH:mm:ss.sss"),week:pb("week",Lc,function(a,b){if(ea(a))return a;if(D(a)){Lc.lastIndex=0;var d=Lc.exec(a);if(d){var c=+d[1],e=+d[2],f=d=0,g=0,k=0,h=Xd(c),e=7*(e-1);b&&(d=b.getHours(),f=b.getMinutes(),g=b.getSeconds(),k=b.getMilliseconds());return new Date(c,0,h.getDate()+e,d,f,g,k)}}return NaN},"yyyy-Www"),month:pb("month",le,Qb(le,["yyyy","MM"]),"yyyy-MM"),number:function(a,b,d,c,e,f){Hc(a,b,d,c);de(c);Wa(a,b,d,c,e,f);var g,k;if(t(d.min)||d.ngMin)c.$validators.min=function(a){return c.$isEmpty(a)||
+w(g)||a>=g},d.$observe("min",function(a){g=Xa(a);c.$validate()});if(t(d.max)||d.ngMax)c.$validators.max=function(a){return c.$isEmpty(a)||w(k)||a<=k},d.$observe("max",function(a){k=Xa(a);c.$validate()});if(t(d.step)||d.ngStep){var h;c.$validators.step=function(a,b){return c.$isEmpty(b)||w(h)||ee(b,g||0,h)};d.$observe("step",function(a){h=Xa(a);c.$validate()})}},url:function(a,b,d,c,e,f){Wa(a,b,d,c,e,f);Gc(c);c.$$parserName="url";c.$validators.url=function(a,b){var d=a||b;return c.$isEmpty(d)||dh.test(d)}},
+email:function(a,b,d,c,e,f){Wa(a,b,d,c,e,f);Gc(c);c.$$parserName="email";c.$validators.email=function(a,b){var d=a||b;return c.$isEmpty(d)||eh.test(d)}},radio:function(a,b,d,c){var e=!d.ngTrim||"false"!==R(d.ngTrim);w(d.name)&&b.attr("name",++rb);b.on("click",function(a){var g;b[0].checked&&(g=d.value,e&&(g=R(g)),c.$setViewValue(g,a&&a.type))});c.$render=function(){var a=d.value;e&&(a=R(a));b[0].checked=a===c.$viewValue};d.$observe("value",c.$render)},range:function(a,b,d,c,e,f){function g(a,c){b.attr(a,
+d[a]);d.$observe(a,c)}function k(a){n=Xa(a);U(c.$modelValue)||(m?(a=b.val(),n>a&&(a=n,b.val(a)),c.$setViewValue(a)):c.$validate())}function h(a){q=Xa(a);U(c.$modelValue)||(m?(a=b.val(),q<a&&(b.val(q),a=q<n?n:q),c.$setViewValue(a)):c.$validate())}function l(a){p=Xa(a);U(c.$modelValue)||(m&&c.$viewValue!==b.val()?c.$setViewValue(b.val()):c.$validate())}Hc(a,b,d,c);de(c);Wa(a,b,d,c,e,f);var m=c.$$hasNativeValidators&&"range"===b[0].type,n=m?0:void 0,q=m?100:void 0,p=m?1:void 0,r=b[0].validity;a=t(d.min);
+e=t(d.max);f=t(d.step);var z=c.$render;c.$render=m&&t(r.rangeUnderflow)&&t(r.rangeOverflow)?function(){z();c.$setViewValue(b.val())}:z;a&&(c.$validators.min=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||w(n)||b>=n},g("min",k));e&&(c.$validators.max=m?function(){return!0}:function(a,b){return c.$isEmpty(b)||w(q)||b<=q},g("max",h));f&&(c.$validators.step=m?function(){return!r.stepMismatch}:function(a,b){return c.$isEmpty(b)||w(p)||ee(b,n||0,p)},g("step",l))},checkbox:function(a,b,d,c,e,
+f,g,k){var h=fe(k,a,"ngTrueValue",d.ngTrueValue,!0),l=fe(k,a,"ngFalseValue",d.ngFalseValue,!1);b.on("click",function(a){c.$setViewValue(b[0].checked,a&&a.type)});c.$render=function(){b[0].checked=c.$viewValue};c.$isEmpty=function(a){return!1===a};c.$formatters.push(function(a){return sa(a,h)});c.$parsers.push(function(a){return a?h:l})},hidden:C,button:C,submit:C,reset:C,file:C},Zc=["$browser","$sniffer","$filter","$parse",function(a,b,d,c){return{restrict:"E",require:["?ngModel"],link:{pre:function(e,
+f,g,k){k[0]&&(ne[N(g.type)]||ne.text)(e,f,g,k[0],b,a,d,c)}}}}],fh=/^(true|false|\d+)$/,mf=function(){function a(a,d,c){var e=t(c)?c:9===Ca?"":null;a.prop("value",e);d.$set("value",c)}return{restrict:"A",priority:100,compile:function(b,d){return fh.test(d.ngValue)?function(b,d,f){b=b.$eval(f.ngValue);a(d,f,b)}:function(b,d,f){b.$watch(f.ngValue,function(b){a(d,f,b)})}}}},Me=["$compile",function(a){return{restrict:"AC",compile:function(b){a.$$addBindingClass(b);return function(b,c,e){a.$$addBindingInfo(c,
+e.ngBind);c=c[0];b.$watch(e.ngBind,function(a){c.textContent=fc(a)})}}}}],Oe=["$interpolate","$compile",function(a,b){return{compile:function(d){b.$$addBindingClass(d);return function(c,d,f){c=a(d.attr(f.$attr.ngBindTemplate));b.$$addBindingInfo(d,c.expressions);d=d[0];f.$observe("ngBindTemplate",function(a){d.textContent=w(a)?"":a})}}}}],Ne=["$sce","$parse","$compile",function(a,b,d){return{restrict:"A",compile:function(c,e){var f=b(e.ngBindHtml),g=b(e.ngBindHtml,function(b){return a.valueOf(b)});
+d.$$addBindingClass(c);return function(b,c,e){d.$$addBindingInfo(c,e.ngBindHtml);b.$watch(g,function(){var d=f(b);c.html(a.getTrustedHtml(d)||"")})}}}}],lf=ka({restrict:"A",require:"ngModel",link:function(a,b,d,c){c.$viewChangeListeners.push(function(){a.$eval(d.ngChange)})}}),Pe=Jc("",!0),Re=Jc("Odd",0),Qe=Jc("Even",1),Se=Qa({compile:function(a,b){b.$set("ngCloak",void 0);a.removeClass("ng-cloak")}}),Te=[function(){return{restrict:"A",scope:!0,controller:"@",priority:500}}],dd={},gh={blur:!0,focus:!0};
+p("click dblclick mousedown mouseup mouseover mouseout mousemove mouseenter mouseleave keydown keyup keypress submit focus blur copy cut paste".split(" "),function(a){var b=Ea("ng-"+a);dd[b]=["$parse","$rootScope",function(d,c){return{restrict:"A",compile:function(e,f){var g=d(f[b]);return function(b,d){d.on(a,function(d){var e=function(){g(b,{$event:d})};gh[a]&&c.$$phase?b.$evalAsync(e):b.$apply(e)})}}}}]});var We=["$animate","$compile",function(a,b){return{multiElement:!0,transclude:"element",priority:600,
+terminal:!0,restrict:"A",$$tlb:!0,link:function(d,c,e,f,g){var k,h,l;d.$watch(e.ngIf,function(d){d?h||g(function(d,f){h=f;d[d.length++]=b.$$createComment("end ngIf",e.ngIf);k={clone:d};a.enter(d,c.parent(),c)}):(l&&(l.remove(),l=null),h&&(h.$destroy(),h=null),k&&(l=ub(k.clone),a.leave(l).done(function(a){!1!==a&&(l=null)}),k=null))})}}}],Xe=["$templateRequest","$anchorScroll","$animate",function(a,b,d){return{restrict:"ECA",priority:400,terminal:!0,transclude:"element",controller:$.noop,compile:function(c,
+e){var f=e.ngInclude||e.src,g=e.onload||"",k=e.autoscroll;return function(c,e,m,n,q){var p=0,r,z,v,s=function(){z&&(z.remove(),z=null);r&&(r.$destroy(),r=null);v&&(d.leave(v).done(function(a){!1!==a&&(z=null)}),z=v,v=null)};c.$watch(f,function(f){var m=function(a){!1===a||!t(k)||k&&!c.$eval(k)||b()},y=++p;f?(a(f,!0).then(function(a){if(!c.$$destroyed&&y===p){var b=c.$new();n.template=a;a=q(b,function(a){s();d.enter(a,null,e).done(m)});r=b;v=a;r.$emit("$includeContentLoaded",f);c.$eval(g)}},function(){c.$$destroyed||
+y!==p||(s(),c.$emit("$includeContentError",f))}),c.$emit("$includeContentRequested",f)):(s(),n.template=null)})}}}}],of=["$compile",function(a){return{restrict:"ECA",priority:-400,require:"ngInclude",link:function(b,d,c,e){ha.call(d[0]).match(/SVG/)?(d.empty(),a(fd(e.template,u.document).childNodes)(b,function(a){d.append(a)},{futureParentElement:d})):(d.html(e.template),a(d.contents())(b))}}}],Ye=Qa({priority:450,compile:function(){return{pre:function(a,b,d){a.$eval(d.ngInit)}}}}),kf=function(){return{restrict:"A",
+priority:100,require:"ngModel",link:function(a,b,d,c){var e=d.ngList||", ",f="false"!==d.ngTrim,g=f?R(e):e;c.$parsers.push(function(a){if(!w(a)){var b=[];a&&p(a.split(g),function(a){a&&b.push(f?R(a):a)});return b}});c.$formatters.push(function(a){if(I(a))return a.join(e)});c.$isEmpty=function(a){return!a||!a.length}}}},ob="ng-valid",$d="ng-invalid",Za="ng-pristine",Ub="ng-dirty",qb=M("ngModel");Rb.$inject="$scope $exceptionHandler $attrs $element $parse $animate $timeout $q $interpolate".split(" ");
+Rb.prototype={$$initGetterSetters:function(){if(this.$options.getOption("getterSetter")){var a=this.$$parse(this.$$attr.ngModel+"()"),b=this.$$parse(this.$$attr.ngModel+"($$$p)");this.$$ngModelGet=function(b){var c=this.$$parsedNgModel(b);B(c)&&(c=a(b));return c};this.$$ngModelSet=function(a,c){B(this.$$parsedNgModel(a))?b(a,{$$$p:c}):this.$$parsedNgModelAssign(a,c)}}else if(!this.$$parsedNgModel.assign)throw qb("nonassign",this.$$attr.ngModel,Aa(this.$$element));},$render:C,$isEmpty:function(a){return w(a)||
+""===a||null===a||a!==a},$$updateEmptyClasses:function(a){this.$isEmpty(a)?(this.$$animate.removeClass(this.$$element,"ng-not-empty"),this.$$animate.addClass(this.$$element,"ng-empty")):(this.$$animate.removeClass(this.$$element,"ng-empty"),this.$$animate.addClass(this.$$element,"ng-not-empty"))},$setPristine:function(){this.$dirty=!1;this.$pristine=!0;this.$$animate.removeClass(this.$$element,Ub);this.$$animate.addClass(this.$$element,Za)},$setDirty:function(){this.$dirty=!0;this.$pristine=!1;this.$$animate.removeClass(this.$$element,
+Za);this.$$animate.addClass(this.$$element,Ub);this.$$parentForm.$setDirty()},$setUntouched:function(){this.$touched=!1;this.$untouched=!0;this.$$animate.setClass(this.$$element,"ng-untouched","ng-touched")},$setTouched:function(){this.$touched=!0;this.$untouched=!1;this.$$animate.setClass(this.$$element,"ng-touched","ng-untouched")},$rollbackViewValue:function(){this.$$timeout.cancel(this.$$pendingDebounce);this.$viewValue=this.$$lastCommittedViewValue;this.$render()},$validate:function(){if(!U(this.$modelValue)){var a=
+this.$$lastCommittedViewValue,b=this.$$rawModelValue,d=this.$valid,c=this.$modelValue,e=this.$options.getOption("allowInvalid"),f=this;this.$$runValidators(b,a,function(a){e||d===a||(f.$modelValue=a?b:void 0,f.$modelValue!==c&&f.$$writeModelToScope())})}},$$runValidators:function(a,b,d){function c(){var c=!0;p(h.$validators,function(d,e){var g=Boolean(d(a,b));c=c&&g;f(e,g)});return c?!0:(p(h.$asyncValidators,function(a,b){f(b,null)}),!1)}function e(){var c=[],d=!0;p(h.$asyncValidators,function(e,
+g){var h=e(a,b);if(!h||!B(h.then))throw qb("nopromise",h);f(g,void 0);c.push(h.then(function(){f(g,!0)},function(){d=!1;f(g,!1)}))});c.length?h.$$q.all(c).then(function(){g(d)},C):g(!0)}function f(a,b){k===h.$$currentValidationRunId&&h.$setValidity(a,b)}function g(a){k===h.$$currentValidationRunId&&d(a)}this.$$currentValidationRunId++;var k=this.$$currentValidationRunId,h=this;(function(){var a=h.$$parserName||"parse";if(w(h.$$parserValid))f(a,null);else return h.$$parserValid||(p(h.$validators,function(a,
+b){f(b,null)}),p(h.$asyncValidators,function(a,b){f(b,null)})),f(a,h.$$parserValid),h.$$parserValid;return!0})()?c()?e():g(!1):g(!1)},$commitViewValue:function(){var a=this.$viewValue;this.$$timeout.cancel(this.$$pendingDebounce);if(this.$$lastCommittedViewValue!==a||""===a&&this.$$hasNativeValidators)this.$$updateEmptyClasses(a),this.$$lastCommittedViewValue=a,this.$pristine&&this.$setDirty(),this.$$parseAndValidate()},$$parseAndValidate:function(){var a=this.$$lastCommittedViewValue,b=this;if(this.$$parserValid=
+w(a)?void 0:!0)for(var d=0;d<this.$parsers.length;d++)if(a=this.$parsers[d](a),w(a)){this.$$parserValid=!1;break}U(this.$modelValue)&&(this.$modelValue=this.$$ngModelGet(this.$$scope));var c=this.$modelValue,e=this.$options.getOption("allowInvalid");this.$$rawModelValue=a;e&&(this.$modelValue=a,b.$modelValue!==c&&b.$$writeModelToScope());this.$$runValidators(a,this.$$lastCommittedViewValue,function(d){e||(b.$modelValue=d?a:void 0,b.$modelValue!==c&&b.$$writeModelToScope())})},$$writeModelToScope:function(){this.$$ngModelSet(this.$$scope,
+this.$modelValue);p(this.$viewChangeListeners,function(a){try{a()}catch(b){this.$$exceptionHandler(b)}},this)},$setViewValue:function(a,b){this.$viewValue=a;this.$options.getOption("updateOnDefault")&&this.$$debounceViewValueCommit(b)},$$debounceViewValueCommit:function(a){var b=this.$options.getOption("debounce");Y(b[a])?b=b[a]:Y(b["default"])&&(b=b["default"]);this.$$timeout.cancel(this.$$pendingDebounce);var d=this;0<b?this.$$pendingDebounce=this.$$timeout(function(){d.$commitViewValue()},b):this.$$scope.$root.$$phase?
+this.$commitViewValue():this.$$scope.$apply(function(){d.$commitViewValue()})},$overrideModelOptions:function(a){this.$options=this.$options.createChild(a)},$processModelValue:function(){var a=this.$$format();this.$viewValue!==a&&(this.$$updateEmptyClasses(a),this.$viewValue=this.$$lastCommittedViewValue=a,this.$render(),this.$$runValidators(this.$modelValue,this.$viewValue,C))},$$format:function(){for(var a=this.$formatters,b=a.length,d=this.$modelValue;b--;)d=a[b](d);return d},$$setModelValue:function(a){this.$modelValue=
+this.$$rawModelValue=a;this.$$parserValid=void 0;this.$processModelValue()}};ae({clazz:Rb,set:function(a,b){a[b]=!0},unset:function(a,b){delete a[b]}});var jf=["$rootScope",function(a){return{restrict:"A",require:["ngModel","^?form","^?ngModelOptions"],controller:Rb,priority:1,compile:function(b){b.addClass(Za).addClass("ng-untouched").addClass(ob);return{pre:function(a,b,e,f){var g=f[0];b=f[1]||g.$$parentForm;if(f=f[2])g.$options=f.$options;g.$$initGetterSetters();b.$addControl(g);e.$observe("name",
+function(a){g.$name!==a&&g.$$parentForm.$$renameControl(g,a)});a.$on("$destroy",function(){g.$$parentForm.$removeControl(g)})},post:function(b,c,e,f){function g(){k.$setTouched()}var k=f[0];if(k.$options.getOption("updateOn"))c.on(k.$options.getOption("updateOn"),function(a){k.$$debounceViewValueCommit(a&&a.type)});c.on("blur",function(){k.$touched||(a.$$phase?b.$evalAsync(g):b.$apply(g))})}}}}}],Sb,hh=/(\s+|^)default(\s+|$)/;Kc.prototype={getOption:function(a){return this.$$options[a]},createChild:function(a){var b=
+!1;a=Q({},a);p(a,function(d,c){"$inherit"===d?"*"===c?b=!0:(a[c]=this.$$options[c],"updateOn"===c&&(a.updateOnDefault=this.$$options.updateOnDefault)):"updateOn"===c&&(a.updateOnDefault=!1,a[c]=R(d.replace(hh,function(){a.updateOnDefault=!0;return" "})))},this);b&&(delete a["*"],ge(a,this.$$options));ge(a,Sb.$$options);return new Kc(a)}};Sb=new Kc({updateOn:"",updateOnDefault:!0,debounce:0,getterSetter:!1,allowInvalid:!1,timezone:null});var nf=function(){function a(a,d){this.$$attrs=a;this.$$scope=
+d}a.$inject=["$attrs","$scope"];a.prototype={$onInit:function(){var a=this.parentCtrl?this.parentCtrl.$options:Sb,d=this.$$scope.$eval(this.$$attrs.ngModelOptions);this.$options=a.createChild(d)}};return{restrict:"A",priority:10,require:{parentCtrl:"?^^ngModelOptions"},bindToController:!0,controller:a}},Ze=Qa({terminal:!0,priority:1E3}),ih=M("ngOptions"),jh=/^\s*([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+group\s+by\s+([\s\S]+?))?(?:\s+disable\s+when\s+([\s\S]+?))?\s+for\s+(?:([$\w][$\w]*)|(?:\(\s*([$\w][$\w]*)\s*,\s*([$\w][$\w]*)\s*\)))\s+in\s+([\s\S]+?)(?:\s+track\s+by\s+([\s\S]+?))?$/,
+gf=["$compile","$document","$parse",function(a,b,d){function c(a,b,c){function e(a,b,c,d,f){this.selectValue=a;this.viewValue=b;this.label=c;this.group=d;this.disabled=f}function f(a){var b;if(!p&&xa(a))b=a;else{b=[];for(var c in a)a.hasOwnProperty(c)&&"$"!==c.charAt(0)&&b.push(c)}return b}var n=a.match(jh);if(!n)throw ih("iexp",a,Aa(b));var q=n[5]||n[7],p=n[6];a=/ as /.test(n[0])&&n[1];var r=n[9];b=d(n[2]?n[1]:q);var t=a&&d(a)||b,v=r&&d(r),s=r?function(a,b){return v(c,b)}:function(a){return Pa(a)},
+w=function(a,b){return s(a,B(a,b))},u=d(n[2]||n[1]),y=d(n[3]||""),J=d(n[4]||""),H=d(n[8]),A={},B=p?function(a,b){A[p]=b;A[q]=a;return A}:function(a){A[q]=a;return A};return{trackBy:r,getTrackByValue:w,getWatchables:d(H,function(a){var b=[];a=a||[];for(var d=f(a),e=d.length,g=0;g<e;g++){var k=a===d?g:d[g],l=a[k],k=B(l,k),l=s(l,k);b.push(l);if(n[2]||n[1])l=u(c,k),b.push(l);n[4]&&(k=J(c,k),b.push(k))}return b}),getOptions:function(){for(var a=[],b={},d=H(c)||[],g=f(d),k=g.length,n=0;n<k;n++){var q=d===
+g?n:g[n],p=B(d[q],q),v=t(c,p),q=s(v,p),G=u(c,p),A=y(c,p),p=J(c,p),v=new e(q,v,G,A,p);a.push(v);b[q]=v}return{items:a,selectValueMap:b,getOptionFromViewValue:function(a){return b[w(a)]},getViewValueFromOption:function(a){return r?pa(a.viewValue):a.viewValue}}}}}var e=u.document.createElement("option"),f=u.document.createElement("optgroup");return{restrict:"A",terminal:!0,require:["select","ngModel"],link:{pre:function(a,b,c,d){d[0].registerOption=C},post:function(d,k,h,l){function m(a){var b=(a=s.getOptionFromViewValue(a))&&
+a.element;b&&!b.selected&&(b.selected=!0);return a}function n(a,b){a.element=b;b.disabled=a.disabled;a.label!==b.label&&(b.label=a.label,b.textContent=a.label);b.value=a.selectValue}var q=l[0],r=l[1],w=h.multiple;l=0;for(var z=k.children(),v=z.length;l<v;l++)if(""===z[l].value){q.hasEmptyOption=!0;q.emptyOption=z.eq(l);break}k.empty();l=!!q.emptyOption;A(e.cloneNode(!1)).val("?");var s,u=c(h.ngOptions,k,d),B=b[0].createDocumentFragment();q.generateUnknownOptionValue=function(a){return"?"};w?(q.writeValue=
+function(a){if(s){var b=a&&a.map(m)||[];s.items.forEach(function(a){a.element.selected&&-1===Array.prototype.indexOf.call(b,a)&&(a.element.selected=!1)})}},q.readValue=function(){var a=k.val()||[],b=[];p(a,function(a){(a=s.selectValueMap[a])&&!a.disabled&&b.push(s.getViewValueFromOption(a))});return b},u.trackBy&&d.$watchCollection(function(){if(I(r.$viewValue))return r.$viewValue.map(function(a){return u.getTrackByValue(a)})},function(){r.$render()})):(q.writeValue=function(a){if(s){var b=k[0].options[k[0].selectedIndex],
+c=s.getOptionFromViewValue(a);b&&b.removeAttribute("selected");c?(k[0].value!==c.selectValue&&(q.removeUnknownOption(),k[0].value=c.selectValue,c.element.selected=!0),c.element.setAttribute("selected","selected")):q.selectUnknownOrEmptyOption(a)}},q.readValue=function(){var a=s.selectValueMap[k.val()];return a&&!a.disabled?(q.unselectEmptyOption(),q.removeUnknownOption(),s.getViewValueFromOption(a)):null},u.trackBy&&d.$watch(function(){return u.getTrackByValue(r.$viewValue)},function(){r.$render()}));
+l&&(a(q.emptyOption)(d),k.prepend(q.emptyOption),8===q.emptyOption[0].nodeType?(q.hasEmptyOption=!1,q.registerOption=function(a,b){""===b.val()&&(q.hasEmptyOption=!0,q.emptyOption=b,q.emptyOption.removeClass("ng-scope"),r.$render(),b.on("$destroy",function(){var a=q.$isEmptyOptionSelected();q.hasEmptyOption=!1;q.emptyOption=void 0;a&&r.$render()}))}):q.emptyOption.removeClass("ng-scope"));d.$watchCollection(u.getWatchables,function(){var a=s&&q.readValue();if(s)for(var b=s.items.length-1;0<=b;b--){var c=
+s.items[b];t(c.group)?Gb(c.element.parentNode):Gb(c.element)}s=u.getOptions();var d={};s.items.forEach(function(a){var b;if(t(a.group)){b=d[a.group];b||(b=f.cloneNode(!1),B.appendChild(b),b.label=null===a.group?"null":a.group,d[a.group]=b);var c=e.cloneNode(!1);b.appendChild(c);n(a,c)}else b=e.cloneNode(!1),B.appendChild(b),n(a,b)});k[0].appendChild(B);r.$render();r.$isEmpty(a)||(b=q.readValue(),(u.trackBy||w?sa(a,b):a===b)||(r.$setViewValue(b),r.$render()))})}}}}],$e=["$locale","$interpolate","$log",
+function(a,b,d){var c=/{}/g,e=/^when(Minus)?(.+)$/;return{link:function(f,g,k){function h(a){g.text(a||"")}var l=k.count,m=k.$attr.when&&g.attr(k.$attr.when),n=k.offset||0,q=f.$eval(m)||{},r={},t=b.startSymbol(),z=b.endSymbol(),v=t+l+"-"+n+z,s=$.noop,u;p(k,function(a,b){var c=e.exec(b);c&&(c=(c[1]?"-":"")+N(c[2]),q[c]=g.attr(k.$attr[b]))});p(q,function(a,d){r[d]=b(a.replace(c,v))});f.$watch(l,function(b){var c=parseFloat(b),e=U(c);e||c in q||(c=a.pluralCat(c-n));c===u||e&&U(u)||(s(),e=r[c],w(e)?(null!=
+b&&d.debug("ngPluralize: no rule defined for '"+c+"' in "+m),s=C,h()):s=f.$watch(e,h),u=c)})}}}],af=["$parse","$animate","$compile",function(a,b,d){var c=M("ngRepeat"),e=function(a,b,c,d,e,m,n){a[c]=d;e&&(a[e]=m);a.$index=b;a.$first=0===b;a.$last=b===n-1;a.$middle=!(a.$first||a.$last);a.$odd=!(a.$even=0===(b&1))};return{restrict:"A",multiElement:!0,transclude:"element",priority:1E3,terminal:!0,$$tlb:!0,compile:function(f,g){var k=g.ngRepeat,h=d.$$createComment("end ngRepeat",k),l=k.match(/^\s*([\s\S]+?)\s+in\s+([\s\S]+?)(?:\s+as\s+([\s\S]+?))?(?:\s+track\s+by\s+([\s\S]+?))?\s*$/);
+if(!l)throw c("iexp",k);var m=l[1],n=l[2],q=l[3],r=l[4],l=m.match(/^(?:(\s*[$\w]+)|\(\s*([$\w]+)\s*,\s*([$\w]+)\s*\))$/);if(!l)throw c("iidexp",m);var t=l[3]||l[1],z=l[2];if(q&&(!/^[$a-zA-Z_][$a-zA-Z0-9_]*$/.test(q)||/^(null|undefined|this|\$index|\$first|\$middle|\$last|\$even|\$odd|\$parent|\$root|\$id)$/.test(q)))throw c("badident",q);var v,s,u,w,y={$id:Pa};r?v=a(r):(u=function(a,b){return Pa(b)},w=function(a){return a});return function(a,d,f,g,l){v&&(s=function(b,c,d){z&&(y[z]=b);y[t]=c;y.$index=
+d;return v(a,y)});var m=T();a.$watchCollection(n,function(f){var g,n,r=d[0],v,y=T(),A,B,G,C,E,D,I;q&&(a[q]=f);if(xa(f))E=f,n=s||u;else for(I in n=s||w,E=[],f)ra.call(f,I)&&"$"!==I.charAt(0)&&E.push(I);A=E.length;I=Array(A);for(g=0;g<A;g++)if(B=f===E?g:E[g],G=f[B],C=n(B,G,g),m[C])D=m[C],delete m[C],y[C]=D,I[g]=D;else{if(y[C])throw p(I,function(a){a&&a.scope&&(m[a.id]=a)}),c("dupes",k,C,G);I[g]={id:C,scope:void 0,clone:void 0};y[C]=!0}for(v in m){D=m[v];C=ub(D.clone);b.leave(C);if(C[0].parentNode)for(g=
+0,n=C.length;g<n;g++)C[g].$$NG_REMOVED=!0;D.scope.$destroy()}for(g=0;g<A;g++)if(B=f===E?g:E[g],G=f[B],D=I[g],D.scope){v=r;do v=v.nextSibling;while(v&&v.$$NG_REMOVED);D.clone[0]!==v&&b.move(ub(D.clone),null,r);r=D.clone[D.clone.length-1];e(D.scope,g,t,G,z,B,A)}else l(function(a,c){D.scope=c;var d=h.cloneNode(!1);a[a.length++]=d;b.enter(a,null,r);r=d;D.clone=a;y[D.id]=D;e(D.scope,g,t,G,z,B,A)});m=y})}}}}],bf=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngShow,
+function(b){a[b?"removeClass":"addClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],Ve=["$animate",function(a){return{restrict:"A",multiElement:!0,link:function(b,d,c){b.$watch(c.ngHide,function(b){a[b?"addClass":"removeClass"](d,"ng-hide",{tempClasses:"ng-hide-animate"})})}}}],cf=Qa(function(a,b,d){a.$watch(d.ngStyle,function(a,d){d&&a!==d&&p(d,function(a,c){b.css(c,"")});a&&b.css(a)},!0)}),df=["$animate","$compile",function(a,b){return{require:"ngSwitch",controller:["$scope",function(){this.cases=
+{}}],link:function(d,c,e,f){var g=[],k=[],h=[],l=[],m=function(a,b){return function(c){!1!==c&&a.splice(b,1)}};d.$watch(e.ngSwitch||e.on,function(c){for(var d,e;h.length;)a.cancel(h.pop());d=0;for(e=l.length;d<e;++d){var r=ub(k[d].clone);l[d].$destroy();(h[d]=a.leave(r)).done(m(h,d))}k.length=0;l.length=0;(g=f.cases["!"+c]||f.cases["?"])&&p(g,function(c){c.transclude(function(d,e){l.push(e);var f=c.element;d[d.length++]=b.$$createComment("end ngSwitchWhen");k.push({clone:d});a.enter(d,f.parent(),
+f)})})})}}}],ef=Qa({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,e){a=d.ngSwitchWhen.split(d.ngSwitchWhenSeparator).sort().filter(function(a,b,c){return c[b-1]!==a});p(a,function(a){c.cases["!"+a]=c.cases["!"+a]||[];c.cases["!"+a].push({transclude:e,element:b})})}}),ff=Qa({transclude:"element",priority:1200,require:"^ngSwitch",multiElement:!0,link:function(a,b,d,c,e){c.cases["?"]=c.cases["?"]||[];c.cases["?"].push({transclude:e,element:b})}}),kh=M("ngTransclude"),
+hf=["$compile",function(a){return{restrict:"EAC",terminal:!0,compile:function(b){var d=a(b.contents());b.empty();return function(a,b,f,g,k){function h(){d(a,function(a){b.append(a)})}if(!k)throw kh("orphan",Aa(b));f.ngTransclude===f.$attr.ngTransclude&&(f.ngTransclude="");f=f.ngTransclude||f.ngTranscludeSlot;k(function(a,c){var d;if(d=a.length)a:{d=0;for(var f=a.length;d<f;d++){var g=a[d];if(g.nodeType!==Oa||g.nodeValue.trim()){d=!0;break a}}d=void 0}d?b.append(a):(h(),c.$destroy())},null,f);f&&!k.isSlotFilled(f)&&
+h()}}}}],Je=["$templateCache",function(a){return{restrict:"E",terminal:!0,compile:function(b,d){"text/ng-template"===d.type&&a.put(d.id,b[0].text)}}}],lh={$setViewValue:C,$render:C},mh=["$element","$scope",function(a,b){function d(){g||(g=!0,b.$$postDigest(function(){g=!1;e.ngModelCtrl.$render()}))}function c(a){k||(k=!0,b.$$postDigest(function(){b.$$destroyed||(k=!1,e.ngModelCtrl.$setViewValue(e.readValue()),a&&e.ngModelCtrl.$render())}))}var e=this,f=new Ib;e.selectValueMap={};e.ngModelCtrl=lh;
+e.multiple=!1;e.unknownOption=A(u.document.createElement("option"));e.hasEmptyOption=!1;e.emptyOption=void 0;e.renderUnknownOption=function(b){b=e.generateUnknownOptionValue(b);e.unknownOption.val(b);a.prepend(e.unknownOption);Ga(e.unknownOption,!0);a.val(b)};e.updateUnknownOption=function(b){b=e.generateUnknownOptionValue(b);e.unknownOption.val(b);Ga(e.unknownOption,!0);a.val(b)};e.generateUnknownOptionValue=function(a){return"? "+Pa(a)+" ?"};e.removeUnknownOption=function(){e.unknownOption.parent()&&
+e.unknownOption.remove()};e.selectEmptyOption=function(){e.emptyOption&&(a.val(""),Ga(e.emptyOption,!0))};e.unselectEmptyOption=function(){e.hasEmptyOption&&Ga(e.emptyOption,!1)};b.$on("$destroy",function(){e.renderUnknownOption=C});e.readValue=function(){var b=a.val(),b=b in e.selectValueMap?e.selectValueMap[b]:b;return e.hasOption(b)?b:null};e.writeValue=function(b){var c=a[0].options[a[0].selectedIndex];c&&Ga(A(c),!1);e.hasOption(b)?(e.removeUnknownOption(),c=Pa(b),a.val(c in e.selectValueMap?
+c:b),Ga(A(a[0].options[a[0].selectedIndex]),!0)):e.selectUnknownOrEmptyOption(b)};e.addOption=function(a,b){if(8!==b[0].nodeType){Ia(a,'"option value"');""===a&&(e.hasEmptyOption=!0,e.emptyOption=b);var c=f.get(a)||0;f.set(a,c+1);d()}};e.removeOption=function(a){var b=f.get(a);b&&(1===b?(f.delete(a),""===a&&(e.hasEmptyOption=!1,e.emptyOption=void 0)):f.set(a,b-1))};e.hasOption=function(a){return!!f.get(a)};e.$hasEmptyOption=function(){return e.hasEmptyOption};e.$isUnknownOptionSelected=function(){return a[0].options[0]===
+e.unknownOption[0]};e.$isEmptyOptionSelected=function(){return e.hasEmptyOption&&a[0].options[a[0].selectedIndex]===e.emptyOption[0]};e.selectUnknownOrEmptyOption=function(a){null==a&&e.emptyOption?(e.removeUnknownOption(),e.selectEmptyOption()):e.unknownOption.parent().length?e.updateUnknownOption(a):e.renderUnknownOption(a)};var g=!1,k=!1;e.registerOption=function(a,b,f,g,k){if(f.$attr.ngValue){var p,r=NaN;f.$observe("value",function(a){var d,f=b.prop("selected");t(r)&&(e.removeOption(p),delete e.selectValueMap[r],
+d=!0);r=Pa(a);p=a;e.selectValueMap[r]=a;e.addOption(a,b);b.attr("value",r);d&&f&&c()})}else g?f.$observe("value",function(a){e.readValue();var d,f=b.prop("selected");t(p)&&(e.removeOption(p),d=!0);p=a;e.addOption(a,b);d&&f&&c()}):k?a.$watch(k,function(a,d){f.$set("value",a);var g=b.prop("selected");d!==a&&e.removeOption(d);e.addOption(a,b);d&&g&&c()}):e.addOption(f.value,b);f.$observe("disabled",function(a){if("true"===a||a&&b.prop("selected"))e.multiple?c(!0):(e.ngModelCtrl.$setViewValue(null),e.ngModelCtrl.$render())});
+b.on("$destroy",function(){var a=e.readValue(),b=f.value;e.removeOption(b);d();(e.multiple&&a&&-1!==a.indexOf(b)||a===b)&&c(!0)})}}],Ke=function(){return{restrict:"E",require:["select","?ngModel"],controller:mh,priority:1,link:{pre:function(a,b,d,c){var e=c[0],f=c[1];if(f){if(e.ngModelCtrl=f,b.on("change",function(){e.removeUnknownOption();a.$apply(function(){f.$setViewValue(e.readValue())})}),d.multiple){e.multiple=!0;e.readValue=function(){var a=[];p(b.find("option"),function(b){b.selected&&!b.disabled&&
+(b=b.value,a.push(b in e.selectValueMap?e.selectValueMap[b]:b))});return a};e.writeValue=function(a){p(b.find("option"),function(b){var c=!!a&&(-1!==Array.prototype.indexOf.call(a,b.value)||-1!==Array.prototype.indexOf.call(a,e.selectValueMap[b.value]));c!==b.selected&&Ga(A(b),c)})};var g,k=NaN;a.$watch(function(){k!==f.$viewValue||sa(g,f.$viewValue)||(g=ja(f.$viewValue),f.$render());k=f.$viewValue});f.$isEmpty=function(a){return!a||0===a.length}}}else e.registerOption=C},post:function(a,b,d,c){var e=
+c[1];if(e){var f=c[0];e.$render=function(){f.writeValue(e.$viewValue)}}}}}},Le=["$interpolate",function(a){return{restrict:"E",priority:100,compile:function(b,d){var c,e;t(d.ngValue)||(t(d.value)?c=a(d.value,!0):(e=a(b.text(),!0))||d.$set("value",b.text()));return function(a,b,d){var h=b.parent();(h=h.data("$selectController")||h.parent().data("$selectController"))&&h.registerOption(a,b,d,c,e)}}}}],ad=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){c&&(d.required=!0,c.$validators.required=
+function(a,b){return!d.required||!c.$isEmpty(b)},d.$observe("required",function(){c.$validate()}))}}},$c=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e,f=d.ngPattern||d.pattern;d.$observe("pattern",function(a){D(a)&&0<a.length&&(a=new RegExp("^"+a+"$"));if(a&&!a.test)throw M("ngPattern")("noregexp",f,a,Aa(b));e=a||void 0;c.$validate()});c.$validators.pattern=function(a,b){return c.$isEmpty(b)||w(e)||e.test(b)}}}}},cd=function(){return{restrict:"A",require:"?ngModel",
+link:function(a,b,d,c){if(c){var e=-1;d.$observe("maxlength",function(a){a=Z(a);e=U(a)?-1:a;c.$validate()});c.$validators.maxlength=function(a,b){return 0>e||c.$isEmpty(b)||b.length<=e}}}}},bd=function(){return{restrict:"A",require:"?ngModel",link:function(a,b,d,c){if(c){var e=0;d.$observe("minlength",function(a){e=Z(a)||0;c.$validate()});c.$validators.minlength=function(a,b){return c.$isEmpty(b)||b.length>=e}}}}};u.angular.bootstrap?u.console&&console.log("WARNING: Tried to load angular more than once."):
+(Be(),Ee($),$.module("ngLocale",[],["$provide",function(a){function b(a){a+="";var b=a.indexOf(".");return-1==b?0:a.length-b-1}a.value("$locale",{DATETIME_FORMATS:{AMPMS:["AM","PM"],DAY:"Sunday Monday Tuesday Wednesday Thursday Friday Saturday".split(" "),ERANAMES:["Before Christ","Anno Domini"],ERAS:["BC","AD"],FIRSTDAYOFWEEK:6,MONTH:"January February March April May June July August September October November December".split(" "),SHORTDAY:"Sun Mon Tue Wed Thu Fri Sat".split(" "),SHORTMONTH:"Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec".split(" "),
+STANDALONEMONTH:"January February March April May June July August September October November December".split(" "),WEEKENDRANGE:[5,6],fullDate:"EEEE, MMMM d, y",longDate:"MMMM d, y",medium:"MMM d, y h:mm:ss a",mediumDate:"MMM d, y",mediumTime:"h:mm:ss a","short":"M/d/yy h:mm a",shortDate:"M/d/yy",shortTime:"h:mm a"},NUMBER_FORMATS:{CURRENCY_SYM:"$",DECIMAL_SEP:".",GROUP_SEP:",",PATTERNS:[{gSize:3,lgSize:3,maxFrac:3,minFrac:0,minInt:1,negPre:"-",negSuf:"",posPre:"",posSuf:""},{gSize:3,lgSize:3,maxFrac:2,
+minFrac:2,minInt:1,negPre:"-\u00a4",negSuf:"",posPre:"\u00a4",posSuf:""}]},id:"en-us",localeID:"en_US",pluralCat:function(a,c){var e=a|0,f=c;void 0===f&&(f=Math.min(b(a),3));Math.pow(10,f);return 1==e&&0==f?"one":"other"}})}]),A(function(){we(u.document,Uc)}))})(window);!window.angular.$$csp().noInlineStyle&&window.angular.element(document.head).prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide:not(.ng-hide-animate){display:none !important;}ng\\:form{display:block;}.ng-animate-shim{visibility:hidden;}.ng-anchor{position:absolute;}</style>');
diff --git a/src/main/resources/assets/js/bootstrap.min.js b/src/main/resources/assets/js/bootstrap.min.js
new file mode 100644
index 0000000..07aef61
--- /dev/null
+++ b/src/main/resources/assets/js/bootstrap.min.js
@@ -0,0 +1,6 @@
+/*!
+ * Bootstrap v4.0.0-beta.3 (https://getbootstrap.com)
+ * Copyright 2011-2017 The Bootstrap Authors (https://github.com/twbs/bootstrap/graphs/contributors)
+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("jquery"),require("popper.js")):"function"==typeof define&&define.amd?define(["exports","jquery","popper.js"],e):e(t.bootstrap={},t.jQuery,t.Popper)}(this,function(t,e,n){"use strict";function i(t,e){for(var n=0;n<e.length;n++){var i=e[n];i.enumerable=i.enumerable||!1,i.configurable=!0,"value"in i&&(i.writable=!0),Object.defineProperty(t,i.key,i)}}function s(t,e,n){return e&&i(t.prototype,e),n&&i(t,n),t}function r(){return(r=Object.assign||function(t){for(var e=1;e<arguments.length;e++){var n=arguments[e];for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(t[i]=n[i])}return t}).apply(this,arguments)}e=e&&e.hasOwnProperty("default")?e.default:e,n=n&&n.hasOwnProperty("default")?n.default:n;var o=function(t){function e(t){return{}.toString.call(t).match(/\s([a-zA-Z]+)/)[1].toLowerCase()}function n(e){var n=this,i=!1;return t(this).one(s.TRANSITION_END,function(){i=!0}),setTimeout(function(){i||s.triggerTransitionEnd(n)},e),this}var i=!1,s={TRANSITION_END:"bsTransitionEnd",getUID:function(t){do{t+=~~(1e6*Math.random())}while(document.getElementById(t));return t},getSelectorFromElement:function(e){var n=e.getAttribute("data-target");n&&"#"!==n||(n=e.getAttribute("href")||""),"#"===n.charAt(0)&&(n=function(e){return e="function"==typeof t.escapeSelector?t.escapeSelector(e).substr(1):e.replace(/(:|\.|\[|\]|,|=|@)/g,"\\$1")}(n));try{return t(document).find(n).length>0?n:null}catch(t){return null}},reflow:function(t){return t.offsetHeight},triggerTransitionEnd:function(e){t(e).trigger(i.end)},supportsTransitionEnd:function(){return Boolean(i)},isElement:function(t){return(t[0]||t).nodeType},typeCheckConfig:function(t,n,i){for(var r in i)if(Object.prototype.hasOwnProperty.call(i,r)){var o=i[r],a=n[r],l=a&&s.isElement(a)?"element":e(a);if(!new RegExp(o).test(l))throw new Error(t.toUpperCase()+': Option "'+r+'" provided type "'+l+'" but expected type "'+o+'".')}}};return i=!window.QUnit&&{end:"transitionend"},t.fn.emulateTransitionEnd=n,s.supportsTransitionEnd()&&(t.event.special[s.TRANSITION_END]={bindType:i.end,delegateType:i.end,handle:function(e){if(t(e.target).is(this))return e.handleObj.handler.apply(this,arguments)}}),s}(e),a=function(t){var e="alert",n="bs.alert",i="."+n,r=t.fn[e],a={CLOSE:"close"+i,CLOSED:"closed"+i,CLICK_DATA_API:"click"+i+".data-api"},l="alert",h="fade",c="show",u=function(){function e(t){this._element=t}var i=e.prototype;return i.close=function(t){t=t||this._element;var e=this._getRootElement(t);this._triggerCloseEvent(e).isDefaultPrevented()||this._removeElement(e)},i.dispose=function(){t.removeData(this._element,n),this._element=null},i._getRootElement=function(e){var n=o.getSelectorFromElement(e),i=!1;return n&&(i=t(n)[0]),i||(i=t(e).closest("."+l)[0]),i},i._triggerCloseEvent=function(e){var n=t.Event(a.CLOSE);return t(e).trigger(n),n},i._removeElement=function(e){var n=this;t(e).removeClass(c),o.supportsTransitionEnd()&&t(e).hasClass(h)?t(e).one(o.TRANSITION_END,function(t){return n._destroyElement(e,t)}).emulateTransitionEnd(150):this._destroyElement(e)},i._destroyElement=function(e){t(e).detach().trigger(a.CLOSED).remove()},e._jQueryInterface=function(i){return this.each(function(){var s=t(this),r=s.data(n);r||(r=new e(this),s.data(n,r)),"close"===i&&r[i](this)})},e._handleDismiss=function(t){return function(e){e&&e.preventDefault(),t.close(this)}},s(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}}]),e}();return t(document).on(a.CLICK_DATA_API,'[data-dismiss="alert"]',u._handleDismiss(new u)),t.fn[e]=u._jQueryInterface,t.fn[e].Constructor=u,t.fn[e].noConflict=function(){return t.fn[e]=r,u._jQueryInterface},u}(e),l=function(t){var e="button",n="bs.button",i="."+n,r=".data-api",o=t.fn[e],a="active",l="btn",h="focus",c='[data-toggle^="button"]',u='[data-toggle="buttons"]',f="input",d=".active",_=".btn",g={CLICK_DATA_API:"click"+i+r,FOCUS_BLUR_DATA_API:"focus"+i+r+" blur"+i+r},m=function(){function e(t){this._element=t}var i=e.prototype;return i.toggle=function(){var e=!0,n=!0,i=t(this._element).closest(u)[0];if(i){var s=t(this._element).find(f)[0];if(s){if("radio"===s.type)if(s.checked&&t(this._element).hasClass(a))e=!1;else{var r=t(i).find(d)[0];r&&t(r).removeClass(a)}if(e){if(s.hasAttribute("disabled")||i.hasAttribute("disabled")||s.classList.contains("disabled")||i.classList.contains("disabled"))return;s.checked=!t(this._element).hasClass(a),t(s).trigger("change")}s.focus(),n=!1}}n&&this._element.setAttribute("aria-pressed",!t(this._element).hasClass(a)),e&&t(this._element).toggleClass(a)},i.dispose=function(){t.removeData(this._element,n),this._element=null},e._jQueryInterface=function(i){return this.each(function(){var s=t(this).data(n);s||(s=new e(this),t(this).data(n,s)),"toggle"===i&&s[i]()})},s(e,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}}]),e}();return t(document).on(g.CLICK_DATA_API,c,function(e){e.preventDefault();var n=e.target;t(n).hasClass(l)||(n=t(n).closest(_)),m._jQueryInterface.call(t(n),"toggle")}).on(g.FOCUS_BLUR_DATA_API,c,function(e){var n=t(e.target).closest(_)[0];t(n).toggleClass(h,/^focus(in)?$/.test(e.type))}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),h=function(t){var e="carousel",n="bs.carousel",i="."+n,a=t.fn[e],l={interval:5e3,keyboard:!0,slide:!1,pause:"hover",wrap:!0},h={interval:"(number|boolean)",keyboard:"boolean",slide:"(boolean|string)",pause:"(string|boolean)",wrap:"boolean"},c="next",u="prev",f="left",d="right",_={SLIDE:"slide"+i,SLID:"slid"+i,KEYDOWN:"keydown"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i,TOUCHEND:"touchend"+i,LOAD_DATA_API:"load"+i+".data-api",CLICK_DATA_API:"click"+i+".data-api"},g="carousel",m="active",p="slide",v="carousel-item-right",E="carousel-item-left",T="carousel-item-next",y="carousel-item-prev",C={ACTIVE:".active",ACTIVE_ITEM:".active.carousel-item",ITEM:".carousel-item",NEXT_PREV:".carousel-item-next, .carousel-item-prev",INDICATORS:".carousel-indicators",DATA_SLIDE:"[data-slide], [data-slide-to]",DATA_RIDE:'[data-ride="carousel"]'},I=function(){function a(e,n){this._items=null,this._interval=null,this._activeElement=null,this._isPaused=!1,this._isSliding=!1,this.touchTimeout=null,this._config=this._getConfig(n),this._element=t(e)[0],this._indicatorsElement=t(this._element).find(C.INDICATORS)[0],this._addEventListeners()}var I=a.prototype;return I.next=function(){this._isSliding||this._slide(c)},I.nextWhenVisible=function(){!document.hidden&&t(this._element).is(":visible")&&"hidden"!==t(this._element).css("visibility")&&this.next()},I.prev=function(){this._isSliding||this._slide(u)},I.pause=function(e){e||(this._isPaused=!0),t(this._element).find(C.NEXT_PREV)[0]&&o.supportsTransitionEnd()&&(o.triggerTransitionEnd(this._element),this.cycle(!0)),clearInterval(this._interval),this._interval=null},I.cycle=function(t){t||(this._isPaused=!1),this._interval&&(clearInterval(this._interval),this._interval=null),this._config.interval&&!this._isPaused&&(this._interval=setInterval((document.visibilityState?this.nextWhenVisible:this.next).bind(this),this._config.interval))},I.to=function(e){var n=this;this._activeElement=t(this._element).find(C.ACTIVE_ITEM)[0];var i=this._getItemIndex(this._activeElement);if(!(e>this._items.length-1||e<0))if(this._isSliding)t(this._element).one(_.SLID,function(){return n.to(e)});else{if(i===e)return this.pause(),void this.cycle();var s=e>i?c:u;this._slide(s,this._items[e])}},I.dispose=function(){t(this._element).off(i),t.removeData(this._element,n),this._items=null,this._config=null,this._element=null,this._interval=null,this._isPaused=null,this._isSliding=null,this._activeElement=null,this._indicatorsElement=null},I._getConfig=function(t){return t=r({},l,t),o.typeCheckConfig(e,t,h),t},I._addEventListeners=function(){var e=this;this._config.keyboard&&t(this._element).on(_.KEYDOWN,function(t){return e._keydown(t)}),"hover"===this._config.pause&&(t(this._element).on(_.MOUSEENTER,function(t){return e.pause(t)}).on(_.MOUSELEAVE,function(t){return e.cycle(t)}),"ontouchstart"in document.documentElement&&t(this._element).on(_.TOUCHEND,function(){e.pause(),e.touchTimeout&&clearTimeout(e.touchTimeout),e.touchTimeout=setTimeout(function(t){return e.cycle(t)},500+e._config.interval)}))},I._keydown=function(t){if(!/input|textarea/i.test(t.target.tagName))switch(t.which){case 37:t.preventDefault(),this.prev();break;case 39:t.preventDefault(),this.next();break;default:return}},I._getItemIndex=function(e){return this._items=t.makeArray(t(e).parent().find(C.ITEM)),this._items.indexOf(e)},I._getItemByDirection=function(t,e){var n=t===c,i=t===u,s=this._getItemIndex(e),r=this._items.length-1;if((i&&0===s||n&&s===r)&&!this._config.wrap)return e;var o=(s+(t===u?-1:1))%this._items.length;return-1===o?this._items[this._items.length-1]:this._items[o]},I._triggerSlideEvent=function(e,n){var i=this._getItemIndex(e),s=this._getItemIndex(t(this._element).find(C.ACTIVE_ITEM)[0]),r=t.Event(_.SLIDE,{relatedTarget:e,direction:n,from:s,to:i});return t(this._element).trigger(r),r},I._setActiveIndicatorElement=function(e){if(this._indicatorsElement){t(this._indicatorsElement).find(C.ACTIVE).removeClass(m);var n=this._indicatorsElement.children[this._getItemIndex(e)];n&&t(n).addClass(m)}},I._slide=function(e,n){var i,s,r,a=this,l=t(this._element).find(C.ACTIVE_ITEM)[0],h=this._getItemIndex(l),u=n||l&&this._getItemByDirection(e,l),g=this._getItemIndex(u),I=Boolean(this._interval);if(e===c?(i=E,s=T,r=f):(i=v,s=y,r=d),u&&t(u).hasClass(m))this._isSliding=!1;else{if(!this._triggerSlideEvent(u,r).isDefaultPrevented()&&l&&u){this._isSliding=!0,I&&this.pause(),this._setActiveIndicatorElement(u);var A=t.Event(_.SLID,{relatedTarget:u,direction:r,from:h,to:g});o.supportsTransitionEnd()&&t(this._element).hasClass(p)?(t(u).addClass(s),o.reflow(u),t(l).addClass(i),t(u).addClass(i),t(l).one(o.TRANSITION_END,function(){t(u).removeClass(i+" "+s).addClass(m),t(l).removeClass(m+" "+s+" "+i),a._isSliding=!1,setTimeout(function(){return t(a._element).trigger(A)},0)}).emulateTransitionEnd(600)):(t(l).removeClass(m),t(u).addClass(m),this._isSliding=!1,t(this._element).trigger(A)),I&&this.cycle()}}},a._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s=r({},l,t(this).data());"object"==typeof e&&(s=r({},s,e));var o="string"==typeof e?e:s.slide;if(i||(i=new a(this,s),t(this).data(n,i)),"number"==typeof e)i.to(e);else if("string"==typeof o){if("undefined"==typeof i[o])throw new Error('No method named "'+o+'"');i[o]()}else s.interval&&(i.pause(),i.cycle())})},a._dataApiClickHandler=function(e){var i=o.getSelectorFromElement(this);if(i){var s=t(i)[0];if(s&&t(s).hasClass(g)){var l=r({},t(s).data(),t(this).data()),h=this.getAttribute("data-slide-to");h&&(l.interval=!1),a._jQueryInterface.call(t(s),l),h&&t(s).data(n).to(h),e.preventDefault()}}},s(a,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}},{key:"Default",get:function(){return l}}]),a}();return t(document).on(_.CLICK_DATA_API,C.DATA_SLIDE,I._dataApiClickHandler),t(window).on(_.LOAD_DATA_API,function(){t(C.DATA_RIDE).each(function(){var e=t(this);I._jQueryInterface.call(e,e.data())})}),t.fn[e]=I._jQueryInterface,t.fn[e].Constructor=I,t.fn[e].noConflict=function(){return t.fn[e]=a,I._jQueryInterface},I}(e),c=function(t){var e="collapse",n="bs.collapse",i="."+n,a=t.fn[e],l={toggle:!0,parent:""},h={toggle:"boolean",parent:"(string|element)"},c={SHOW:"show"+i,SHOWN:"shown"+i,HIDE:"hide"+i,HIDDEN:"hidden"+i,CLICK_DATA_API:"click"+i+".data-api"},u="show",f="collapse",d="collapsing",_="collapsed",g="width",m="height",p={ACTIVES:".show, .collapsing",DATA_TOGGLE:'[data-toggle="collapse"]'},v=function(){function i(e,n){this._isTransitioning=!1,this._element=e,this._config=this._getConfig(n),this._triggerArray=t.makeArray(t('[data-toggle="collapse"][href="#'+e.id+'"],[data-toggle="collapse"][data-target="#'+e.id+'"]'));for(var i=t(p.DATA_TOGGLE),s=0;s<i.length;s++){var r=i[s],a=o.getSelectorFromElement(r);null!==a&&t(a).filter(e).length>0&&this._triggerArray.push(r)}this._parent=this._config.parent?this._getParent():null,this._config.parent||this._addAriaAndCollapsedClass(this._element,this._triggerArray),this._config.toggle&&this.toggle()}var a=i.prototype;return a.toggle=function(){t(this._element).hasClass(u)?this.hide():this.show()},a.show=function(){var e=this;if(!this._isTransitioning&&!t(this._element).hasClass(u)){var s,r;if(this._parent&&((s=t.makeArray(t(this._parent).children().children(p.ACTIVES))).length||(s=null)),!(s&&(r=t(s).data(n))&&r._isTransitioning)){var a=t.Event(c.SHOW);if(t(this._element).trigger(a),!a.isDefaultPrevented()){s&&(i._jQueryInterface.call(t(s),"hide"),r||t(s).data(n,null));var l=this._getDimension();t(this._element).removeClass(f).addClass(d),this._element.style[l]=0,this._triggerArray.length&&t(this._triggerArray).removeClass(_).attr("aria-expanded",!0),this.setTransitioning(!0);var h=function(){t(e._element).removeClass(d).addClass(f).addClass(u),e._element.style[l]="",e.setTransitioning(!1),t(e._element).trigger(c.SHOWN)};if(o.supportsTransitionEnd()){var g="scroll"+(l[0].toUpperCase()+l.slice(1));t(this._element).one(o.TRANSITION_END,h).emulateTransitionEnd(600),this._element.style[l]=this._element[g]+"px"}else h()}}}},a.hide=function(){var e=this;if(!this._isTransitioning&&t(this._element).hasClass(u)){var n=t.Event(c.HIDE);if(t(this._element).trigger(n),!n.isDefaultPrevented()){var i=this._getDimension();if(this._element.style[i]=this._element.getBoundingClientRect()[i]+"px",o.reflow(this._element),t(this._element).addClass(d).removeClass(f).removeClass(u),this._triggerArray.length)for(var s=0;s<this._triggerArray.length;s++){var r=this._triggerArray[s],a=o.getSelectorFromElement(r);if(null!==a){t(a).hasClass(u)||t(r).addClass(_).attr("aria-expanded",!1)}}this.setTransitioning(!0);var l=function(){e.setTransitioning(!1),t(e._element).removeClass(d).addClass(f).trigger(c.HIDDEN)};this._element.style[i]="",o.supportsTransitionEnd()?t(this._element).one(o.TRANSITION_END,l).emulateTransitionEnd(600):l()}}},a.setTransitioning=function(t){this._isTransitioning=t},a.dispose=function(){t.removeData(this._element,n),this._config=null,this._parent=null,this._element=null,this._triggerArray=null,this._isTransitioning=null},a._getConfig=function(t){return t=r({},l,t),t.toggle=Boolean(t.toggle),o.typeCheckConfig(e,t,h),t},a._getDimension=function(){return t(this._element).hasClass(g)?g:m},a._getParent=function(){var e=this,n=null;o.isElement(this._config.parent)?(n=this._config.parent,"undefined"!=typeof this._config.parent.jquery&&(n=this._config.parent[0])):n=t(this._config.parent)[0];var s='[data-toggle="collapse"][data-parent="'+this._config.parent+'"]';return t(n).find(s).each(function(t,n){e._addAriaAndCollapsedClass(i._getTargetFromElement(n),[n])}),n},a._addAriaAndCollapsedClass=function(e,n){if(e){var i=t(e).hasClass(u);n.length&&t(n).toggleClass(_,!i).attr("aria-expanded",i)}},i._getTargetFromElement=function(e){var n=o.getSelectorFromElement(e);return n?t(n)[0]:null},i._jQueryInterface=function(e){return this.each(function(){var s=t(this),o=s.data(n),a=r({},l,s.data(),"object"==typeof e&&e);if(!o&&a.toggle&&/show|hide/.test(e)&&(a.toggle=!1),o||(o=new i(this,a),s.data(n,o)),"string"==typeof e){if("undefined"==typeof o[e])throw new Error('No method named "'+e+'"');o[e]()}})},s(i,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}},{key:"Default",get:function(){return l}}]),i}();return t(document).on(c.CLICK_DATA_API,p.DATA_TOGGLE,function(e){"A"===e.currentTarget.tagName&&e.preventDefault();var i=t(this),s=o.getSelectorFromElement(this);t(s).each(function(){var e=t(this),s=e.data(n)?"toggle":i.data();v._jQueryInterface.call(e,s)})}),t.fn[e]=v._jQueryInterface,t.fn[e].Constructor=v,t.fn[e].noConflict=function(){return t.fn[e]=a,v._jQueryInterface},v}(e),u=function(t){var e="dropdown",i="bs.dropdown",a="."+i,l=".data-api",h=t.fn[e],c=new RegExp("38|40|27"),u={HIDE:"hide"+a,HIDDEN:"hidden"+a,SHOW:"show"+a,SHOWN:"shown"+a,CLICK:"click"+a,CLICK_DATA_API:"click"+a+l,KEYDOWN_DATA_API:"keydown"+a+l,KEYUP_DATA_API:"keyup"+a+l},f="disabled",d="show",_="dropup",g="dropright",m="dropleft",p="dropdown-menu-right",v="dropdown-menu-left",E="position-static",T='[data-toggle="dropdown"]',y=".dropdown form",C=".dropdown-menu",I=".navbar-nav",A=".dropdown-menu .dropdown-item:not(.disabled)",b="top-start",D="top-end",S="bottom-start",w="bottom-end",N="right-start",O="left-start",k={offset:0,flip:!0,boundary:"scrollParent"},P={offset:"(number|string|function)",flip:"boolean",boundary:"(string|element)"},L=function(){function l(t,e){this._element=t,this._popper=null,this._config=this._getConfig(e),this._menu=this._getMenuElement(),this._inNavbar=this._detectNavbar(),this._addEventListeners()}var h=l.prototype;return h.toggle=function(){if(!this._element.disabled&&!t(this._element).hasClass(f)){var e=l._getParentFromElement(this._element),i=t(this._menu).hasClass(d);if(l._clearMenus(),!i){var s={relatedTarget:this._element},r=t.Event(u.SHOW,s);if(t(e).trigger(r),!r.isDefaultPrevented()){if(!this._inNavbar){if("undefined"==typeof n)throw new Error("Bootstrap dropdown require Popper.js (https://popper.js.org)");var o=this._element;t(e).hasClass(_)&&(t(this._menu).hasClass(v)||t(this._menu).hasClass(p))&&(o=e),"scrollParent"!==this._config.boundary&&t(e).addClass(E),this._popper=new n(o,this._menu,this._getPopperConfig())}"ontouchstart"in document.documentElement&&!t(e).closest(I).length&&t("body").children().on("mouseover",null,t.noop),this._element.focus(),this._element.setAttribute("aria-expanded",!0),t(this._menu).toggleClass(d),t(e).toggleClass(d).trigger(t.Event(u.SHOWN,s))}}}},h.dispose=function(){t.removeData(this._element,i),t(this._element).off(a),this._element=null,this._menu=null,null!==this._popper&&(this._popper.destroy(),this._popper=null)},h.update=function(){this._inNavbar=this._detectNavbar(),null!==this._popper&&this._popper.scheduleUpdate()},h._addEventListeners=function(){var e=this;t(this._element).on(u.CLICK,function(t){t.preventDefault(),t.stopPropagation(),e.toggle()})},h._getConfig=function(n){return n=r({},this.constructor.Default,t(this._element).data(),n),o.typeCheckConfig(e,n,this.constructor.DefaultType),n},h._getMenuElement=function(){if(!this._menu){var e=l._getParentFromElement(this._element);this._menu=t(e).find(C)[0]}return this._menu},h._getPlacement=function(){var e=t(this._element).parent(),n=S;return e.hasClass(_)?(n=b,t(this._menu).hasClass(p)&&(n=D)):e.hasClass(g)?n=N:e.hasClass(m)?n=O:t(this._menu).hasClass(p)&&(n=w),n},h._detectNavbar=function(){return t(this._element).closest(".navbar").length>0},h._getPopperConfig=function(){var t=this,e={};"function"==typeof this._config.offset?e.fn=function(e){return e.offsets=r({},e.offsets,t._config.offset(e.offsets)||{}),e}:e.offset=this._config.offset;return{placement:this._getPlacement(),modifiers:{offset:e,flip:{enabled:this._config.flip},preventOverflow:{boundariesElement:this._config.boundary}}}},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i);if(n||(n=new l(this,"object"==typeof e?e:null),t(this).data(i,n)),"string"==typeof e){if("undefined"==typeof n[e])throw new Error('No method named "'+e+'"');n[e]()}})},l._clearMenus=function(e){if(!e||3!==e.which&&("keyup"!==e.type||9===e.which))for(var n=t.makeArray(t(T)),s=0;s<n.length;s++){var r=l._getParentFromElement(n[s]),o=t(n[s]).data(i),a={relatedTarget:n[s]};if(o){var h=o._menu;if(t(r).hasClass(d)&&!(e&&("click"===e.type&&/input|textarea/i.test(e.target.tagName)||"keyup"===e.type&&9===e.which)&&t.contains(r,e.target))){var c=t.Event(u.HIDE,a);t(r).trigger(c),c.isDefaultPrevented()||("ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),n[s].setAttribute("aria-expanded","false"),t(h).removeClass(d),t(r).removeClass(d).trigger(t.Event(u.HIDDEN,a)))}}}},l._getParentFromElement=function(e){var n,i=o.getSelectorFromElement(e);return i&&(n=t(i)[0]),n||e.parentNode},l._dataApiKeydownHandler=function(e){if((/input|textarea/i.test(e.target.tagName)?!(32===e.which||27!==e.which&&(40!==e.which&&38!==e.which||t(e.target).closest(C).length)):c.test(e.which))&&(e.preventDefault(),e.stopPropagation(),!this.disabled&&!t(this).hasClass(f))){var n=l._getParentFromElement(this),i=t(n).hasClass(d);if((i||27===e.which&&32===e.which)&&(!i||27!==e.which&&32!==e.which)){var s=t(n).find(A).get();if(s.length){var r=s.indexOf(e.target);38===e.which&&r>0&&r--,40===e.which&&r<s.length-1&&r++,r<0&&(r=0),s[r].focus()}}else{if(27===e.which){var o=t(n).find(T)[0];t(o).trigger("focus")}t(this).trigger("click")}}},s(l,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}},{key:"Default",get:function(){return k}},{key:"DefaultType",get:function(){return P}}]),l}();return t(document).on(u.KEYDOWN_DATA_API,T,L._dataApiKeydownHandler).on(u.KEYDOWN_DATA_API,C,L._dataApiKeydownHandler).on(u.CLICK_DATA_API+" "+u.KEYUP_DATA_API,L._clearMenus).on(u.CLICK_DATA_API,T,function(e){e.preventDefault(),e.stopPropagation(),L._jQueryInterface.call(t(this),"toggle")}).on(u.CLICK_DATA_API,y,function(t){t.stopPropagation()}),t.fn[e]=L._jQueryInterface,t.fn[e].Constructor=L,t.fn[e].noConflict=function(){return t.fn[e]=h,L._jQueryInterface},L}(e),f=function(t){var e="modal",n="bs.modal",i="."+n,a=t.fn.modal,l={backdrop:!0,keyboard:!0,focus:!0,show:!0},h={backdrop:"(boolean|string)",keyboard:"boolean",focus:"boolean",show:"boolean"},c={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,FOCUSIN:"focusin"+i,RESIZE:"resize"+i,CLICK_DISMISS:"click.dismiss"+i,KEYDOWN_DISMISS:"keydown.dismiss"+i,MOUSEUP_DISMISS:"mouseup.dismiss"+i,MOUSEDOWN_DISMISS:"mousedown.dismiss"+i,CLICK_DATA_API:"click"+i+".data-api"},u="modal-scrollbar-measure",f="modal-backdrop",d="modal-open",_="fade",g="show",m={DIALOG:".modal-dialog",DATA_TOGGLE:'[data-toggle="modal"]',DATA_DISMISS:'[data-dismiss="modal"]',FIXED_CONTENT:".fixed-top, .fixed-bottom, .is-fixed, .sticky-top",STICKY_CONTENT:".sticky-top",NAVBAR_TOGGLER:".navbar-toggler"},p=function(){function a(e,n){this._config=this._getConfig(n),this._element=e,this._dialog=t(e).find(m.DIALOG)[0],this._backdrop=null,this._isShown=!1,this._isBodyOverflowing=!1,this._ignoreBackdropClick=!1,this._originalBodyPadding=0,this._scrollbarWidth=0}var p=a.prototype;return p.toggle=function(t){return this._isShown?this.hide():this.show(t)},p.show=function(e){var n=this;if(!this._isTransitioning&&!this._isShown){o.supportsTransitionEnd()&&t(this._element).hasClass(_)&&(this._isTransitioning=!0);var i=t.Event(c.SHOW,{relatedTarget:e});t(this._element).trigger(i),this._isShown||i.isDefaultPrevented()||(this._isShown=!0,this._checkScrollbar(),this._setScrollbar(),this._adjustDialog(),t(document.body).addClass(d),this._setEscapeEvent(),this._setResizeEvent(),t(this._element).on(c.CLICK_DISMISS,m.DATA_DISMISS,function(t){return n.hide(t)}),t(this._dialog).on(c.MOUSEDOWN_DISMISS,function(){t(n._element).one(c.MOUSEUP_DISMISS,function(e){t(e.target).is(n._element)&&(n._ignoreBackdropClick=!0)})}),this._showBackdrop(function(){return n._showElement(e)}))}},p.hide=function(e){var n=this;if(e&&e.preventDefault(),!this._isTransitioning&&this._isShown){var i=t.Event(c.HIDE);if(t(this._element).trigger(i),this._isShown&&!i.isDefaultPrevented()){this._isShown=!1;var s=o.supportsTransitionEnd()&&t(this._element).hasClass(_);s&&(this._isTransitioning=!0),this._setEscapeEvent(),this._setResizeEvent(),t(document).off(c.FOCUSIN),t(this._element).removeClass(g),t(this._element).off(c.CLICK_DISMISS),t(this._dialog).off(c.MOUSEDOWN_DISMISS),s?t(this._element).one(o.TRANSITION_END,function(t){return n._hideModal(t)}).emulateTransitionEnd(300):this._hideModal()}}},p.dispose=function(){t.removeData(this._element,n),t(window,document,this._element,this._backdrop).off(i),this._config=null,this._element=null,this._dialog=null,this._backdrop=null,this._isShown=null,this._isBodyOverflowing=null,this._ignoreBackdropClick=null,this._scrollbarWidth=null},p.handleUpdate=function(){this._adjustDialog()},p._getConfig=function(t){return t=r({},l,t),o.typeCheckConfig(e,t,h),t},p._showElement=function(e){var n=this,i=o.supportsTransitionEnd()&&t(this._element).hasClass(_);this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE||document.body.appendChild(this._element),this._element.style.display="block",this._element.removeAttribute("aria-hidden"),this._element.scrollTop=0,i&&o.reflow(this._element),t(this._element).addClass(g),this._config.focus&&this._enforceFocus();var s=t.Event(c.SHOWN,{relatedTarget:e}),r=function(){n._config.focus&&n._element.focus(),n._isTransitioning=!1,t(n._element).trigger(s)};i?t(this._dialog).one(o.TRANSITION_END,r).emulateTransitionEnd(300):r()},p._enforceFocus=function(){var e=this;t(document).off(c.FOCUSIN).on(c.FOCUSIN,function(n){document===n.target||e._element===n.target||t(e._element).has(n.target).length||e._element.focus()})},p._setEscapeEvent=function(){var e=this;this._isShown&&this._config.keyboard?t(this._element).on(c.KEYDOWN_DISMISS,function(t){27===t.which&&(t.preventDefault(),e.hide())}):this._isShown||t(this._element).off(c.KEYDOWN_DISMISS)},p._setResizeEvent=function(){var e=this;this._isShown?t(window).on(c.RESIZE,function(t){return e.handleUpdate(t)}):t(window).off(c.RESIZE)},p._hideModal=function(){var e=this;this._element.style.display="none",this._element.setAttribute("aria-hidden",!0),this._isTransitioning=!1,this._showBackdrop(function(){t(document.body).removeClass(d),e._resetAdjustments(),e._resetScrollbar(),t(e._element).trigger(c.HIDDEN)})},p._removeBackdrop=function(){this._backdrop&&(t(this._backdrop).remove(),this._backdrop=null)},p._showBackdrop=function(e){var n=this,i=t(this._element).hasClass(_)?_:"";if(this._isShown&&this._config.backdrop){var s=o.supportsTransitionEnd()&&i;if(this._backdrop=document.createElement("div"),this._backdrop.className=f,i&&t(this._backdrop).addClass(i),t(this._backdrop).appendTo(document.body),t(this._element).on(c.CLICK_DISMISS,function(t){n._ignoreBackdropClick?n._ignoreBackdropClick=!1:t.target===t.currentTarget&&("static"===n._config.backdrop?n._element.focus():n.hide())}),s&&o.reflow(this._backdrop),t(this._backdrop).addClass(g),!e)return;if(!s)return void e();t(this._backdrop).one(o.TRANSITION_END,e).emulateTransitionEnd(150)}else if(!this._isShown&&this._backdrop){t(this._backdrop).removeClass(g);var r=function(){n._removeBackdrop(),e&&e()};o.supportsTransitionEnd()&&t(this._element).hasClass(_)?t(this._backdrop).one(o.TRANSITION_END,r).emulateTransitionEnd(150):r()}else e&&e()},p._adjustDialog=function(){var t=this._element.scrollHeight>document.documentElement.clientHeight;!this._isBodyOverflowing&&t&&(this._element.style.paddingLeft=this._scrollbarWidth+"px"),this._isBodyOverflowing&&!t&&(this._element.style.paddingRight=this._scrollbarWidth+"px")},p._resetAdjustments=function(){this._element.style.paddingLeft="",this._element.style.paddingRight=""},p._checkScrollbar=function(){var t=document.body.getBoundingClientRect();this._isBodyOverflowing=t.left+t.right<window.innerWidth,this._scrollbarWidth=this._getScrollbarWidth()},p._setScrollbar=function(){var e=this;if(this._isBodyOverflowing){t(m.FIXED_CONTENT).each(function(n,i){var s=t(i)[0].style.paddingRight,r=t(i).css("padding-right");t(i).data("padding-right",s).css("padding-right",parseFloat(r)+e._scrollbarWidth+"px")}),t(m.STICKY_CONTENT).each(function(n,i){var s=t(i)[0].style.marginRight,r=t(i).css("margin-right");t(i).data("margin-right",s).css("margin-right",parseFloat(r)-e._scrollbarWidth+"px")}),t(m.NAVBAR_TOGGLER).each(function(n,i){var s=t(i)[0].style.marginRight,r=t(i).css("margin-right");t(i).data("margin-right",s).css("margin-right",parseFloat(r)+e._scrollbarWidth+"px")});var n=document.body.style.paddingRight,i=t("body").css("padding-right");t("body").data("padding-right",n).css("padding-right",parseFloat(i)+this._scrollbarWidth+"px")}},p._resetScrollbar=function(){t(m.FIXED_CONTENT).each(function(e,n){var i=t(n).data("padding-right");"undefined"!=typeof i&&t(n).css("padding-right",i).removeData("padding-right")}),t(m.STICKY_CONTENT+", "+m.NAVBAR_TOGGLER).each(function(e,n){var i=t(n).data("margin-right");"undefined"!=typeof i&&t(n).css("margin-right",i).removeData("margin-right")});var e=t("body").data("padding-right");"undefined"!=typeof e&&t("body").css("padding-right",e).removeData("padding-right")},p._getScrollbarWidth=function(){var t=document.createElement("div");t.className=u,document.body.appendChild(t);var e=t.getBoundingClientRect().width-t.clientWidth;return document.body.removeChild(t),e},a._jQueryInterface=function(e,i){return this.each(function(){var s=t(this).data(n),o=r({},a.Default,t(this).data(),"object"==typeof e&&e);if(s||(s=new a(this,o),t(this).data(n,s)),"string"==typeof e){if("undefined"==typeof s[e])throw new Error('No method named "'+e+'"');s[e](i)}else o.show&&s.show(i)})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}},{key:"Default",get:function(){return l}}]),a}();return t(document).on(c.CLICK_DATA_API,m.DATA_TOGGLE,function(e){var i,s=this,a=o.getSelectorFromElement(this);a&&(i=t(a)[0]);var l=t(i).data(n)?"toggle":r({},t(i).data(),t(this).data());"A"!==this.tagName&&"AREA"!==this.tagName||e.preventDefault();var h=t(i).one(c.SHOW,function(e){e.isDefaultPrevented()||h.one(c.HIDDEN,function(){t(s).is(":visible")&&s.focus()})});p._jQueryInterface.call(t(i),l,this)}),t.fn.modal=p._jQueryInterface,t.fn.modal.Constructor=p,t.fn.modal.noConflict=function(){return t.fn.modal=a,p._jQueryInterface},p}(e),d=function(t){var e="tooltip",i="bs.tooltip",a="."+i,l=t.fn[e],h=new RegExp("(^|\\s)bs-tooltip\\S+","g"),c={animation:"boolean",template:"string",title:"(string|element|function)",trigger:"string",delay:"(number|object)",html:"boolean",selector:"(string|boolean)",placement:"(string|function)",offset:"(number|string)",container:"(string|element|boolean)",fallbackPlacement:"(string|array)",boundary:"(string|element)"},u={AUTO:"auto",TOP:"top",RIGHT:"right",BOTTOM:"bottom",LEFT:"left"},f={animation:!0,template:'<div class="tooltip" role="tooltip"><div class="arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,selector:!1,placement:"top",offset:0,container:!1,fallbackPlacement:"flip",boundary:"scrollParent"},d="show",_="out",g={HIDE:"hide"+a,HIDDEN:"hidden"+a,SHOW:"show"+a,SHOWN:"shown"+a,INSERTED:"inserted"+a,CLICK:"click"+a,FOCUSIN:"focusin"+a,FOCUSOUT:"focusout"+a,MOUSEENTER:"mouseenter"+a,MOUSELEAVE:"mouseleave"+a},m="fade",p="show",v=".tooltip-inner",E=".arrow",T="hover",y="focus",C="click",I="manual",A=function(){function l(t,e){if("undefined"==typeof n)throw new Error("Bootstrap tooltips require Popper.js (https://popper.js.org)");this._isEnabled=!0,this._timeout=0,this._hoverState="",this._activeTrigger={},this._popper=null,this.element=t,this.config=this._getConfig(e),this.tip=null,this._setListeners()}var A=l.prototype;return A.enable=function(){this._isEnabled=!0},A.disable=function(){this._isEnabled=!1},A.toggleEnabled=function(){this._isEnabled=!this._isEnabled},A.toggle=function(e){if(this._isEnabled)if(e){var n=this.constructor.DATA_KEY,i=t(e.currentTarget).data(n);i||(i=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(n,i)),i._activeTrigger.click=!i._activeTrigger.click,i._isWithActiveTrigger()?i._enter(null,i):i._leave(null,i)}else{if(t(this.getTipElement()).hasClass(p))return void this._leave(null,this);this._enter(null,this)}},A.dispose=function(){clearTimeout(this._timeout),t.removeData(this.element,this.constructor.DATA_KEY),t(this.element).off(this.constructor.EVENT_KEY),t(this.element).closest(".modal").off("hide.bs.modal"),this.tip&&t(this.tip).remove(),this._isEnabled=null,this._timeout=null,this._hoverState=null,this._activeTrigger=null,null!==this._popper&&this._popper.destroy(),this._popper=null,this.element=null,this.config=null,this.tip=null},A.show=function(){var e=this;if("none"===t(this.element).css("display"))throw new Error("Please use show on visible elements");var i=t.Event(this.constructor.Event.SHOW);if(this.isWithContent()&&this._isEnabled){t(this.element).trigger(i);var s=t.contains(this.element.ownerDocument.documentElement,this.element);if(i.isDefaultPrevented()||!s)return;var r=this.getTipElement(),a=o.getUID(this.constructor.NAME);r.setAttribute("id",a),this.element.setAttribute("aria-describedby",a),this.setContent(),this.config.animation&&t(r).addClass(m);var h="function"==typeof this.config.placement?this.config.placement.call(this,r,this.element):this.config.placement,c=this._getAttachment(h);this.addAttachmentClass(c);var u=!1===this.config.container?document.body:t(this.config.container);t(r).data(this.constructor.DATA_KEY,this),t.contains(this.element.ownerDocument.documentElement,this.tip)||t(r).appendTo(u),t(this.element).trigger(this.constructor.Event.INSERTED),this._popper=new n(this.element,r,{placement:c,modifiers:{offset:{offset:this.config.offset},flip:{behavior:this.config.fallbackPlacement},arrow:{element:E},preventOverflow:{boundariesElement:this.config.boundary}},onCreate:function(t){t.originalPlacement!==t.placement&&e._handlePopperPlacementChange(t)},onUpdate:function(t){e._handlePopperPlacementChange(t)}}),t(r).addClass(p),"ontouchstart"in document.documentElement&&t("body").children().on("mouseover",null,t.noop);var f=function(){e.config.animation&&e._fixTransition();var n=e._hoverState;e._hoverState=null,t(e.element).trigger(e.constructor.Event.SHOWN),n===_&&e._leave(null,e)};o.supportsTransitionEnd()&&t(this.tip).hasClass(m)?t(this.tip).one(o.TRANSITION_END,f).emulateTransitionEnd(l._TRANSITION_DURATION):f()}},A.hide=function(e){var n=this,i=this.getTipElement(),s=t.Event(this.constructor.Event.HIDE),r=function(){n._hoverState!==d&&i.parentNode&&i.parentNode.removeChild(i),n._cleanTipClass(),n.element.removeAttribute("aria-describedby"),t(n.element).trigger(n.constructor.Event.HIDDEN),null!==n._popper&&n._popper.destroy(),e&&e()};t(this.element).trigger(s),s.isDefaultPrevented()||(t(i).removeClass(p),"ontouchstart"in document.documentElement&&t("body").children().off("mouseover",null,t.noop),this._activeTrigger[C]=!1,this._activeTrigger[y]=!1,this._activeTrigger[T]=!1,o.supportsTransitionEnd()&&t(this.tip).hasClass(m)?t(i).one(o.TRANSITION_END,r).emulateTransitionEnd(150):r(),this._hoverState="")},A.update=function(){null!==this._popper&&this._popper.scheduleUpdate()},A.isWithContent=function(){return Boolean(this.getTitle())},A.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-tooltip-"+e)},A.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},A.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(v),this.getTitle()),e.removeClass(m+" "+p)},A.setElementContent=function(e,n){var i=this.config.html;"object"==typeof n&&(n.nodeType||n.jquery)?i?t(n).parent().is(e)||e.empty().append(n):e.text(t(n).text()):e[i?"html":"text"](n)},A.getTitle=function(){var t=this.element.getAttribute("data-original-title");return t||(t="function"==typeof this.config.title?this.config.title.call(this.element):this.config.title),t},A._getAttachment=function(t){return u[t.toUpperCase()]},A._setListeners=function(){var e=this;this.config.trigger.split(" ").forEach(function(n){if("click"===n)t(e.element).on(e.constructor.Event.CLICK,e.config.selector,function(t){return e.toggle(t)});else if(n!==I){var i=n===T?e.constructor.Event.MOUSEENTER:e.constructor.Event.FOCUSIN,s=n===T?e.constructor.Event.MOUSELEAVE:e.constructor.Event.FOCUSOUT;t(e.element).on(i,e.config.selector,function(t){return e._enter(t)}).on(s,e.config.selector,function(t){return e._leave(t)})}t(e.element).closest(".modal").on("hide.bs.modal",function(){return e.hide()})}),this.config.selector?this.config=r({},this.config,{trigger:"manual",selector:""}):this._fixTitle()},A._fixTitle=function(){var t=typeof this.element.getAttribute("data-original-title");(this.element.getAttribute("title")||"string"!==t)&&(this.element.setAttribute("data-original-title",this.element.getAttribute("title")||""),this.element.setAttribute("title",""))},A._enter=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusin"===e.type?y:T]=!0),t(n.getTipElement()).hasClass(p)||n._hoverState===d?n._hoverState=d:(clearTimeout(n._timeout),n._hoverState=d,n.config.delay&&n.config.delay.show?n._timeout=setTimeout(function(){n._hoverState===d&&n.show()},n.config.delay.show):n.show())},A._leave=function(e,n){var i=this.constructor.DATA_KEY;(n=n||t(e.currentTarget).data(i))||(n=new this.constructor(e.currentTarget,this._getDelegateConfig()),t(e.currentTarget).data(i,n)),e&&(n._activeTrigger["focusout"===e.type?y:T]=!1),n._isWithActiveTrigger()||(clearTimeout(n._timeout),n._hoverState=_,n.config.delay&&n.config.delay.hide?n._timeout=setTimeout(function(){n._hoverState===_&&n.hide()},n.config.delay.hide):n.hide())},A._isWithActiveTrigger=function(){for(var t in this._activeTrigger)if(this._activeTrigger[t])return!0;return!1},A._getConfig=function(n){return"number"==typeof(n=r({},this.constructor.Default,t(this.element).data(),n)).delay&&(n.delay={show:n.delay,hide:n.delay}),"number"==typeof n.title&&(n.title=n.title.toString()),"number"==typeof n.content&&(n.content=n.content.toString()),o.typeCheckConfig(e,n,this.constructor.DefaultType),n},A._getDelegateConfig=function(){var t={};if(this.config)for(var e in this.config)this.constructor.Default[e]!==this.config[e]&&(t[e]=this.config[e]);return t},A._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(h);null!==n&&n.length>0&&e.removeClass(n.join(""))},A._handlePopperPlacementChange=function(t){this._cleanTipClass(),this.addAttachmentClass(this._getAttachment(t.placement))},A._fixTransition=function(){var e=this.getTipElement(),n=this.config.animation;null===e.getAttribute("x-placement")&&(t(e).removeClass(m),this.config.animation=!1,this.hide(),this.show(),this.config.animation=n)},l._jQueryInterface=function(e){return this.each(function(){var n=t(this).data(i),s="object"==typeof e&&e;if((n||!/dispose|hide/.test(e))&&(n||(n=new l(this,s),t(this).data(i,n)),"string"==typeof e)){if("undefined"==typeof n[e])throw new Error('No method named "'+e+'"');n[e]()}})},s(l,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}},{key:"Default",get:function(){return f}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return i}},{key:"Event",get:function(){return g}},{key:"EVENT_KEY",get:function(){return a}},{key:"DefaultType",get:function(){return c}}]),l}();return t.fn[e]=A._jQueryInterface,t.fn[e].Constructor=A,t.fn[e].noConflict=function(){return t.fn[e]=l,A._jQueryInterface},A}(e),_=function(t){var e="popover",n="bs.popover",i="."+n,o=t.fn[e],a=new RegExp("(^|\\s)bs-popover\\S+","g"),l=r({},d.Default,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-header"></h3><div class="popover-body"></div></div>'}),h=r({},d.DefaultType,{content:"(string|element|function)"}),c="fade",u="show",f=".popover-header",_=".popover-body",g={HIDE:"hide"+i,HIDDEN:"hidden"+i,SHOW:"show"+i,SHOWN:"shown"+i,INSERTED:"inserted"+i,CLICK:"click"+i,FOCUSIN:"focusin"+i,FOCUSOUT:"focusout"+i,MOUSEENTER:"mouseenter"+i,MOUSELEAVE:"mouseleave"+i},m=function(r){function o(){return r.apply(this,arguments)||this}!function(t,e){t.prototype=Object.create(e.prototype),t.prototype.constructor=t,t.__proto__=e}(o,r);var d=o.prototype;return d.isWithContent=function(){return this.getTitle()||this._getContent()},d.addAttachmentClass=function(e){t(this.getTipElement()).addClass("bs-popover-"+e)},d.getTipElement=function(){return this.tip=this.tip||t(this.config.template)[0],this.tip},d.setContent=function(){var e=t(this.getTipElement());this.setElementContent(e.find(f),this.getTitle());var n=this._getContent();"function"==typeof n&&(n=n.call(this.element)),this.setElementContent(e.find(_),n),e.removeClass(c+" "+u)},d._getContent=function(){return this.element.getAttribute("data-content")||this.config.content},d._cleanTipClass=function(){var e=t(this.getTipElement()),n=e.attr("class").match(a);null!==n&&n.length>0&&e.removeClass(n.join(""))},o._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n),s="object"==typeof e?e:null;if((i||!/destroy|hide/.test(e))&&(i||(i=new o(this,s),t(this).data(n,i)),"string"==typeof e)){if("undefined"==typeof i[e])throw new Error('No method named "'+e+'"');i[e]()}})},s(o,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}},{key:"Default",get:function(){return l}},{key:"NAME",get:function(){return e}},{key:"DATA_KEY",get:function(){return n}},{key:"Event",get:function(){return g}},{key:"EVENT_KEY",get:function(){return i}},{key:"DefaultType",get:function(){return h}}]),o}(d);return t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=o,m._jQueryInterface},m}(e),g=function(t){var e="scrollspy",n="bs.scrollspy",i="."+n,a=t.fn[e],l={offset:10,method:"auto",target:""},h={offset:"number",method:"string",target:"(string|element)"},c={ACTIVATE:"activate"+i,SCROLL:"scroll"+i,LOAD_DATA_API:"load"+i+".data-api"},u="dropdown-item",f="active",d={DATA_SPY:'[data-spy="scroll"]',ACTIVE:".active",NAV_LIST_GROUP:".nav, .list-group",NAV_LINKS:".nav-link",NAV_ITEMS:".nav-item",LIST_ITEMS:".list-group-item",DROPDOWN:".dropdown",DROPDOWN_ITEMS:".dropdown-item",DROPDOWN_TOGGLE:".dropdown-toggle"},_="offset",g="position",m=function(){function a(e,n){var i=this;this._element=e,this._scrollElement="BODY"===e.tagName?window:e,this._config=this._getConfig(n),this._selector=this._config.target+" "+d.NAV_LINKS+","+this._config.target+" "+d.LIST_ITEMS+","+this._config.target+" "+d.DROPDOWN_ITEMS,this._offsets=[],this._targets=[],this._activeTarget=null,this._scrollHeight=0,t(this._scrollElement).on(c.SCROLL,function(t){return i._process(t)}),this.refresh(),this._process()}var m=a.prototype;return m.refresh=function(){var e=this,n=this._scrollElement!==this._scrollElement.window?g:_,i="auto"===this._config.method?n:this._config.method,s=i===g?this._getScrollTop():0;this._offsets=[],this._targets=[],this._scrollHeight=this._getScrollHeight();t.makeArray(t(this._selector)).map(function(e){var n,r=o.getSelectorFromElement(e);if(r&&(n=t(r)[0]),n){var a=n.getBoundingClientRect();if(a.width||a.height)return[t(n)[i]().top+s,r]}return null}).filter(function(t){return t}).sort(function(t,e){return t[0]-e[0]}).forEach(function(t){e._offsets.push(t[0]),e._targets.push(t[1])})},m.dispose=function(){t.removeData(this._element,n),t(this._scrollElement).off(i),this._element=null,this._scrollElement=null,this._config=null,this._selector=null,this._offsets=null,this._targets=null,this._activeTarget=null,this._scrollHeight=null},m._getConfig=function(n){if("string"!=typeof(n=r({},l,n)).target){var i=t(n.target).attr("id");i||(i=o.getUID(e),t(n.target).attr("id",i)),n.target="#"+i}return o.typeCheckConfig(e,n,h),n},m._getScrollTop=function(){return this._scrollElement===window?this._scrollElement.pageYOffset:this._scrollElement.scrollTop},m._getScrollHeight=function(){return this._scrollElement.scrollHeight||Math.max(document.body.scrollHeight,document.documentElement.scrollHeight)},m._getOffsetHeight=function(){return this._scrollElement===window?window.innerHeight:this._scrollElement.getBoundingClientRect().height},m._process=function(){var t=this._getScrollTop()+this._config.offset,e=this._getScrollHeight(),n=this._config.offset+e-this._getOffsetHeight();if(this._scrollHeight!==e&&this.refresh(),t>=n){var i=this._targets[this._targets.length-1];this._activeTarget!==i&&this._activate(i)}else{if(this._activeTarget&&t<this._offsets[0]&&this._offsets[0]>0)return this._activeTarget=null,void this._clear();for(var s=this._offsets.length;s--;){this._activeTarget!==this._targets[s]&&t>=this._offsets[s]&&("undefined"==typeof this._offsets[s+1]||t<this._offsets[s+1])&&this._activate(this._targets[s])}}},m._activate=function(e){this._activeTarget=e,this._clear();var n=this._selector.split(",");n=n.map(function(t){return t+'[data-target="'+e+'"],'+t+'[href="'+e+'"]'});var i=t(n.join(","));i.hasClass(u)?(i.closest(d.DROPDOWN).find(d.DROPDOWN_TOGGLE).addClass(f),i.addClass(f)):(i.addClass(f),i.parents(d.NAV_LIST_GROUP).prev(d.NAV_LINKS+", "+d.LIST_ITEMS).addClass(f),i.parents(d.NAV_LIST_GROUP).prev(d.NAV_ITEMS).children(d.NAV_LINKS).addClass(f)),t(this._scrollElement).trigger(c.ACTIVATE,{relatedTarget:e})},m._clear=function(){t(this._selector).filter(d.ACTIVE).removeClass(f)},a._jQueryInterface=function(e){return this.each(function(){var i=t(this).data(n);if(i||(i=new a(this,"object"==typeof e&&e),t(this).data(n,i)),"string"==typeof e){if("undefined"==typeof i[e])throw new Error('No method named "'+e+'"');i[e]()}})},s(a,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}},{key:"Default",get:function(){return l}}]),a}();return t(window).on(c.LOAD_DATA_API,function(){for(var e=t.makeArray(t(d.DATA_SPY)),n=e.length;n--;){var i=t(e[n]);m._jQueryInterface.call(i,i.data())}}),t.fn[e]=m._jQueryInterface,t.fn[e].Constructor=m,t.fn[e].noConflict=function(){return t.fn[e]=a,m._jQueryInterface},m}(e),m=function(t){var e="bs.tab",n="."+e,i=t.fn.tab,r={HIDE:"hide"+n,HIDDEN:"hidden"+n,SHOW:"show"+n,SHOWN:"shown"+n,CLICK_DATA_API:"click.bs.tab.data-api"},a="dropdown-menu",l="active",h="disabled",c="fade",u="show",f=".dropdown",d=".nav, .list-group",_=".active",g="> li > .active",m='[data-toggle="tab"], [data-toggle="pill"], [data-toggle="list"]',p=".dropdown-toggle",v="> .dropdown-menu .active",E=function(){function n(t){this._element=t}var i=n.prototype;return i.show=function(){var e=this;if(!(this._element.parentNode&&this._element.parentNode.nodeType===Node.ELEMENT_NODE&&t(this._element).hasClass(l)||t(this._element).hasClass(h))){var n,i,s=t(this._element).closest(d)[0],a=o.getSelectorFromElement(this._element);if(s){var c="UL"===s.nodeName?g:_;i=(i=t.makeArray(t(s).find(c)))[i.length-1]}var u=t.Event(r.HIDE,{relatedTarget:this._element}),f=t.Event(r.SHOW,{relatedTarget:i});if(i&&t(i).trigger(u),t(this._element).trigger(f),!f.isDefaultPrevented()&&!u.isDefaultPrevented()){a&&(n=t(a)[0]),this._activate(this._element,s);var m=function(){var n=t.Event(r.HIDDEN,{relatedTarget:e._element}),s=t.Event(r.SHOWN,{relatedTarget:i});t(i).trigger(n),t(e._element).trigger(s)};n?this._activate(n,n.parentNode,m):m()}}},i.dispose=function(){t.removeData(this._element,e),this._element=null},i._activate=function(e,n,i){var s=this,r=("UL"===n.nodeName?t(n).find(g):t(n).children(_))[0],a=i&&o.supportsTransitionEnd()&&r&&t(r).hasClass(c),l=function(){return s._transitionComplete(e,r,i)};r&&a?t(r).one(o.TRANSITION_END,l).emulateTransitionEnd(150):l()},i._transitionComplete=function(e,n,i){if(n){t(n).removeClass(u+" "+l);var s=t(n.parentNode).find(v)[0];s&&t(s).removeClass(l),"tab"===n.getAttribute("role")&&n.setAttribute("aria-selected",!1)}if(t(e).addClass(l),"tab"===e.getAttribute("role")&&e.setAttribute("aria-selected",!0),o.reflow(e),t(e).addClass(u),e.parentNode&&t(e.parentNode).hasClass(a)){var r=t(e).closest(f)[0];r&&t(r).find(p).addClass(l),e.setAttribute("aria-expanded",!0)}i&&i()},n._jQueryInterface=function(i){return this.each(function(){var s=t(this),r=s.data(e);if(r||(r=new n(this),s.data(e,r)),"string"==typeof i){if("undefined"==typeof r[i])throw new Error('No method named "'+i+'"');r[i]()}})},s(n,null,[{key:"VERSION",get:function(){return"4.0.0-beta.3"}}]),n}();return t(document).on(r.CLICK_DATA_API,m,function(e){e.preventDefault(),E._jQueryInterface.call(t(this),"show")}),t.fn.tab=E._jQueryInterface,t.fn.tab.Constructor=E,t.fn.tab.noConflict=function(){return t.fn.tab=i,E._jQueryInterface},E}(e);!function(t){if("undefined"==typeof t)throw new Error("Bootstrap's JavaScript requires jQuery. jQuery must be included before Bootstrap's JavaScript.");var e=t.fn.jquery.split(" ")[0].split(".");if(e[0]<2&&e[1]<9||1===e[0]&&9===e[1]&&e[2]<1||e[0]>=4)throw new Error("Bootstrap's JavaScript requires at least jQuery v1.9.1 but less than v4.0.0")}(e),t.Util=o,t.Alert=a,t.Button=l,t.Carousel=h,t.Collapse=c,t.Dropdown=u,t.Modal=f,t.Popover=_,t.Scrollspy=g,t.Tab=m,t.Tooltip=d,Object.defineProperty(t,"__esModule",{value:!0})}); \ No newline at end of file
diff --git a/src/main/resources/assets/js/default.js b/src/main/resources/assets/js/default.js
new file mode 100644
index 0000000..547cab0
--- /dev/null
+++ b/src/main/resources/assets/js/default.js
@@ -0,0 +1,127 @@
+var footer = "<nav class='navbar navbar-default fixed-bottom justify-content-center' style='z-index:-1;'><div class='navbar-inner navbar-content-center text-center'><p>© Websketch &emsp;V22.03</p></div></nav>";
+
+var globalConfig = {};
+
+var userConfig = {};
+
+/**
+ * 服务器响应提示
+ */
+function responseTip(data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.status === "success") {
+ layer.msg("保存成功");
+ } else {
+ alerts("保存失败,请稍后重新尝试");
+ }
+}
+
+function checkPassword(password, passwordConfirm) {
+ return password.length >= userConfig.password.minLength && password.length <= userConfig.password.maxLength && password === passwordConfirm;
+}
+
+function sendVerifyCode(email, eventSrc) {
+ if (isEmail(email)) {
+ layer.load(1);
+ $.post("/common/" + email + "/code", function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.status === "success") {
+ layer.msg("发送成功,请前往邮箱查看");
+ $(eventSrc).attr("disabled", "disabled");
+ $(eventSrc).addClass("disabled");
+ setTimeout(function () {
+ $(eventSrc).removeAttr("disabled");
+ $(eventSrc).removeClass("disabled");
+ }, 60000);
+ } else {
+ alerts("获取验证码失败,请联系管理员");
+ }
+ });
+ } else {
+ alerts("邮箱格式不合法");
+ }
+}
+
+$(document).ready(function () {
+ layer.load(1);
+ $.get("/config/global", function (data) {
+ layer.closeAll();
+ globalConfig = JSON.parse(data);
+ /** @namespace globalConfig.loadParticle */
+ if (globalConfig.loadParticle) {
+ // 加载 particle粒子效果
+ particlesJS.load('particles-js', 'js/particles.json', function () {
+ console.log('callback - particles.js config loaded');
+ });
+ }
+ /** @namespace globalConfig.background.useImage */
+ if (globalConfig.background.useImage) {
+ /** @namespace globalConfig.background.listGenerator */
+ if (globalConfig.background.listGenerator.enable) {
+ var start = globalConfig.background.listGenerator.start;
+ var end = globalConfig.background.listGenerator.end;
+ var len = end - start + 1;
+ var list = new Array(len);
+ for (var i = 0; i < len; i++) {
+ /** @namespace globalConfig.background.listGenerator.suffix */
+ list[i] = globalConfig.background.listGenerator.prefix + (start++) + globalConfig.background.listGenerator.suffix;
+ }
+ globalConfig.background.imageList = list;
+ }
+ changeBackgroundImage();
+ }
+ setCSS();
+ });
+ // 加载页脚
+ $("#footer").html(footer);
+ $("body").append("<button onclick='changeBackgroundImage();' class='rounded-circle btn btn-light random-image' " +
+ "style='position: fixed;width: 3rem;height: 3rem;bottom: 1rem;right: 1rem;'>" +
+ "<span class='glyphicon glyphicon-retweet'></span></button>");
+});
+
+function changeBackgroundImage() {
+ if (globalConfig.background.useImage) {
+ var idx = 0;
+ if (globalConfig.background.random) {
+ idx = Math.floor(Math.random() * globalConfig.background.imageList.length);
+ } else {
+ /** @namespace globalConfig.background.imageIndex */
+ idx = globalConfig.background.imageIndex;
+ }
+ /** @namespace globalConfig.background.imageList */
+ var url = globalConfig.background.imageList[idx];
+ if (typeof url !== "undefined") {
+ var body = $("body");
+ $(body).css("background", "url('" + url + "') no-repeat center center fixed");
+ $(body).css("background-size", "cover");
+ }
+ }
+}
+
+function setCSS() {
+ // for (var m = 0; m < globalConfig.css.length; m++) {
+ // var node = globalConfig.css[m];
+ // var tempElement = node.selector;
+ // var element = [];
+ // if (tempElement instanceof Array) {
+ // element = tempElement;
+ // } else {
+ // element = element.concat(tempElement);
+ // }
+ // var tempItem = node.style;
+ // var item = [];
+ // if (tempItem instanceof Array) {
+ // item = tempItem;
+ // } else {
+ // item = item.concat(tempItem);
+ // }
+ // for (var j = 0; j < element.length; j++) {
+ // for (var k = 0; k < item.length; k++) {
+ // var css = item[k].split(":");
+ // $(element[j]).css(css[0].trim(), rtrim(css[1].trim(), ";"));
+ // }
+ // }
+ // }
+} \ No newline at end of file
diff --git a/src/main/resources/assets/js/fileinput.min.js b/src/main/resources/assets/js/fileinput.min.js
new file mode 100644
index 0000000..ad378fd
--- /dev/null
+++ b/src/main/resources/assets/js/fileinput.min.js
@@ -0,0 +1,1822 @@
+/*!
+ * bootstrap-fileinput v4.4.7
+ * http://plugins.krajee.com/file-input
+ *
+ * Author: Kartik Visweswaran
+ * Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
+ *
+ * Licensed under the BSD 3-Clause
+ * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
+ */
+!function (e) {
+ "use strict";
+ "function" == typeof define && define.amd ? define(["jquery"], e) : "object" == typeof module && module.exports ? module.exports = e(require("jquery")) : e(window.jQuery)
+}(function (e) {
+ "use strict";
+ e.fn.fileinputLocales = {}, e.fn.fileinputThemes = {}, String.prototype.setTokens = function (e) {
+ var t, i, a = this.toString();
+ for (t in e) e.hasOwnProperty(t) && (i = new RegExp("{" + t + "}", "g"), a = a.replace(i, e[t]));
+ return a
+ };
+ var t, i;
+ t = {
+ FRAMES: ".kv-preview-thumb",
+ SORT_CSS: "file-sortable",
+ OBJECT_PARAMS: '<param name="controller" value="true" />\n<param name="allowFullScreen" value="true" />\n<param name="allowScriptAccess" value="always" />\n<param name="autoPlay" value="false" />\n<param name="autoStart" value="false" />\n<param name="quality" value="high" />\n',
+ DEFAULT_PREVIEW: '<div class="file-preview-other">\n<span class="{previewFileIconClass}">{previewFileIcon}</span>\n</div>',
+ MODAL_ID: "kvFileinputModal",
+ MODAL_EVENTS: ["show", "shown", "hide", "hidden", "loaded"],
+ objUrl: window.URL || window.webkitURL,
+ compare: function (e, t, i) {
+ return void 0 !== e && (i ? e === t : e.match(t))
+ },
+ isIE: function (e) {
+ if ("Microsoft Internet Explorer" !== navigator.appName) return !1;
+ if (10 === e) return new RegExp("msie\\s" + e, "i").test(navigator.userAgent);
+ var t, i = document.createElement("div");
+ return i.innerHTML = "<!--[if IE " + e + "]> <i></i> <![endif]-->", t = i.getElementsByTagName("i").length, document.body.appendChild(i), i.parentNode.removeChild(i), t
+ },
+ initModal: function (t) {
+ var i = e("body");
+ i.length && t.appendTo(i)
+ },
+ isEmpty: function (t, i) {
+ return void 0 === t || null === t || 0 === t.length || i && "" === e.trim(t)
+ },
+ isArray: function (e) {
+ return Array.isArray(e) || "[object Array]" === Object.prototype.toString.call(e)
+ },
+ ifSet: function (e, t, i) {
+ return i = i || "", t && "object" == typeof t && e in t ? t[e] : i
+ },
+ cleanArray: function (e) {
+ return e instanceof Array || (e = []), e.filter(function (e) {
+ return void 0 !== e && null !== e
+ })
+ },
+ spliceArray: function (e, t) {
+ var i, a = 0, r = [];
+ if (!(e instanceof Array)) return [];
+ for (i = 0; i < e.length; i++) i !== t && (r[a] = e[i], a++);
+ return r
+ },
+ getNum: function (e, t) {
+ return t = t || 0, "number" == typeof e ? e : ("string" == typeof e && (e = parseFloat(e)), isNaN(e) ? t : e)
+ },
+ hasFileAPISupport: function () {
+ return !(!window.File || !window.FileReader)
+ },
+ hasDragDropSupport: function () {
+ var e = document.createElement("div");
+ return !t.isIE(9) && (void 0 !== e.draggable || void 0 !== e.ondragstart && void 0 !== e.ondrop)
+ },
+ hasFileUploadSupport: function () {
+ return t.hasFileAPISupport() && window.FormData
+ },
+ hasBlobSupport: function () {
+ try {
+ return !!window.Blob && Boolean(new Blob)
+ } catch (e) {
+ return !1
+ }
+ },
+ hasArrayBufferViewSupport: function () {
+ try {
+ return 100 === new Blob([new Uint8Array(100)]).size
+ } catch (e) {
+ return !1
+ }
+ },
+ dataURI2Blob: function (e) {
+ var i, a, r, n, o, l,
+ s = window.BlobBuilder || window.WebKitBlobBuilder || window.MozBlobBuilder || window.MSBlobBuilder,
+ d = t.hasBlobSupport(), c = (d || s) && window.atob && window.ArrayBuffer && window.Uint8Array;
+ if (!c) return null;
+ for (i = e.split(",")[0].indexOf("base64") >= 0 ? atob(e.split(",")[1]) : decodeURIComponent(e.split(",")[1]), a = new ArrayBuffer(i.length), r = new Uint8Array(a), n = 0; n < i.length; n += 1) r[n] = i.charCodeAt(n);
+ return o = e.split(",")[0].split(":")[1].split(";")[0], d ? new Blob([t.hasArrayBufferViewSupport() ? r : a], {type: o}) : (l = new s, l.append(a), l.getBlob(o))
+ },
+ arrayBuffer2String: function (e) {
+ if (window.TextDecoder) return new TextDecoder("utf-8").decode(e);
+ var t, i, a, r, n = Array.prototype.slice.apply(new Uint8Array(e)), o = "", l = 0;
+ for (t = n.length; t > l;) switch (i = n[l++], i >> 4) {
+ case 0:
+ case 1:
+ case 2:
+ case 3:
+ case 4:
+ case 5:
+ case 6:
+ case 7:
+ o += String.fromCharCode(i);
+ break;
+ case 12:
+ case 13:
+ a = n[l++], o += String.fromCharCode((31 & i) << 6 | 63 & a);
+ break;
+ case 14:
+ a = n[l++], r = n[l++], o += String.fromCharCode((15 & i) << 12 | (63 & a) << 6 | (63 & r) << 0)
+ }
+ return o
+ },
+ isHtml: function (e) {
+ var t = document.createElement("div");
+ t.innerHTML = e;
+ for (var i = t.childNodes, a = i.length; a--;) if (1 === i[a].nodeType) return !0;
+ return !1
+ },
+ isSvg: function (e) {
+ return e.match(/^\s*<\?xml/i) && (e.match(/<!DOCTYPE svg/i) || e.match(/<svg/i))
+ },
+ getMimeType: function (e, t, i) {
+ switch (e) {
+ case"ffd8ffe0":
+ case"ffd8ffe1":
+ case"ffd8ffe2":
+ return "image/jpeg";
+ case"89504E47":
+ return "image/png";
+ case"47494638":
+ return "image/gif";
+ case"49492a00":
+ return "image/tiff";
+ case"52494646":
+ return "image/webp";
+ case"66747970":
+ return "video/3gp";
+ case"4f676753":
+ return "video/ogg";
+ case"1a45dfa3":
+ return "video/mkv";
+ case"000001ba":
+ case"000001b3":
+ return "video/mpeg";
+ case"3026b275":
+ return "video/wmv";
+ case"25504446":
+ return "application/pdf";
+ case"25215053":
+ return "application/ps";
+ case"504b0304":
+ case"504b0506":
+ case"504b0508":
+ return "application/zip";
+ case"377abcaf":
+ return "application/7z";
+ case"75737461":
+ return "application/tar";
+ case"7801730d":
+ return "application/dmg";
+ default:
+ switch (e.substring(0, 6)) {
+ case"435753":
+ return "application/x-shockwave-flash";
+ case"494433":
+ return "audio/mp3";
+ case"425a68":
+ return "application/bzip";
+ default:
+ switch (e.substring(0, 4)) {
+ case"424d":
+ return "image/bmp";
+ case"fffb":
+ return "audio/mp3";
+ case"4d5a":
+ return "application/exe";
+ case"1f9d":
+ case"1fa0":
+ return "application/zip";
+ case"1f8b":
+ return "application/gzip";
+ default:
+ return t && !t.match(/[^\u0000-\u007f]/) ? "application/text-plain" : i
+ }
+ }
+ }
+ },
+ addCss: function (e, t) {
+ e.removeClass(t).addClass(t)
+ },
+ getElement: function (i, a, r) {
+ return t.isEmpty(i) || t.isEmpty(i[a]) ? r : e(i[a])
+ },
+ uniqId: function () {
+ return Math.round((new Date).getTime()) + "_" + Math.round(100 * Math.random())
+ },
+ htmlEncode: function (e) {
+ return e.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g, "&apos;")
+ },
+ replaceTags: function (t, i) {
+ var a = t;
+ return i ? (e.each(i, function (e, t) {
+ "function" == typeof t && (t = t()), a = a.split(e).join(t)
+ }), a) : a
+ },
+ cleanMemory: function (e) {
+ var i = e.is("img") ? e.attr("src") : e.find("source").attr("src");
+ t.objUrl.revokeObjectURL(i)
+ },
+ findFileName: function (e) {
+ var t = e.lastIndexOf("/");
+ return -1 === t && (t = e.lastIndexOf("\\")), e.split(e.substring(t, t + 1)).pop()
+ },
+ checkFullScreen: function () {
+ return document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement || document.msFullscreenElement
+ },
+ toggleFullScreen: function (e) {
+ var i = document, a = i.documentElement;
+ a && e && !t.checkFullScreen() ? a.requestFullscreen ? a.requestFullscreen() : a.msRequestFullscreen ? a.msRequestFullscreen() : a.mozRequestFullScreen ? a.mozRequestFullScreen() : a.webkitRequestFullscreen && a.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT) : i.exitFullscreen ? i.exitFullscreen() : i.msExitFullscreen ? i.msExitFullscreen() : i.mozCancelFullScreen ? i.mozCancelFullScreen() : i.webkitExitFullscreen && i.webkitExitFullscreen()
+ },
+ moveArray: function (e, t, i) {
+ if (i >= e.length) for (var a = i - e.length; a-- + 1;) e.push(void 0);
+ return e.splice(i, 0, e.splice(t, 1)[0]), e
+ },
+ cleanZoomCache: function (e) {
+ var t = e.closest(".kv-zoom-cache-theme");
+ t.length || (t = e.closest(".kv-zoom-cache")), t.remove()
+ },
+ setOrientation: function (e, t) {
+ var i, a, r, n = new DataView(e), o = 0, l = 1;
+ if (65496 !== n.getUint16(o) || e.length < 2) return void(t && t());
+ for (o += 2, i = n.byteLength; i - 2 > o;) switch (a = n.getUint16(o), o += 2, a) {
+ case 65505:
+ r = n.getUint16(o), i = r - o, o += 2;
+ break;
+ case 274:
+ l = n.getUint16(o + 6, !1), i = 0
+ }
+ t && t(l)
+ },
+ validateOrientation: function (e, i) {
+ if (window.FileReader && window.DataView) {
+ var a, r = new FileReader;
+ r.onloadend = function () {
+ a = r.result, t.setOrientation(a, i)
+ }, r.readAsArrayBuffer(e)
+ }
+ },
+ adjustOrientedImage: function (e, t) {
+ var i, a, r;
+ if (e.hasClass("is-portrait-gt4")) {
+ if (t) return void e.css({width: e.parent().height()});
+ e.css({
+ height: "auto",
+ width: e.height()
+ }), i = e.parent().offset().top, a = e.offset().top, r = i - a, e.css("margin-top", r)
+ }
+ },
+ closeButton: function (e) {
+ return e = e ? "close " + e : "close", '<button type="button" class="' + e + '" aria-label="Close">\n <span aria-hidden="true">&times;</span>\n</button>'
+ }
+ }, i = function (i, a) {
+ var r = this;
+ r.$element = e(i), r.$parent = r.$element.parent(), r._validate() && (r.isPreviewable = t.hasFileAPISupport(), r.isIE9 = t.isIE(9), r.isIE10 = t.isIE(10), (r.isPreviewable || r.isIE9) && (r._init(a), r._listen()), r.$element.removeClass("file-loading"))
+ }, i.prototype = {
+ constructor: i, _cleanup: function () {
+ var e = this;
+ e.reader = null, e.formdata = {}, e.uploadCount = 0, e.uploadStatus = {}, e.uploadLog = [], e.uploadAsyncCount = 0, e.loadedImages = [], e.totalImagesCount = 0, e.ajaxRequests = [], e.clearStack(), e.fileInputCleared = !1, e.fileBatchCompleted = !0, e.isPreviewable || (e.showPreview = !1), e.isError = !1, e.ajaxAborted = !1, e.cancelling = !1
+ }, _init: function (i, a) {
+ var r, n, o, l, s = this, d = s.$element;
+ s.options = i, e.each(i, function (e, i) {
+ switch (e) {
+ case"minFileCount":
+ case"maxFileCount":
+ case"minFileSize":
+ case"maxFileSize":
+ case"maxFilePreviewSize":
+ case"resizeImageQuality":
+ case"resizeIfSizeMoreThan":
+ case"progressUploadThreshold":
+ case"initialPreviewCount":
+ case"zoomModalHeight":
+ case"minImageHeight":
+ case"maxImageHeight":
+ case"minImageWidth":
+ case"maxImageWidth":
+ s[e] = t.getNum(i);
+ break;
+ default:
+ s[e] = i
+ }
+ }), s.rtl && (l = s.previewZoomButtonIcons.prev, s.previewZoomButtonIcons.prev = s.previewZoomButtonIcons.next, s.previewZoomButtonIcons.next = l), a || s._cleanup(), s.$form = d.closest("form"), s._initTemplateDefaults(), s.uploadFileAttr = t.isEmpty(d.attr("name")) ? "file_data" : d.attr("name"), o = s._getLayoutTemplate("progress"), s.progressTemplate = o.replace("{class}", s.progressClass), s.progressCompleteTemplate = o.replace("{class}", s.progressCompleteClass), s.progressErrorTemplate = o.replace("{class}", s.progressErrorClass), s.dropZoneEnabled = t.hasDragDropSupport() && s.dropZoneEnabled, s.isDisabled = d.attr("disabled") || d.attr("readonly"), s.isDisabled && d.attr("disabled", !0), s.isAjaxUpload = t.hasFileUploadSupport() && !t.isEmpty(s.uploadUrl), s.isClickable = s.browseOnZoneClick && s.showPreview && (s.isAjaxUpload && s.dropZoneEnabled || !t.isEmpty(s.defaultPreviewContent)), s.slug = "function" == typeof i.slugCallback ? i.slugCallback : s._slugDefault, s.mainTemplate = s.showCaption ? s._getLayoutTemplate("main1") : s._getLayoutTemplate("main2"), s.captionTemplate = s._getLayoutTemplate("caption"), s.previewGenericTemplate = s._getPreviewTemplate("generic"), !s.imageCanvas && s.resizeImage && (s.maxImageWidth || s.maxImageHeight) && (s.imageCanvas = document.createElement("canvas"), s.imageCanvasContext = s.imageCanvas.getContext("2d")), t.isEmpty(d.attr("id")) && d.attr("id", t.uniqId()), s.namespace = ".fileinput_" + d.attr("id").replace(/-/g, "_"), void 0 === s.$container ? s.$container = s._createContainer() : s._refreshContainer(), n = s.$container, s.$dropZone = n.find(".file-drop-zone"), s.$progress = n.find(".kv-upload-progress"), s.$btnUpload = n.find(".fileinput-upload"), s.$captionContainer = t.getElement(i, "elCaptionContainer", n.find(".file-caption")), s.$caption = t.getElement(i, "elCaptionText", n.find(".file-caption-name")), t.isEmpty(s.msgPlaceholder) || (r = d.attr("multiple") ? s.filePlural : s.fileSingle, s.$caption.attr("placeholder", s.msgPlaceholder.replace("{files}", r))), s.$captionIcon = s.$captionContainer.find(".file-caption-icon"), s.$previewContainer = t.getElement(i, "elPreviewContainer", n.find(".file-preview")), s.$preview = t.getElement(i, "elPreviewImage", n.find(".file-preview-thumbnails")), s.$previewStatus = t.getElement(i, "elPreviewStatus", n.find(".file-preview-status")), s.$errorContainer = t.getElement(i, "elErrorContainer", s.$previewContainer.find(".kv-fileinput-error")), s._validateDisabled(), t.isEmpty(s.msgErrorClass) || t.addCss(s.$errorContainer, s.msgErrorClass), a || (s.$errorContainer.hide(), s.previewInitId = "preview-" + t.uniqId(), s._initPreviewCache(), s._initPreview(!0), s._initPreviewActions(), s._setFileDropZoneTitle(), s.$parent.hasClass("file-loading") && (s.$container.insertBefore(s.$parent), s.$parent.remove())), d.attr("disabled") && s.disable(), s._initZoom(), s.hideThumbnailContent && t.addCss(s.$preview, "hide-content")
+ }, _initTemplateDefaults: function () {
+ var i, a, r, n, o, l, s, d, c, p, u, f, m, v, g, h, w, _, b, C, y, x, T, E, S, k, F, I, P, A, D, z, $, j, U,
+ B, R, L, O = this;
+ i = '{preview}\n<div class="kv-upload-progress kv-hidden"></div><div class="clearfix"></div>\n<div class="input-group {class}">\n {caption}\n<div class="input-group-btn input-group-append">\n {remove}\n {cancel}\n {upload}\n {browse}\n </div>\n</div>', a = '{preview}\n<div class="kv-upload-progress kv-hidden"></div>\n<div class="clearfix"></div>\n{remove}\n{cancel}\n{upload}\n{browse}\n', r = '<div class="file-preview {class}">\n {close} <div class="{dropClass}">\n <div class="file-preview-thumbnails">\n </div>\n <div class="clearfix"></div> <div class="file-preview-status text-center text-success"></div>\n <div class="kv-fileinput-error"></div>\n </div>\n</div>', o = t.closeButton("fileinput-remove"), n = '<i class="glyphicon glyphicon-file"></i>', l = '<div class="file-caption form-control {class}" tabindex="500">\n <span class="file-caption-icon"></span>\n <input class="file-caption-name" onkeydown="return false;" onpaste="return false;">\n</div>', s = '<button type="{type}" tabindex="500" title="{title}" class="{css}" {status}>{icon} {label}</button>', d = '<a href="{href}" tabindex="500" title="{title}" class="{css}" {status}>{icon} {label}</a>', c = '<div tabindex="500" class="{css}" {status}>{icon} {label}</div>', p = '<div id="' + t.MODAL_ID + '" class="file-zoom-dialog modal fade" tabindex="-1" aria-labelledby="' + t.MODAL_ID + 'Label"></div>', u = '<div class="modal-dialog modal-lg{rtl}" role="document">\n <div class="modal-content">\n <div class="modal-header">\n <h5 class="modal-title">{heading}</h5>\n <span class="kv-zoom-title"></span>\n <div class="kv-zoom-actions">{toggleheader}{fullscreen}{borderless}{close}</div>\n </div>\n <div class="modal-body">\n <div class="floating-buttons"></div>\n <div class="kv-zoom-body file-zoom-content {zoomFrameClass}"></div>\n{prev} {next}\n </div>\n </div>\n</div>\n', f = '<div class="progress">\n <div class="{class}" role="progressbar" aria-valuenow="{percent}" aria-valuemin="0" aria-valuemax="100" style="width:{percent}%;">\n {status}\n </div>\n</div>', m = " <samp>({sizeText})</samp>", v = '<div class="file-thumbnail-footer">\n <div class="file-footer-caption" title="{caption}">\n <div class="file-caption-info">{caption}</div>\n <div class="file-size-info">{size}</div>\n </div>\n {progress}\n{indicator}\n{actions}\n</div>', g = '<div class="file-actions">\n <div class="file-footer-buttons">\n {download} {upload} {delete} {zoom} {other} </div>\n</div>\n{drag}\n<div class="clearfix"></div>', h = '<button type="button" class="kv-file-remove {removeClass}" title="{removeTitle}" {dataUrl}{dataKey}>{removeIcon}</button>\n', w = '<button type="button" class="kv-file-upload {uploadClass}" title="{uploadTitle}">{uploadIcon}</button>', _ = '<a class="kv-file-download {downloadClass}" title="{downloadTitle}" href="{downloadUrl}" download="{caption}" target="_blank">{downloadIcon}</a>', b = '<button type="button" class="kv-file-zoom {zoomClass}" title="{zoomTitle}">{zoomIcon}</button>', C = '<span class="file-drag-handle {dragClass}" title="{dragTitle}">{dragIcon}</span>', y = '<div class="file-upload-indicator" title="{indicatorTitle}">{indicator}</div>', x = '<div class="file-preview-frame {frameClass}" id="{previewId}" data-fileindex="{fileindex}" data-template="{template}"', T = x + '><div class="kv-file-content">\n', E = x + ' title="{caption}"><div class="kv-file-content">\n', S = "</div>{footer}\n</div>\n", k = "{content}\n", F = '<div class="kv-preview-data file-preview-html" title="{caption}" {style}>{data}</div>\n', I = '<img src="{data}" class="file-preview-image kv-preview-data" title="{caption}" alt="{caption}" {style}>\n', P = '<textarea class="kv-preview-data file-preview-text" title="{caption}" readonly {style}>{data}</textarea>\n', A = '<iframe class="kv-preview-data file-preview-office" src="https://docs.google.com/gview?url={data}&embedded=true" {style}></iframe>', D = '<video class="kv-preview-data file-preview-video" controls {style}>\n<source src="{data}" type="{type}">\n' + t.DEFAULT_PREVIEW + "\n</video>\n", z = '<audio class="kv-preview-data file-preview-audio" controls {style}>\n<source src="{data}" type="{type}">\n' + t.DEFAULT_PREVIEW + "\n</audio>\n", $ = '<embed class="kv-preview-data file-preview-flash" src="{data}" type="application/x-shockwave-flash" {style}>\n', U = '<embed class="kv-preview-data file-preview-pdf" src="{data}" type="application/pdf" {style}>\n', j = '<object class="kv-preview-data file-preview-object file-object {typeCss}" data="{data}" type="{type}" {style}>\n<param name="movie" value="{caption}" />\n' + t.OBJECT_PARAMS + " " + t.DEFAULT_PREVIEW + "\n</object>\n", B = '<div class="kv-preview-data file-preview-other-frame" {style}>\n' + t.DEFAULT_PREVIEW + "\n</div>\n", R = '<div class="kv-zoom-cache" style="display:none">{zoomContent}</div>', L = {
+ width: "100%",
+ height: "100%",
+ "min-height": "480px"
+ }, O.defaults = {
+ layoutTemplates: {
+ main1: i,
+ main2: a,
+ preview: r,
+ close: o,
+ fileIcon: n,
+ caption: l,
+ modalMain: p,
+ modal: u,
+ progress: f,
+ size: m,
+ footer: v,
+ indicator: y,
+ actions: g,
+ actionDelete: h,
+ actionUpload: w,
+ actionDownload: _,
+ actionZoom: b,
+ actionDrag: C,
+ btnDefault: s,
+ btnLink: d,
+ btnBrowse: c,
+ zoomCache: R
+ },
+ previewMarkupTags: {tagBefore1: T, tagBefore2: E, tagAfter: S},
+ previewContentTemplates: {
+ generic: k,
+ html: F,
+ image: I,
+ text: P,
+ office: A,
+ video: D,
+ audio: z,
+ flash: $,
+ object: j,
+ pdf: U,
+ other: B
+ },
+ allowedPreviewTypes: ["image", "html", "text", "video", "audio", "flash", "pdf", "object"],
+ previewTemplates: {},
+ previewSettings: {
+ image: {width: "auto", height: "auto", "max-width": "100%", "max-height": "100%"},
+ html: {width: "213px", height: "160px"},
+ text: {width: "213px", height: "160px"},
+ office: {width: "213px", height: "160px"},
+ video: {width: "213px", height: "160px"},
+ audio: {width: "100%", height: "30px"},
+ flash: {width: "213px", height: "160px"},
+ object: {width: "213px", height: "160px"},
+ pdf: {width: "213px", height: "160px"},
+ other: {width: "213px", height: "160px"}
+ },
+ previewSettingsSmall: {
+ image: {
+ width: "auto",
+ height: "auto",
+ "max-width": "100%",
+ "max-height": "100%"
+ },
+ html: {width: "100%", height: "160px"},
+ text: {width: "100%", height: "160px"},
+ office: {width: "100%", height: "160px"},
+ video: {width: "100%", height: "auto"},
+ audio: {width: "100%", height: "30px"},
+ flash: {width: "100%", height: "auto"},
+ object: {width: "100%", height: "auto"},
+ pdf: {width: "100%", height: "160px"},
+ other: {width: "100%", height: "160px"}
+ },
+ previewZoomSettings: {
+ image: {width: "auto", height: "auto", "max-width": "100%", "max-height": "100%"},
+ html: L,
+ text: L,
+ office: {width: "100%", height: "100%", "max-width": "100%", "min-height": "480px"},
+ video: {width: "auto", height: "100%", "max-width": "100%"},
+ audio: {width: "100%", height: "30px"},
+ flash: {width: "auto", height: "480px"},
+ object: {width: "auto", height: "100%", "max-width": "100%", "min-height": "480px"},
+ pdf: L,
+ other: {width: "auto", height: "100%", "min-height": "480px"}
+ },
+ fileTypeSettings: {
+ image: function (e, i) {
+ return t.compare(e, "image.*") && !t.compare(e, /(tiff?|wmf)$/i) || t.compare(i, /\.(gif|png|jpe?g)$/i)
+ }, html: function (e, i) {
+ return t.compare(e, "text/html") || t.compare(i, /\.(htm|html)$/i)
+ }, office: function (e, i) {
+ return t.compare(e, /(word|excel|powerpoint|office|iwork-pages|tiff?)$/i) || t.compare(i, /\.(rtf|docx?|xlsx?|pptx?|pps|potx?|ods|odt|pages|ai|dxf|ttf|tiff?|wmf|e?ps)$/i)
+ }, text: function (e, i) {
+ return t.compare(e, "text.*") || t.compare(i, /\.(xml|javascript)$/i) || t.compare(i, /\.(txt|md|csv|nfo|ini|json|php|js|css)$/i)
+ }, video: function (e, i) {
+ return t.compare(e, "video.*") && (t.compare(e, /(ogg|mp4|mp?g|mov|webm|3gp)$/i) || t.compare(i, /\.(og?|mp4|webm|mp?g|mov|3gp)$/i))
+ }, audio: function (e, i) {
+ return t.compare(e, "audio.*") && (t.compare(i, /(ogg|mp3|mp?g|wav)$/i) || t.compare(i, /\.(og?|mp3|mp?g|wav)$/i))
+ }, flash: function (e, i) {
+ return t.compare(e, "application/x-shockwave-flash", !0) || t.compare(i, /\.(swf)$/i)
+ }, pdf: function (e, i) {
+ return t.compare(e, "application/pdf", !0) || t.compare(i, /\.(pdf)$/i)
+ }, object: function () {
+ return !0
+ }, other: function () {
+ return !0
+ }
+ },
+ fileActionSettings: {
+ showRemove: !0,
+ showUpload: !0,
+ showDownload: !0,
+ showZoom: !0,
+ showDrag: !0,
+ removeIcon: '<i class="glyphicon glyphicon-trash"></i>',
+ removeClass: "btn btn-kv btn-default btn-outline-secondary",
+ removeErrorClass: "btn btn-kv btn-danger",
+ removeTitle: "Remove file",
+ uploadIcon: '<i class="glyphicon glyphicon-upload"></i>',
+ uploadClass: "btn btn-kv btn-default btn-outline-secondary",
+ uploadTitle: "Upload file",
+ uploadRetryIcon: '<i class="glyphicon glyphicon-repeat"></i>',
+ uploadRetryTitle: "Retry upload",
+ downloadIcon: '<i class="glyphicon glyphicon-download"></i>',
+ downloadClass: "btn btn-kv btn-default btn-outline-secondary",
+ downloadTitle: "Download file",
+ zoomIcon: '<i class="glyphicon glyphicon-zoom-in"></i>',
+ zoomClass: "btn btn-kv btn-default btn-outline-secondary",
+ zoomTitle: "View Details",
+ dragIcon: '<i class="glyphicon glyphicon-move"></i>',
+ dragClass: "text-info",
+ dragTitle: "Move / Rearrange",
+ dragSettings: {},
+ indicatorNew: '<i class="glyphicon glyphicon-plus-sign text-warning"></i>',
+ indicatorSuccess: '<i class="glyphicon glyphicon-ok-sign text-success"></i>',
+ indicatorError: '<i class="glyphicon glyphicon-exclamation-sign text-danger"></i>',
+ indicatorLoading: '<i class="glyphicon glyphicon-hourglass text-muted"></i>',
+ indicatorNewTitle: "Not uploaded yet",
+ indicatorSuccessTitle: "Uploaded",
+ indicatorErrorTitle: "Upload Error",
+ indicatorLoadingTitle: "Uploading ..."
+ }
+ }, e.each(O.defaults, function (t, i) {
+ return "allowedPreviewTypes" === t ? void(void 0 === O.allowedPreviewTypes && (O.allowedPreviewTypes = i)) : void(O[t] = e.extend(!0, {}, i, O[t]))
+ }), O._initPreviewTemplates()
+ }, _initPreviewTemplates: function () {
+ var i, a = this, r = a.defaults, n = a.previewMarkupTags, o = n.tagAfter;
+ e.each(r.previewContentTemplates, function (e, r) {
+ t.isEmpty(a.previewTemplates[e]) && (i = n.tagBefore2, "generic" !== e && "image" !== e && "html" !== e && "text" !== e || (i = n.tagBefore1), a.previewTemplates[e] = i + r + o)
+ })
+ }, _initPreviewCache: function () {
+ var i = this;
+ i.previewCache = {
+ data: {}, init: function () {
+ var e = i.initialPreview;
+ e.length > 0 && !t.isArray(e) && (e = e.split(i.initialPreviewDelimiter)), i.previewCache.data = {
+ content: e,
+ config: i.initialPreviewConfig,
+ tags: i.initialPreviewThumbTags
+ }
+ }, count: function () {
+ return i.previewCache.data && i.previewCache.data.content ? i.previewCache.data.content.length : 0
+ }, get: function (a, r) {
+ var n, o, l, s, d, c, p, u = "init_" + a, f = i.previewCache.data, m = f.config[a],
+ v = f.content[a], g = i.previewInitId + "-" + u,
+ h = t.ifSet("previewAsData", m, i.initialPreviewAsData),
+ w = function (e, a, r, n, o, l, s, d, c) {
+ return d = " file-preview-initial " + t.SORT_CSS + (d ? " " + d : ""), i._generatePreviewTemplate(e, a, r, n, o, !1, null, d, l, s, c)
+ };
+ return v ? (r = void 0 === r ? !0 : r, l = t.ifSet("type", m, i.initialPreviewFileType || "generic"), d = t.ifSet("filename", m, t.ifSet("caption", m)), c = t.ifSet("filetype", m, l), s = i.previewCache.footer(a, r, m && m.size || null), p = t.ifSet("frameClass", m), n = h ? w(l, v, d, c, g, s, u, p) : w("generic", v, d, c, g, s, u, p, l).setTokens({content: f.content[a]}), f.tags.length && f.tags[a] && (n = t.replaceTags(n, f.tags[a])), t.isEmpty(m) || t.isEmpty(m.frameAttr) || (o = e(document.createElement("div")).html(n), o.find(".file-preview-initial").attr(m.frameAttr), n = o.html(), o.remove()), n) : ""
+ }, add: function (e, a, r, n) {
+ var o, l = i.previewCache.data;
+ return t.isArray(e) || (e = e.split(i.initialPreviewDelimiter)), n ? (o = l.content.push(e) - 1, l.config[o] = a, l.tags[o] = r) : (o = e.length - 1, l.content = e, l.config = a, l.tags = r), i.previewCache.data = l, o
+ }, set: function (e, a, r, n) {
+ var o, l, s = i.previewCache.data;
+ if (e && e.length && (t.isArray(e) || (e = e.split(i.initialPreviewDelimiter)), l = e.filter(function (e) {
+ return null !== e
+ }), l.length)) {
+ if (void 0 === s.content && (s.content = []), void 0 === s.config && (s.config = []), void 0 === s.tags && (s.tags = []), n) {
+ for (o = 0; o < e.length; o++) e[o] && s.content.push(e[o]);
+ for (o = 0; o < a.length; o++) a[o] && s.config.push(a[o]);
+ for (o = 0; o < r.length; o++) r[o] && s.tags.push(r[o])
+ } else s.content = e, s.config = a, s.tags = r;
+ i.previewCache.data = s
+ }
+ }, unset: function (e) {
+ var a = i.previewCache.count();
+ if (a) {
+ if (1 === a) return i.previewCache.data.content = [], i.previewCache.data.config = [], i.previewCache.data.tags = [], i.initialPreview = [], i.initialPreviewConfig = [], void(i.initialPreviewThumbTags = []);
+ i.previewCache.data.content = t.spliceArray(i.previewCache.data.content, e), i.previewCache.data.config = t.spliceArray(i.previewCache.data.config, e), i.previewCache.data.tags = t.spliceArray(i.previewCache.data.tags, e)
+ }
+ }, out: function () {
+ var e, t, a = "", r = i.previewCache.count();
+ if (0 === r) return {content: "", caption: ""};
+ for (t = 0; r > t; t++) a += i.previewCache.get(t);
+ return e = i._getMsgSelected(r), {content: a, caption: e}
+ }, footer: function (e, a, r) {
+ var n = i.previewCache.data || {};
+ if (t.isEmpty(n.content)) return "";
+ (t.isEmpty(n.config) || t.isEmpty(n.config[e])) && (n.config[e] = {}), a = void 0 === a ? !0 : a;
+ var o, l = n.config[e], s = t.ifSet("caption", l), d = t.ifSet("width", l, "auto"),
+ c = t.ifSet("url", l, !1), p = t.ifSet("key", l, null), u = i.fileActionSettings,
+ f = i.initialPreviewShowDelete || !1, m = l.downloadUrl || i.initialPreviewDownloadUrl || "",
+ v = l.filename || l.caption || "", g = !!m,
+ h = t.ifSet("showDelete", l, t.ifSet("showDelete", u, f)),
+ w = t.ifSet("showDownload", l, t.ifSet("showDownload", u, g)),
+ _ = t.ifSet("showZoom", l, t.ifSet("showZoom", u, !0)),
+ b = t.ifSet("showDrag", l, t.ifSet("showDrag", u, !0)), C = c === !1 && a;
+ return w = w && l.downloadUrl !== !1 && !!m, o = i._renderFileActions(!1, w, h, _, b, C, c, p, !0, m, v), i._getLayoutTemplate("footer").setTokens({
+ progress: i._renderThumbProgress(),
+ actions: o,
+ caption: s,
+ size: i._getSize(r),
+ width: d,
+ indicator: ""
+ })
+ }
+ }, i.previewCache.init()
+ }, _handler: function (e, t, i) {
+ var a = this, r = a.namespace, n = t.split(" ").join(r + " ") + r;
+ e && e.length && e.off(n).on(n, i)
+ }, _log: function (e) {
+ var t = this, i = t.$element.attr("id");
+ i && (e = '"' + i + '": ' + e), "undefined" != typeof window.console.log ? window.console.log(e) : window.alert(e)
+ }, _validate: function () {
+ var e = this, t = "file" === e.$element.attr("type");
+ return t || e._log('The input "type" must be set to "file" for initializing the "bootstrap-fileinput" plugin.'), t
+ }, _errorsExist: function () {
+ var t, i = this, a = i.$errorContainer.find("li");
+ return a.length ? !0 : (t = e(document.createElement("div")).html(i.$errorContainer.html()), t.find(".kv-error-close").remove(), t.find("ul").remove(), !!e.trim(t.text()).length)
+ }, _errorHandler: function (e, t) {
+ var i = this, a = e.target.error, r = function (e) {
+ i._showError(e.replace("{name}", t))
+ };
+ r(a.code === a.NOT_FOUND_ERR ? i.msgFileNotFound : a.code === a.SECURITY_ERR ? i.msgFileSecured : a.code === a.NOT_READABLE_ERR ? i.msgFileNotReadable : a.code === a.ABORT_ERR ? i.msgFilePreviewAborted : i.msgFilePreviewError)
+ }, _addError: function (e) {
+ var t = this, i = t.$errorContainer;
+ e && i.length && (i.html(t.errorCloseButton + e), t._handler(i.find(".kv-error-close"), "click", function () {
+ setTimeout(function () {
+ t.showPreview && !t.getFrames().length && t.clear(), i.fadeOut("slow")
+ }, 10)
+ }))
+ }, _setValidationError: function (e) {
+ var i = this;
+ e = (e ? e + " " : "") + "has-error", i.$container.removeClass(e).addClass("has-error"), t.addCss(i.$captionContainer, "is-invalid")
+ }, _resetErrors: function (e) {
+ var t = this, i = t.$errorContainer;
+ t.isError = !1, t.$container.removeClass("has-error"), t.$captionContainer.removeClass("is-invalid"), i.html(""), e ? i.fadeOut("slow") : i.hide()
+ }, _showFolderError: function (e) {
+ var t, i = this, a = i.$errorContainer;
+ e && (t = i.msgFoldersNotAllowed.replace("{n}", e), i._addError(t), i._setValidationError(), a.fadeIn(800), i._raise("filefoldererror", [e, t]))
+ }, _showUploadError: function (e, t, i) {
+ var a = this, r = a.$errorContainer, n = i || "fileuploaderror",
+ o = t && t.id ? '<li data-file-id="' + t.id + '">' + e + "</li>" : "<li>" + e + "</li>";
+ return 0 === r.find("ul").length ? a._addError("<ul>" + o + "</ul>") : r.find("ul").append(o), r.fadeIn(800), a._raise(n, [t, e]), a._setValidationError("file-input-new"), !0
+ }, _showError: function (e, t, i) {
+ var a = this, r = a.$errorContainer, n = i || "fileerror";
+ return t = t || {}, t.reader = a.reader, a._addError(e), r.fadeIn(800), a._raise(n, [t, e]), a.isAjaxUpload || a._clearFileInput(), a._setValidationError("file-input-new"), a.$btnUpload.attr("disabled", !0), !0
+ }, _noFilesError: function (e) {
+ var t = this, i = t.minFileCount > 1 ? t.filePlural : t.fileSingle,
+ a = t.msgFilesTooLess.replace("{n}", t.minFileCount).replace("{files}", i), r = t.$errorContainer;
+ t._addError(a), t.isError = !0, t._updateFileDetails(0), r.fadeIn(800), t._raise("fileerror", [e, a]), t._clearFileInput(), t._setValidationError()
+ }, _parseError: function (t, i, a, r) {
+ var n, o = this, l = e.trim(a + ""),
+ s = void 0 !== i.responseJSON && void 0 !== i.responseJSON.error ? i.responseJSON.error : i.responseText;
+ return o.cancelling && o.msgUploadAborted && (l = o.msgUploadAborted), o.showAjaxErrorDetails && s && (s = e.trim(s.replace(/\n\s*\n/g, "\n")), n = s.length ? "<pre>" + s + "</pre>" : "", l += l ? n : s), l || (l = o.msgAjaxError.replace("{operation}", t)), o.cancelling = !1, r ? "<b>" + r + ": </b>" + l : l
+ }, _parseFileType: function (e, i) {
+ var a, r, n, o, l = this, s = l.allowedPreviewTypes || [];
+ if ("application/text-plain" === e) return "text";
+ for (o = 0; o < s.length; o++) if (n = s[o], a = l.fileTypeSettings[n], r = a(e, i) ? n : "", !t.isEmpty(r)) return r;
+ return "other"
+ }, _getPreviewIcon: function (t) {
+ var i, a = this, r = null;
+ return t && t.indexOf(".") > -1 && (i = t.split(".").pop(), a.previewFileIconSettings && (r = a.previewFileIconSettings[i] || a.previewFileIconSettings[i.toLowerCase()] || null), a.previewFileExtSettings && e.each(a.previewFileExtSettings, function (e, t) {
+ return a.previewFileIconSettings[e] && t(i) ? void(r = a.previewFileIconSettings[e]) : void 0
+ })), r
+ }, _parseFilePreviewIcon: function (e, t) {
+ var i = this, a = i._getPreviewIcon(t) || i.previewFileIcon, r = e;
+ return r.indexOf("{previewFileIcon}") > -1 && (r = r.setTokens({
+ previewFileIconClass: i.previewFileIconClass,
+ previewFileIcon: a
+ })), r
+ }, _raise: function (t, i) {
+ var a = this, r = e.Event(t);
+ if (void 0 !== i ? a.$element.trigger(r, i) : a.$element.trigger(r), r.isDefaultPrevented() || r.result === !1) return !1;
+ switch (t) {
+ case"filebatchuploadcomplete":
+ case"filebatchuploadsuccess":
+ case"fileuploaded":
+ case"fileclear":
+ case"filecleared":
+ case"filereset":
+ case"fileerror":
+ case"filefoldererror":
+ case"fileuploaderror":
+ case"filebatchuploaderror":
+ case"filedeleteerror":
+ case"filecustomerror":
+ case"filesuccessremove":
+ break;
+ default:
+ a.ajaxAborted || (a.ajaxAborted = r.result)
+ }
+ return !0
+ }, _listenFullScreen: function (e) {
+ var t, i, a = this, r = a.$modal;
+ r && r.length && (t = r && r.find(".btn-fullscreen"), i = r && r.find(".btn-borderless"), t.length && i.length && (t.removeClass("active").attr("aria-pressed", "false"), i.removeClass("active").attr("aria-pressed", "false"), e ? t.addClass("active").attr("aria-pressed", "true") : i.addClass("active").attr("aria-pressed", "true"), r.hasClass("file-zoom-fullscreen") ? a._maximizeZoomDialog() : e ? a._maximizeZoomDialog() : i.removeClass("active").attr("aria-pressed", "false")))
+ }, _listen: function () {
+ var i, a = this, r = a.$element, n = a.$form, o = a.$container;
+ a._handler(r, "change", e.proxy(a._change, a)), a.showBrowse && a._handler(a.$btnFile, "click", e.proxy(a._browse, a)), a._handler(o.find(".fileinput-remove:not([disabled])"), "click", e.proxy(a.clear, a)), a._handler(o.find(".fileinput-cancel"), "click", e.proxy(a.cancel, a)), a._initDragDrop(), a._handler(n, "reset", e.proxy(a.clear, a)), a.isAjaxUpload || a._handler(n, "submit", e.proxy(a._submitForm, a)), a._handler(a.$container.find(".fileinput-upload"), "click", e.proxy(a._uploadClick, a)), a._handler(e(window), "resize", function () {
+ a._listenFullScreen(screen.width === window.innerWidth && screen.height === window.innerHeight)
+ }), i = "webkitfullscreenchange mozfullscreenchange fullscreenchange MSFullscreenChange", a._handler(e(document), i, function () {
+ a._listenFullScreen(t.checkFullScreen())
+ }), a._autoFitContent(), a._initClickable()
+ }, _autoFitContent: function () {
+ var t, i = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth, a = this,
+ r = 400 > i ? a.previewSettingsSmall || a.defaults.previewSettingsSmall : a.previewSettings || a.defaults.previewSettings;
+ e.each(r, function (e, i) {
+ t = ".file-preview-frame .file-preview-" + e, a.$preview.find(t + ".kv-preview-data," + t + " .kv-preview-data").css(i)
+ })
+ }, _initClickable: function () {
+ var i, a = this;
+ a.isClickable && (i = a.isAjaxUpload ? a.$dropZone : a.$preview.find(".file-default-preview"), t.addCss(i, "clickable"), i.attr("tabindex", -1), a._handler(i, "click", function (t) {
+ var r = e(t.target);
+ i.find(".kv-fileinput-error:visible").length || r.parents(".file-preview-thumbnails").length && !r.parents(".file-default-preview").length || (a.$element.trigger("click"), i.blur())
+ }))
+ }, _initDragDrop: function () {
+ var t = this, i = t.$dropZone;
+ t.isAjaxUpload && t.dropZoneEnabled && t.showPreview && (t._handler(i, "dragenter dragover", e.proxy(t._zoneDragEnter, t)), t._handler(i, "dragleave", e.proxy(t._zoneDragLeave, t)), t._handler(i, "drop", e.proxy(t._zoneDrop, t)), t._handler(e(document), "dragenter dragover drop", t._zoneDragDropInit))
+ }, _zoneDragDropInit: function (e) {
+ e.stopPropagation(), e.preventDefault()
+ }, _zoneDragEnter: function (i) {
+ var a = this, r = e.inArray("Files", i.originalEvent.dataTransfer.types) > -1;
+ return a._zoneDragDropInit(i), a.isDisabled || !r ? (i.originalEvent.dataTransfer.effectAllowed = "none", void(i.originalEvent.dataTransfer.dropEffect = "none")) : void t.addCss(a.$dropZone, "file-highlighted")
+ }, _zoneDragLeave: function (e) {
+ var t = this;
+ t._zoneDragDropInit(e), t.isDisabled || t.$dropZone.removeClass("file-highlighted")
+ }, _zoneDrop: function (e) {
+ var i = this;
+ e.preventDefault(), i.isDisabled || t.isEmpty(e.originalEvent.dataTransfer.files) || (i._change(e, "dragdrop"), i.$dropZone.removeClass("file-highlighted"));
+ }, _uploadClick: function (e) {
+ var i, a = this, r = a.$container.find(".fileinput-upload"),
+ n = !r.hasClass("disabled") && t.isEmpty(r.attr("disabled"));
+ if (!e || !e.isDefaultPrevented()) {
+ if (!a.isAjaxUpload) return void(n && "submit" !== r.attr("type") && (i = r.closest("form"), i.length && i.trigger("submit"), e.preventDefault()));
+ e.preventDefault(), n && a.upload()
+ }
+ }, _submitForm: function () {
+ var e = this;
+ return e._isFileSelectionValid() && !e._abort({})
+ }, _clearPreview: function () {
+ var i = this, a = i.$preview,
+ r = i.showUploadedThumbs ? i.getFrames(":not(.file-preview-success)") : i.getFrames();
+ r.each(function () {
+ var i = e(this);
+ i.remove(), t.cleanZoomCache(a.find("#zoom-" + i.attr("id")))
+ }), i.getFrames().length && i.showPreview || i._resetUpload(), i._validateDefaultPreview()
+ }, _initSortable: function () {
+ var i, a = this, r = a.$preview, n = "." + t.SORT_CSS;
+ window.KvSortable && 0 !== r.find(n).length && (i = {
+ handle: ".drag-handle-init",
+ dataIdAttr: "data-preview-id",
+ scroll: !1,
+ draggable: n,
+ onSort: function (i) {
+ var r = i.oldIndex, n = i.newIndex, o = 0;
+ a.initialPreview = t.moveArray(a.initialPreview, r, n), a.initialPreviewConfig = t.moveArray(a.initialPreviewConfig, r, n), a.previewCache.init(), a.getFrames(".file-preview-initial").each(function () {
+ e(this).attr("data-fileindex", "init_" + o), o++
+ }), a._raise("filesorted", {
+ previewId: e(i.item).attr("id"),
+ oldIndex: r,
+ newIndex: n,
+ stack: a.initialPreviewConfig
+ })
+ }
+ }, r.data("kvsortable") && r.kvsortable("destroy"), e.extend(!0, i, a.fileActionSettings.dragSettings), r.kvsortable(i))
+ }, _setPreviewContent: function (e) {
+ var t = this;
+ t.$preview.html(e), t._autoFitContent()
+ }, _initPreview: function (e) {
+ var i, a = this, r = a.initialCaption || "";
+ return a.previewCache.count() ? (i = a.previewCache.out(), r = e && a.initialCaption ? a.initialCaption : i.caption, a._setPreviewContent(i.content), a._setInitThumbAttr(), a._setCaption(r), a._initSortable(), void(t.isEmpty(i.content) || a.$container.removeClass("file-input-new"))) : (a._clearPreview(), void(e ? a._setCaption(r) : a._initCaption()))
+ }, _getZoomButton: function (e) {
+ var t = this, i = t.previewZoomButtonIcons[e], a = t.previewZoomButtonClasses[e],
+ r = ' title="' + (t.previewZoomButtonTitles[e] || "") + '" ',
+ n = r + ("close" === e ? ' data-dismiss="modal" aria-hidden="true"' : "");
+ return "fullscreen" !== e && "borderless" !== e && "toggleheader" !== e || (n += ' data-toggle="button" aria-pressed="false" autocomplete="off"'), '<button type="button" class="' + a + " btn-" + e + '"' + n + ">" + i + "</button>"
+ }, _getModalContent: function () {
+ var e = this;
+ return e._getLayoutTemplate("modal").setTokens({
+ rtl: e.rtl ? " kv-rtl" : "",
+ zoomFrameClass: e.frameClass,
+ heading: e.msgZoomModalHeading,
+ prev: e._getZoomButton("prev"),
+ next: e._getZoomButton("next"),
+ toggleheader: e._getZoomButton("toggleheader"),
+ fullscreen: e._getZoomButton("fullscreen"),
+ borderless: e._getZoomButton("borderless"),
+ close: e._getZoomButton("close")
+ })
+ }, _listenModalEvent: function (e) {
+ var i = this, a = i.$modal, r = function (e) {
+ return {sourceEvent: e, previewId: a.data("previewId"), modal: a}
+ };
+ a.on(e + ".bs.modal", function (n) {
+ var o = a.find(".btn-fullscreen"), l = a.find(".btn-borderless");
+ i._raise("filezoom" + e, r(n)), "shown" === e && (l.removeClass("active").attr("aria-pressed", "false"), o.removeClass("active").attr("aria-pressed", "false"), a.hasClass("file-zoom-fullscreen") && (i._maximizeZoomDialog(), t.checkFullScreen() ? o.addClass("active").attr("aria-pressed", "true") : l.addClass("active").attr("aria-pressed", "true")))
+ })
+ }, _initZoom: function () {
+ var i, a = this, r = a._getLayoutTemplate("modalMain"), n = "#" + t.MODAL_ID;
+ a.showPreview && (a.$modal = e(n), a.$modal && a.$modal.length || (i = e(document.createElement("div")).html(r).insertAfter(a.$container), a.$modal = e(n).insertBefore(i), i.remove()), t.initModal(a.$modal), a.$modal.html(a._getModalContent()), e.each(t.MODAL_EVENTS, function (e, t) {
+ a._listenModalEvent(t)
+ }))
+ }, _initZoomButtons: function () {
+ var t, i, a = this, r = a.$modal.data("previewId") || "", n = a.getFrames().toArray(), o = n.length,
+ l = a.$modal.find(".btn-prev"), s = a.$modal.find(".btn-next");
+ return n.length < 2 ? (l.hide(), void s.hide()) : (l.show(), s.show(), void(o && (t = e(n[0]), i = e(n[o - 1]), l.removeAttr("disabled"), s.removeAttr("disabled"), t.length && t.attr("id") === r && l.attr("disabled", !0), i.length && i.attr("id") === r && s.attr("disabled", !0))))
+ }, _maximizeZoomDialog: function () {
+ var t = this, i = t.$modal, a = i.find(".modal-header:visible"), r = i.find(".modal-footer:visible"),
+ n = i.find(".modal-body"), o = e(window).height(), l = 0;
+ i.addClass("file-zoom-fullscreen"), a && a.length && (o -= a.outerHeight(!0)), r && r.length && (o -= r.outerHeight(!0)), n && n.length && (l = n.outerHeight(!0) - n.height(), o -= l), i.find(".kv-zoom-body").height(o)
+ }, _resizeZoomDialog: function (e) {
+ var i = this, a = i.$modal, r = a.find(".btn-fullscreen"), n = a.find(".btn-borderless");
+ if (a.hasClass("file-zoom-fullscreen")) t.toggleFullScreen(!1), e ? r.hasClass("active") || (a.removeClass("file-zoom-fullscreen"), i._resizeZoomDialog(!0), n.hasClass("active") && n.removeClass("active").attr("aria-pressed", "false")) : r.hasClass("active") ? r.removeClass("active").attr("aria-pressed", "false") : (a.removeClass("file-zoom-fullscreen"), i.$modal.find(".kv-zoom-body").css("height", i.zoomModalHeight)); else {
+ if (!e) return void i._maximizeZoomDialog();
+ t.toggleFullScreen(!0)
+ }
+ a.focus()
+ }, _setZoomContent: function (i, a) {
+ var r, n, o, l, s, d, c, p, u, f, m = this, v = i.attr("id"), g = m.$modal, h = g.find(".btn-prev"),
+ w = g.find(".btn-next"), _ = g.find(".btn-fullscreen"), b = g.find(".btn-borderless"),
+ C = g.find(".btn-toggleheader"), y = m.$preview.find("#zoom-" + v);
+ n = y.attr("data-template") || "generic", r = y.find(".kv-file-content"), o = r.length ? r.html() : "", u = i.data("caption") || "", f = i.data("size") || "", l = u + " " + f, g.find(".kv-zoom-title").attr("title", e("<div/>").html(l).text()).html(l), s = g.find(".kv-zoom-body"), g.removeClass("kv-single-content"), a ? (p = s.addClass("file-thumb-loading").clone().insertAfter(s), s.html(o).hide(), p.fadeOut("fast", function () {
+ s.fadeIn("fast", function () {
+ s.removeClass("file-thumb-loading")
+ }), p.remove()
+ })) : s.html(o), c = m.previewZoomSettings[n], c && (d = s.find(".kv-preview-data"), t.addCss(d, "file-zoom-detail"), e.each(c, function (e, t) {
+ d.css(e, t), (d.attr("width") && "width" === e || d.attr("height") && "height" === e) && d.removeAttr(e)
+ })), g.data("previewId", v);
+ var x = s.find("img");
+ x.length && t.adjustOrientedImage(x, !0), m._handler(h, "click", function () {
+ m._zoomSlideShow("prev", v)
+ }), m._handler(w, "click", function () {
+ m._zoomSlideShow("next", v)
+ }), m._handler(_, "click", function () {
+ m._resizeZoomDialog(!0)
+ }), m._handler(b, "click", function () {
+ m._resizeZoomDialog(!1)
+ }), m._handler(C, "click", function () {
+ var e, t = g.find(".modal-header"), i = g.find(".modal-body .floating-buttons"),
+ a = t.find(".kv-zoom-actions"), r = function (e) {
+ var i = m.$modal.find(".kv-zoom-body"), a = m.zoomModalHeight;
+ g.hasClass("file-zoom-fullscreen") && (a = i.outerHeight(!0), e || (a -= t.outerHeight(!0))), i.css("height", e ? a + e : a)
+ };
+ t.is(":visible") ? (e = t.outerHeight(!0), t.slideUp("slow", function () {
+ a.find(".btn").appendTo(i), r(e)
+ })) : (i.find(".btn").appendTo(a), t.slideDown("slow", function () {
+ r()
+ })), g.focus()
+ }), m._handler(g, "keydown", function (e) {
+ var t = e.which || e.keyCode;
+ 37 !== t || h.attr("disabled") || m._zoomSlideShow("prev", v), 39 !== t || w.attr("disabled") || m._zoomSlideShow("next", v)
+ })
+ }, _zoomPreview: function (e) {
+ var i, a = this, r = a.$modal;
+ if (!e.length) throw"Cannot zoom to detailed preview!";
+ t.initModal(r), r.html(a._getModalContent()), i = e.closest(t.FRAMES), a._setZoomContent(i), r.modal("show"), a._initZoomButtons()
+ }, _zoomSlideShow: function (t, i) {
+ var a, r, n, o = this, l = o.$modal.find(".kv-zoom-actions .btn-" + t), s = o.getFrames().toArray(),
+ d = s.length;
+ if (!l.attr("disabled")) {
+ for (r = 0; d > r; r++) if (e(s[r]).attr("id") === i) {
+ n = "prev" === t ? r - 1 : r + 1;
+ break
+ }
+ 0 > n || n >= d || !s[n] || (a = e(s[n]), a.length && o._setZoomContent(a, !0), o._initZoomButtons(), o._raise("filezoom" + t, {
+ previewId: i,
+ modal: o.$modal
+ }))
+ }
+ }, _initZoomButton: function () {
+ var t = this;
+ t.$preview.find(".kv-file-zoom").each(function () {
+ var i = e(this);
+ t._handler(i, "click", function () {
+ t._zoomPreview(i)
+ })
+ })
+ }, _clearObjects: function (t) {
+ t.find("video audio").each(function () {
+ this.pause(), e(this).remove()
+ }), t.find("img object div").each(function () {
+ e(this).remove()
+ })
+ }, _clearFileInput: function () {
+ var i, a, r, n = this, o = n.$element;
+ n.fileInputCleared = !0, t.isEmpty(o.val()) || (n.isIE9 || n.isIE10 ? (i = o.closest("form"), a = e(document.createElement("form")), r = e(document.createElement("div")), o.before(r), i.length ? i.after(a) : r.after(a), a.append(o).trigger("reset"), r.before(o).remove(), a.remove()) : o.val(""))
+ }, _resetUpload: function () {
+ var e = this;
+ e.uploadCache = {
+ content: [],
+ config: [],
+ tags: [],
+ append: !0
+ }, e.uploadCount = 0, e.uploadStatus = {}, e.uploadLog = [], e.uploadAsyncCount = 0, e.loadedImages = [], e.totalImagesCount = 0, e.$btnUpload.removeAttr("disabled"), e._setProgress(0), e.$progress.hide(), e._resetErrors(!1), e.ajaxAborted = !1, e.ajaxRequests = [], e._resetCanvas(), e.cacheInitialPreview = {}, e.overwriteInitial && (e.initialPreview = [], e.initialPreviewConfig = [], e.initialPreviewThumbTags = [], e.previewCache.data = {
+ content: [],
+ config: [],
+ tags: []
+ })
+ }, _resetCanvas: function () {
+ var e = this;
+ e.canvas && e.imageCanvasContext && e.imageCanvasContext.clearRect(0, 0, e.canvas.width, e.canvas.height)
+ }, _hasInitialPreview: function () {
+ var e = this;
+ return !e.overwriteInitial && e.previewCache.count()
+ }, _resetPreview: function () {
+ var e, t, i = this;
+ i.previewCache.count() ? (e = i.previewCache.out(), i._setPreviewContent(e.content), i._setInitThumbAttr(), t = i.initialCaption ? i.initialCaption : e.caption, i._setCaption(t)) : (i._clearPreview(), i._initCaption()), i.showPreview && (i._initZoom(), i._initSortable())
+ }, _clearDefaultPreview: function () {
+ var e = this;
+ e.$preview.find(".file-default-preview").remove()
+ }, _validateDefaultPreview: function () {
+ var e = this;
+ e.showPreview && !t.isEmpty(e.defaultPreviewContent) && (e._setPreviewContent('<div class="file-default-preview">' + e.defaultPreviewContent + "</div>"), e.$container.removeClass("file-input-new"), e._initClickable())
+ }, _resetPreviewThumbs: function (e) {
+ var t, i = this;
+ return e ? (i._clearPreview(), void i.clearStack()) : void(i._hasInitialPreview() ? (t = i.previewCache.out(), i._setPreviewContent(t.content), i._setInitThumbAttr(), i._setCaption(t.caption), i._initPreviewActions()) : i._clearPreview())
+ }, _getLayoutTemplate: function (e) {
+ var i = this, a = i.layoutTemplates[e];
+ return t.isEmpty(i.customLayoutTags) ? a : t.replaceTags(a, i.customLayoutTags)
+ }, _getPreviewTemplate: function (e) {
+ var i = this, a = i.previewTemplates[e];
+ return t.isEmpty(i.customPreviewTags) ? a : t.replaceTags(a, i.customPreviewTags)
+ }, _getOutData: function (e, t, i) {
+ var a = this;
+ return e = e || {}, t = t || {}, i = i || a.filestack.slice(0) || {}, {
+ form: a.formdata,
+ files: i,
+ filenames: a.filenames,
+ filescount: a.getFilesCount(),
+ extra: a._getExtraData(),
+ response: t,
+ reader: a.reader,
+ jqXHR: e
+ }
+ }, _getMsgSelected: function (e) {
+ var t = this, i = 1 === e ? t.fileSingle : t.filePlural;
+ return e > 0 ? t.msgSelected.replace("{n}", e).replace("{files}", i) : t.msgNoFilesSelected
+ }, _getFrame: function (t) {
+ var i = this, a = e("#" + t);
+ return a.length ? a : (i._log('Invalid thumb frame with id: "' + t + '".'), null)
+ }, _getThumbs: function (e) {
+ return e = e || "", this.getFrames(":not(.file-preview-initial)" + e)
+ }, _getExtraData: function (e, t) {
+ var i = this, a = i.uploadExtraData;
+ return "function" == typeof i.uploadExtraData && (a = i.uploadExtraData(e, t)), a
+ }, _initXhr: function (e, t, i) {
+ var a = this;
+ return e.upload && e.upload.addEventListener("progress", function (e) {
+ var r = 0, n = e.total, o = e.loaded || e.position;
+ e.lengthComputable && (r = Math.floor(o / n * 100)), t ? a._setAsyncUploadStatus(t, r, i) : a._setProgress(r)
+ }, !1), e
+ }, _mergeAjaxCallback: function (e, t, i) {
+ var a, r = this, n = r.ajaxSettings, o = r.mergeAjaxCallbacks;
+ "delete" === i && (n = r.ajaxDeleteSettings, o = r.mergeAjaxDeleteCallbacks), a = n[e], o && "function" == typeof a ? "before" === o ? n[e] = function () {
+ a.apply(this, arguments), t.apply(this, arguments)
+ } : n[e] = function () {
+ t.apply(this, arguments), a.apply(this, arguments)
+ } : n[e] = t, "delete" === i ? r.ajaxDeleteSettings = n : r.ajaxSettings = n
+ }, _ajaxSubmit: function (t, i, a, r, n, o) {
+ var l, s = this;
+ s._raise("filepreajax", [n, o]) && (s._uploadExtra(n, o), s._mergeAjaxCallback("beforeSend", t), s._mergeAjaxCallback("success", i), s._mergeAjaxCallback("complete", a), s._mergeAjaxCallback("error", r), l = e.extend(!0, {}, {
+ xhr: function () {
+ var t = e.ajaxSettings.xhr();
+ return s._initXhr(t, n, s.getFileStack().length)
+ },
+ url: o && s.uploadUrlThumb ? s.uploadUrlThumb : s.uploadUrl,
+ type: "POST",
+ dataType: "json",
+ data: s.formdata,
+ cache: !1,
+ processData: !1,
+ contentType: !1
+ }, s.ajaxSettings), s.ajaxRequests.push(e.ajax(l)))
+ }, _mergeArray: function (e, i) {
+ var a = this, r = t.cleanArray(a[e]), n = t.cleanArray(i);
+ a[e] = r.concat(n)
+ }, _initUploadSuccess: function (i, a, r) {
+ var n, o, l, s, d, c, p, u, f, m = this;
+ m.showPreview && "object" == typeof i && !e.isEmptyObject(i) && void 0 !== i.initialPreview && i.initialPreview.length > 0 && (m.hasInitData = !0, c = i.initialPreview || [], p = i.initialPreviewConfig || [], u = i.initialPreviewThumbTags || [], n = void 0 === i.append || i.append, c.length > 0 && !t.isArray(c) && (c = c.split(m.initialPreviewDelimiter)), m._mergeArray("initialPreview", c), m._mergeArray("initialPreviewConfig", p), m._mergeArray("initialPreviewThumbTags", u), void 0 !== a ? r ? (f = a.attr("data-fileindex"), m.uploadCache.content[f] = c[0], m.uploadCache.config[f] = p[0] || [], m.uploadCache.tags[f] = u[0] || [], m.uploadCache.append = n) : (l = m.previewCache.add(c, p[0], u[0], n), o = m.previewCache.get(l, !1), s = e(document.createElement("div")).html(o).hide().insertAfter(a), d = s.find(".kv-zoom-cache"), d && d.length && d.insertAfter(a), a.fadeOut("slow", function () {
+ var e = s.find(".file-preview-frame");
+ e && e.length && e.insertBefore(a).fadeIn("slow").css("display:inline-block"), m._initPreviewActions(), m._clearFileInput(), t.cleanZoomCache(m.$preview.find("#zoom-" + a.attr("id"))), a.remove(), s.remove(), m._initSortable()
+ })) : (m.previewCache.set(c, p, u, n), m._initPreview(), m._initPreviewActions()))
+ }, _initSuccessThumbs: function () {
+ var i = this;
+ i.showPreview && i._getThumbs(t.FRAMES + ".file-preview-success").each(function () {
+ var a = e(this), r = i.$preview, n = a.find(".kv-file-remove");
+ n.removeAttr("disabled"), i._handler(n, "click", function () {
+ var e = a.attr("id"), n = i._raise("filesuccessremove", [e, a.attr("data-fileindex")]);
+ t.cleanMemory(a), n !== !1 && a.fadeOut("slow", function () {
+ t.cleanZoomCache(r.find("#zoom-" + e)), a.remove(), i.getFrames().length || i.reset()
+ })
+ })
+ })
+ }, _checkAsyncComplete: function () {
+ var t, i, a = this;
+ for (i = 0; i < a.filestack.length; i++) if (a.filestack[i] && (t = a.previewInitId + "-" + i, -1 === e.inArray(t, a.uploadLog))) return !1;
+ return a.uploadAsyncCount === a.uploadLog.length
+ }, _uploadExtra: function (t, i) {
+ var a = this, r = a._getExtraData(t, i);
+ 0 !== r.length && e.each(r, function (e, t) {
+ a.formdata.append(e, t)
+ })
+ }, _uploadSingle: function (i, a) {
+ var r, n, o, l, s, d, c, p, u, f, m, v = this, g = v.getFileStack().length, h = new FormData,
+ w = v.previewInitId + "-" + i, _ = v.filestack.length > 0 || !e.isEmptyObject(v.uploadExtraData),
+ b = e("#" + w).find(".file-thumb-progress"), C = {id: w, index: i};
+ v.formdata = h, v.showPreview && (n = e("#" + w + ":not(.file-preview-initial)"), l = n.find(".kv-file-upload"), s = n.find(".kv-file-remove"), b.show()), 0 === g || !_ || l && l.hasClass("disabled") || v._abort(C) || (m = function (e, t) {
+ d || v.updateStack(e, void 0), v.uploadLog.push(t), v._checkAsyncComplete() && (v.fileBatchCompleted = !0)
+ }, o = function () {
+ var e, i, a, r = v.uploadCache, n = 0, o = v.cacheInitialPreview;
+ v.fileBatchCompleted && (o && o.content && (n = o.content.length), setTimeout(function () {
+ var l = 0 === v.getFileStack(!0).length;
+ if (v.showPreview) {
+ if (v.previewCache.set(r.content, r.config, r.tags, r.append), n) {
+ for (i = 0; i < r.content.length; i++) a = i + n, o.content[a] = r.content[i], o.config.length && (o.config[a] = r.config[i]), o.tags.length && (o.tags[a] = r.tags[i]);
+ v.initialPreview = t.cleanArray(o.content), v.initialPreviewConfig = t.cleanArray(o.config), v.initialPreviewThumbTags = t.cleanArray(o.tags)
+ } else v.initialPreview = r.content, v.initialPreviewConfig = r.config, v.initialPreviewThumbTags = r.tags;
+ v.cacheInitialPreview = {}, v.hasInitData && (v._initPreview(), v._initPreviewActions())
+ }
+ v.unlock(l), l && v._clearFileInput(), e = v.$preview.find(".file-preview-initial"), v.uploadAsync && e.length && (t.addCss(e, t.SORT_CSS), v._initSortable()), v._raise("filebatchuploadcomplete", [v.filestack, v._getExtraData()]), v.uploadCount = 0, v.uploadStatus = {}, v.uploadLog = [], v._setProgress(101), v.ajaxAborted = !1
+ }, 100))
+ }, c = function (o) {
+ r = v._getOutData(o), v.fileBatchCompleted = !1, a || (v.ajaxAborted = !1), v.showPreview && (n.hasClass("file-preview-success") || (v._setThumbStatus(n, "Loading"), t.addCss(n, "file-uploading")), l.attr("disabled", !0), s.attr("disabled", !0)), a || v.lock(), v._raise("filepreupload", [r, w, i]), e.extend(!0, C, r), v._abort(C) && (o.abort(), a || (v._setThumbStatus(n, "New"), n.removeClass("file-uploading"), l.removeAttr("disabled"), s.removeAttr("disabled"), v.unlock()), v._setProgressCancelled())
+ }, p = function (o, s, c) {
+ var p = v.showPreview && n.attr("id") ? n.attr("id") : w;
+ r = v._getOutData(c, o), e.extend(!0, C, r), setTimeout(function () {
+ t.isEmpty(o) || t.isEmpty(o.error) ? (v.showPreview && (v._setThumbStatus(n, "Success"), l.hide(), v._initUploadSuccess(o, n, a), v._setProgress(101, b)), v._raise("fileuploaded", [r, p, i]), a ? m(i, p) : v.updateStack(i, void 0)) : (d = !0, v._showUploadError(o.error, C), v._setPreviewError(n, i, v.filestack[i], v.retryErrorUploads), v.retryErrorUploads || l.hide(), a && m(i, p), v._setProgress(101, e("#" + p).find(".file-thumb-progress"), v.msgUploadError))
+ }, 100)
+ }, u = function () {
+ setTimeout(function () {
+ v.showPreview && (l.removeAttr("disabled"), s.removeAttr("disabled"), n.removeClass("file-uploading")), a ? o() : (v.unlock(!1), v._clearFileInput()), v._initSuccessThumbs()
+ }, 100)
+ }, f = function (t, r, o) {
+ var s = v.ajaxOperations.uploadThumb,
+ c = v._parseError(s, t, o, a && v.filestack[i].name ? v.filestack[i].name : null);
+ d = !0, setTimeout(function () {
+ a && m(i, w), v.uploadStatus[w] = 100, v._setPreviewError(n, i, v.filestack[i], v.retryErrorUploads), v.retryErrorUploads || l.hide(), e.extend(!0, C, v._getOutData(t)), v._setProgress(101, b, v.msgAjaxProgressError.replace("{operation}", s)), v._setProgress(101, e("#" + w).find(".file-thumb-progress"), v.msgUploadError), v._showUploadError(c, C)
+ }, 100)
+ }, h.append(v.uploadFileAttr, v.filestack[i], v.filenames[i]), h.append("file_id", i), v._ajaxSubmit(c, p, u, f, w, i))
+ }, _uploadBatch: function () {
+ var i, a, r, n, o, l = this, s = l.filestack, d = s.length, c = {},
+ p = l.filestack.length > 0 || !e.isEmptyObject(l.uploadExtraData);
+ l.formdata = new FormData, 0 !== d && p && !l._abort(c) && (o = function () {
+ e.each(s, function (e) {
+ l.updateStack(e, void 0)
+ }), l._clearFileInput()
+ }, i = function (i) {
+ l.lock();
+ var a = l._getOutData(i);
+ l.ajaxAborted = !1, l.showPreview && l._getThumbs().each(function () {
+ var i = e(this), a = i.find(".kv-file-upload"), r = i.find(".kv-file-remove");
+ i.hasClass("file-preview-success") || (l._setThumbStatus(i, "Loading"), t.addCss(i, "file-uploading")), a.attr("disabled", !0), r.attr("disabled", !0)
+ }), l._raise("filebatchpreupload", [a]), l._abort(a) && (i.abort(), l._getThumbs().each(function () {
+ var t = e(this), i = t.find(".kv-file-upload"), a = t.find(".kv-file-remove");
+ t.hasClass("file-preview-loading") && (l._setThumbStatus(t, "New"), t.removeClass("file-uploading")), i.removeAttr("disabled"), a.removeAttr("disabled")
+ }), l._setProgressCancelled())
+ }, a = function (i, a, r) {
+ var n = l._getOutData(r, i), s = 0, d = l._getThumbs(":not(.file-preview-success)"),
+ c = t.isEmpty(i) || t.isEmpty(i.errorkeys) ? [] : i.errorkeys;
+ t.isEmpty(i) || t.isEmpty(i.error) ? (l._raise("filebatchuploadsuccess", [n]), o(), l.showPreview ? (d.each(function () {
+ var t = e(this);
+ l._setThumbStatus(t, "Success"), t.removeClass("file-uploading"), t.find(".kv-file-upload").hide().removeAttr("disabled")
+ }), l._initUploadSuccess(i)) : l.reset(), l._setProgress(101)) : (l.showPreview && (d.each(function () {
+ var t = e(this), i = t.attr("data-fileindex");
+ t.removeClass("file-uploading"), t.find(".kv-file-upload").removeAttr("disabled"), t.find(".kv-file-remove").removeAttr("disabled"), 0 === c.length || -1 !== e.inArray(s, c) ? (l._setPreviewError(t, i, l.filestack[i], l.retryErrorUploads), l.retryErrorUploads || (t.find(".kv-file-upload").hide(), l.updateStack(i, void 0))) : (t.find(".kv-file-upload").hide(), l._setThumbStatus(t, "Success"), l.updateStack(i, void 0)), t.hasClass("file-preview-error") && !l.retryErrorUploads || s++
+ }), l._initUploadSuccess(i)), l._showUploadError(i.error, n, "filebatchuploaderror"), l._setProgress(101, l.$progress, l.msgUploadError))
+ }, n = function () {
+ l.unlock(), l._initSuccessThumbs(), l._clearFileInput(), l._raise("filebatchuploadcomplete", [l.filestack, l._getExtraData()])
+ }, r = function (t, i, a) {
+ var r = l._getOutData(t), n = l.ajaxOperations.uploadBatch, o = l._parseError(n, t, a);
+ l._showUploadError(o, r, "filebatchuploaderror"), l.uploadFileCount = d - 1, l.showPreview && (l._getThumbs().each(function () {
+ var t = e(this), i = t.attr("data-fileindex");
+ t.removeClass("file-uploading"), void 0 !== l.filestack[i] && l._setPreviewError(t)
+ }), l._getThumbs().removeClass("file-uploading"), l._getThumbs(" .kv-file-upload").removeAttr("disabled"), l._getThumbs(" .kv-file-delete").removeAttr("disabled"), l._setProgress(101, l.$progress, l.msgAjaxProgressError.replace("{operation}", n)))
+ }, e.each(s, function (e, i) {
+ t.isEmpty(s[e]) || l.formdata.append(l.uploadFileAttr, i, l.filenames[e])
+ }), l._ajaxSubmit(i, a, n, r))
+ }, _uploadExtraOnly: function () {
+ var e, i, a, r, n = this, o = {};
+ n.formdata = new FormData, n._abort(o) || (e = function (e) {
+ n.lock();
+ var t = n._getOutData(e);
+ n._raise("filebatchpreupload", [t]), n._setProgress(50), o.data = t, o.xhr = e, n._abort(o) && (e.abort(), n._setProgressCancelled())
+ }, i = function (e, i, a) {
+ var r = n._getOutData(a, e);
+ t.isEmpty(e) || t.isEmpty(e.error) ? (n._raise("filebatchuploadsuccess", [r]), n._clearFileInput(), n._initUploadSuccess(e), n._setProgress(101)) : n._showUploadError(e.error, r, "filebatchuploaderror")
+ }, a = function () {
+ n.unlock(), n._clearFileInput(), n._raise("filebatchuploadcomplete", [n.filestack, n._getExtraData()])
+ }, r = function (e, t, i) {
+ var a = n._getOutData(e), r = n.ajaxOperations.uploadExtra, l = n._parseError(r, e, i);
+ o.data = a, n._showUploadError(l, a, "filebatchuploaderror"), n._setProgress(101, n.$progress, n.msgAjaxProgressError.replace("{operation}", r))
+ }, n._ajaxSubmit(e, i, a, r))
+ }, _deleteFileIndex: function (i) {
+ var a = this, r = i.attr("data-fileindex");
+ "init_" === r.substring(0, 5) && (r = parseInt(r.replace("init_", "")), a.initialPreview = t.spliceArray(a.initialPreview, r), a.initialPreviewConfig = t.spliceArray(a.initialPreviewConfig, r), a.initialPreviewThumbTags = t.spliceArray(a.initialPreviewThumbTags, r), a.getFrames().each(function () {
+ var t = e(this), i = t.attr("data-fileindex");
+ "init_" === i.substring(0, 5) && (i = parseInt(i.replace("init_", "")), i > r && (i--, t.attr("data-fileindex", "init_" + i)))
+ }), a.uploadAsync && (a.cacheInitialPreview = a.getPreview()))
+ }, _initFileActions: function () {
+ var i = this, a = i.$preview;
+ i.showPreview && (i._initZoomButton(), i.getFrames(" .kv-file-remove").each(function () {
+ var r, n, o, l, s = e(this), d = s.closest(t.FRAMES), c = d.attr("id"), p = d.attr("data-fileindex");
+ i._handler(s, "click", function () {
+ return l = i._raise("filepreremove", [c, p]), l !== !1 && i._validateMinCount() ? (r = d.hasClass("file-preview-error"), t.cleanMemory(d), void d.fadeOut("slow", function () {
+ t.cleanZoomCache(a.find("#zoom-" + c)), i.updateStack(p, void 0), i._clearObjects(d), d.remove(), c && r && i.$errorContainer.find('li[data-file-id="' + c + '"]').fadeOut("fast", function () {
+ e(this).remove(), i._errorsExist() || i._resetErrors()
+ }), i._clearFileInput();
+ var l = i.getFileStack(!0), s = i.previewCache.count(), u = l.length,
+ f = i.showPreview && i.getFrames().length;
+ 0 !== u || 0 !== s || f ? (n = s + u, o = n > 1 ? i._getMsgSelected(n) : l[0] ? i._getFileNames()[0] : "", i._setCaption(o)) : i.reset(), i._raise("fileremoved", [c, p])
+ })) : !1
+ })
+ }), i.getFrames(" .kv-file-upload").each(function () {
+ var a = e(this);
+ i._handler(a, "click", function () {
+ var e = a.closest(t.FRAMES), r = e.attr("data-fileindex");
+ i.$progress.hide(), e.hasClass("file-preview-error") && !i.retryErrorUploads || i._uploadSingle(r, !1)
+ })
+ }))
+ }, _initPreviewActions: function () {
+ var i = this, a = i.$preview, r = i.deleteExtraData || {}, n = t.FRAMES + " .kv-file-remove",
+ o = i.fileActionSettings, l = o.removeClass, s = o.removeErrorClass, d = function () {
+ var e = i.isAjaxUpload ? i.previewCache.count() : i.$element.get(0).files.length;
+ a.find(t.FRAMES).length || e || (i._setCaption(""), i.reset(), i.initialCaption = "")
+ };
+ i._initZoomButton(), a.find(n).each(function () {
+ var n, o, c, p = e(this), u = p.data("url") || i.deleteUrl, f = p.data("key");
+ if (!t.isEmpty(u) && void 0 !== f) {
+ var m, v, g, h, w = p.closest(t.FRAMES), _ = i.previewCache.data, b = w.attr("data-fileindex");
+ b = parseInt(b.replace("init_", "")), g = t.isEmpty(_.config) && t.isEmpty(_.config[b]) ? null : _.config[b], h = t.isEmpty(g) || t.isEmpty(g.extra) ? r : g.extra, "function" == typeof h && (h = h()), v = {
+ id: p.attr("id"),
+ key: f,
+ extra: h
+ }, n = function (e) {
+ i.ajaxAborted = !1, i._raise("filepredelete", [f, e, h]), i._abort() ? e.abort() : (p.removeClass(s), t.addCss(w, "file-uploading"), t.addCss(p, "disabled " + l))
+ }, o = function (e, r, n) {
+ var o, c;
+ return t.isEmpty(e) || t.isEmpty(e.error) ? (w.removeClass("file-uploading").addClass("file-deleted"), void w.fadeOut("slow", function () {
+ b = parseInt(w.attr("data-fileindex").replace("init_", "")), i.previewCache.unset(b), i._deleteFileIndex(w), o = i.previewCache.count(), c = o > 0 ? i._getMsgSelected(o) : "", i._setCaption(c), i._raise("filedeleted", [f, n, h]), t.cleanZoomCache(a.find("#zoom-" + w.attr("id"))), i._clearObjects(w), w.remove(), d()
+ })) : (v.jqXHR = n, v.response = e, i._showError(e.error, v, "filedeleteerror"), w.removeClass("file-uploading"), p.removeClass("disabled " + l).addClass(s), void d())
+ }, c = function (e, t, a) {
+ var r = i.ajaxOperations.deleteThumb, n = i._parseError(r, e, a);
+ v.jqXHR = e, v.response = {}, i._showError(n, v, "filedeleteerror"), w.removeClass("file-uploading"), p.removeClass("disabled " + l).addClass(s), d()
+ }, i._mergeAjaxCallback("beforeSend", n, "delete"), i._mergeAjaxCallback("success", o, "delete"), i._mergeAjaxCallback("error", c, "delete"), m = e.extend(!0, {}, {
+ url: u,
+ type: "POST",
+ dataType: "json",
+ data: e.extend(!0, {}, {key: f}, h)
+ }, i.ajaxDeleteSettings), i._handler(p, "click", function () {
+ return i._validateMinCount() ? (i.ajaxAborted = !1, i._raise("filebeforedelete", [f, h]), void(i.ajaxAborted instanceof Promise ? i.ajaxAborted.then(function (t) {
+ t || e.ajax(m)
+ }) : i.ajaxAborted || e.ajax(m))) : !1
+ })
+ }
+ })
+ }, _hideFileIcon: function () {
+ var e = this;
+ e.overwriteInitial && e.$captionContainer.removeClass("icon-visible")
+ }, _showFileIcon: function () {
+ var e = this;
+ t.addCss(e.$captionContainer, "icon-visible")
+ }, _getSize: function (t) {
+ var i, a, r, n = this, o = parseFloat(t), l = n.fileSizeGetter;
+ return e.isNumeric(t) && e.isNumeric(o) ? ("function" == typeof l ? r = l(o) : 0 === o ? r = "0.00 B" : (i = Math.floor(Math.log(o) / Math.log(1024)), a = ["B", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"], r = 1 * (o / Math.pow(1024, i)).toFixed(2) + " " + a[i]), n._getLayoutTemplate("size").replace("{sizeText}", r)) : ""
+ }, _generatePreviewTemplate: function (i, a, r, n, o, l, s, d, c, p, u) {
+ var f, m, v = this, g = v.slug(r), h = "", w = "",
+ _ = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
+ b = 400 > _ ? v.previewSettingsSmall[i] || v.defaults.previewSettingsSmall[i] : v.previewSettings[i] || v.defaults.previewSettings[i],
+ C = c || v._renderFileFooter(g, s, "auto", l), y = v._getPreviewIcon(r), x = "type-default",
+ T = y && v.preferIconicPreview, E = y && v.preferIconicZoomPreview;
+ return b && e.each(b, function (e, t) {
+ w += e + ":" + t + ";"
+ }), m = function (a, l, s, c) {
+ var f = s ? "zoom-" + o : o, m = v._getPreviewTemplate(a), h = (d || "") + " " + c;
+ return v.frameClass && (h = v.frameClass + " " + h), s && (h = h.replace(" " + t.SORT_CSS, "")), m = v._parseFilePreviewIcon(m, r), "text" === a && (l = t.htmlEncode(l)), "object" !== i || n || e.each(v.defaults.fileTypeSettings, function (e, t) {
+ "object" !== e && "other" !== e && t(r, n) && (x = "type-" + e)
+ }), m.setTokens({
+ previewId: f,
+ caption: g,
+ frameClass: h,
+ type: n,
+ fileindex: p,
+ typeCss: x,
+ footer: C,
+ data: l,
+ template: u || i,
+ style: w ? 'style="' + w + '"' : ""
+ })
+ }, p = p || o.slice(o.lastIndexOf("-") + 1), v.fileActionSettings.showZoom && (h = m(E ? "other" : i, a, !0, "kv-zoom-thumb")), h = "\n" + v._getLayoutTemplate("zoomCache").replace("{zoomContent}", h), f = m(T ? "other" : i, a, !1, "kv-preview-thumb"), f + h
+ }, _previewDefault: function (i, a, r) {
+ var n = this, o = n.$preview;
+ if (n.showPreview) {
+ var l, s = i ? i.name : "", d = i ? i.type : "", c = i.size || 0, p = n.slug(s),
+ u = r === !0 && !n.isAjaxUpload, f = t.objUrl.createObjectURL(i);
+ n._clearDefaultPreview(), l = n._generatePreviewTemplate("other", f, s, d, a, u, c), o.append("\n" + l), n._setThumbAttr(a, p, c), r === !0 && n.isAjaxUpload && n._setThumbStatus(e("#" + a), "Error")
+ }
+ }, _previewFile: function (e, i, a, r, n, o) {
+ if (this.showPreview) {
+ var l, s = this, d = i ? i.name : "", c = o.type, p = o.name, u = s._parseFileType(c, d),
+ f = s.allowedPreviewTypes, m = s.allowedPreviewMimeTypes, v = s.$preview, g = i.size || 0,
+ h = f && f.indexOf(u) >= 0, w = m && -1 !== m.indexOf(c),
+ _ = "text" === u || "html" === u || "image" === u ? a.target.result : n;
+ if ("html" === u && s.purifyHtml && window.DOMPurify && (_ = window.DOMPurify.sanitize(_)), h || w) {
+ l = s._generatePreviewTemplate(u, _, d, c, r, !1, g), s._clearDefaultPreview(), v.append("\n" + l);
+ var b = v.find("#" + r + " img");
+ b.length && s.autoOrientImage ? t.validateOrientation(i, function (e) {
+ if (!e) return void s._validateImage(r, p, c, g, _);
+ var a = v.find("#zoom-" + r + " img"), n = "rotate-" + e;
+ e > 4 && (n += b.width() > b.height() ? " is-portrait-gt4" : " is-landscape-gt4"), t.addCss(b, n), t.addCss(a, n), s._raise("fileimageoriented", {
+ $img: b,
+ file: i
+ }), s._validateImage(r, p, c, g, _), t.adjustOrientedImage(b)
+ }) : s._validateImage(r, p, c, g, _)
+ } else s._previewDefault(i, r);
+ s._setThumbAttr(r, p, g), s._initSortable()
+ }
+ }, _setThumbAttr: function (t, i, a) {
+ var r = this, n = e("#" + t);
+ n.length && (a = a && a > 0 ? r._getSize(a) : "", n.data({caption: i, size: a}))
+ }, _setInitThumbAttr: function () {
+ var e, i, a, r, n = this, o = n.previewCache.data, l = n.previewCache.count();
+ if (0 !== l) for (var s = 0; l > s; s++) e = o.config[s], r = n.previewInitId + "-init_" + s, i = t.ifSet("caption", e, t.ifSet("filename", e)), a = t.ifSet("size", e), n._setThumbAttr(r, i, a)
+ }, _slugDefault: function (e) {
+ return t.isEmpty(e) ? "" : String(e).replace(/[\[\]\/\{}:;#%=\(\)\*\+\?\\\^\$\|<>&"']/g, "_")
+ }, _updateFileDetails: function (e) {
+ var i = this, a = i.$element, r = i.getFileStack(),
+ n = t.isIE(9) && t.findFileName(a.val()) || a[0].files[0] && a[0].files[0].name || r.length && r[0].name || "",
+ o = i.slug(n), l = i.isAjaxUpload ? r.length : e, s = i.previewCache.count() + l,
+ d = 1 === l ? o : i._getMsgSelected(s);
+ i.isError ? (i.$previewContainer.removeClass("file-thumb-loading"), i.$previewStatus.html(""), i.$captionContainer.removeClass("icon-visible")) : i._showFileIcon(), i._setCaption(d, i.isError), i.$container.removeClass("file-input-new file-input-ajax-new"), 1 === arguments.length && i._raise("fileselect", [e, o]), i.previewCache.count() && i._initPreviewActions()
+ }, _setThumbStatus: function (e, t) {
+ var i = this;
+ if (i.showPreview) {
+ var a = "indicator" + t, r = a + "Title", n = "file-preview-" + t.toLowerCase(),
+ o = e.find(".file-upload-indicator"), l = i.fileActionSettings;
+ e.removeClass("file-preview-success file-preview-error file-preview-loading"), "Success" === t && e.find(".file-drag-handle").remove(), o.html(l[a]), o.attr("title", l[r]), e.addClass(n), "Error" !== t || i.retryErrorUploads || e.find(".kv-file-upload").attr("disabled", !0)
+ }
+ }, _setProgressCancelled: function () {
+ var e = this;
+ e._setProgress(101, e.$progress, e.msgCancelled)
+ }, _setProgress: function (e, i, a) {
+ var r, n = this, o = Math.min(e, 100), l = n.progressUploadThreshold,
+ s = 100 >= e ? n.progressTemplate : n.progressCompleteTemplate,
+ d = 100 > o ? n.progressTemplate : a ? n.progressErrorTemplate : s;
+ i = i || n.$progress, t.isEmpty(d) || (r = l && o > l && 100 >= e ? d.setTokens({
+ percent: l,
+ status: n.msgUploadThreshold
+ }) : d.setTokens({
+ percent: o,
+ status: e > 100 ? n.msgUploadEnd : o + "%"
+ }), i.html(r), a && i.find('[role="progressbar"]').html(a))
+ }, _setFileDropZoneTitle: function () {
+ var e, i = this, a = i.$container.find(".file-drop-zone"), r = i.dropZoneTitle;
+ i.isClickable && (e = t.isEmpty(i.$element.attr("multiple")) ? i.fileSingle : i.filePlural, r += i.dropZoneClickTitle.replace("{files}", e)), a.find("." + i.dropZoneTitleClass).remove(), i.isAjaxUpload && i.showPreview && 0 !== a.length && !(i.getFileStack().length > 0) && i.dropZoneEnabled && (0 === a.find(t.FRAMES).length && t.isEmpty(i.defaultPreviewContent) && a.prepend('<div class="' + i.dropZoneTitleClass + '">' + r + "</div>"), i.$container.removeClass("file-input-new"), t.addCss(i.$container, "file-input-ajax-new"))
+ }, _setAsyncUploadStatus: function (t, i, a) {
+ var r = this, n = 0;
+ r._setProgress(i, e("#" + t).find(".file-thumb-progress")), r.uploadStatus[t] = i, e.each(r.uploadStatus, function (e, t) {
+ n += t
+ }), r._setProgress(Math.floor(n / a))
+ }, _validateMinCount: function () {
+ var e = this, t = e.isAjaxUpload ? e.getFileStack().length : e.$element.get(0).files.length;
+ return e.validateInitialCount && e.minFileCount > 0 && e._getFileCount(t - 1) < e.minFileCount ? (e._noFilesError({}), !1) : !0
+ }, _getFileCount: function (e) {
+ var t = this, i = 0;
+ return t.validateInitialCount && !t.overwriteInitial && (i = t.previewCache.count(), e += i), e
+ }, _getFileId: function (e) {
+ var t, i = this, a = i.generateFileId;
+ return "function" == typeof a ? a(e, event) : e ? (t = String(e.webkitRelativePath || e.fileName || e.name || null), t ? e.size + "-" + t.replace(/[^0-9a-zA-Z_-]/gim, "") : null) : null
+ }, _getFileName: function (e) {
+ return e && e.name ? this.slug(e.name) : void 0
+ }, _getFileIds: function (e) {
+ var t = this;
+ return t.fileids.filter(function (t) {
+ return e ? void 0 !== t : void 0 !== t && null !== t
+ })
+ }, _getFileNames: function (e) {
+ var t = this;
+ return t.filenames.filter(function (t) {
+ return e ? void 0 !== t : void 0 !== t && null !== t
+ })
+ }, _setPreviewError: function (e, t, i, a) {
+ var r = this;
+ if (void 0 !== t && r.updateStack(t, i), r.showPreview) {
+ if (r.removeFromPreviewOnError && !a) return void e.remove();
+ r._setThumbStatus(e, "Error"), r._refreshUploadButton(e, a)
+ }
+ }, _refreshUploadButton: function (e, t) {
+ var i = this, a = e.find(".kv-file-upload"), r = i.fileActionSettings, n = r.uploadIcon, o = r.uploadTitle;
+ a.length && (t && (n = r.uploadRetryIcon, o = r.uploadRetryTitle), a.attr("title", o).html(n))
+ }, _checkDimensions: function (e, i, a, r, n, o, l) {
+ var s, d, c, p, u = this, f = "Small" === i ? "min" : "max", m = u[f + "Image" + o];
+ !t.isEmpty(m) && a.length && (c = a[0], d = "Width" === o ? c.naturalWidth || c.width : c.naturalHeight || c.height, p = "Small" === i ? d >= m : m >= d, p || (s = u["msgImage" + o + i].setTokens({
+ name: n,
+ size: m
+ }), u._showUploadError(s, l), u._setPreviewError(r, e, null)))
+ }, _validateImage: function (t, i, a, r, n) {
+ var o, l, s, d, c = this, p = c.$preview, u = p.find("#" + t), f = u.attr("data-fileindex"),
+ m = u.find("img");
+ i = i || "Untitled", m.one("load", function () {
+ l = u.width(), s = p.width(), l > s && m.css("width", "100%"), o = {
+ ind: f,
+ id: t
+ }, c._checkDimensions(f, "Small", m, u, i, "Width", o), c._checkDimensions(f, "Small", m, u, i, "Height", o), c.resizeImage || (c._checkDimensions(f, "Large", m, u, i, "Width", o), c._checkDimensions(f, "Large", m, u, i, "Height", o)), c._raise("fileimageloaded", [t]);
+ try {
+ d = window.piexif ? window.piexif.load(n) : null
+ } catch (e) {
+ d = null
+ }
+ c.loadedImages.push({
+ ind: f,
+ img: m,
+ thumb: u,
+ pid: t,
+ typ: a,
+ siz: r,
+ validated: !1,
+ imgData: n,
+ exifObj: d
+ }), u.data("exif", d), c._validateAllImages()
+ }).one("error", function () {
+ c._raise("fileimageloaderror", [t])
+ }).each(function () {
+ this.complete ? e(this).trigger("load") : this.error && e(this).trigger("error")
+ })
+ }, _validateAllImages: function () {
+ var e, t, i, a = this, r = {val: 0}, n = a.loadedImages.length, o = a.resizeIfSizeMoreThan;
+ if (n === a.totalImagesCount && (a._raise("fileimagesloaded"), a.resizeImage)) for (e = 0; e < a.loadedImages.length; e++) t = a.loadedImages[e], t.validated || (i = t.siz, i && i > 1e3 * o && a._getResizedImage(t, r, n), a.loadedImages[e].validated = !0)
+ }, _getResizedImage: function (i, a, r) {
+ var n, o, l, s, d, c, p, u = this, f = e(i.img)[0], m = f.naturalWidth, v = f.naturalHeight, g = 1,
+ h = u.maxImageWidth || m, w = u.maxImageHeight || v, _ = !(!m || !v), b = u.imageCanvas,
+ C = u.imageCanvasContext, y = i.typ, x = i.pid, T = i.ind, E = i.thumb, S = i.exifObj;
+ if (d = function (e, t, i) {
+ u.isAjaxUpload ? u._showUploadError(e, t, i) : u._showError(e, t, i), u._setPreviewError(E, T)
+ }, (!u.filestack[T] || !_ || h >= m && w >= v) && (_ && u.filestack[T] && u._raise("fileimageresized", [x, T]), a.val++, a.val === r && u._raise("fileimagesresized"), !_)) return void d(u.msgImageResizeError, {
+ id: x,
+ index: T
+ }, "fileimageresizeerror");
+ y = y || u.resizeDefaultImageType, o = m > h, l = v > w, g = "width" === u.resizePreference ? o ? h / m : l ? w / v : 1 : l ? w / v : o ? h / m : 1, u._resetCanvas(), m *= g, v *= g, b.width = m, b.height = v;
+ try {
+ C.drawImage(f, 0, 0, m, v), s = b.toDataURL(y, u.resizeQuality), S && (p = window.piexif.dump(S), s = window.piexif.insert(p, s)), n = t.dataURI2Blob(s), u.filestack[T] = n, u._raise("fileimageresized", [x, T]), a.val++, a.val === r && u._raise("fileimagesresized", [void 0, void 0]), n instanceof Blob || d(u.msgImageResizeError, {
+ id: x,
+ index: T
+ }, "fileimageresizeerror")
+ } catch (k) {
+ a.val++, a.val === r && u._raise("fileimagesresized", [void 0, void 0]), c = u.msgImageResizeException.replace("{errors}", k.message), d(c, {
+ id: x,
+ index: T
+ }, "fileimageresizeexception")
+ }
+ }, _initBrowse: function (e) {
+ var t = this;
+ t.showBrowse ? (t.$btnFile = e.find(".btn-file"), t.$btnFile.append(t.$element)) : t.$element.hide()
+ }, _initCaption: function () {
+ var e = this, i = e.initialCaption || "";
+ return e.overwriteInitial || t.isEmpty(i) ? (e.$caption.val(""), !1) : (e._setCaption(i), !0)
+ }, _setCaption: function (i, a) {
+ var r, n, o, l, s, d = this, c = d.getFileStack();
+ if (d.$caption.length) {
+ if (d.$captionContainer.removeClass("icon-visible"), a) r = e("<div>" + d.msgValidationError + "</div>").text(), l = c.length, s = l ? 1 === l && c[0] ? d._getFileNames()[0] : d._getMsgSelected(l) : d._getMsgSelected(d.msgNo), n = t.isEmpty(i) ? s : i, o = '<span class="' + d.msgValidationErrorClass + '">' + d.msgValidationErrorIcon + "</span>"; else {
+ if (t.isEmpty(i)) return;
+ r = e("<div>" + i + "</div>").text(), n = r, o = d._getLayoutTemplate("fileIcon")
+ }
+ d.$captionContainer.addClass("icon-visible"), d.$caption.attr("title", r).val(n), d.$captionIcon.html(o)
+ }
+ }, _createContainer: function () {
+ var t = this, i = {"class": "file-input file-input-new" + (t.rtl ? " kv-rtl" : "")},
+ a = e(document.createElement("div")).attr(i).html(t._renderMain());
+ return t.$element.before(a), t._initBrowse(a), t.theme && a.addClass("theme-" + t.theme), a
+ }, _refreshContainer: function () {
+ var e = this, t = e.$container;
+ t.before(e.$element), t.html(e._renderMain()), e._initBrowse(t), e._validateDisabled()
+ }, _validateDisabled: function () {
+ var e = this;
+ e.$caption.attr({readonly: e.isDisabled})
+ }, _renderMain: function () {
+ var e = this, t = e.isAjaxUpload && e.dropZoneEnabled ? " file-drop-zone" : "file-drop-disabled",
+ i = e.showClose ? e._getLayoutTemplate("close") : "",
+ a = e.showPreview ? e._getLayoutTemplate("preview").setTokens({
+ "class": e.previewClass,
+ dropClass: t
+ }) : "", r = e.isDisabled ? e.captionClass + " file-caption-disabled" : e.captionClass,
+ n = e.captionTemplate.setTokens({"class": r + " kv-fileinput-caption"});
+ return e.mainTemplate.setTokens({
+ "class": e.mainClass + (!e.showBrowse && e.showCaption ? " no-browse" : ""),
+ preview: a,
+ close: i,
+ caption: n,
+ upload: e._renderButton("upload"),
+ remove: e._renderButton("remove"),
+ cancel: e._renderButton("cancel"),
+ browse: e._renderButton("browse")
+ })
+ }, _renderButton: function (e) {
+ var i = this, a = i._getLayoutTemplate("btnDefault"), r = i[e + "Class"], n = i[e + "Title"],
+ o = i[e + "Icon"], l = i[e + "Label"], s = i.isDisabled ? " disabled" : "", d = "button";
+ switch (e) {
+ case"remove":
+ if (!i.showRemove) return "";
+ break;
+ case"cancel":
+ if (!i.showCancel) return "";
+ r += " kv-hidden";
+ break;
+ case"upload":
+ if (!i.showUpload) return "";
+ i.isAjaxUpload && !i.isDisabled ? a = i._getLayoutTemplate("btnLink").replace("{href}", i.uploadUrl) : d = "submit";
+ break;
+ case"browse":
+ if (!i.showBrowse) return "";
+ a = i._getLayoutTemplate("btnBrowse");
+ break;
+ default:
+ return ""
+ }
+ return r += "browse" === e ? " btn-file" : " fileinput-" + e + " fileinput-" + e + "-button", t.isEmpty(l) || (l = ' <span class="' + i.buttonLabelClass + '">' + l + "</span>"), a.setTokens({
+ type: d,
+ css: r,
+ title: n,
+ status: s,
+ icon: o,
+ label: l
+ })
+ }, _renderThumbProgress: function () {
+ var e = this;
+ return '<div class="file-thumb-progress kv-hidden">' + e.progressTemplate.setTokens({
+ percent: "0",
+ status: e.msgUploadBegin
+ }) + "</div>"
+ }, _renderFileFooter: function (e, i, a, r) {
+ var n, o = this, l = o.fileActionSettings, s = l.showRemove, d = l.showDrag, c = l.showUpload,
+ p = l.showZoom, u = o._getLayoutTemplate("footer"), f = o._getLayoutTemplate("indicator"),
+ m = r ? l.indicatorError : l.indicatorNew, v = r ? l.indicatorErrorTitle : l.indicatorNewTitle,
+ g = f.setTokens({indicator: m, indicatorTitle: v});
+ return i = o._getSize(i), n = o.isAjaxUpload ? u.setTokens({
+ actions: o._renderFileActions(c, !1, s, p, d, !1, !1, !1),
+ caption: e,
+ size: i,
+ width: a,
+ progress: o._renderThumbProgress(),
+ indicator: g
+ }) : u.setTokens({
+ actions: o._renderFileActions(!1, !1, !1, p, d, !1, !1, !1),
+ caption: e,
+ size: i,
+ width: a,
+ progress: "",
+ indicator: g
+ }), n = t.replaceTags(n, o.previewThumbTags)
+ }, _renderFileActions: function (e, t, i, a, r, n, o, l, s, d, c) {
+ if (!(e || t || i || a || r)) return "";
+ var p, u = this, f = o === !1 ? "" : ' data-url="' + o + '"', m = l === !1 ? "" : ' data-key="' + l + '"',
+ v = "", g = "", h = "", w = "", _ = "", b = u._getLayoutTemplate("actions"), C = u.fileActionSettings,
+ y = u.otherActionButtons.setTokens({dataKey: m, key: l}),
+ x = n ? C.removeClass + " disabled" : C.removeClass;
+ return i && (v = u._getLayoutTemplate("actionDelete").setTokens({
+ removeClass: x,
+ removeIcon: C.removeIcon,
+ removeTitle: C.removeTitle,
+ dataUrl: f,
+ dataKey: m,
+ key: l
+ })), e && (g = u._getLayoutTemplate("actionUpload").setTokens({
+ uploadClass: C.uploadClass,
+ uploadIcon: C.uploadIcon,
+ uploadTitle: C.uploadTitle
+ })), t && (h = u._getLayoutTemplate("actionDownload").setTokens({
+ downloadClass: C.downloadClass,
+ downloadIcon: C.downloadIcon,
+ downloadTitle: C.downloadTitle,
+ downloadUrl: d || u.initialPreviewDownloadUrl
+ }), h = h.setTokens({
+ filename: c,
+ key: l
+ })), a && (w = u._getLayoutTemplate("actionZoom").setTokens({
+ zoomClass: C.zoomClass,
+ zoomIcon: C.zoomIcon,
+ zoomTitle: C.zoomTitle
+ })), r && s && (p = "drag-handle-init " + C.dragClass, _ = u._getLayoutTemplate("actionDrag").setTokens({
+ dragClass: p,
+ dragTitle: C.dragTitle,
+ dragIcon: C.dragIcon
+ })), b.setTokens({"delete": v, upload: g, download: h, zoom: w, drag: _, other: y})
+ }, _browse: function (e) {
+ var t = this;
+ t._raise("filebrowse"), e && e.isDefaultPrevented() || (t.isError && !t.isAjaxUpload && t.clear(), t.$captionContainer.focus())
+ }, _filterDuplicate: function (e, t, i) {
+ var a = this, r = a._getFileId(e);
+ r && i && i.indexOf(r) > -1 || (i || (i = []), t.push(e), i.push(r))
+ }, _change: function (i) {
+ var a = this, r = a.$element;
+ if (!a.isAjaxUpload && t.isEmpty(r.val()) && a.fileInputCleared) return void(a.fileInputCleared = !1);
+ a.fileInputCleared = !1;
+ var n, o, l, s, d = [], c = arguments.length > 1, p = a.isAjaxUpload,
+ u = c ? i.originalEvent.dataTransfer.files : r.get(0).files, f = a.filestack.length,
+ m = t.isEmpty(r.attr("multiple")), v = m && f > 0, g = 0, h = a._getFileIds(),
+ w = function (t, i, r, n) {
+ var o = e.extend(!0, {}, a._getOutData({}, {}, u), {id: r, index: n}),
+ l = {id: r, index: n, file: i, files: u};
+ return a.isAjaxUpload ? a._showUploadError(t, o) : a._showError(t, l)
+ };
+ if (a.reader = null, a._resetUpload(), a._hideFileIcon(), a.isAjaxUpload && a.$container.find(".file-drop-zone ." + a.dropZoneTitleClass).remove(), c ? e.each(u, function (e, t) {
+ t && !t.type && void 0 !== t.size && t.size % 4096 === 0 ? g++ : a._filterDuplicate(t, d, h)
+ }) : (u = i.target && void 0 === i.target.files ? i.target.value ? [{name: i.target.value.replace(/^.+\\/, "")}] : [] : i.target.files || {}, p ? e.each(u, function (e, t) {
+ a._filterDuplicate(t, d, h)
+ }) : d = u), t.isEmpty(d) || 0 === d.length) return p || a.clear(), a._showFolderError(g), void a._raise("fileselectnone");
+ if (a._resetErrors(), s = d.length, o = a._getFileCount(a.isAjaxUpload ? a.getFileStack().length + s : s), a.maxFileCount > 0 && o > a.maxFileCount) {
+ if (!a.autoReplace || s > a.maxFileCount) return l = a.autoReplace && s > a.maxFileCount ? s : o, n = a.msgFilesTooMany.replace("{m}", a.maxFileCount).replace("{n}", l), a.isError = w(n, null, null, null), a.$captionContainer.removeClass("icon-visible"), a._setCaption("", !0), void a.$container.removeClass("file-input-new file-input-ajax-new");
+ o > a.maxFileCount && a._resetPreviewThumbs(p)
+ } else !p || v ? (a._resetPreviewThumbs(!1), v && a.clearStack()) : !p || 0 !== f || a.previewCache.count() && !a.overwriteInitial || a._resetPreviewThumbs(!0);
+ a.isPreviewable ? a.readFiles(d) : a._updateFileDetails(1), a._showFolderError(g)
+ }, _abort: function (t) {
+ var i, a = this;
+ return a.ajaxAborted && "object" == typeof a.ajaxAborted && void 0 !== a.ajaxAborted.message ? (i = e.extend(!0, {}, a._getOutData(), t), i.abortData = a.ajaxAborted.data || {}, i.abortMessage = a.ajaxAborted.message, a._setProgress(101, a.$progress, a.msgCancelled), a._showUploadError(a.ajaxAborted.message, i, "filecustomerror"), a.cancel(), !0) : !!a.ajaxAborted
+ }, _resetFileStack: function () {
+ var i = this, a = 0, r = [], n = [], o = [];
+ i._getThumbs().each(function () {
+ var l, s = e(this), d = s.attr("data-fileindex"), c = i.filestack[d], p = s.attr("id");
+ "-1" !== d && -1 !== d && (void 0 !== c ? (r[a] = c, n[a] = i._getFileName(c), o[a] = i._getFileId(c), s.attr({
+ id: i.previewInitId + "-" + a,
+ "data-fileindex": a
+ }), a++) : (l = "uploaded-" + t.uniqId(), s.attr({
+ id: l,
+ "data-fileindex": "-1"
+ }), i.$preview.find("#zoom-" + p).attr("id", "zoom-" + l)))
+ }), i.filestack = r, i.filenames = n, i.fileids = o
+ }, _isFileSelectionValid: function (e) {
+ var t = this;
+ return e = e || 0, t.required && !t.getFilesCount() ? (t.$errorContainer.html(""), t._showUploadError(t.msgFileRequired), !1) : t.minFileCount > 0 && t._getFileCount(e) < t.minFileCount ? (t._noFilesError({}), !1) : !0
+ }, clearStack: function () {
+ var e = this;
+ return e.filestack = [], e.filenames = [], e.fileids = [], e.$element
+ }, updateStack: function (e, t) {
+ var i = this;
+ return i.filestack[e] = t, i.filenames[e] = i._getFileName(t), i.fileids[e] = t && i._getFileId(t) || null, i.$element
+ }, addToStack: function (e) {
+ var t = this;
+ return t.filestack.push(e), t.filenames.push(t._getFileName(e)), t.fileids.push(t._getFileId(e)), t.$element
+ }, getFileStack: function (e) {
+ var t = this;
+ return t.filestack.filter(function (t) {
+ return e ? void 0 !== t : void 0 !== t && null !== t
+ })
+ }, getFilesCount: function () {
+ var e = this, t = e.isAjaxUpload ? e.getFileStack().length : e.$element.get(0).files.length;
+ return e._getFileCount(t)
+ }, readFiles: function (i) {
+ this.reader = new FileReader;
+ var a, r = this, n = r.$element, o = r.$preview, l = r.reader, s = r.$previewContainer,
+ d = r.$previewStatus, c = r.msgLoading, p = r.msgProgress, u = r.previewInitId, f = i.length,
+ m = r.fileTypeSettings, v = r.filestack.length, g = r.allowedFileTypes, h = g ? g.length : 0,
+ w = r.allowedFileExtensions, _ = t.isEmpty(w) ? "" : w.join(", "),
+ b = r.maxFilePreviewSize && parseFloat(r.maxFilePreviewSize), C = o.length && (!b || isNaN(b)),
+ y = function (t, n, o, l) {
+ var s, d = e.extend(!0, {}, r._getOutData({}, {}, i), {id: o, index: l}),
+ c = {id: o, index: l, file: n, files: i};
+ r._previewDefault(n, o, !0), r.isAjaxUpload ? (r.addToStack(void 0), setTimeout(function () {
+ a(l + 1)
+ }, 100)) : f = 0, r._initFileActions(), s = e("#" + o), s.find(".kv-file-upload").hide(), r.removeFromPreviewOnError && s.remove(), r.isError = r.isAjaxUpload ? r._showUploadError(t, d) : r._showError(t, c), r._updateFileDetails(f)
+ };
+ r.loadedImages = [], r.totalImagesCount = 0, e.each(i, function (e, t) {
+ var i = r.fileTypeSettings.image;
+ i && i(t.type) && r.totalImagesCount++
+ }), a = function (x) {
+ if (t.isEmpty(n.attr("multiple")) && (f = 1), x >= f) return r.isAjaxUpload && r.filestack.length > 0 ? r._raise("filebatchselected", [r.getFileStack()]) : r._raise("filebatchselected", [i]), s.removeClass("file-thumb-loading"), void d.html("");
+ var T, E, S, k, F, I, P, A, D, z, $, j, U = v + x, B = u + "-" + U, R = i[x], L = m.text, O = m.image,
+ M = m.html, Z = R.name ? r.slug(R.name) : "", N = (R.size || 0) / 1e3, H = "",
+ V = t.objUrl.createObjectURL(R), W = 0, q = "", K = 0, Y = function () {
+ var e = p.setTokens({index: x + 1, files: f, percent: 50, name: Z});
+ setTimeout(function () {
+ d.html(e), r._updateFileDetails(f), a(x + 1)
+ }, 100), r._raise("fileloaded", [R, B, x, l])
+ };
+ if (h > 0) for (E = 0; h > E; E++) I = g[E], P = r.msgFileTypes[I] || I, q += 0 === E ? P : ", " + P;
+ if (Z === !1) return void a(x + 1);
+ if (0 === Z.length) return S = r.msgInvalidFileName.replace("{name}", t.htmlEncode(R.name)), void y(S, R, B, x);
+ if (t.isEmpty(w) || (H = new RegExp("\\.(" + w.join("|") + ")$", "i")), T = N.toFixed(2), r.maxFileSize > 0 && N > r.maxFileSize) return S = r.msgSizeTooLarge.setTokens({
+ name: Z,
+ size: T,
+ maxSize: r.maxFileSize
+ }), void y(S, R, B, x);
+ if (null !== r.minFileSize && N <= t.getNum(r.minFileSize)) return S = r.msgSizeTooSmall.setTokens({
+ name: Z,
+ size: T,
+ minSize: r.minFileSize
+ }), void y(S, R, B, x);
+ if (!t.isEmpty(g) && t.isArray(g)) {
+ for (E = 0; E < g.length; E += 1) k = g[E], A = m[k], W += A && "function" == typeof A && A(R.type, R.name) ? 1 : 0;
+ if (0 === W) return S = r.msgInvalidFileType.setTokens({name: Z, types: q}), void y(S, R, B, x)
+ }
+ return 0 !== W || t.isEmpty(w) || !t.isArray(w) || t.isEmpty(H) || (F = t.compare(Z, H), W += t.isEmpty(F) ? 0 : F.length, 0 !== W) ? r.showPreview ? !C && N > b ? (r.addToStack(R), s.addClass("file-thumb-loading"), r._previewDefault(R, B), r._initFileActions(), r._updateFileDetails(f), void a(x + 1)) : (o.length && void 0 !== FileReader ? (D = L(R.type, Z), z = M(R.type, Z), $ = O(R.type, Z), d.html(c.replace("{index}", x + 1).replace("{files}", f)), s.addClass("file-thumb-loading"), l.onerror = function (e) {
+ r._errorHandler(e, Z)
+ }, l.onload = function (i) {
+ var a, n, o, s, d, c, p = [], u = function (e) {
+ var t = new FileReader;
+ t.onerror = function (e) {
+ r._errorHandler(e, Z)
+ }, t.onload = function (e) {
+ r._previewFile(x, R, e, B, V, n), r._initFileActions(), Y()
+ }, e ? t.readAsText(R, r.textEncoding) : t.readAsDataURL(R)
+ };
+ if (n = {name: Z, type: R.type}, e.each(m, function (e, t) {
+ "object" !== e && "other" !== e && t(R.type, Z) && K++
+ }), 0 === K) {
+ for (o = new Uint8Array(i.target.result), E = 0; E < o.length; E++) s = o[E].toString(16), p.push(s);
+ if (a = p.join("").toLowerCase().substring(0, 8), c = t.getMimeType(a, "", ""), t.isEmpty(c) && (d = t.arrayBuffer2String(l.result), c = t.isSvg(d) ? "image/svg+xml" : t.getMimeType(a, d, R.type)), n = {
+ name: Z,
+ type: c
+ }, D = L(c, ""), z = M(c, ""), $ = O(c, ""), j = D || z, j || $) return void u(j)
+ }
+ r._previewFile(x, R, i, B, V, n), r._initFileActions(), Y()
+ }, l.onprogress = function (e) {
+ if (e.lengthComputable) {
+ var t = e.loaded / e.total * 100, i = Math.ceil(t);
+ S = p.setTokens({index: x + 1, files: f, percent: i, name: Z}), setTimeout(function () {
+ d.html(S)
+ }, 100)
+ }
+ }, D || z ? l.readAsText(R, r.textEncoding) : $ ? l.readAsDataURL(R) : l.readAsArrayBuffer(R)) : (r._previewDefault(R, B), setTimeout(function () {
+ a(x + 1), r._updateFileDetails(f)
+ }, 100), r._raise("fileloaded", [R, B, x, l])), void r.addToStack(R)) : (r.isAjaxUpload && r.addToStack(R), setTimeout(function () {
+ a(x + 1), r._updateFileDetails(f)
+ }, 100), void r._raise("fileloaded", [R, B, x, l])) : (S = r.msgInvalidFileExtension.setTokens({
+ name: Z,
+ extensions: _
+ }), void y(S, R, B, x))
+ }, a(0), r._updateFileDetails(f, !1)
+ }, lock: function () {
+ var e = this;
+ return e._resetErrors(), e.disable(), e.showRemove && e.$container.find(".fileinput-remove").hide(), e.showCancel && e.$container.find(".fileinput-cancel").show(), e._raise("filelock", [e.filestack, e._getExtraData()]), e.$element
+ }, unlock: function (e) {
+ var t = this;
+ return void 0 === e && (e = !0), t.enable(), t.showCancel && t.$container.find(".fileinput-cancel").hide(), t.showRemove && t.$container.find(".fileinput-remove").show(), e && t._resetFileStack(), t._raise("fileunlock", [t.filestack, t._getExtraData()]), t.$element
+ }, cancel: function () {
+ var t, i = this, a = i.ajaxRequests, r = a.length;
+ if (r > 0) for (t = 0; r > t; t += 1) i.cancelling = !0, a[t].abort();
+ return i._setProgressCancelled(), i._getThumbs().each(function () {
+ var t = e(this), a = t.attr("data-fileindex");
+ t.removeClass("file-uploading"), void 0 !== i.filestack[a] && (t.find(".kv-file-upload").removeClass("disabled").removeAttr("disabled"), t.find(".kv-file-remove").removeClass("disabled").removeAttr("disabled")), i.unlock()
+ }), i.$element
+ }, clear: function () {
+ var i, a = this;
+ if (a._raise("fileclear")) return a.$btnUpload.removeAttr("disabled"), a._getThumbs().find("video,audio,img").each(function () {
+ t.cleanMemory(e(this))
+ }), a._resetUpload(), a.clearStack(), a._clearFileInput(), a._resetErrors(!0), a._hasInitialPreview() ? (a._showFileIcon(), a._resetPreview(), a._initPreviewActions(), a.$container.removeClass("file-input-new")) : (a._getThumbs().each(function () {
+ a._clearObjects(e(this))
+ }), a.isAjaxUpload && (a.previewCache.data = {}), a.$preview.html(""), i = !a.overwriteInitial && a.initialCaption.length > 0 ? a.initialCaption : "", a.$caption.attr("title", "").val(i), t.addCss(a.$container, "file-input-new"), a._validateDefaultPreview()), 0 === a.$container.find(t.FRAMES).length && (a._initCaption() || a.$captionContainer.removeClass("icon-visible")), a._hideFileIcon(), a._raise("filecleared"), a.$captionContainer.focus(), a._setFileDropZoneTitle(), a.$element
+ }, reset: function () {
+ var e = this;
+ if (e._raise("filereset")) return e._resetPreview(), e.$container.find(".fileinput-filename").text(""), t.addCss(e.$container, "file-input-new"), (e.getFrames().length || e.isAjaxUpload && e.dropZoneEnabled) && e.$container.removeClass("file-input-new"), e.clearStack(), e.formdata = {}, e._setFileDropZoneTitle(), e.$element
+ }, disable: function () {
+ var e = this;
+ return e.isDisabled = !0, e._raise("filedisabled"), e.$element.attr("disabled", "disabled"), e.$container.find(".kv-fileinput-caption").addClass("file-caption-disabled"), e.$container.find(".fileinput-remove, .fileinput-upload, .file-preview-frame button").attr("disabled", !0), t.addCss(e.$container.find(".btn-file"), "disabled"), e._initDragDrop(), e.$element
+ }, enable: function () {
+ var e = this;
+ return e.isDisabled = !1, e._raise("fileenabled"), e.$element.removeAttr("disabled"), e.$container.find(".kv-fileinput-caption").removeClass("file-caption-disabled"), e.$container.find(".fileinput-remove, .fileinput-upload, .file-preview-frame button").removeAttr("disabled"), e.$container.find(".btn-file").removeClass("disabled"), e._initDragDrop(), e.$element
+ }, upload: function () {
+ var i, a, r, n = this, o = n.getFileStack().length, l = !e.isEmptyObject(n._getExtraData());
+ if (n.isAjaxUpload && !n.isDisabled && n._isFileSelectionValid(o)) {
+ if (n._resetUpload(), 0 === o && !l) return void n._showUploadError(n.msgUploadEmpty);
+ if (n.$progress.show(), n.uploadCount = 0, n.uploadStatus = {}, n.uploadLog = [], n.lock(), n._setProgress(2), 0 === o && l) return void n._uploadExtraOnly();
+ if (r = n.filestack.length, n.hasInitData = !1, !n.uploadAsync) return n._uploadBatch(), n.$element;
+ for (a = n._getOutData(), n._raise("filebatchpreupload", [a]), n.fileBatchCompleted = !1, n.uploadCache = {
+ content: [],
+ config: [],
+ tags: [],
+ append: !0
+ }, n.uploadAsyncCount = n.getFileStack().length, i = 0; r > i; i++) n.uploadCache.content[i] = null, n.uploadCache.config[i] = null, n.uploadCache.tags[i] = null;
+ for (n.$preview.find(".file-preview-initial").removeClass(t.SORT_CSS), n._initSortable(), n.cacheInitialPreview = n.getPreview(), i = 0; r > i; i++) n.filestack[i] && n._uploadSingle(i, !0)
+ }
+ }, destroy: function () {
+ var t = this, i = t.$form, a = t.$container, r = t.$element, n = t.namespace;
+ return e(document).off(n), e(window).off(n), i && i.length && i.off(n), t.isAjaxUpload && t._clearFileInput(), t._cleanup(), t._initPreviewCache(), r.insertBefore(a).off(n).removeData(), a.off().remove(), r
+ }, refresh: function (i, a) {
+ var r = this, n = r.$element;
+ return i = "object" != typeof i || t.isEmpty(i) ? r.options : e.extend(!0, {}, r.options, i), r._init(i, !0), r._listen(), a && n.trigger("change" + r.namespace), n
+ }, zoom: function (e) {
+ var i = this, a = i._getFrame(e), r = i.$modal;
+ a && (t.initModal(r), r.html(i._getModalContent()), i._setZoomContent(a), r.modal("show"), i._initZoomButtons())
+ }, getExif: function (e) {
+ var t = this, i = t._getFrame(e);
+ return i && i.data("exif") || null
+ }, getFrames: function (e) {
+ var i = this;
+ return e = e || "", i.$preview.find(t.FRAMES + e)
+ }, getPreview: function () {
+ var e = this;
+ return {content: e.initialPreview, config: e.initialPreviewConfig, tags: e.initialPreviewThumbTags}
+ }
+ }, e.fn.fileinput = function (a) {
+ if (t.hasFileAPISupport() || t.isIE(9)) {
+ var r = Array.apply(null, arguments), n = [];
+ switch (r.shift(), this.each(function () {
+ var o, l = e(this), s = l.data("fileinput"), d = "object" == typeof a && a,
+ c = d.theme || l.data("theme"), p = {}, u = {},
+ f = d.language || l.data("language") || e.fn.fileinput.defaults.language || "en";
+ s || (c && (u = e.fn.fileinputThemes[c] || {}), "en" === f || t.isEmpty(e.fn.fileinputLocales[f]) || (p = e.fn.fileinputLocales[f] || {}), o = e.extend(!0, {}, e.fn.fileinput.defaults, u, e.fn.fileinputLocales.en, p, d, l.data()), s = new i(this, o), l.data("fileinput", s)), "string" == typeof a && n.push(s[a].apply(s, r))
+ }), n.length) {
+ case 0:
+ return this;
+ case 1:
+ return n[0];
+ default:
+ return n
+ }
+ }
+ }, e.fn.fileinput.defaults = {
+ language: "en",
+ showCaption: !0,
+ showBrowse: !0,
+ showPreview: !0,
+ showRemove: !0,
+ showUpload: !0,
+ showCancel: !0,
+ showClose: !0,
+ showUploadedThumbs: !0,
+ browseOnZoneClick: !1,
+ autoReplace: !1,
+ autoOrientImage: !0,
+ required: !1,
+ rtl: !1,
+ hideThumbnailContent: !1,
+ generateFileId: null,
+ previewClass: "",
+ captionClass: "",
+ frameClass: "krajee-default",
+ mainClass: "file-caption-main",
+ mainTemplate: null,
+ purifyHtml: !0,
+ fileSizeGetter: null,
+ initialCaption: "",
+ initialPreview: [],
+ initialPreviewDelimiter: "*$$*",
+ initialPreviewAsData: !1,
+ initialPreviewFileType: "image",
+ initialPreviewConfig: [],
+ initialPreviewThumbTags: [],
+ previewThumbTags: {},
+ initialPreviewShowDelete: !0,
+ initialPreviewDownloadUrl: "",
+ removeFromPreviewOnError: !1,
+ deleteUrl: "",
+ deleteExtraData: {},
+ overwriteInitial: !0,
+ previewZoomButtonIcons: {
+ prev: '<i class="glyphicon glyphicon-triangle-left"></i>',
+ next: '<i class="glyphicon glyphicon-triangle-right"></i>',
+ toggleheader: '<i class="glyphicon glyphicon-resize-vertical"></i>',
+ fullscreen: '<i class="glyphicon glyphicon-fullscreen"></i>',
+ borderless: '<i class="glyphicon glyphicon-resize-full"></i>',
+ close: '<i class="glyphicon glyphicon-remove"></i>'
+ },
+ previewZoomButtonClasses: {
+ prev: "btn btn-navigate",
+ next: "btn btn-navigate",
+ toggleheader: "btn btn-kv btn-default btn-outline-secondary",
+ fullscreen: "btn btn-kv btn-default btn-outline-secondary",
+ borderless: "btn btn-kv btn-default btn-outline-secondary",
+ close: "btn btn-kv btn-default btn-outline-secondary"
+ },
+ preferIconicPreview: !1,
+ preferIconicZoomPreview: !1,
+ allowedPreviewTypes: void 0,
+ allowedPreviewMimeTypes: null,
+ allowedFileTypes: null,
+ allowedFileExtensions: null,
+ defaultPreviewContent: null,
+ customLayoutTags: {},
+ customPreviewTags: {},
+ previewFileIcon: '<i class="glyphicon glyphicon-file"></i>',
+ previewFileIconClass: "file-other-icon",
+ previewFileIconSettings: {},
+ previewFileExtSettings: {},
+ buttonLabelClass: "hidden-xs",
+ browseIcon: '<i class="glyphicon glyphicon-folder-open"></i>&nbsp;',
+ browseClass: "btn btn-primary",
+ removeIcon: '<i class="glyphicon glyphicon-trash"></i>',
+ removeClass: "btn btn-default btn-secondary",
+ cancelIcon: '<i class="glyphicon glyphicon-ban-circle"></i>',
+ cancelClass: "btn btn-default btn-secondary",
+ uploadIcon: '<i class="glyphicon glyphicon-upload"></i>',
+ uploadClass: "btn btn-default btn-secondary",
+ uploadUrl: null,
+ uploadUrlThumb: null,
+ uploadAsync: !0,
+ uploadExtraData: {},
+ zoomModalHeight: 480,
+ minImageWidth: null,
+ minImageHeight: null,
+ maxImageWidth: null,
+ maxImageHeight: null,
+ resizeImage: !1,
+ resizePreference: "width",
+ resizeQuality: .92,
+ resizeDefaultImageType: "image/jpeg",
+ resizeIfSizeMoreThan: 0,
+ minFileSize: 0,
+ maxFileSize: 0,
+ maxFilePreviewSize: 25600,
+ minFileCount: 0,
+ maxFileCount: 0,
+ validateInitialCount: !1,
+ msgValidationErrorClass: "text-danger",
+ msgValidationErrorIcon: '<i class="glyphicon glyphicon-exclamation-sign"></i> ',
+ msgErrorClass: "file-error-message",
+ progressThumbClass: "progress-bar bg-success progress-bar-success progress-bar-striped active",
+ progressClass: "progress-bar bg-success progress-bar-success progress-bar-striped active",
+ progressCompleteClass: "progress-bar bg-success progress-bar-success",
+ progressErrorClass: "progress-bar bg-danger progress-bar-danger",
+ progressUploadThreshold: 99,
+ previewFileType: "image",
+ elCaptionContainer: null,
+ elCaptionText: null,
+ elPreviewContainer: null,
+ elPreviewImage: null,
+ elPreviewStatus: null,
+ elErrorContainer: null,
+ errorCloseButton: t.closeButton("kv-error-close"),
+ slugCallback: null,
+ dropZoneEnabled: !0,
+ dropZoneTitleClass: "file-drop-zone-title",
+ fileActionSettings: {},
+ otherActionButtons: "",
+ textEncoding: "UTF-8",
+ ajaxSettings: {},
+ ajaxDeleteSettings: {},
+ showAjaxErrorDetails: !0,
+ mergeAjaxCallbacks: !1,
+ mergeAjaxDeleteCallbacks: !1,
+ retryErrorUploads: !0
+ }, e.fn.fileinputLocales.en = {
+ fileSingle: "file",
+ filePlural: "files",
+ browseLabel: "Browse &hellip;",
+ removeLabel: "Remove",
+ removeTitle: "Clear selected files",
+ cancelLabel: "Cancel",
+ cancelTitle: "Abort ongoing upload",
+ uploadLabel: "Upload",
+ uploadTitle: "Upload selected files",
+ msgNo: "No",
+ msgNoFilesSelected: "No files selected",
+ msgCancelled: "Cancelled",
+ msgPlaceholder: "Select {files}...",
+ msgZoomModalHeading: "Detailed Preview",
+ msgFileRequired: "You must select a file to upload.",
+ msgSizeTooSmall: 'File "{name}" (<b>{size} KB</b>) is too small and must be larger than <b>{minSize} KB</b>.',
+ msgSizeTooLarge: 'File "{name}" (<b>{size} KB</b>) exceeds maximum allowed upload size of <b>{maxSize} KB</b>.',
+ msgFilesTooLess: "You must select at least <b>{n}</b> {files} to upload.",
+ msgFilesTooMany: "Number of files selected for upload <b>({n})</b> exceeds maximum allowed limit of <b>{m}</b>.",
+ msgFileNotFound: 'File "{name}" not found!',
+ msgFileSecured: 'Security restrictions prevent reading the file "{name}".',
+ msgFileNotReadable: 'File "{name}" is not readable.',
+ msgFilePreviewAborted: 'File preview aborted for "{name}".',
+ msgFilePreviewError: 'An error occurred while reading the file "{name}".',
+ msgInvalidFileName: 'Invalid or unsupported characters in file name "{name}".',
+ msgInvalidFileType: 'Invalid type for file "{name}". Only "{types}" files are supported.',
+ msgInvalidFileExtension: 'Invalid extension for file "{name}". Only "{extensions}" files are supported.',
+ msgFileTypes: {
+ image: "image",
+ html: "HTML",
+ text: "text",
+ video: "video",
+ audio: "audio",
+ flash: "flash",
+ pdf: "PDF",
+ object: "object"
+ },
+ msgUploadAborted: "The file upload was aborted",
+ msgUploadThreshold: "Processing...",
+ msgUploadBegin: "Initializing...",
+ msgUploadEnd: "Done",
+ msgUploadEmpty: "No valid data available for upload.",
+ msgUploadError: "Error",
+ msgValidationError: "Validation Error",
+ msgLoading: "Loading file {index} of {files} &hellip;",
+ msgProgress: "Loading file {index} of {files} - {name} - {percent}% completed.",
+ msgSelected: "{n} {files} selected",
+ msgFoldersNotAllowed: "Drag & drop files only! {n} folder(s) dropped were skipped.",
+ msgImageWidthSmall: 'Width of image file "{name}" must be at least {size} px.',
+ msgImageHeightSmall: 'Height of image file "{name}" must be at least {size} px.',
+ msgImageWidthLarge: 'Width of image file "{name}" cannot exceed {size} px.',
+ msgImageHeightLarge: 'Height of image file "{name}" cannot exceed {size} px.',
+ msgImageResizeError: "Could not get the image dimensions to resize.",
+ msgImageResizeException: "Error while resizing the image.<pre>{errors}</pre>",
+ msgAjaxError: "Something went wrong with the {operation} operation. Please try again later!",
+ msgAjaxProgressError: "{operation} failed",
+ ajaxOperations: {
+ deleteThumb: "file delete",
+ uploadThumb: "file upload",
+ uploadBatch: "batch file upload",
+ uploadExtra: "form data upload"
+ },
+ dropZoneTitle: "Drag & drop files here &hellip;",
+ dropZoneClickTitle: "<br>(or click to select {files})",
+ previewZoomButtonTitles: {
+ prev: "View previous file",
+ next: "View next file",
+ toggleheader: "Toggle header",
+ fullscreen: "Toggle full screen",
+ borderless: "Toggle borderless mode",
+ close: "Close detailed preview"
+ }
+ }, e.fn.fileinput.Constructor = i, e(document).ready(function () {
+ var t = e("input.file[type=file]");
+ t.length && t.fileinput()
+ })
+}); \ No newline at end of file
diff --git a/src/main/resources/assets/js/index.js b/src/main/resources/assets/js/index.js
new file mode 100644
index 0000000..a6a8b87
--- /dev/null
+++ b/src/main/resources/assets/js/index.js
@@ -0,0 +1,624 @@
+var app = new Vue({
+ el: "#index",
+ data: {
+ username: "",
+ permission: 1,
+ loginTime: "",
+ passwordVerify: "",
+ passwordConfirm: "",
+ emailErrorTip: "",
+ emailVerifyStatus: ""
+ }
+});
+
+var search = "";
+
+Vue.component('paging-more', {
+ template: '<button class="btn btn-link btn-block btn-lg" onclick="offset += 1;getPage();"><b>获取更多</b></button><br/><br/>'
+});
+
+var userInfo = {};
+
+function getPage() {
+ if (currentTab === "#downloaded-content") {
+ getUserDownloaded();
+ } else if (currentTab === "#uploaded-content") {
+ getUserUploaded();
+ } else if(currentTab === "#resources-content") {
+ getResource(getOrderBy());
+ } else if (currentTab === "#files-content") {
+ getFiles("")
+ } else {
+ getFiles("")
+ }
+}
+
+/**
+ * 保存用户信息
+ */
+function saveInfo() {
+ var email = $("#email").val();
+ if (isEmail(email)) {
+ var code = $("#email-verify-code").val();
+ if (!userConfig.emailVerify || code.length === 6 || email === userInfo.email) {
+ layer.load(1);
+ $.ajax({
+ url: '/user/info',
+ type: 'PUT',
+ dataType: "",
+ data: {
+ avatar: $("#avatar").attr("src"),
+ realName: $("#real-name").val(),
+ email: email,
+ code: code
+ },
+ success: function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ userInfo.email = json.email;
+ alerts(json.message);
+ }
+ });
+ } else {
+ alerts("验证码格式不正确");
+ }
+ } else {
+ alerts("邮箱格式不正确");
+ }
+}
+
+/**
+ * 更新密码
+ */
+function updatePassword() {
+ var oldPassword = $("#old-password").val();
+ var newPassword = $("#new-password").val();
+ var confirmNewPassword = $("#confirm-new-password").val();
+ if (oldPassword && checkPassword(newPassword, confirmNewPassword)) {
+ layer.load(1);
+ $.ajax({
+ url: "/user/password",
+ type: "PUT",
+ data: {oldPassword: oldPassword, newPassword: newPassword},
+ success: function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.status === "success") {
+ alerts("密码修改成功");
+ location.href = "/signin.html#login";
+ } else {
+ alerts(json.message);
+ }
+ }
+ });
+ } else {
+ alerts("格式不合法,无法提交");
+ }
+}
+
+function getUserInfo() {
+ layer.load(1);
+ $.get("/user/info", function (data) {
+ layer.closeAll();
+ try {
+ var json = JSON.parse(data);
+ userInfo = json;
+ app.permission = json.permission;
+ /** @namespace app.lastLoginTime */
+ app.loginTime = new Date(json.lastLoginTime).format("yyyy-MM-dd hh:mm:ss");
+ /** @namespace json.avator */
+ if (!isEmpty(json.avatar)) {
+ $("#avatar").attr("src", json.avatar);
+ }
+ app.username = json.username;
+ $("#email").val(json.email);
+ $("#real-name").val(json.realName);
+ checkEmailChange(json.email);
+ } catch (e) {
+ window.location.href = "/signin";
+ }
+ });
+}
+
+function showAvatarModal() {
+ layer.open({
+ type: 1,
+ title: false,
+ closeBtn: 0,
+ offset: 'ct',
+ shadeClose: true,
+ content: "<input id='file-input' class='form-control file' multiple data-max-file-count='100' data-preview-file-type='img' name='file' type='file'/>"
+ });
+ $("#file-input").fileinput({
+ uploadUrl: "/common/avatar",
+ uploadAsync: true,
+ maxFileCount: 1,
+ maxFilePreviewSize: 10485760
+ }).on('fileuploaded', function (event, data) {
+ var json = data.response;
+ if (JSON.stringify(json).indexOf("success") > 0) {
+ $("#avatar").attr("src", json.success);
+ } else {
+ alerts(json.error);
+ }
+ });
+}
+
+function getOrderBy() {
+ return $("#order-by").val() + " " + $("#order-way").val();
+}
+
+$(document).ready(function () {
+ $("#search").keyup(function () {
+ /** @namespace window.event.keyCode */
+ if (window.event.keyCode === 13) {
+ search = $('#search').val();
+ offset = 0;
+ getPage();
+ }
+ });
+ $(".content-filter").change(function () {
+ offset = 0;
+ getFiles("");
+ });
+ $(".email-verify-code").keyup(function () {
+ var code = event.srcElement.value;
+ if (code.length === 6) {
+ $.ajax({
+ url: "/common/" + code + "/verification", type: "PUT", success: function (data) {
+ var json = JSON.parse(data);
+ app.emailVerifyStatus = json.status === "success" ? "" : "验证码错误";
+ }
+ });
+ } else {
+ app.emailVerifyStatus = "";
+ }
+ });
+ $(".email").keyup(function () {
+ checkEmailChange(event.srcElement.value);
+ });
+ $(".password").keyup(function () {
+ var len = event.srcElement.value.length;
+ if (len >= userConfig.password.minLength && len <= userConfig.password.maxLength) {
+ app.passwordVerify = "";
+ } else {
+ app.passwordVerify = "密码长度限定为" + userConfig.password.minLength + "至" + userConfig.password.maxLength + "位";
+ }
+ });
+ $(".confirm-password").keyup(function () {
+ app.passwordConfirm = (event.srcElement.value === $("#new-password").val()) ? "" : "两次输入的密码不一样";
+ });
+ $(".sendVerifyCode").click(function () {
+ sendVerifyCode($("#email").val(), event.srcElement);
+ });
+
+ $("a.nav-link[href='" + location.hash + "-tab']").click();
+ getTabContent(location.hash);
+ $(".nav-link").click(function () {
+ getTabContent($(event.srcElement).attr("href"));
+ });
+});
+
+function getTabContent(href) {
+ if (href.startsWith("uploaded", 1)) {
+ offset = 0;
+ window.location.hash = "uploaded";
+ getUserUploaded();
+ } else if (href.startsWith("downloaded", 1)) {
+ offset = 0;
+ window.location.hash = "downloaded";
+ getUserDownloaded();
+ } else if (href.startsWith("bio", 1)) {
+ window.location.hash = "bio";
+ getUserInfo();
+ } else if (href.startsWith("resource", 1)) {
+ offset = 0;
+ window.location.hash = "resource";
+ getResource("");
+ } else if (href.startsWith("files", 1)) {
+ offset = 0;
+ window.location.hash = "files";
+ getFiles("");
+ var history = $("#history_path").attr("value");
+ if(history==''||history==undefined){
+ $("#history_path").attr("value",$("#dir_id").attr("value"));
+ }
+ } else{
+ offset = 0;
+ window.location.hash = "files";
+ getFiles("");
+ var history = $("#history_path").attr("value");
+ if(history==''||history==undefined){
+ $("#history_path").attr("value",$("#dir_id").attr("value"));
+ }
+ }
+}
+
+var offset = 0;
+
+function checkEmailChange(email) {
+ var isChange = email !== userInfo.email;
+ if (isEmail(email)) {
+ if (isChange) {
+ $.get("/user/email/exists", {email: email}, function (data) {
+ var json = JSON.parse(data);
+ app.emailErrorTip = json.exists ? "该邮箱已经被注册啦" : "";
+ });
+ }
+ app.emailErrorTip = "";
+ } else {
+ app.emailErrorTip = "邮箱格式不正确";
+ }
+ $(".verify-code-div").css("display", isChange && userConfig.emailVerify ? "block" : "none");
+}
+
+/**
+ * 加载用户配置信息
+ */
+layer.load(1);
+$.get("/config/user", function (data) {
+ layer.closeAll();
+ userConfig = JSON.parse(data);
+});
+
+var currentTab = "#files-content";
+
+function getUserDownloaded() {
+ currentTab = "#downloaded-content";
+ layer.load(1);
+ $.get("/file/user/downloaded", {offset: offset, search: search}, function (data) {
+ layer.closeAll();
+ try {
+ setResources(JSON.parse(data), currentTab);
+ } catch (e) {
+ window.location.href = "/signin";
+ }
+ });
+}
+
+function getUserUploaded() {
+ currentTab = "#uploaded-content";
+ layer.load(1);
+ $.get("/file/user/uploaded", {offset: offset, search: search}, function (data) {
+ layer.closeAll();
+ try {
+ setResources(JSON.parse(data), currentTab);
+ } catch (e) {
+ window.location.href = "/signin";
+ }
+ });
+}
+
+function getResource(orderBy) {
+ currentTab = "#resources-content";
+ layer.load(1);
+ $.get("/file/all", {
+ offset: offset,
+ categoryId: $("#category").val(),
+ orderBy: orderBy,
+ search: search
+ }, function (data) {
+ layer.closeAll();
+ setResources(JSON.parse(data), currentTab);
+ });
+}
+
+function setResources(resources, tabId) {
+ var contentHtml = "";
+ search = "";
+ if (resources.length < 1) {
+ offset -= 1;
+ alerts("糟糕,没有数据了");
+ } else {
+ $.each(resources, function (i, resource) {
+
+ /** @namespace resource.fileName */
+ /** @namespace resource.createTime */
+ /** @namespace resource.categoryName */
+ /** @namespace resource.checkTimes */
+ /** @namespace resource.downloadTimes */
+ /** @namespace resource.visitUrl */
+ /** @namespace resource.downloadTime */
+ /**
+ * 暂时不考虑查看次数
+ * @code &emsp;查看次数:<b>" + resource.checkTimes + "</b>
+ */
+ var isDownloaded = "#downloaded-content" === tabId;
+ var date = isDownloaded ? resource.downloadTime : resource.createTime;
+ contentHtml += "<div class='row content-box rounded' data-id='" + resource.id + "'><div class='col-12 col-sm-12'><br/><div class='row'>" +
+ (isMobile() ? "" : "<div class='col-sm-1 col-0'><img src='" + (resource.avatar ? resource.avatar : "/assets/img/default-user.jpg") + "' class='rounded avatar'/></div>") +
+ "<div class='col-sm-11 col-12'><h4><a data-toggle='tooltip' class='visit-url' href='" + resource.visitUrl + "' target='_blank' data-description='" + resource.description + "' title='" + resource.description + "'>" + resource.fileName + "</a>" +
+ ("#uploaded-content" === tabId ? "&emsp;<a href='javascript:;' class='font-1' onclick='editFile();'>编辑</a>&emsp;<a href='javascript:;' class='font-1' onclick='removeFile();'>删除</a>" : "") +
+ "</h4><p>上传者:<b>" + resource.username + "</b>&emsp;" + (isDownloaded ? "下载" : "上传") + "时间:<b>" + new Date(date).format("yyyy-MM-dd hh:mm:ss") + "</b>&emsp;文件大小:<b>" + formatSize(resource.size) + "</b>&emsp;分类:<b class='file-category'>" + resource.categoryName + "</b>" +
+ "&emsp;标签:<b class='file-tag'>" + resource.tag + "</b>&emsp;下载次数:<b>" + resource.downloadTimes + "</b>" +
+ "</p></div></div><br/></div></div><br/>";
+ });
+ if (offset > 0) {
+ $(tabId).append(contentHtml);
+ } else {
+ $(tabId).html(contentHtml);
+ }
+ $('[data-toggle="tooltip"]').tooltip();
+ setCSS();
+ }
+}
+
+function getFiles(path) {
+ currentTab = "#files-content";
+ layer.load(1);
+ $.ajax({
+ url: "/sketch/list",
+ method: "GET",
+ cache: false,
+ data: {searchPath: path},
+ async: false,
+ success: function (data, textStatus, xhr) {
+ layer.closeAll();
+ try {
+ setFiles(JSON.parse(data), currentTab);
+ } catch (e) {
+ console.log(xhr.status)
+ window.location.href = "/signin";
+ if (xhr.status === 302) {
+ }
+ }
+ },
+ error: function () {
+ // layer.closeAll();
+ // window.location.href = "/signin";
+ }
+ });
+ /* $.get("/sketch/list", {
+ searchPath: path
+ }, function (data) {
+ layer.closeAll();
+ setFiles(JSON.parse(data), currentTab);
+ });*/
+}
+function setFiles(fileData, tabId) {
+ var resources = fileData.result;
+ var dirPath1=fileData.path;
+ $("#dir_id").html(dirPath1);
+ $("#dir_id").attr("value",dirPath1);
+ var dirPath = dirPath1.replaceAll("\\","\\\\");
+ var contentHtml = "";
+ search = "";
+ /* if (resources.length < 1) {
+ offset -= 1;
+ alerts("糟糕,没有数据了");
+ } else */{
+ $.each(resources, function (i, resource) {
+ contentHtml += "<tr>"+
+ "<td>"+
+ "<button class='file_ic' onclick='operatorPage(\""+dirPath+resource.name+"\",\""+resource.type+"\",\""+resource.name+"\")'><i class='glyphicon " +(resource.type==="file" ? "glyphicon-file":"glyphicon-folder-close")+ "'/></button>" +
+ "</td>" +
+ "<td>"+
+ "<h5><button data-toggle='tooltip' class='visit-url' href='javascript:;' onclick='operatorPage(\""+dirPath+resource.name+"\",\""+resource.type+"\",\""+resource.name+"\")' >" + resource.name + "</button></h5>" +
+ "</td>"+
+ "<td data-order='" + resource.size + "'>"+
+ "<b>" + formatSize(resource.size) + "</b>" +
+ "</td>"+
+ "<td>"+
+ "<b>" + resource.date + "</b>" +
+ "</td>"+
+ "</tr>";
+ });
+ if (offset > 0) {
+ $(tabId).append(contentHtml);
+ } else {
+ $(tabId).html(contentHtml);
+ }
+ $('[data-toggle="tooltip"]').tooltip();
+ setCSS();
+ }
+}
+
+var srcContentBox;
+
+function editFile() {
+ var contentBox = $(event.srcElement).parents(".content-box");
+ srcContentBox = contentBox;
+ $("#edit-file-id").val($(contentBox).attr("data-id"));
+ $("#edit-file-name").val($(contentBox).find("a.visit-url").text());
+ $("#edit-file-category").val($(contentBox).find("b.file-category").text());
+ $("#edit-file-tag").val($(contentBox).find("b.file-tag").text());
+ $("#edit-file-description").val($(contentBox).find("a.visit-url").attr("data-description"));
+ $("#edit-file-modal").modal("show");
+}
+
+function saveFileInfo() {
+ var name = $("#edit-file-name").val();
+ var category = $("#edit-file-category").val();
+ var tag = $("#edit-file-tag").val();
+ var description = $("#edit-file-description").val();
+ if (isEmpty(name)) {
+ alerts("文件名不能为空");
+ } else {
+ layer.load(1);
+ $.ajax({
+ url: "/file/" + $("#edit-file-id").val(),
+ type: "PUT",
+ data: {
+ name: name,
+ category: category,
+ tag: tag,
+ description: description
+ },
+ success: function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.status === "success") {
+ $(srcContentBox).find("a.visit-url").text(name);
+ $(srcContentBox).find("b.file-category").text(category);
+ $(srcContentBox).find("b.file-tag").text(tag);
+ $(srcContentBox).find("a.visit-url").attr("data-description", description);
+ var href = $(srcContentBox).find("a.visit-url").attr("href");
+ $(srcContentBox).find("a.visit-url").attr("href", href.substr(0, href.lastIndexOf("/") + 1) + name);
+ $("#edit-file-modal").modal("hide");
+ alerts("保存成功");
+ } else {
+ alerts(json.message);
+ }
+ }
+ })
+ ;
+ }
+}
+
+function removeFile() {
+ var contentBox = $(event.srcElement).parents(".content-box");
+ layer.confirm('是否确定删除文件【' + $(contentBox).find("a.visit-url").text() + '】', {
+ btn: ['确定', '删除'],
+ skin: 'layui-layer-molv'
+ }, function () {
+ var id = $(contentBox).attr("data-id");
+ layer.load(1);
+ $.ajax({
+ url: "/file/" + id, type: "DELETE", success: function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.status === "success") {
+ $(contentBox).remove();
+ layer.msg("删除成功");
+ } else {
+ alerts(json.message);
+ }
+ }, error: function () {
+ layer.closeAll();
+ alerts("服务器异常,请联系管理员");
+ }
+ });
+ });
+}
+
+$.get("/category/all", function (data) {
+ var json = JSON.parse(data);
+ var option = "";
+ $.each(json, function (i, category) {
+ option += "<option value='" + category.name + "'>" + category.name + "</option>";
+ });
+ if (!isEmpty(option)) {
+ $("#edit-file-category").html(option);
+ }
+ option = "";
+ $.each(json, function (i, category) {
+ option += "<option value='" + category.id + "'>" + category.name + "</option>";
+ });
+ if (!isEmpty(option)) {
+ $("#category").append(option);
+ }
+});
+
+// web sketch 文件上传
+function showFileUpload() {
+ layer.open({
+ type: 1,
+ title: false,
+ closeBtn: 1,
+ offset: 'ct',
+ shadeClose: true,
+ content: "<input id='file-upload' class='form-control file' multiple data-max-file-count='100' name='file' type='file'/>"
+ });
+ $("#file-upload").fileinput({
+ uploadUrl: "./sketch/upload",
+ language: 'en',
+ // showPreview: false, //是否显示预览
+ showCancel: true,
+ showUpload: true,
+ maxFileCount: 10,
+ maxFilePreviewSize: 512000, //允许上传文件最大500M
+ uploadExtraData:function() {
+ var extData = {
+ destination: $("#dir_id").attr("value")
+ }
+ return extData;
+ }
+ }).on('fileuploaded', function (event, data) {
+ var json = data.response;
+ if (JSON.stringify(json).indexOf("success") > 0) {
+ $("#avatar").attr("src", json.success);
+ getFiles($("#dir_id").attr("value"));
+ } else {
+ alerts(json.error);
+ }
+ });
+}
+
+function operatorPage(currentPath,type,name){
+ if(type==="dir"){
+ var nextPath = currentPath;
+ if(currentPath.indexOf("\\")!=-1){
+ nextPath = currentPath.endsWith("\\") ? currentPath : currentPath +"\\";
+ } else {
+ nextPath = currentPath.endsWith("/") ? currentPath : currentPath +"/";
+ }
+ getFiles(nextPath);
+ $(".backBtn_p").show();
+ } else {
+ fileDownLoad(currentPath,name);
+ }
+}
+function backPage() {
+ var currentPath = $("#dir_id").attr("value");
+ var backPath = currentPath;
+ if(currentPath.indexOf("\\")!=-1){
+ if(currentPath.endsWith("\\")){
+ currentPath = currentPath.substring(0, currentPath.lastIndexOf('\\'));
+ }
+ backPath = currentPath == '' ? '' : currentPath.substring(0, currentPath.lastIndexOf('\\'))+"\\";
+ } else {
+ if(currentPath.endsWith("/")){
+ currentPath = currentPath.substring(0, currentPath.lastIndexOf('\\'));
+ }
+ backPath = currentPath == '' ? '' : currentPath.substring(0, currentPath.lastIndexOf('/'))+"/";
+ }
+ getFiles(backPath);
+ if ( $("#history_path").attr("value")==backPath){
+ $(".backBtn_p").hide();
+ }
+}
+function reconvert(str){
+ str = str.replace(/(\\u)(\w{1,4})/gi,function($0){
+ return (String.fromCharCode(parseInt((escape($0).replace(/(%5Cu)(\w{1,4})/g,"$2")),16)));
+ });
+ str = str.replace(/(&#x)(\w{1,4});/gi,function($0){
+ return String.fromCharCode(parseInt(escape($0).replace(/(%26%23x)(\w{1,4})(%3B)/g,"$2"),16));
+ });
+ str = str.replace(/(&#)(\d{1,6});/gi,function($0){
+ return String.fromCharCode(parseInt(escape($0).replace(/(%26%23)(\d{1,6})(%3B)/g,"$2")));
+ });
+
+ return str;
+}
+function fileDownLoad(path,name) {
+ var url = '/sketch/download?path='+encodeURI(path);
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', url, true); // 也可以使用POST方式,根据接口
+ xhr.responseType = "blob"; // 返回类型blob
+ // 定义请求完成的处理函数,请求前也可以增加加载框/禁用下载按钮逻辑
+ xhr.onload = function () {
+ if (this.status === 200) {
+ var blob = this.response;
+ var reader = new FileReader();
+ reader.readAsDataURL(blob); // 转换为base64,可以直接放入a表情href
+ reader.onload = function (e) {
+ // 转换完成,创建一个a标签用于下载
+ var a = document.createElement('a');
+ // 获取文件名fileName
+ // var fileName = decodeURI(xhr.getResponseHeader("Content-Disposition")).split("filename=")
+ // var fileName2 = xhr.getResponseHeader("Content-Disposition").split("filename=")
+ // var fileName3 = xhr.getResponseHeader("filename")
+ // console.log(reconvert(fileName3))
+ // fileName = fileName[fileName.length - 1];
+ // fileName = fileName.replace(/"/g, "");
+ a.download = name;
+ a.href = e.target.result;
+ $("body").append(a); // 修复firefox中无法触发click
+ a.click();
+ $(a).remove();
+ }
+ }
+ };
+ // 发送ajax请求
+ xhr.send()
+}
diff --git a/src/main/resources/assets/js/jquery-3.3.1.js b/src/main/resources/assets/js/jquery-3.3.1.js
new file mode 100644
index 0000000..2efa1ff
--- /dev/null
+++ b/src/main/resources/assets/js/jquery-3.3.1.js
@@ -0,0 +1,10332 @@
+/*!
+ * jQuery JavaScript Library v3.3.1
+ * https://jquery.com/
+ *
+ * Includes Sizzle.js
+ * https://sizzlejs.com/
+ *
+ * Copyright JS Foundation and other contributors
+ * Released under the MIT license
+ * https://jquery.org/license
+ *
+ * Date: 2018-01-20T17:24Z
+ */
+(function (global, factory) {
+
+ "use strict";
+
+ if (typeof module === "object" && typeof module.exports === "object") {
+
+ // For CommonJS and CommonJS-like environments where a proper `window`
+ // is present, execute the factory and get jQuery.
+ // For environments that do not have a `window` with a `document`
+ // (such as Node.js), expose a factory as module.exports.
+ // This accentuates the need for the creation of a real `window`.
+ // e.g. var jQuery = require("jquery")(window);
+ // See ticket #14549 for more info.
+ module.exports = global.document ?
+ factory(global, true) :
+ function (w) {
+ if (!w.document) {
+ throw new Error("jQuery requires a window with a document");
+ }
+ return factory(w);
+ };
+ } else {
+ factory(global);
+ }
+
+ // Pass this if window is not defined yet
+})(typeof window !== "undefined" ? window : this, function (window, noGlobal) {
+
+ // Edge <= 12 - 13+, Firefox <=18 - 45+, IE 10 - 11, Safari 5.1 - 9+, iOS 6 - 9.1
+ // throw exceptions when non-strict code (e.g., ASP.NET 4.5) accesses strict mode
+ // arguments.callee.caller (trac-13335). But as of jQuery 3.0 (2016), strict mode should be common
+ // enough that all such attempts are guarded in a try block.
+ "use strict";
+
+ var arr = [];
+
+ var document = window.document;
+
+ var getProto = Object.getPrototypeOf;
+
+ var slice = arr.slice;
+
+ var concat = arr.concat;
+
+ var push = arr.push;
+
+ var indexOf = arr.indexOf;
+
+ var class2type = {};
+
+ var toString = class2type.toString;
+
+ var hasOwn = class2type.hasOwnProperty;
+
+ var fnToString = hasOwn.toString;
+
+ var ObjectFunctionString = fnToString.call(Object);
+
+ var support = {};
+
+ var isFunction = function isFunction(obj) {
+
+ // Support: Chrome <=57, Firefox <=52
+ // In some browsers, typeof returns "function" for HTML <object> elements
+ // (i.e., `typeof document.createElement( "object" ) === "function"`).
+ // We don't want to classify *any* DOM node as a function.
+ return typeof obj === "function" && typeof obj.nodeType !== "number";
+ };
+
+
+ var isWindow = function isWindow(obj) {
+ return obj != null && obj === obj.window;
+ };
+
+
+ var preservedScriptAttributes = {
+ type: true,
+ src: true,
+ noModule: true
+ };
+
+ function DOMEval(code, doc, node) {
+ doc = doc || document;
+
+ var i,
+ script = doc.createElement("script");
+
+ script.text = code;
+ if (node) {
+ for (i in preservedScriptAttributes) {
+ if (node[i]) {
+ script[i] = node[i];
+ }
+ }
+ }
+ doc.head.appendChild(script).parentNode.removeChild(script);
+ }
+
+
+ function toType(obj) {
+ if (obj == null) {
+ return obj + "";
+ }
+
+ // Support: Android <=2.3 only (functionish RegExp)
+ return typeof obj === "object" || typeof obj === "function" ?
+ class2type[toString.call(obj)] || "object" :
+ typeof obj;
+ }
+
+ /* global Symbol */
+ // Defining this global in .eslintrc.json would create a danger of using the global
+ // unguarded in another place, it seems safer to define global only for this module
+
+
+ var
+ version = "3.3.1",
+
+ // Define a local copy of jQuery
+ jQuery = function (selector, context) {
+
+ // The jQuery object is actually just the init constructor 'enhanced'
+ // Need init if jQuery is called (just allow error to be thrown if not included)
+ return new jQuery.fn.init(selector, context);
+ },
+
+ // Support: Android <=4.0 only
+ // Make sure we trim BOM and NBSP
+ rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;
+
+ jQuery.fn = jQuery.prototype = {
+
+ // The current version of jQuery being used
+ jquery: version,
+
+ constructor: jQuery,
+
+ // The default length of a jQuery object is 0
+ length: 0,
+
+ toArray: function () {
+ return slice.call(this);
+ },
+
+ // Get the Nth element in the matched element set OR
+ // Get the whole matched element set as a clean array
+ get: function (num) {
+
+ // Return all the elements in a clean array
+ if (num == null) {
+ return slice.call(this);
+ }
+
+ // Return just the one element from the set
+ return num < 0 ? this[num + this.length] : this[num];
+ },
+
+ // Take an array of elements and push it onto the stack
+ // (returning the new matched element set)
+ pushStack: function (elems) {
+
+ // Build a new jQuery matched element set
+ var ret = jQuery.merge(this.constructor(), elems);
+
+ // Add the old object onto the stack (as a reference)
+ ret.prevObject = this;
+
+ // Return the newly-formed element set
+ return ret;
+ },
+
+ // Execute a callback for every element in the matched set.
+ each: function (callback) {
+ return jQuery.each(this, callback);
+ },
+
+ map: function (callback) {
+ return this.pushStack(jQuery.map(this, function (elem, i) {
+ return callback.call(elem, i, elem);
+ }));
+ },
+
+ slice: function () {
+ return this.pushStack(slice.apply(this, arguments));
+ },
+
+ first: function () {
+ return this.eq(0);
+ },
+
+ last: function () {
+ return this.eq(-1);
+ },
+
+ eq: function (i) {
+ var len = this.length,
+ j = +i + (i < 0 ? len : 0);
+ return this.pushStack(j >= 0 && j < len ? [this[j]] : []);
+ },
+
+ end: function () {
+ return this.prevObject || this.constructor();
+ },
+
+ // For internal use only.
+ // Behaves like an Array's method, not like a jQuery method.
+ push: push,
+ sort: arr.sort,
+ splice: arr.splice
+ };
+
+ jQuery.extend = jQuery.fn.extend = function () {
+ var options, name, src, copy, copyIsArray, clone,
+ target = arguments[0] || {},
+ i = 1,
+ length = arguments.length,
+ deep = false;
+
+ // Handle a deep copy situation
+ if (typeof target === "boolean") {
+ deep = target;
+
+ // Skip the boolean and the target
+ target = arguments[i] || {};
+ i++;
+ }
+
+ // Handle case when target is a string or something (possible in deep copy)
+ if (typeof target !== "object" && !isFunction(target)) {
+ target = {};
+ }
+
+ // Extend jQuery itself if only one argument is passed
+ if (i === length) {
+ target = this;
+ i--;
+ }
+
+ for (; i < length; i++) {
+
+ // Only deal with non-null/undefined values
+ if ((options = arguments[i]) != null) {
+
+ // Extend the base object
+ for (name in options) {
+ src = target[name];
+ copy = options[name];
+
+ // Prevent never-ending loop
+ if (target === copy) {
+ continue;
+ }
+
+ // Recurse if we're merging plain objects or arrays
+ if (deep && copy && (jQuery.isPlainObject(copy) ||
+ (copyIsArray = Array.isArray(copy)))) {
+
+ if (copyIsArray) {
+ copyIsArray = false;
+ clone = src && Array.isArray(src) ? src : [];
+
+ } else {
+ clone = src && jQuery.isPlainObject(src) ? src : {};
+ }
+
+ // Never move original objects, clone them
+ target[name] = jQuery.extend(deep, clone, copy);
+
+ // Don't bring in undefined values
+ } else if (copy !== undefined) {
+ target[name] = copy;
+ }
+ }
+ }
+ }
+
+ // Return the modified object
+ return target;
+ };
+
+ jQuery.extend({
+
+ // Unique for each copy of jQuery on the page
+ expando: "jQuery" + (version + Math.random()).replace(/\D/g, ""),
+
+ // Assume jQuery is ready without the ready module
+ isReady: true,
+
+ error: function (msg) {
+ throw new Error(msg);
+ },
+
+ noop: function () {
+ },
+
+ isPlainObject: function (obj) {
+ var proto, Ctor;
+
+ // Detect obvious negatives
+ // Use toString instead of jQuery.type to catch host objects
+ if (!obj || toString.call(obj) !== "[object Object]") {
+ return false;
+ }
+
+ proto = getProto(obj);
+
+ // Objects with no prototype (e.g., `Object.create( null )`) are plain
+ if (!proto) {
+ return true;
+ }
+
+ // Objects with prototype are plain iff they were constructed by a global Object function
+ Ctor = hasOwn.call(proto, "constructor") && proto.constructor;
+ return typeof Ctor === "function" && fnToString.call(Ctor) === ObjectFunctionString;
+ },
+
+ isEmptyObject: function (obj) {
+
+ /* eslint-disable no-unused-vars */
+ // See https://github.com/eslint/eslint/issues/6125
+ var name;
+
+ for (name in obj) {
+ return false;
+ }
+ return true;
+ },
+
+ // Evaluates a script in a global context
+ globalEval: function (code) {
+ DOMEval(code);
+ },
+
+ each: function (obj, callback) {
+ var length, i = 0;
+
+ if (isArrayLike(obj)) {
+ length = obj.length;
+ for (; i < length; i++) {
+ if (callback.call(obj[i], i, obj[i]) === false) {
+ break;
+ }
+ }
+ } else {
+ for (i in obj) {
+ if (callback.call(obj[i], i, obj[i]) === false) {
+ break;
+ }
+ }
+ }
+
+ return obj;
+ },
+
+ // Support: Android <=4.0 only
+ trim: function (text) {
+ return text == null ?
+ "" :
+ (text + "").replace(rtrim, "");
+ },
+
+ // results is for internal usage only
+ makeArray: function (arr, results) {
+ var ret = results || [];
+
+ if (arr != null) {
+ if (isArrayLike(Object(arr))) {
+ jQuery.merge(ret,
+ typeof arr === "string" ?
+ [arr] : arr
+ );
+ } else {
+ push.call(ret, arr);
+ }
+ }
+
+ return ret;
+ },
+
+ inArray: function (elem, arr, i) {
+ return arr == null ? -1 : indexOf.call(arr, elem, i);
+ },
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ merge: function (first, second) {
+ var len = +second.length,
+ j = 0,
+ i = first.length;
+
+ for (; j < len; j++) {
+ first[i++] = second[j];
+ }
+
+ first.length = i;
+
+ return first;
+ },
+
+ grep: function (elems, callback, invert) {
+ var callbackInverse,
+ matches = [],
+ i = 0,
+ length = elems.length,
+ callbackExpect = !invert;
+
+ // Go through the array, only saving the items
+ // that pass the validator function
+ for (; i < length; i++) {
+ callbackInverse = !callback(elems[i], i);
+ if (callbackInverse !== callbackExpect) {
+ matches.push(elems[i]);
+ }
+ }
+
+ return matches;
+ },
+
+ // arg is for internal usage only
+ map: function (elems, callback, arg) {
+ var length, value,
+ i = 0,
+ ret = [];
+
+ // Go through the array, translating each of the items to their new values
+ if (isArrayLike(elems)) {
+ length = elems.length;
+ for (; i < length; i++) {
+ value = callback(elems[i], i, arg);
+
+ if (value != null) {
+ ret.push(value);
+ }
+ }
+
+ // Go through every key on the object,
+ } else {
+ for (i in elems) {
+ value = callback(elems[i], i, arg);
+
+ if (value != null) {
+ ret.push(value);
+ }
+ }
+ }
+
+ // Flatten any nested arrays
+ return concat.apply([], ret);
+ },
+
+ // A global GUID counter for objects
+ guid: 1,
+
+ // jQuery.support is not used in Core but other projects attach their
+ // properties to it so it needs to exist.
+ support: support
+ });
+
+ if (typeof Symbol === "function") {
+ jQuery.fn[Symbol.iterator] = arr[Symbol.iterator];
+ }
+
+ // Populate the class2type map
+ jQuery.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),
+ function (i, name) {
+ class2type["[object " + name + "]"] = name.toLowerCase();
+ });
+
+ function isArrayLike(obj) {
+
+ // Support: real iOS 8.2 only (not reproducible in simulator)
+ // `in` check used to prevent JIT error (gh-2145)
+ // hasOwn isn't used here due to false negatives
+ // regarding Nodelist length in IE
+ var length = !!obj && "length" in obj && obj.length,
+ type = toType(obj);
+
+ if (isFunction(obj) || isWindow(obj)) {
+ return false;
+ }
+
+ return type === "array" || length === 0 ||
+ typeof length === "number" && length > 0 && (length - 1) in obj;
+ }
+
+ var Sizzle =
+ /*!
+ * Sizzle CSS Selector Engine v2.3.3
+ * https://sizzlejs.com/
+ *
+ * Copyright jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: 2016-08-08
+ */
+ (function (window) {
+
+ var i,
+ support,
+ Expr,
+ getText,
+ isXML,
+ tokenize,
+ compile,
+ select,
+ outermostContext,
+ sortInput,
+ hasDuplicate,
+
+ // Local document vars
+ setDocument,
+ document,
+ docElem,
+ documentIsHTML,
+ rbuggyQSA,
+ rbuggyMatches,
+ matches,
+ contains,
+
+ // Instance-specific data
+ expando = "sizzle" + 1 * new Date(),
+ preferredDoc = window.document,
+ dirruns = 0,
+ done = 0,
+ classCache = createCache(),
+ tokenCache = createCache(),
+ compilerCache = createCache(),
+ sortOrder = function (a, b) {
+ if (a === b) {
+ hasDuplicate = true;
+ }
+ return 0;
+ },
+
+ // Instance methods
+ hasOwn = ({}).hasOwnProperty,
+ arr = [],
+ pop = arr.pop,
+ push_native = arr.push,
+ push = arr.push,
+ slice = arr.slice,
+ // Use a stripped-down indexOf as it's faster than native
+ // https://jsperf.com/thor-indexof-vs-for/5
+ indexOf = function (list, elem) {
+ var i = 0,
+ len = list.length;
+ for (; i < len; i++) {
+ if (list[i] === elem) {
+ return i;
+ }
+ }
+ return -1;
+ },
+
+ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",
+
+ // Regular expressions
+
+ // http://www.w3.org/TR/css3-selectors/#whitespace
+ whitespace = "[\\x20\\t\\r\\n\\f]",
+
+ // http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
+ identifier = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+",
+
+ // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
+ attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
+ // Operator (capture 2)
+ "*([*^$|!~]?=)" + whitespace +
+ // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
+ "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
+ "*\\]",
+
+ pseudos = ":(" + identifier + ")(?:\\((" +
+ // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
+ // 1. quoted (capture 3; capture 4 or capture 5)
+ "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
+ // 2. simple (capture 6)
+ "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
+ // 3. anything else (capture 2)
+ ".*" +
+ ")\\)|)",
+
+ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
+ rwhitespace = new RegExp(whitespace + "+", "g"),
+ rtrim = new RegExp("^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g"),
+
+ rcomma = new RegExp("^" + whitespace + "*," + whitespace + "*"),
+ rcombinators = new RegExp("^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*"),
+
+ rattributeQuotes = new RegExp("=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g"),
+
+ rpseudo = new RegExp(pseudos),
+ ridentifier = new RegExp("^" + identifier + "$"),
+
+ matchExpr = {
+ "ID": new RegExp("^#(" + identifier + ")"),
+ "CLASS": new RegExp("^\\.(" + identifier + ")"),
+ "TAG": new RegExp("^(" + identifier + "|[*])"),
+ "ATTR": new RegExp("^" + attributes),
+ "PSEUDO": new RegExp("^" + pseudos),
+ "CHILD": new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
+ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
+ "*(\\d+)|))" + whitespace + "*\\)|)", "i"),
+ "bool": new RegExp("^(?:" + booleans + ")$", "i"),
+ // For use in libraries implementing .is()
+ // We use this for POS matching in `select`
+ "needsContext": new RegExp("^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
+ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i")
+ },
+
+ rinputs = /^(?:input|select|textarea|button)$/i,
+ rheader = /^h\d$/i,
+
+ rnative = /^[^{]+\{\s*\[native \w/,
+
+ // Easily-parseable/retrievable ID or TAG or CLASS selectors
+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,
+
+ rsibling = /[+~]/,
+
+ // CSS escapes
+ // http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
+ runescape = new RegExp("\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig"),
+ funescape = function (_, escaped, escapedWhitespace) {
+ var high = "0x" + escaped - 0x10000;
+ // NaN means non-codepoint
+ // Support: Firefox<24
+ // Workaround erroneous numeric interpretation of +"0x"
+ return high !== high || escapedWhitespace ?
+ escaped :
+ high < 0 ?
+ // BMP codepoint
+ String.fromCharCode(high + 0x10000) :
+ // Supplemental Plane codepoint (surrogate pair)
+ String.fromCharCode(high >> 10 | 0xD800, high & 0x3FF | 0xDC00);
+ },
+
+ // CSS string/identifier serialization
+ // https://drafts.csswg.org/cssom/#common-serializing-idioms
+ rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,
+ fcssescape = function (ch, asCodePoint) {
+ if (asCodePoint) {
+
+ // U+0000 NULL becomes U+FFFD REPLACEMENT CHARACTER
+ if (ch === "\0") {
+ return "\uFFFD";
+ }
+
+ // Control characters and (dependent upon position) numbers get escaped as code points
+ return ch.slice(0, -1) + "\\" + ch.charCodeAt(ch.length - 1).toString(16) + " ";
+ }
+
+ // Other potentially-special ASCII characters get backslash-escaped
+ return "\\" + ch;
+ },
+
+ // Used for iframes
+ // See setDocument()
+ // Removing the function wrapper causes a "Permission Denied"
+ // error in IE
+ unloadHandler = function () {
+ setDocument();
+ },
+
+ disabledAncestor = addCombinator(
+ function (elem) {
+ return elem.disabled === true && ("form" in elem || "label" in elem);
+ },
+ {dir: "parentNode", next: "legend"}
+ );
+
+ // Optimize for push.apply( _, NodeList )
+ try {
+ push.apply(
+ (arr = slice.call(preferredDoc.childNodes)),
+ preferredDoc.childNodes
+ );
+ // Support: Android<4.0
+ // Detect silently failing push.apply
+ arr[preferredDoc.childNodes.length].nodeType;
+ } catch (e) {
+ push = {
+ apply: arr.length ?
+
+ // Leverage slice if possible
+ function (target, els) {
+ push_native.apply(target, slice.call(els));
+ } :
+
+ // Support: IE<9
+ // Otherwise append directly
+ function (target, els) {
+ var j = target.length,
+ i = 0;
+ // Can't trust NodeList.length
+ while ((target[j++] = els[i++])) {
+ }
+ target.length = j - 1;
+ }
+ };
+ }
+
+ function Sizzle(selector, context, results, seed) {
+ var m, i, elem, nid, match, groups, newSelector,
+ newContext = context && context.ownerDocument,
+
+ // nodeType defaults to 9, since context defaults to document
+ nodeType = context ? context.nodeType : 9;
+
+ results = results || [];
+
+ // Return early from calls with invalid selector or context
+ if (typeof selector !== "string" || !selector ||
+ nodeType !== 1 && nodeType !== 9 && nodeType !== 11) {
+
+ return results;
+ }
+
+ // Try to shortcut find operations (as opposed to filters) in HTML documents
+ if (!seed) {
+
+ if ((context ? context.ownerDocument || context : preferredDoc) !== document) {
+ setDocument(context);
+ }
+ context = context || document;
+
+ if (documentIsHTML) {
+
+ // If the selector is sufficiently simple, try using a "get*By*" DOM method
+ // (excepting DocumentFragment context, where the methods don't exist)
+ if (nodeType !== 11 && (match = rquickExpr.exec(selector))) {
+
+ // ID selector
+ if ((m = match[1])) {
+
+ // Document context
+ if (nodeType === 9) {
+ if ((elem = context.getElementById(m))) {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if (elem.id === m) {
+ results.push(elem);
+ return results;
+ }
+ } else {
+ return results;
+ }
+
+ // Element context
+ } else {
+
+ // Support: IE, Opera, Webkit
+ // TODO: identify versions
+ // getElementById can match elements by name instead of ID
+ if (newContext && (elem = newContext.getElementById(m)) &&
+ contains(context, elem) &&
+ elem.id === m) {
+
+ results.push(elem);
+ return results;
+ }
+ }
+
+ // Type selector
+ } else if (match[2]) {
+ push.apply(results, context.getElementsByTagName(selector));
+ return results;
+
+ // Class selector
+ } else if ((m = match[3]) && support.getElementsByClassName &&
+ context.getElementsByClassName) {
+
+ push.apply(results, context.getElementsByClassName(m));
+ return results;
+ }
+ }
+
+ // Take advantage of querySelectorAll
+ if (support.qsa &&
+ !compilerCache[selector + " "] &&
+ (!rbuggyQSA || !rbuggyQSA.test(selector))) {
+
+ if (nodeType !== 1) {
+ newContext = context;
+ newSelector = selector;
+
+ // qSA looks outside Element context, which is not what we want
+ // Thanks to Andrew Dupont for this workaround technique
+ // Support: IE <=8
+ // Exclude object elements
+ } else if (context.nodeName.toLowerCase() !== "object") {
+
+ // Capture the context ID, setting it first if necessary
+ if ((nid = context.getAttribute("id"))) {
+ nid = nid.replace(rcssescape, fcssescape);
+ } else {
+ context.setAttribute("id", (nid = expando));
+ }
+
+ // Prefix every selector in the list
+ groups = tokenize(selector);
+ i = groups.length;
+ while (i--) {
+ groups[i] = "#" + nid + " " + toSelector(groups[i]);
+ }
+ newSelector = groups.join(",");
+
+ // Expand context for sibling selectors
+ newContext = rsibling.test(selector) && testContext(context.parentNode) ||
+ context;
+ }
+
+ if (newSelector) {
+ try {
+ push.apply(results,
+ newContext.querySelectorAll(newSelector)
+ );
+ return results;
+ } catch (qsaError) {
+ } finally {
+ if (nid === expando) {
+ context.removeAttribute("id");
+ }
+ }
+ }
+ }
+ }
+ }
+
+ // All others
+ return select(selector.replace(rtrim, "$1"), context, results, seed);
+ }
+
+ /**
+ * Create key-value caches of limited size
+ * @returns {function(string, object)} Returns the Object data after storing it on itself with
+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
+ * deleting the oldest entry
+ */
+ function createCache() {
+ var keys = [];
+
+ function cache(key, value) {
+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
+ if (keys.push(key + " ") > Expr.cacheLength) {
+ // Only keep the most recent entries
+ delete cache[keys.shift()];
+ }
+ return (cache[key + " "] = value);
+ }
+
+ return cache;
+ }
+
+ /**
+ * Mark a function for special use by Sizzle
+ * @param {Function} fn The function to mark
+ */
+ function markFunction(fn) {
+ fn[expando] = true;
+ return fn;
+ }
+
+ /**
+ * Support testing using an element
+ * @param {Function} fn Passed the created element and returns a boolean result
+ */
+ function assert(fn) {
+ var el = document.createElement("fieldset");
+
+ try {
+ return !!fn(el);
+ } catch (e) {
+ return false;
+ } finally {
+ // Remove from its parent by default
+ if (el.parentNode) {
+ el.parentNode.removeChild(el);
+ }
+ // release memory in IE
+ el = null;
+ }
+ }
+
+ /**
+ * Adds the same handler for all of the specified attrs
+ * @param {String} attrs Pipe-separated list of attributes
+ * @param {Function} handler The method that will be applied
+ */
+ function addHandle(attrs, handler) {
+ var arr = attrs.split("|"),
+ i = arr.length;
+
+ while (i--) {
+ Expr.attrHandle[arr[i]] = handler;
+ }
+ }
+
+ /**
+ * Checks document order of two siblings
+ * @param {Element} a
+ * @param {Element} b
+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
+ */
+ function siblingCheck(a, b) {
+ var cur = b && a,
+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
+ a.sourceIndex - b.sourceIndex;
+
+ // Use IE sourceIndex if available on both nodes
+ if (diff) {
+ return diff;
+ }
+
+ // Check if b follows a
+ if (cur) {
+ while ((cur = cur.nextSibling)) {
+ if (cur === b) {
+ return -1;
+ }
+ }
+ }
+
+ return a ? 1 : -1;
+ }
+
+ /**
+ * Returns a function to use in pseudos for input types
+ * @param {String} type
+ */
+ function createInputPseudo(type) {
+ return function (elem) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === type;
+ };
+ }
+
+ /**
+ * Returns a function to use in pseudos for buttons
+ * @param {String} type
+ */
+ function createButtonPseudo(type) {
+ return function (elem) {
+ var name = elem.nodeName.toLowerCase();
+ return (name === "input" || name === "button") && elem.type === type;
+ };
+ }
+
+ /**
+ * Returns a function to use in pseudos for :enabled/:disabled
+ * @param {Boolean} disabled true for :disabled; false for :enabled
+ */
+ function createDisabledPseudo(disabled) {
+
+ // Known :disabled false positives: fieldset[disabled] > legend:nth-of-type(n+2) :can-disable
+ return function (elem) {
+
+ // Only certain elements can match :enabled or :disabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-enabled
+ // https://html.spec.whatwg.org/multipage/scripting.html#selector-disabled
+ if ("form" in elem) {
+
+ // Check for inherited disabledness on relevant non-disabled elements:
+ // * listed form-associated elements in a disabled fieldset
+ // https://html.spec.whatwg.org/multipage/forms.html#category-listed
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-fe-disabled
+ // * option elements in a disabled optgroup
+ // https://html.spec.whatwg.org/multipage/forms.html#concept-option-disabled
+ // All such elements have a "form" property.
+ if (elem.parentNode && elem.disabled === false) {
+
+ // Option elements defer to a parent optgroup if present
+ if ("label" in elem) {
+ if ("label" in elem.parentNode) {
+ return elem.parentNode.disabled === disabled;
+ } else {
+ return elem.disabled === disabled;
+ }
+ }
+
+ // Support: IE 6 - 11
+ // Use the isDisabled shortcut property to check for disabled fieldset ancestors
+ return elem.isDisabled === disabled ||
+
+ // Where there is no isDisabled, check manually
+ /* jshint -W018 */
+ elem.isDisabled !== !disabled &&
+ disabledAncestor(elem) === disabled;
+ }
+
+ return elem.disabled === disabled;
+
+ // Try to winnow out elements that can't be disabled before trusting the disabled property.
+ // Some victims get caught in our net (label, legend, menu, track), but it shouldn't
+ // even exist on them, let alone have a boolean value.
+ } else if ("label" in elem) {
+ return elem.disabled === disabled;
+ }
+
+ // Remaining elements are neither :enabled nor :disabled
+ return false;
+ };
+ }
+
+ /**
+ * Returns a function to use in pseudos for positionals
+ * @param {Function} fn
+ */
+ function createPositionalPseudo(fn) {
+ return markFunction(function (argument) {
+ argument = +argument;
+ return markFunction(function (seed, matches) {
+ var j,
+ matchIndexes = fn([], seed.length, argument),
+ i = matchIndexes.length;
+
+ // Match elements found at the specified indexes
+ while (i--) {
+ if (seed[(j = matchIndexes[i])]) {
+ seed[j] = !(matches[j] = seed[j]);
+ }
+ }
+ });
+ });
+ }
+
+ /**
+ * Checks a node for validity as a Sizzle context
+ * @param {Element|Object=} context
+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
+ */
+ function testContext(context) {
+ return context && typeof context.getElementsByTagName !== "undefined" && context;
+ }
+
+ // Expose support vars for convenience
+ support = Sizzle.support = {};
+
+ /**
+ * Detects XML nodes
+ * @param {Element|Object} elem An element or a document
+ * @returns {Boolean} True iff elem is a non-HTML XML node
+ */
+ isXML = Sizzle.isXML = function (elem) {
+ // documentElement is verified for cases where it doesn't yet exist
+ // (such as loading iframes in IE - #4833)
+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;
+ return documentElement ? documentElement.nodeName !== "HTML" : false;
+ };
+
+ /**
+ * Sets document-related variables once based on the current document
+ * @param {Element|Object} [doc] An element or document object to use to set the document
+ * @returns {Object} Returns the current document
+ */
+ setDocument = Sizzle.setDocument = function (node) {
+ var hasCompare, subWindow,
+ doc = node ? node.ownerDocument || node : preferredDoc;
+
+ // Return early if doc is invalid or already selected
+ if (doc === document || doc.nodeType !== 9 || !doc.documentElement) {
+ return document;
+ }
+
+ // Update global variables
+ document = doc;
+ docElem = document.documentElement;
+ documentIsHTML = !isXML(document);
+
+ // Support: IE 9-11, Edge
+ // Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
+ if (preferredDoc !== document &&
+ (subWindow = document.defaultView) && subWindow.top !== subWindow) {
+
+ // Support: IE 11, Edge
+ if (subWindow.addEventListener) {
+ subWindow.addEventListener("unload", unloadHandler, false);
+
+ // Support: IE 9 - 10 only
+ } else if (subWindow.attachEvent) {
+ subWindow.attachEvent("onunload", unloadHandler);
+ }
+ }
+
+ /* Attributes
+ ---------------------------------------------------------------------- */
+
+ // Support: IE<8
+ // Verify that getAttribute really returns attributes and not properties
+ // (excepting IE8 booleans)
+ support.attributes = assert(function (el) {
+ el.className = "i";
+ return !el.getAttribute("className");
+ });
+
+ /* getElement(s)By*
+ ---------------------------------------------------------------------- */
+
+ // Check if getElementsByTagName("*") returns only elements
+ support.getElementsByTagName = assert(function (el) {
+ el.appendChild(document.createComment(""));
+ return !el.getElementsByTagName("*").length;
+ });
+
+ // Support: IE<9
+ support.getElementsByClassName = rnative.test(document.getElementsByClassName);
+
+ // Support: IE<10
+ // Check if getElementById returns elements by name
+ // The broken getElementById methods don't pick up programmatically-set names,
+ // so use a roundabout getElementsByName test
+ support.getById = assert(function (el) {
+ docElem.appendChild(el).id = expando;
+ return !document.getElementsByName || !document.getElementsByName(expando).length;
+ });
+
+ // ID filter and find
+ if (support.getById) {
+ Expr.filter["ID"] = function (id) {
+ var attrId = id.replace(runescape, funescape);
+ return function (elem) {
+ return elem.getAttribute("id") === attrId;
+ };
+ };
+ Expr.find["ID"] = function (id, context) {
+ if (typeof context.getElementById !== "undefined" && documentIsHTML) {
+ var elem = context.getElementById(id);
+ return elem ? [elem] : [];
+ }
+ };
+ } else {
+ Expr.filter["ID"] = function (id) {
+ var attrId = id.replace(runescape, funescape);
+ return function (elem) {
+ var node = typeof elem.getAttributeNode !== "undefined" &&
+ elem.getAttributeNode("id");
+ return node && node.value === attrId;
+ };
+ };
+
+ // Support: IE 6 - 7 only
+ // getElementById is not reliable as a find shortcut
+ Expr.find["ID"] = function (id, context) {
+ if (typeof context.getElementById !== "undefined" && documentIsHTML) {
+ var node, i, elems,
+ elem = context.getElementById(id);
+
+ if (elem) {
+
+ // Verify the id attribute
+ node = elem.getAttributeNode("id");
+ if (node && node.value === id) {
+ return [elem];
+ }
+
+ // Fall back on getElementsByName
+ elems = context.getElementsByName(id);
+ i = 0;
+ while ((elem = elems[i++])) {
+ node = elem.getAttributeNode("id");
+ if (node && node.value === id) {
+ return [elem];
+ }
+ }
+ }
+
+ return [];
+ }
+ };
+ }
+
+ // Tag
+ Expr.find["TAG"] = support.getElementsByTagName ?
+ function (tag, context) {
+ if (typeof context.getElementsByTagName !== "undefined") {
+ return context.getElementsByTagName(tag);
+
+ // DocumentFragment nodes don't have gEBTN
+ } else if (support.qsa) {
+ return context.querySelectorAll(tag);
+ }
+ } :
+
+ function (tag, context) {
+ var elem,
+ tmp = [],
+ i = 0,
+ // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
+ results = context.getElementsByTagName(tag);
+
+ // Filter out possible comments
+ if (tag === "*") {
+ while ((elem = results[i++])) {
+ if (elem.nodeType === 1) {
+ tmp.push(elem);
+ }
+ }
+
+ return tmp;
+ }
+ return results;
+ };
+
+ // Class
+ Expr.find["CLASS"] = support.getElementsByClassName && function (className, context) {
+ if (typeof context.getElementsByClassName !== "undefined" && documentIsHTML) {
+ return context.getElementsByClassName(className);
+ }
+ };
+
+ /* QSA/matchesSelector
+ ---------------------------------------------------------------------- */
+
+ // QSA and matchesSelector support
+
+ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)
+ rbuggyMatches = [];
+
+ // qSa(:focus) reports false when true (Chrome 21)
+ // We allow this because of a bug in IE8/9 that throws an error
+ // whenever `document.activeElement` is accessed on an iframe
+ // So, we allow :focus to pass through QSA all the time to avoid the IE error
+ // See https://bugs.jquery.com/ticket/13378
+ rbuggyQSA = [];
+
+ if ((support.qsa = rnative.test(document.querySelectorAll))) {
+ // Build QSA regex
+ // Regex strategy adopted from Diego Perini
+ assert(function (el) {
+ // Select is set to empty string on purpose
+ // This is to test IE's treatment of not explicitly
+ // setting a boolean content attribute,
+ // since its presence should be enough
+ // https://bugs.jquery.com/ticket/12359
+ docElem.appendChild(el).innerHTML = "<a id='" + expando + "'></a>" +
+ "<select id='" + expando + "-\r\\' msallowcapture=''>" +
+ "<option selected=''></option></select>";
+
+ // Support: IE8, Opera 11-12.16
+ // Nothing should be selected when empty strings follow ^= or $= or *=
+ // The test attribute must be unknown in Opera but "safe" for WinRT
+ // https://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
+ if (el.querySelectorAll("[msallowcapture^='']").length) {
+ rbuggyQSA.push("[*^$]=" + whitespace + "*(?:''|\"\")");
+ }
+
+ // Support: IE8
+ // Boolean attributes and "value" are not treated correctly
+ if (!el.querySelectorAll("[selected]").length) {
+ rbuggyQSA.push("\\[" + whitespace + "*(?:value|" + booleans + ")");
+ }
+
+ // Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
+ if (!el.querySelectorAll("[id~=" + expando + "-]").length) {
+ rbuggyQSA.push("~=");
+ }
+
+ // Webkit/Opera - :checked should return selected option elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ // IE8 throws error here and will not see later tests
+ if (!el.querySelectorAll(":checked").length) {
+ rbuggyQSA.push(":checked");
+ }
+
+ // Support: Safari 8+, iOS 8+
+ // https://bugs.webkit.org/show_bug.cgi?id=136851
+ // In-page `selector#id sibling-combinator selector` fails
+ if (!el.querySelectorAll("a#" + expando + "+*").length) {
+ rbuggyQSA.push(".#.+[+~]");
+ }
+ });
+
+ assert(function (el) {
+ el.innerHTML = "<a href='' disabled='disabled'></a>" +
+ "<select disabled='disabled'><option/></select>";
+
+ // Support: Windows 8 Native Apps
+ // The type and name attributes are restricted during .innerHTML assignment
+ var input = document.createElement("input");
+ input.setAttribute("type", "hidden");
+ el.appendChild(input).setAttribute("name", "D");
+
+ // Support: IE8
+ // Enforce case-sensitivity of name attribute
+ if (el.querySelectorAll("[name=d]").length) {
+ rbuggyQSA.push("name" + whitespace + "*[*^$|!~]?=");
+ }
+
+ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
+ // IE8 throws error here and will not see later tests
+ if (el.querySelectorAll(":enabled").length !== 2) {
+ rbuggyQSA.push(":enabled", ":disabled");
+ }
+
+ // Support: IE9-11+
+ // IE's :disabled selector does not pick up the children of disabled fieldsets
+ docElem.appendChild(el).disabled = true;
+ if (el.querySelectorAll(":disabled").length !== 2) {
+ rbuggyQSA.push(":enabled", ":disabled");
+ }
+
+ // Opera 10-11 does not throw on post-comma invalid pseudos
+ el.querySelectorAll("*,:x");
+ rbuggyQSA.push(",.*:");
+ });
+ }
+
+ if ((support.matchesSelector = rnative.test((matches = docElem.matches ||
+ docElem.webkitMatchesSelector ||
+ docElem.mozMatchesSelector ||
+ docElem.oMatchesSelector ||
+ docElem.msMatchesSelector)))) {
+
+ assert(function (el) {
+ // Check to see if it's possible to do matchesSelector
+ // on a disconnected node (IE 9)
+ support.disconnectedMatch = matches.call(el, "*");
+
+ // This should fail with an exception
+ // Gecko does not error, returns false instead
+ matches.call(el, "[s!='']:x");
+ rbuggyMatches.push("!=", pseudos);
+ });
+ }
+
+ rbuggyQSA = rbuggyQSA.length && new RegExp(rbuggyQSA.join("|"));
+ rbuggyMatches = rbuggyMatches.length && new RegExp(rbuggyMatches.join("|"));
+
+ /* Contains
+ ---------------------------------------------------------------------- */
+ hasCompare = rnative.test(docElem.compareDocumentPosition);
+
+ // Element contains another
+ // Purposefully self-exclusive
+ // As in, an element does not contain itself
+ contains = hasCompare || rnative.test(docElem.contains) ?
+ function (a, b) {
+ var adown = a.nodeType === 9 ? a.documentElement : a,
+ bup = b && b.parentNode;
+ return a === bup || !!(bup && bup.nodeType === 1 && (
+ adown.contains ?
+ adown.contains(bup) :
+ a.compareDocumentPosition && a.compareDocumentPosition(bup) & 16
+ ));
+ } :
+ function (a, b) {
+ if (b) {
+ while ((b = b.parentNode)) {
+ if (b === a) {
+ return true;
+ }
+ }
+ }
+ return false;
+ };
+
+ /* Sorting
+ ---------------------------------------------------------------------- */
+
+ // Document order sorting
+ sortOrder = hasCompare ?
+ function (a, b) {
+
+ // Flag for duplicate removal
+ if (a === b) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ // Sort on method existence if only one input has compareDocumentPosition
+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
+ if (compare) {
+ return compare;
+ }
+
+ // Calculate position if both inputs belong to the same document
+ compare = (a.ownerDocument || a) === (b.ownerDocument || b) ?
+ a.compareDocumentPosition(b) :
+
+ // Otherwise we know they are disconnected
+ 1;
+
+ // Disconnected nodes
+ if (compare & 1 ||
+ (!support.sortDetached && b.compareDocumentPosition(a) === compare)) {
+
+ // Choose the first element that is related to our preferred document
+ if (a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a)) {
+ return -1;
+ }
+ if (b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b)) {
+ return 1;
+ }
+
+ // Maintain original order
+ return sortInput ?
+ (indexOf(sortInput, a) - indexOf(sortInput, b)) :
+ 0;
+ }
+
+ return compare & 4 ? -1 : 1;
+ } :
+ function (a, b) {
+ // Exit early if the nodes are identical
+ if (a === b) {
+ hasDuplicate = true;
+ return 0;
+ }
+
+ var cur,
+ i = 0,
+ aup = a.parentNode,
+ bup = b.parentNode,
+ ap = [a],
+ bp = [b];
+
+ // Parentless nodes are either documents or disconnected
+ if (!aup || !bup) {
+ return a === document ? -1 :
+ b === document ? 1 :
+ aup ? -1 :
+ bup ? 1 :
+ sortInput ?
+ (indexOf(sortInput, a) - indexOf(sortInput, b)) :
+ 0;
+
+ // If the nodes are siblings, we can do a quick check
+ } else if (aup === bup) {
+ return siblingCheck(a, b);
+ }
+
+ // Otherwise we need full lists of their ancestors for comparison
+ cur = a;
+ while ((cur = cur.parentNode)) {
+ ap.unshift(cur);
+ }
+ cur = b;
+ while ((cur = cur.parentNode)) {
+ bp.unshift(cur);
+ }
+
+ // Walk down the tree looking for a discrepancy
+ while (ap[i] === bp[i]) {
+ i++;
+ }
+
+ return i ?
+ // Do a sibling check if the nodes have a common ancestor
+ siblingCheck(ap[i], bp[i]) :
+
+ // Otherwise nodes in our document sort first
+ ap[i] === preferredDoc ? -1 :
+ bp[i] === preferredDoc ? 1 :
+ 0;
+ };
+
+ return document;
+ };
+
+ Sizzle.matches = function (expr, elements) {
+ return Sizzle(expr, null, null, elements);
+ };
+
+ Sizzle.matchesSelector = function (elem, expr) {
+ // Set document vars if needed
+ if ((elem.ownerDocument || elem) !== document) {
+ setDocument(elem);
+ }
+
+ // Make sure that attribute selectors are quoted
+ expr = expr.replace(rattributeQuotes, "='$1']");
+
+ if (support.matchesSelector && documentIsHTML &&
+ !compilerCache[expr + " "] &&
+ (!rbuggyMatches || !rbuggyMatches.test(expr)) &&
+ (!rbuggyQSA || !rbuggyQSA.test(expr))) {
+
+ try {
+ var ret = matches.call(elem, expr);
+
+ // IE 9's matchesSelector returns false on disconnected nodes
+ if (ret || support.disconnectedMatch ||
+ // As well, disconnected nodes are said to be in a document
+ // fragment in IE 9
+ elem.document && elem.document.nodeType !== 11) {
+ return ret;
+ }
+ } catch (e) {
+ }
+ }
+
+ return Sizzle(expr, document, null, [elem]).length > 0;
+ };
+
+ Sizzle.contains = function (context, elem) {
+ // Set document vars if needed
+ if ((context.ownerDocument || context) !== document) {
+ setDocument(context);
+ }
+ return contains(context, elem);
+ };
+
+ Sizzle.attr = function (elem, name) {
+ // Set document vars if needed
+ if ((elem.ownerDocument || elem) !== document) {
+ setDocument(elem);
+ }
+
+ var fn = Expr.attrHandle[name.toLowerCase()],
+ // Don't get fooled by Object.prototype properties (jQuery #13807)
+ val = fn && hasOwn.call(Expr.attrHandle, name.toLowerCase()) ?
+ fn(elem, name, !documentIsHTML) :
+ undefined;
+
+ return val !== undefined ?
+ val :
+ support.attributes || !documentIsHTML ?
+ elem.getAttribute(name) :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+ };
+
+ Sizzle.escape = function (sel) {
+ return (sel + "").replace(rcssescape, fcssescape);
+ };
+
+ Sizzle.error = function (msg) {
+ throw new Error("Syntax error, unrecognized expression: " + msg);
+ };
+
+ /**
+ * Document sorting and removing duplicates
+ * @param {ArrayLike} results
+ */
+ Sizzle.uniqueSort = function (results) {
+ var elem,
+ duplicates = [],
+ j = 0,
+ i = 0;
+
+ // Unless we *know* we can detect duplicates, assume their presence
+ hasDuplicate = !support.detectDuplicates;
+ sortInput = !support.sortStable && results.slice(0);
+ results.sort(sortOrder);
+
+ if (hasDuplicate) {
+ while ((elem = results[i++])) {
+ if (elem === results[i]) {
+ j = duplicates.push(i);
+ }
+ }
+ while (j--) {
+ results.splice(duplicates[j], 1);
+ }
+ }
+
+ // Clear input after sorting to release objects
+ // See https://github.com/jquery/sizzle/pull/225
+ sortInput = null;
+
+ return results;
+ };
+
+ /**
+ * Utility function for retrieving the text value of an array of DOM nodes
+ * @param {Array|Element} elem
+ */
+ getText = Sizzle.getText = function (elem) {
+ var node,
+ ret = "",
+ i = 0,
+ nodeType = elem.nodeType;
+
+ if (!nodeType) {
+ // If no nodeType, this is expected to be an array
+ while ((node = elem[i++])) {
+ // Do not traverse comment nodes
+ ret += getText(node);
+ }
+ } else if (nodeType === 1 || nodeType === 9 || nodeType === 11) {
+ // Use textContent for elements
+ // innerText usage removed for consistency of new lines (jQuery #11153)
+ if (typeof elem.textContent === "string") {
+ return elem.textContent;
+ } else {
+ // Traverse its children
+ for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
+ ret += getText(elem);
+ }
+ }
+ } else if (nodeType === 3 || nodeType === 4) {
+ return elem.nodeValue;
+ }
+ // Do not include comment or processing instruction nodes
+
+ return ret;
+ };
+
+ Expr = Sizzle.selectors = {
+
+ // Can be adjusted by the user
+ cacheLength: 50,
+
+ createPseudo: markFunction,
+
+ match: matchExpr,
+
+ attrHandle: {},
+
+ find: {},
+
+ relative: {
+ ">": {dir: "parentNode", first: true},
+ " ": {dir: "parentNode"},
+ "+": {dir: "previousSibling", first: true},
+ "~": {dir: "previousSibling"}
+ },
+
+ preFilter: {
+ "ATTR": function (match) {
+ match[1] = match[1].replace(runescape, funescape);
+
+ // Move the given value to match[3] whether quoted or unquoted
+ match[3] = (match[3] || match[4] || match[5] || "").replace(runescape, funescape);
+
+ if (match[2] === "~=") {
+ match[3] = " " + match[3] + " ";
+ }
+
+ return match.slice(0, 4);
+ },
+
+ "CHILD": function (match) {
+ /* matches from matchExpr["CHILD"]
+ 1 type (only|nth|...)
+ 2 what (child|of-type)
+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
+ 4 xn-component of xn+y argument ([+-]?\d*n|)
+ 5 sign of xn-component
+ 6 x of xn-component
+ 7 sign of y-component
+ 8 y of y-component
+ */
+ match[1] = match[1].toLowerCase();
+
+ if (match[1].slice(0, 3) === "nth") {
+ // nth-* requires argument
+ if (!match[3]) {
+ Sizzle.error(match[0]);
+ }
+
+ // numeric x and y parameters for Expr.filter.CHILD
+ // remember that false/true cast respectively to 0/1
+ match[4] = +(match[4] ? match[5] + (match[6] || 1) : 2 * (match[3] === "even" || match[3] === "odd"));
+ match[5] = +((match[7] + match[8]) || match[3] === "odd");
+
+ // other types prohibit arguments
+ } else if (match[3]) {
+ Sizzle.error(match[0]);
+ }
+
+ return match;
+ },
+
+ "PSEUDO": function (match) {
+ var excess,
+ unquoted = !match[6] && match[2];
+
+ if (matchExpr["CHILD"].test(match[0])) {
+ return null;
+ }
+
+ // Accept quoted arguments as-is
+ if (match[3]) {
+ match[2] = match[4] || match[5] || "";
+
+ // Strip excess characters from unquoted arguments
+ } else if (unquoted && rpseudo.test(unquoted) &&
+ // Get excess from tokenize (recursively)
+ (excess = tokenize(unquoted, true)) &&
+ // advance to the next closing parenthesis
+ (excess = unquoted.indexOf(")", unquoted.length - excess) - unquoted.length)) {
+
+ // excess is a negative index
+ match[0] = match[0].slice(0, excess);
+ match[2] = unquoted.slice(0, excess);
+ }
+
+ // Return only captures needed by the pseudo filter method (type and argument)
+ return match.slice(0, 3);
+ }
+ },
+
+ filter: {
+
+ "TAG": function (nodeNameSelector) {
+ var nodeName = nodeNameSelector.replace(runescape, funescape).toLowerCase();
+ return nodeNameSelector === "*" ?
+ function () {
+ return true;
+ } :
+ function (elem) {
+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
+ };
+ },
+
+ "CLASS": function (className) {
+ var pattern = classCache[className + " "];
+
+ return pattern ||
+ (pattern = new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)")) &&
+ classCache(className, function (elem) {
+ return pattern.test(typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "");
+ });
+ },
+
+ "ATTR": function (name, operator, check) {
+ return function (elem) {
+ var result = Sizzle.attr(elem, name);
+
+ if (result == null) {
+ return operator === "!=";
+ }
+ if (!operator) {
+ return true;
+ }
+
+ result += "";
+
+ return operator === "=" ? result === check :
+ operator === "!=" ? result !== check :
+ operator === "^=" ? check && result.indexOf(check) === 0 :
+ operator === "*=" ? check && result.indexOf(check) > -1 :
+ operator === "$=" ? check && result.slice(-check.length) === check :
+ operator === "~=" ? (" " + result.replace(rwhitespace, " ") + " ").indexOf(check) > -1 :
+ operator === "|=" ? result === check || result.slice(0, check.length + 1) === check + "-" :
+ false;
+ };
+ },
+
+ "CHILD": function (type, what, argument, first, last) {
+ var simple = type.slice(0, 3) !== "nth",
+ forward = type.slice(-4) !== "last",
+ ofType = what === "of-type";
+
+ return first === 1 && last === 0 ?
+
+ // Shortcut for :nth-*(n)
+ function (elem) {
+ return !!elem.parentNode;
+ } :
+
+ function (elem, context, xml) {
+ var cache, uniqueCache, outerCache, node, nodeIndex, start,
+ dir = simple !== forward ? "nextSibling" : "previousSibling",
+ parent = elem.parentNode,
+ name = ofType && elem.nodeName.toLowerCase(),
+ useCache = !xml && !ofType,
+ diff = false;
+
+ if (parent) {
+
+ // :(first|last|only)-(child|of-type)
+ if (simple) {
+ while (dir) {
+ node = elem;
+ while ((node = node[dir])) {
+ if (ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1) {
+
+ return false;
+ }
+ }
+ // Reverse direction for :only-* (if we haven't yet done so)
+ start = dir = type === "only" && !start && "nextSibling";
+ }
+ return true;
+ }
+
+ start = [forward ? parent.firstChild : parent.lastChild];
+
+ // non-xml :nth-child(...) stores cache data on `parent`
+ if (forward && useCache) {
+
+ // Seek `elem` from a previously-cached index
+
+ // ...in a gzip-friendly way
+ node = parent;
+ outerCache = node[expando] || (node[expando] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[node.uniqueID] ||
+ (outerCache[node.uniqueID] = {});
+
+ cache = uniqueCache[type] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = nodeIndex && cache[2];
+ node = nodeIndex && parent.childNodes[nodeIndex];
+
+ while ((node = ++nodeIndex && node && node[dir] ||
+
+ // Fallback to seeking `elem` from the start
+ (diff = nodeIndex = 0) || start.pop())) {
+
+ // When found, cache indexes on `parent` and break
+ if (node.nodeType === 1 && ++diff && node === elem) {
+ uniqueCache[type] = [dirruns, nodeIndex, diff];
+ break;
+ }
+ }
+
+ } else {
+ // Use previously-cached element index if available
+ if (useCache) {
+ // ...in a gzip-friendly way
+ node = elem;
+ outerCache = node[expando] || (node[expando] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[node.uniqueID] ||
+ (outerCache[node.uniqueID] = {});
+
+ cache = uniqueCache[type] || [];
+ nodeIndex = cache[0] === dirruns && cache[1];
+ diff = nodeIndex;
+ }
+
+ // xml :nth-child(...)
+ // or :nth-last-child(...) or :nth(-last)?-of-type(...)
+ if (diff === false) {
+ // Use the same loop as above to seek `elem` from the start
+ while ((node = ++nodeIndex && node && node[dir] ||
+ (diff = nodeIndex = 0) || start.pop())) {
+
+ if ((ofType ?
+ node.nodeName.toLowerCase() === name :
+ node.nodeType === 1) &&
+ ++diff) {
+
+ // Cache the index of each encountered element
+ if (useCache) {
+ outerCache = node[expando] || (node[expando] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[node.uniqueID] ||
+ (outerCache[node.uniqueID] = {});
+
+ uniqueCache[type] = [dirruns, diff];
+ }
+
+ if (node === elem) {
+ break;
+ }
+ }
+ }
+ }
+ }
+
+ // Incorporate the offset, then check against cycle size
+ diff -= last;
+ return diff === first || (diff % first === 0 && diff / first >= 0);
+ }
+ };
+ },
+
+ "PSEUDO": function (pseudo, argument) {
+ // pseudo-class names are case-insensitive
+ // http://www.w3.org/TR/selectors/#pseudo-classes
+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
+ // Remember that setFilters inherits from pseudos
+ var args,
+ fn = Expr.pseudos[pseudo] || Expr.setFilters[pseudo.toLowerCase()] ||
+ Sizzle.error("unsupported pseudo: " + pseudo);
+
+ // The user may use createPseudo to indicate that
+ // arguments are needed to create the filter function
+ // just as Sizzle does
+ if (fn[expando]) {
+ return fn(argument);
+ }
+
+ // But maintain support for old signatures
+ if (fn.length > 1) {
+ args = [pseudo, pseudo, "", argument];
+ return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase()) ?
+ markFunction(function (seed, matches) {
+ var idx,
+ matched = fn(seed, argument),
+ i = matched.length;
+ while (i--) {
+ idx = indexOf(seed, matched[i]);
+ seed[idx] = !(matches[idx] = matched[i]);
+ }
+ }) :
+ function (elem) {
+ return fn(elem, 0, args);
+ };
+ }
+
+ return fn;
+ }
+ },
+
+ pseudos: {
+ // Potentially complex pseudos
+ "not": markFunction(function (selector) {
+ // Trim the selector passed to compile
+ // to avoid treating leading and trailing
+ // spaces as combinators
+ var input = [],
+ results = [],
+ matcher = compile(selector.replace(rtrim, "$1"));
+
+ return matcher[expando] ?
+ markFunction(function (seed, matches, context, xml) {
+ var elem,
+ unmatched = matcher(seed, null, xml, []),
+ i = seed.length;
+
+ // Match elements unmatched by `matcher`
+ while (i--) {
+ if ((elem = unmatched[i])) {
+ seed[i] = !(matches[i] = elem);
+ }
+ }
+ }) :
+ function (elem, context, xml) {
+ input[0] = elem;
+ matcher(input, null, xml, results);
+ // Don't keep the element (issue #299)
+ input[0] = null;
+ return !results.pop();
+ };
+ }),
+
+ "has": markFunction(function (selector) {
+ return function (elem) {
+ return Sizzle(selector, elem).length > 0;
+ };
+ }),
+
+ "contains": markFunction(function (text) {
+ text = text.replace(runescape, funescape);
+ return function (elem) {
+ return (elem.textContent || elem.innerText || getText(elem)).indexOf(text) > -1;
+ };
+ }),
+
+ // "Whether an element is represented by a :lang() selector
+ // is based solely on the element's language value
+ // being equal to the identifier C,
+ // or beginning with the identifier C immediately followed by "-".
+ // The matching of C against the element's language value is performed case-insensitively.
+ // The identifier C does not have to be a valid language name."
+ // http://www.w3.org/TR/selectors/#lang-pseudo
+ "lang": markFunction(function (lang) {
+ // lang value must be a valid identifier
+ if (!ridentifier.test(lang || "")) {
+ Sizzle.error("unsupported lang: " + lang);
+ }
+ lang = lang.replace(runescape, funescape).toLowerCase();
+ return function (elem) {
+ var elemLang;
+ do {
+ if ((elemLang = documentIsHTML ?
+ elem.lang :
+ elem.getAttribute("xml:lang") || elem.getAttribute("lang"))) {
+
+ elemLang = elemLang.toLowerCase();
+ return elemLang === lang || elemLang.indexOf(lang + "-") === 0;
+ }
+ } while ((elem = elem.parentNode) && elem.nodeType === 1);
+ return false;
+ };
+ }),
+
+ // Miscellaneous
+ "target": function (elem) {
+ var hash = window.location && window.location.hash;
+ return hash && hash.slice(1) === elem.id;
+ },
+
+ "root": function (elem) {
+ return elem === docElem;
+ },
+
+ "focus": function (elem) {
+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
+ },
+
+ // Boolean properties
+ "enabled": createDisabledPseudo(false),
+ "disabled": createDisabledPseudo(true),
+
+ "checked": function (elem) {
+ // In CSS3, :checked should return both checked and selected elements
+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
+ var nodeName = elem.nodeName.toLowerCase();
+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
+ },
+
+ "selected": function (elem) {
+ // Accessing this property makes selected-by-default
+ // options in Safari work properly
+ if (elem.parentNode) {
+ elem.parentNode.selectedIndex;
+ }
+
+ return elem.selected === true;
+ },
+
+ // Contents
+ "empty": function (elem) {
+ // http://www.w3.org/TR/selectors/#empty-pseudo
+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
+ // but not by others (comment: 8; processing instruction: 7; etc.)
+ // nodeType < 6 works because attributes (2) do not appear as children
+ for (elem = elem.firstChild; elem; elem = elem.nextSibling) {
+ if (elem.nodeType < 6) {
+ return false;
+ }
+ }
+ return true;
+ },
+
+ "parent": function (elem) {
+ return !Expr.pseudos["empty"](elem);
+ },
+
+ // Element/input types
+ "header": function (elem) {
+ return rheader.test(elem.nodeName);
+ },
+
+ "input": function (elem) {
+ return rinputs.test(elem.nodeName);
+ },
+
+ "button": function (elem) {
+ var name = elem.nodeName.toLowerCase();
+ return name === "input" && elem.type === "button" || name === "button";
+ },
+
+ "text": function (elem) {
+ var attr;
+ return elem.nodeName.toLowerCase() === "input" &&
+ elem.type === "text" &&
+
+ // Support: IE<8
+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
+ ((attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text");
+ },
+
+ // Position-in-collection
+ "first": createPositionalPseudo(function () {
+ return [0];
+ }),
+
+ "last": createPositionalPseudo(function (matchIndexes, length) {
+ return [length - 1];
+ }),
+
+ "eq": createPositionalPseudo(function (matchIndexes, length, argument) {
+ return [argument < 0 ? argument + length : argument];
+ }),
+
+ "even": createPositionalPseudo(function (matchIndexes, length) {
+ var i = 0;
+ for (; i < length; i += 2) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ }),
+
+ "odd": createPositionalPseudo(function (matchIndexes, length) {
+ var i = 1;
+ for (; i < length; i += 2) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ }),
+
+ "lt": createPositionalPseudo(function (matchIndexes, length, argument) {
+ var i = argument < 0 ? argument + length : argument;
+ for (; --i >= 0;) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ }),
+
+ "gt": createPositionalPseudo(function (matchIndexes, length, argument) {
+ var i = argument < 0 ? argument + length : argument;
+ for (; ++i < length;) {
+ matchIndexes.push(i);
+ }
+ return matchIndexes;
+ })
+ }
+ };
+
+ Expr.pseudos["nth"] = Expr.pseudos["eq"];
+
+ // Add button/input type pseudos
+ for (i in {radio: true, checkbox: true, file: true, password: true, image: true}) {
+ Expr.pseudos[i] = createInputPseudo(i);
+ }
+ for (i in {submit: true, reset: true}) {
+ Expr.pseudos[i] = createButtonPseudo(i);
+ }
+
+ // Easy API for creating new setFilters
+ function setFilters() {
+ }
+
+ setFilters.prototype = Expr.filters = Expr.pseudos;
+ Expr.setFilters = new setFilters();
+
+ tokenize = Sizzle.tokenize = function (selector, parseOnly) {
+ var matched, match, tokens, type,
+ soFar, groups, preFilters,
+ cached = tokenCache[selector + " "];
+
+ if (cached) {
+ return parseOnly ? 0 : cached.slice(0);
+ }
+
+ soFar = selector;
+ groups = [];
+ preFilters = Expr.preFilter;
+
+ while (soFar) {
+
+ // Comma and first run
+ if (!matched || (match = rcomma.exec(soFar))) {
+ if (match) {
+ // Don't consume trailing commas as valid
+ soFar = soFar.slice(match[0].length) || soFar;
+ }
+ groups.push((tokens = []));
+ }
+
+ matched = false;
+
+ // Combinators
+ if ((match = rcombinators.exec(soFar))) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ // Cast descendant combinators to space
+ type: match[0].replace(rtrim, " ")
+ });
+ soFar = soFar.slice(matched.length);
+ }
+
+ // Filters
+ for (type in Expr.filter) {
+ if ((match = matchExpr[type].exec(soFar)) && (!preFilters[type] ||
+ (match = preFilters[type](match)))) {
+ matched = match.shift();
+ tokens.push({
+ value: matched,
+ type: type,
+ matches: match
+ });
+ soFar = soFar.slice(matched.length);
+ }
+ }
+
+ if (!matched) {
+ break;
+ }
+ }
+
+ // Return the length of the invalid excess
+ // if we're just parsing
+ // Otherwise, throw an error or return tokens
+ return parseOnly ?
+ soFar.length :
+ soFar ?
+ Sizzle.error(selector) :
+ // Cache the tokens
+ tokenCache(selector, groups).slice(0);
+ };
+
+ function toSelector(tokens) {
+ var i = 0,
+ len = tokens.length,
+ selector = "";
+ for (; i < len; i++) {
+ selector += tokens[i].value;
+ }
+ return selector;
+ }
+
+ function addCombinator(matcher, combinator, base) {
+ var dir = combinator.dir,
+ skip = combinator.next,
+ key = skip || dir,
+ checkNonElements = base && key === "parentNode",
+ doneName = done++;
+
+ return combinator.first ?
+ // Check against closest ancestor/preceding element
+ function (elem, context, xml) {
+ while ((elem = elem[dir])) {
+ if (elem.nodeType === 1 || checkNonElements) {
+ return matcher(elem, context, xml);
+ }
+ }
+ return false;
+ } :
+
+ // Check against all ancestor/preceding elements
+ function (elem, context, xml) {
+ var oldCache, uniqueCache, outerCache,
+ newCache = [dirruns, doneName];
+
+ // We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
+ if (xml) {
+ while ((elem = elem[dir])) {
+ if (elem.nodeType === 1 || checkNonElements) {
+ if (matcher(elem, context, xml)) {
+ return true;
+ }
+ }
+ }
+ } else {
+ while ((elem = elem[dir])) {
+ if (elem.nodeType === 1 || checkNonElements) {
+ outerCache = elem[expando] || (elem[expando] = {});
+
+ // Support: IE <9 only
+ // Defend against cloned attroperties (jQuery gh-1709)
+ uniqueCache = outerCache[elem.uniqueID] || (outerCache[elem.uniqueID] = {});
+
+ if (skip && skip === elem.nodeName.toLowerCase()) {
+ elem = elem[dir] || elem;
+ } else if ((oldCache = uniqueCache[key]) &&
+ oldCache[0] === dirruns && oldCache[1] === doneName) {
+
+ // Assign to newCache so results back-propagate to previous elements
+ return (newCache[2] = oldCache[2]);
+ } else {
+ // Reuse newcache so results back-propagate to previous elements
+ uniqueCache[key] = newCache;
+
+ // A match means we're done; a fail means we have to keep checking
+ if ((newCache[2] = matcher(elem, context, xml))) {
+ return true;
+ }
+ }
+ }
+ }
+ }
+ return false;
+ };
+ }
+
+ function elementMatcher(matchers) {
+ return matchers.length > 1 ?
+ function (elem, context, xml) {
+ var i = matchers.length;
+ while (i--) {
+ if (!matchers[i](elem, context, xml)) {
+ return false;
+ }
+ }
+ return true;
+ } :
+ matchers[0];
+ }
+
+ function multipleContexts(selector, contexts, results) {
+ var i = 0,
+ len = contexts.length;
+ for (; i < len; i++) {
+ Sizzle(selector, contexts[i], results);
+ }
+ return results;
+ }
+
+ function condense(unmatched, map, filter, context, xml) {
+ var elem,
+ newUnmatched = [],
+ i = 0,
+ len = unmatched.length,
+ mapped = map != null;
+
+ for (; i < len; i++) {
+ if ((elem = unmatched[i])) {
+ if (!filter || filter(elem, context, xml)) {
+ newUnmatched.push(elem);
+ if (mapped) {
+ map.push(i);
+ }
+ }
+ }
+ }
+
+ return newUnmatched;
+ }
+
+ function setMatcher(preFilter, selector, matcher, postFilter, postFinder, postSelector) {
+ if (postFilter && !postFilter[expando]) {
+ postFilter = setMatcher(postFilter);
+ }
+ if (postFinder && !postFinder[expando]) {
+ postFinder = setMatcher(postFinder, postSelector);
+ }
+ return markFunction(function (seed, results, context, xml) {
+ var temp, i, elem,
+ preMap = [],
+ postMap = [],
+ preexisting = results.length,
+
+ // Get initial elements from seed or context
+ elems = seed || multipleContexts(selector || "*", context.nodeType ? [context] : context, []),
+
+ // Prefilter to get matcher input, preserving a map for seed-results synchronization
+ matcherIn = preFilter && (seed || !selector) ?
+ condense(elems, preMap, preFilter, context, xml) :
+ elems,
+
+ matcherOut = matcher ?
+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
+ postFinder || (seed ? preFilter : preexisting || postFilter) ?
+
+ // ...intermediate processing is necessary
+ [] :
+
+ // ...otherwise use results directly
+ results :
+ matcherIn;
+
+ // Find primary matches
+ if (matcher) {
+ matcher(matcherIn, matcherOut, context, xml);
+ }
+
+ // Apply postFilter
+ if (postFilter) {
+ temp = condense(matcherOut, postMap);
+ postFilter(temp, [], context, xml);
+
+ // Un-match failing elements by moving them back to matcherIn
+ i = temp.length;
+ while (i--) {
+ if ((elem = temp[i])) {
+ matcherOut[postMap[i]] = !(matcherIn[postMap[i]] = elem);
+ }
+ }
+ }
+
+ if (seed) {
+ if (postFinder || preFilter) {
+ if (postFinder) {
+ // Get the final matcherOut by condensing this intermediate into postFinder contexts
+ temp = [];
+ i = matcherOut.length;
+ while (i--) {
+ if ((elem = matcherOut[i])) {
+ // Restore matcherIn since elem is not yet a final match
+ temp.push((matcherIn[i] = elem));
+ }
+ }
+ postFinder(null, (matcherOut = []), temp, xml);
+ }
+
+ // Move matched elements from seed to results to keep them synchronized
+ i = matcherOut.length;
+ while (i--) {
+ if ((elem = matcherOut[i]) &&
+ (temp = postFinder ? indexOf(seed, elem) : preMap[i]) > -1) {
+
+ seed[temp] = !(results[temp] = elem);
+ }
+ }
+ }
+
+ // Add elements to results, through postFinder if defined
+ } else {
+ matcherOut = condense(
+ matcherOut === results ?
+ matcherOut.splice(preexisting, matcherOut.length) :
+ matcherOut
+ );
+ if (postFinder) {
+ postFinder(null, results, matcherOut, xml);
+ } else {
+ push.apply(results, matcherOut);
+ }
+ }
+ });
+ }
+
+ function matcherFromTokens(tokens) {
+ var checkContext, matcher, j,
+ len = tokens.length,
+ leadingRelative = Expr.relative[tokens[0].type],
+ implicitRelative = leadingRelative || Expr.relative[" "],
+ i = leadingRelative ? 1 : 0,
+
+ // The foundational matcher ensures that elements are reachable from top-level context(s)
+ matchContext = addCombinator(function (elem) {
+ return elem === checkContext;
+ }, implicitRelative, true),
+ matchAnyContext = addCombinator(function (elem) {
+ return indexOf(checkContext, elem) > -1;
+ }, implicitRelative, true),
+ matchers = [function (elem, context, xml) {
+ var ret = (!leadingRelative && (xml || context !== outermostContext)) || (
+ (checkContext = context).nodeType ?
+ matchContext(elem, context, xml) :
+ matchAnyContext(elem, context, xml));
+ // Avoid hanging onto element (issue #299)
+ checkContext = null;
+ return ret;
+ }];
+
+ for (; i < len; i++) {
+ if ((matcher = Expr.relative[tokens[i].type])) {
+ matchers = [addCombinator(elementMatcher(matchers), matcher)];
+ } else {
+ matcher = Expr.filter[tokens[i].type].apply(null, tokens[i].matches);
+
+ // Return special upon seeing a positional matcher
+ if (matcher[expando]) {
+ // Find the next relative operator (if any) for proper handling
+ j = ++i;
+ for (; j < len; j++) {
+ if (Expr.relative[tokens[j].type]) {
+ break;
+ }
+ }
+ return setMatcher(
+ i > 1 && elementMatcher(matchers),
+ i > 1 && toSelector(
+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`
+ tokens.slice(0, i - 1).concat({value: tokens[i - 2].type === " " ? "*" : ""})
+ ).replace(rtrim, "$1"),
+ matcher,
+ i < j && matcherFromTokens(tokens.slice(i, j)),
+ j < len && matcherFromTokens((tokens = tokens.slice(j))),
+ j < len && toSelector(tokens)
+ );
+ }
+ matchers.push(matcher);
+ }
+ }
+
+ return elementMatcher(matchers);
+ }
+
+ function matcherFromGroupMatchers(elementMatchers, setMatchers) {
+ var bySet = setMatchers.length > 0,
+ byElement = elementMatchers.length > 0,
+ superMatcher = function (seed, context, xml, results, outermost) {
+ var elem, j, matcher,
+ matchedCount = 0,
+ i = "0",
+ unmatched = seed && [],
+ setMatched = [],
+ contextBackup = outermostContext,
+ // We must always have either seed elements or outermost context
+ elems = seed || byElement && Expr.find["TAG"]("*", outermost),
+ // Use integer dirruns iff this is the outermost matcher
+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
+ len = elems.length;
+
+ if (outermost) {
+ outermostContext = context === document || context || outermost;
+ }
+
+ // Add elements passing elementMatchers directly to results
+ // Support: IE<9, Safari
+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
+ for (; i !== len && (elem = elems[i]) != null; i++) {
+ if (byElement && elem) {
+ j = 0;
+ if (!context && elem.ownerDocument !== document) {
+ setDocument(elem);
+ xml = !documentIsHTML;
+ }
+ while ((matcher = elementMatchers[j++])) {
+ if (matcher(elem, context || document, xml)) {
+ results.push(elem);
+ break;
+ }
+ }
+ if (outermost) {
+ dirruns = dirrunsUnique;
+ }
+ }
+
+ // Track unmatched elements for set filters
+ if (bySet) {
+ // They will have gone through all possible matchers
+ if ((elem = !matcher && elem)) {
+ matchedCount--;
+ }
+
+ // Lengthen the array for every element, matched or not
+ if (seed) {
+ unmatched.push(elem);
+ }
+ }
+ }
+
+ // `i` is now the count of elements visited above, and adding it to `matchedCount`
+ // makes the latter nonnegative.
+ matchedCount += i;
+
+ // Apply set filters to unmatched elements
+ // NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
+ // equals `i`), unless we didn't visit _any_ elements in the above loop because we have
+ // no element matchers and no seed.
+ // Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
+ // case, which will result in a "00" `matchedCount` that differs from `i` but is also
+ // numerically zero.
+ if (bySet && i !== matchedCount) {
+ j = 0;
+ while ((matcher = setMatchers[j++])) {
+ matcher(unmatched, setMatched, context, xml);
+ }
+
+ if (seed) {
+ // Reintegrate element matches to eliminate the need for sorting
+ if (matchedCount > 0) {
+ while (i--) {
+ if (!(unmatched[i] || setMatched[i])) {
+ setMatched[i] = pop.call(results);
+ }
+ }
+ }
+
+ // Discard index placeholder values to get only actual matches
+ setMatched = condense(setMatched);
+ }
+
+ // Add matches to results
+ push.apply(results, setMatched);
+
+ // Seedless set matches succeeding multiple successful matchers stipulate sorting
+ if (outermost && !seed && setMatched.length > 0 &&
+ (matchedCount + setMatchers.length) > 1) {
+
+ Sizzle.uniqueSort(results);
+ }
+ }
+
+ // Override manipulation of globals by nested matchers
+ if (outermost) {
+ dirruns = dirrunsUnique;
+ outermostContext = contextBackup;
+ }
+
+ return unmatched;
+ };
+
+ return bySet ?
+ markFunction(superMatcher) :
+ superMatcher;
+ }
+
+ compile = Sizzle.compile = function (selector, match /* Internal Use Only */) {
+ var i,
+ setMatchers = [],
+ elementMatchers = [],
+ cached = compilerCache[selector + " "];
+
+ if (!cached) {
+ // Generate a function of recursive functions that can be used to check each element
+ if (!match) {
+ match = tokenize(selector);
+ }
+ i = match.length;
+ while (i--) {
+ cached = matcherFromTokens(match[i]);
+ if (cached[expando]) {
+ setMatchers.push(cached);
+ } else {
+ elementMatchers.push(cached);
+ }
+ }
+
+ // Cache the compiled function
+ cached = compilerCache(selector, matcherFromGroupMatchers(elementMatchers, setMatchers));
+
+ // Save selector and tokenization
+ cached.selector = selector;
+ }
+ return cached;
+ };
+
+ /**
+ * A low-level selection function that works with Sizzle's compiled
+ * selector functions
+ * @param {String|Function} selector A selector or a pre-compiled
+ * selector function built with Sizzle.compile
+ * @param {Element} context
+ * @param {Array} [results]
+ * @param {Array} [seed] A set of elements to match against
+ */
+ select = Sizzle.select = function (selector, context, results, seed) {
+ var i, tokens, token, type, find,
+ compiled = typeof selector === "function" && selector,
+ match = !seed && tokenize((selector = compiled.selector || selector));
+
+ results = results || [];
+
+ // Try to minimize operations if there is only one selector in the list and no seed
+ // (the latter of which guarantees us context)
+ if (match.length === 1) {
+
+ // Reduce context if the leading compound selector is an ID
+ tokens = match[0] = match[0].slice(0);
+ if (tokens.length > 2 && (token = tokens[0]).type === "ID" &&
+ context.nodeType === 9 && documentIsHTML && Expr.relative[tokens[1].type]) {
+
+ context = (Expr.find["ID"](token.matches[0].replace(runescape, funescape), context) || [])[0];
+ if (!context) {
+ return results;
+
+ // Precompiled matchers will still verify ancestry, so step up a level
+ } else if (compiled) {
+ context = context.parentNode;
+ }
+
+ selector = selector.slice(tokens.shift().value.length);
+ }
+
+ // Fetch a seed set for right-to-left matching
+ i = matchExpr["needsContext"].test(selector) ? 0 : tokens.length;
+ while (i--) {
+ token = tokens[i];
+
+ // Abort if we hit a combinator
+ if (Expr.relative[(type = token.type)]) {
+ break;
+ }
+ if ((find = Expr.find[type])) {
+ // Search, expanding context for leading sibling combinators
+ if ((seed = find(
+ token.matches[0].replace(runescape, funescape),
+ rsibling.test(tokens[0].type) && testContext(context.parentNode) || context
+ ))) {
+
+ // If seed is empty or no tokens remain, we can return early
+ tokens.splice(i, 1);
+ selector = seed.length && toSelector(tokens);
+ if (!selector) {
+ push.apply(results, seed);
+ return results;
+ }
+
+ break;
+ }
+ }
+ }
+ }
+
+ // Compile and execute a filtering function if one is not provided
+ // Provide `match` to avoid retokenization if we modified the selector above
+ (compiled || compile(selector, match))(
+ seed,
+ context,
+ !documentIsHTML,
+ results,
+ !context || rsibling.test(selector) && testContext(context.parentNode) || context
+ );
+ return results;
+ };
+
+ // One-time assignments
+
+ // Sort stability
+ support.sortStable = expando.split("").sort(sortOrder).join("") === expando;
+
+ // Support: Chrome 14-35+
+ // Always assume duplicates if they aren't passed to the comparison function
+ support.detectDuplicates = !!hasDuplicate;
+
+ // Initialize against the default document
+ setDocument();
+
+ // Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
+ // Detached nodes confoundingly follow *each other*
+ support.sortDetached = assert(function (el) {
+ // Should return 1, but returns 4 (following)
+ return el.compareDocumentPosition(document.createElement("fieldset")) & 1;
+ });
+
+ // Support: IE<8
+ // Prevent attribute/property "interpolation"
+ // https://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
+ if (!assert(function (el) {
+ el.innerHTML = "<a href='#'></a>";
+ return el.firstChild.getAttribute("href") === "#";
+ })) {
+ addHandle("type|href|height|width", function (elem, name, isXML) {
+ if (!isXML) {
+ return elem.getAttribute(name, name.toLowerCase() === "type" ? 1 : 2);
+ }
+ });
+ }
+
+ // Support: IE<9
+ // Use defaultValue in place of getAttribute("value")
+ if (!support.attributes || !assert(function (el) {
+ el.innerHTML = "<input/>";
+ el.firstChild.setAttribute("value", "");
+ return el.firstChild.getAttribute("value") === "";
+ })) {
+ addHandle("value", function (elem, name, isXML) {
+ if (!isXML && elem.nodeName.toLowerCase() === "input") {
+ return elem.defaultValue;
+ }
+ });
+ }
+
+ // Support: IE<9
+ // Use getAttributeNode to fetch booleans when getAttribute lies
+ if (!assert(function (el) {
+ return el.getAttribute("disabled") == null;
+ })) {
+ addHandle(booleans, function (elem, name, isXML) {
+ var val;
+ if (!isXML) {
+ return elem[name] === true ? name.toLowerCase() :
+ (val = elem.getAttributeNode(name)) && val.specified ?
+ val.value :
+ null;
+ }
+ });
+ }
+
+ return Sizzle;
+
+ })(window);
+
+
+ jQuery.find = Sizzle;
+ jQuery.expr = Sizzle.selectors;
+
+ // Deprecated
+ jQuery.expr[":"] = jQuery.expr.pseudos;
+ jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
+ jQuery.text = Sizzle.getText;
+ jQuery.isXMLDoc = Sizzle.isXML;
+ jQuery.contains = Sizzle.contains;
+ jQuery.escapeSelector = Sizzle.escape;
+
+
+ var dir = function (elem, dir, until) {
+ var matched = [],
+ truncate = until !== undefined;
+
+ while ((elem = elem[dir]) && elem.nodeType !== 9) {
+ if (elem.nodeType === 1) {
+ if (truncate && jQuery(elem).is(until)) {
+ break;
+ }
+ matched.push(elem);
+ }
+ }
+ return matched;
+ };
+
+
+ var siblings = function (n, elem) {
+ var matched = [];
+
+ for (; n; n = n.nextSibling) {
+ if (n.nodeType === 1 && n !== elem) {
+ matched.push(n);
+ }
+ }
+
+ return matched;
+ };
+
+
+ var rneedsContext = jQuery.expr.match.needsContext;
+
+
+ function nodeName(elem, name) {
+
+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
+
+ };
+ var rsingleTag = (/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i);
+
+
+ // Implement the identical functionality for filter and not
+ function winnow(elements, qualifier, not) {
+ if (isFunction(qualifier)) {
+ return jQuery.grep(elements, function (elem, i) {
+ return !!qualifier.call(elem, i, elem) !== not;
+ });
+ }
+
+ // Single element
+ if (qualifier.nodeType) {
+ return jQuery.grep(elements, function (elem) {
+ return (elem === qualifier) !== not;
+ });
+ }
+
+ // Arraylike of elements (jQuery, arguments, Array)
+ if (typeof qualifier !== "string") {
+ return jQuery.grep(elements, function (elem) {
+ return (indexOf.call(qualifier, elem) > -1) !== not;
+ });
+ }
+
+ // Filtered directly for both simple and complex selectors
+ return jQuery.filter(qualifier, elements, not);
+ }
+
+ jQuery.filter = function (expr, elems, not) {
+ var elem = elems[0];
+
+ if (not) {
+ expr = ":not(" + expr + ")";
+ }
+
+ if (elems.length === 1 && elem.nodeType === 1) {
+ return jQuery.find.matchesSelector(elem, expr) ? [elem] : [];
+ }
+
+ return jQuery.find.matches(expr, jQuery.grep(elems, function (elem) {
+ return elem.nodeType === 1;
+ }));
+ };
+
+ jQuery.fn.extend({
+ find: function (selector) {
+ var i, ret,
+ len = this.length,
+ self = this;
+
+ if (typeof selector !== "string") {
+ return this.pushStack(jQuery(selector).filter(function () {
+ for (i = 0; i < len; i++) {
+ if (jQuery.contains(self[i], this)) {
+ return true;
+ }
+ }
+ }));
+ }
+
+ ret = this.pushStack([]);
+
+ for (i = 0; i < len; i++) {
+ jQuery.find(selector, self[i], ret);
+ }
+
+ return len > 1 ? jQuery.uniqueSort(ret) : ret;
+ },
+ filter: function (selector) {
+ return this.pushStack(winnow(this, selector || [], false));
+ },
+ not: function (selector) {
+ return this.pushStack(winnow(this, selector || [], true));
+ },
+ is: function (selector) {
+ return !!winnow(
+ this,
+
+ // If this is a positional/relative selector, check membership in the returned set
+ // so $("p:first").is("p:last") won't return true for a doc with two "p".
+ typeof selector === "string" && rneedsContext.test(selector) ?
+ jQuery(selector) :
+ selector || [],
+ false
+ ).length;
+ }
+ });
+
+
+ // Initialize a jQuery object
+
+
+ // A central reference to the root jQuery(document)
+ var rootjQuery,
+
+ // A simple way to check for HTML strings
+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+ // Strict HTML recognition (#11290: must start with <)
+ // Shortcut simple #id case for speed
+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,
+
+ init = jQuery.fn.init = function (selector, context, root) {
+ var match, elem;
+
+ // HANDLE: $(""), $(null), $(undefined), $(false)
+ if (!selector) {
+ return this;
+ }
+
+ // Method init() accepts an alternate rootjQuery
+ // so migrate can support jQuery.sub (gh-2101)
+ root = root || rootjQuery;
+
+ // Handle HTML strings
+ if (typeof selector === "string") {
+ if (selector[0] === "<" &&
+ selector[selector.length - 1] === ">" &&
+ selector.length >= 3) {
+
+ // Assume that strings that start and end with <> are HTML and skip the regex check
+ match = [null, selector, null];
+
+ } else {
+ match = rquickExpr.exec(selector);
+ }
+
+ // Match html or make sure no context is specified for #id
+ if (match && (match[1] || !context)) {
+
+ // HANDLE: $(html) -> $(array)
+ if (match[1]) {
+ context = context instanceof jQuery ? context[0] : context;
+
+ // Option to run scripts is true for back-compat
+ // Intentionally let the error be thrown if parseHTML is not present
+ jQuery.merge(this, jQuery.parseHTML(
+ match[1],
+ context && context.nodeType ? context.ownerDocument || context : document,
+ true
+ ));
+
+ // HANDLE: $(html, props)
+ if (rsingleTag.test(match[1]) && jQuery.isPlainObject(context)) {
+ for (match in context) {
+
+ // Properties of context are called as methods if possible
+ if (isFunction(this[match])) {
+ this[match](context[match]);
+
+ // ...and otherwise set as attributes
+ } else {
+ this.attr(match, context[match]);
+ }
+ }
+ }
+
+ return this;
+
+ // HANDLE: $(#id)
+ } else {
+ elem = document.getElementById(match[2]);
+
+ if (elem) {
+
+ // Inject the element directly into the jQuery object
+ this[0] = elem;
+ this.length = 1;
+ }
+ return this;
+ }
+
+ // HANDLE: $(expr, $(...))
+ } else if (!context || context.jquery) {
+ return (context || root).find(selector);
+
+ // HANDLE: $(expr, context)
+ // (which is just equivalent to: $(context).find(expr)
+ } else {
+ return this.constructor(context).find(selector);
+ }
+
+ // HANDLE: $(DOMElement)
+ } else if (selector.nodeType) {
+ this[0] = selector;
+ this.length = 1;
+ return this;
+
+ // HANDLE: $(function)
+ // Shortcut for document ready
+ } else if (isFunction(selector)) {
+ return root.ready !== undefined ?
+ root.ready(selector) :
+
+ // Execute immediately if ready is not present
+ selector(jQuery);
+ }
+
+ return jQuery.makeArray(selector, this);
+ };
+
+ // Give the init function the jQuery prototype for later instantiation
+ init.prototype = jQuery.fn;
+
+ // Initialize central reference
+ rootjQuery = jQuery(document);
+
+
+ var rparentsprev = /^(?:parents|prev(?:Until|All))/,
+
+ // Methods guaranteed to produce a unique set when starting from a unique set
+ guaranteedUnique = {
+ children: true,
+ contents: true,
+ next: true,
+ prev: true
+ };
+
+ jQuery.fn.extend({
+ has: function (target) {
+ var targets = jQuery(target, this),
+ l = targets.length;
+
+ return this.filter(function () {
+ var i = 0;
+ for (; i < l; i++) {
+ if (jQuery.contains(this, targets[i])) {
+ return true;
+ }
+ }
+ });
+ },
+
+ closest: function (selectors, context) {
+ var cur,
+ i = 0,
+ l = this.length,
+ matched = [],
+ targets = typeof selectors !== "string" && jQuery(selectors);
+
+ // Positional selectors never match, since there's no _selection_ context
+ if (!rneedsContext.test(selectors)) {
+ for (; i < l; i++) {
+ for (cur = this[i]; cur && cur !== context; cur = cur.parentNode) {
+
+ // Always skip document fragments
+ if (cur.nodeType < 11 && (targets ?
+ targets.index(cur) > -1 :
+
+ // Don't pass non-elements to Sizzle
+ cur.nodeType === 1 &&
+ jQuery.find.matchesSelector(cur, selectors))) {
+
+ matched.push(cur);
+ break;
+ }
+ }
+ }
+ }
+
+ return this.pushStack(matched.length > 1 ? jQuery.uniqueSort(matched) : matched);
+ },
+
+ // Determine the position of an element within the set
+ index: function (elem) {
+
+ // No argument, return index in parent
+ if (!elem) {
+ return (this[0] && this[0].parentNode) ? this.first().prevAll().length : -1;
+ }
+
+ // Index in selector
+ if (typeof elem === "string") {
+ return indexOf.call(jQuery(elem), this[0]);
+ }
+
+ // Locate the position of the desired element
+ return indexOf.call(this,
+
+ // If it receives a jQuery object, the first element is used
+ elem.jquery ? elem[0] : elem
+ );
+ },
+
+ add: function (selector, context) {
+ return this.pushStack(
+ jQuery.uniqueSort(
+ jQuery.merge(this.get(), jQuery(selector, context))
+ )
+ );
+ },
+
+ addBack: function (selector) {
+ return this.add(selector == null ?
+ this.prevObject : this.prevObject.filter(selector)
+ );
+ }
+ });
+
+ function sibling(cur, dir) {
+ while ((cur = cur[dir]) && cur.nodeType !== 1) {
+ }
+ return cur;
+ }
+
+ jQuery.each({
+ parent: function (elem) {
+ var parent = elem.parentNode;
+ return parent && parent.nodeType !== 11 ? parent : null;
+ },
+ parents: function (elem) {
+ return dir(elem, "parentNode");
+ },
+ parentsUntil: function (elem, i, until) {
+ return dir(elem, "parentNode", until);
+ },
+ next: function (elem) {
+ return sibling(elem, "nextSibling");
+ },
+ prev: function (elem) {
+ return sibling(elem, "previousSibling");
+ },
+ nextAll: function (elem) {
+ return dir(elem, "nextSibling");
+ },
+ prevAll: function (elem) {
+ return dir(elem, "previousSibling");
+ },
+ nextUntil: function (elem, i, until) {
+ return dir(elem, "nextSibling", until);
+ },
+ prevUntil: function (elem, i, until) {
+ return dir(elem, "previousSibling", until);
+ },
+ siblings: function (elem) {
+ return siblings((elem.parentNode || {}).firstChild, elem);
+ },
+ children: function (elem) {
+ return siblings(elem.firstChild);
+ },
+ contents: function (elem) {
+ if (nodeName(elem, "iframe")) {
+ return elem.contentDocument;
+ }
+
+ // Support: IE 9 - 11 only, iOS 7 only, Android Browser <=4.3 only
+ // Treat the template element as a regular one in browsers that
+ // don't support it.
+ if (nodeName(elem, "template")) {
+ elem = elem.content || elem;
+ }
+
+ return jQuery.merge([], elem.childNodes);
+ }
+ }, function (name, fn) {
+ jQuery.fn[name] = function (until, selector) {
+ var matched = jQuery.map(this, fn, until);
+
+ if (name.slice(-5) !== "Until") {
+ selector = until;
+ }
+
+ if (selector && typeof selector === "string") {
+ matched = jQuery.filter(selector, matched);
+ }
+
+ if (this.length > 1) {
+
+ // Remove duplicates
+ if (!guaranteedUnique[name]) {
+ jQuery.uniqueSort(matched);
+ }
+
+ // Reverse order for parents* and prev-derivatives
+ if (rparentsprev.test(name)) {
+ matched.reverse();
+ }
+ }
+
+ return this.pushStack(matched);
+ };
+ });
+ var rnothtmlwhite = (/[^\x20\t\r\n\f]+/g);
+
+
+ // Convert String-formatted options into Object-formatted ones
+ function createOptions(options) {
+ var object = {};
+ jQuery.each(options.match(rnothtmlwhite) || [], function (_, flag) {
+ object[flag] = true;
+ });
+ return object;
+ }
+
+ /*
+ * Create a callback list using the following parameters:
+ *
+ * options: an optional list of space-separated options that will change how
+ * the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
+ * Possible options:
+ *
+ * once: will ensure the callback list can only be fired once (like a Deferred)
+ *
+ * memory: will keep track of previous values and will call any callback added
+ * after the list has been fired right away with the latest "memorized"
+ * values (like a Deferred)
+ *
+ * unique: will ensure a callback can only be added once (no duplicate in the list)
+ *
+ * stopOnFalse: interrupt callings when a callback returns false
+ *
+ */
+ jQuery.Callbacks = function (options) {
+
+ // Convert options from String-formatted to Object-formatted if needed
+ // (we check in cache first)
+ options = typeof options === "string" ?
+ createOptions(options) :
+ jQuery.extend({}, options);
+
+ var // Flag to know if list is currently firing
+ firing,
+
+ // Last fire value for non-forgettable lists
+ memory,
+
+ // Flag to know if list was already fired
+ fired,
+
+ // Flag to prevent firing
+ locked,
+
+ // Actual callback list
+ list = [],
+
+ // Queue of execution data for repeatable lists
+ queue = [],
+
+ // Index of currently firing callback (modified by add/remove as needed)
+ firingIndex = -1,
+
+ // Fire callbacks
+ fire = function () {
+
+ // Enforce single-firing
+ locked = locked || options.once;
+
+ // Execute callbacks for all pending executions,
+ // respecting firingIndex overrides and runtime changes
+ fired = firing = true;
+ for (; queue.length; firingIndex = -1) {
+ memory = queue.shift();
+ while (++firingIndex < list.length) {
+
+ // Run callback and check for early termination
+ if (list[firingIndex].apply(memory[0], memory[1]) === false &&
+ options.stopOnFalse) {
+
+ // Jump to end and forget the data so .add doesn't re-fire
+ firingIndex = list.length;
+ memory = false;
+ }
+ }
+ }
+
+ // Forget the data if we're done with it
+ if (!options.memory) {
+ memory = false;
+ }
+
+ firing = false;
+
+ // Clean up if we're done firing for good
+ if (locked) {
+
+ // Keep an empty list if we have data for future add calls
+ if (memory) {
+ list = [];
+
+ // Otherwise, this object is spent
+ } else {
+ list = "";
+ }
+ }
+ },
+
+ // Actual Callbacks object
+ self = {
+
+ // Add a callback or a collection of callbacks to the list
+ add: function () {
+ if (list) {
+
+ // If we have memory from a past run, we should fire after adding
+ if (memory && !firing) {
+ firingIndex = list.length - 1;
+ queue.push(memory);
+ }
+
+ (function add(args) {
+ jQuery.each(args, function (_, arg) {
+ if (isFunction(arg)) {
+ if (!options.unique || !self.has(arg)) {
+ list.push(arg);
+ }
+ } else if (arg && arg.length && toType(arg) !== "string") {
+
+ // Inspect recursively
+ add(arg);
+ }
+ });
+ })(arguments);
+
+ if (memory && !firing) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Remove a callback from the list
+ remove: function () {
+ jQuery.each(arguments, function (_, arg) {
+ var index;
+ while ((index = jQuery.inArray(arg, list, index)) > -1) {
+ list.splice(index, 1);
+
+ // Handle firing indexes
+ if (index <= firingIndex) {
+ firingIndex--;
+ }
+ }
+ });
+ return this;
+ },
+
+ // Check if a given callback is in the list.
+ // If no argument is given, return whether or not list has callbacks attached.
+ has: function (fn) {
+ return fn ?
+ jQuery.inArray(fn, list) > -1 :
+ list.length > 0;
+ },
+
+ // Remove all callbacks from the list
+ empty: function () {
+ if (list) {
+ list = [];
+ }
+ return this;
+ },
+
+ // Disable .fire and .add
+ // Abort any current/pending executions
+ // Clear all callbacks and values
+ disable: function () {
+ locked = queue = [];
+ list = memory = "";
+ return this;
+ },
+ disabled: function () {
+ return !list;
+ },
+
+ // Disable .fire
+ // Also disable .add unless we have memory (since it would have no effect)
+ // Abort any pending executions
+ lock: function () {
+ locked = queue = [];
+ if (!memory && !firing) {
+ list = memory = "";
+ }
+ return this;
+ },
+ locked: function () {
+ return !!locked;
+ },
+
+ // Call all callbacks with the given context and arguments
+ fireWith: function (context, args) {
+ if (!locked) {
+ args = args || [];
+ args = [context, args.slice ? args.slice() : args];
+ queue.push(args);
+ if (!firing) {
+ fire();
+ }
+ }
+ return this;
+ },
+
+ // Call all the callbacks with the given arguments
+ fire: function () {
+ self.fireWith(this, arguments);
+ return this;
+ },
+
+ // To know if the callbacks have already been called at least once
+ fired: function () {
+ return !!fired;
+ }
+ };
+
+ return self;
+ };
+
+
+ function Identity(v) {
+ return v;
+ }
+
+ function Thrower(ex) {
+ throw ex;
+ }
+
+ function adoptValue(value, resolve, reject, noValue) {
+ var method;
+
+ try {
+
+ // Check for promise aspect first to privilege synchronous behavior
+ if (value && isFunction((method = value.promise))) {
+ method.call(value).done(resolve).fail(reject);
+
+ // Other thenables
+ } else if (value && isFunction((method = value.then))) {
+ method.call(value, resolve, reject);
+
+ // Other non-thenables
+ } else {
+
+ // Control `resolve` arguments by letting Array#slice cast boolean `noValue` to integer:
+ // * false: [ value ].slice( 0 ) => resolve( value )
+ // * true: [ value ].slice( 1 ) => resolve()
+ resolve.apply(undefined, [value].slice(noValue));
+ }
+
+ // For Promises/A+, convert exceptions into rejections
+ // Since jQuery.when doesn't unwrap thenables, we can skip the extra checks appearing in
+ // Deferred#then to conditionally suppress rejection.
+ } catch (value) {
+
+ // Support: Android 4.0 only
+ // Strict mode functions invoked without .call/.apply get global-object context
+ reject.apply(undefined, [value]);
+ }
+ }
+
+ jQuery.extend({
+
+ Deferred: function (func) {
+ var tuples = [
+
+ // action, add listener, callbacks,
+ // ... .then handlers, argument index, [final state]
+ ["notify", "progress", jQuery.Callbacks("memory"),
+ jQuery.Callbacks("memory"), 2],
+ ["resolve", "done", jQuery.Callbacks("once memory"),
+ jQuery.Callbacks("once memory"), 0, "resolved"],
+ ["reject", "fail", jQuery.Callbacks("once memory"),
+ jQuery.Callbacks("once memory"), 1, "rejected"]
+ ],
+ state = "pending",
+ promise = {
+ state: function () {
+ return state;
+ },
+ always: function () {
+ deferred.done(arguments).fail(arguments);
+ return this;
+ },
+ "catch": function (fn) {
+ return promise.then(null, fn);
+ },
+
+ // Keep pipe for back-compat
+ pipe: function (/* fnDone, fnFail, fnProgress */) {
+ var fns = arguments;
+
+ return jQuery.Deferred(function (newDefer) {
+ jQuery.each(tuples, function (i, tuple) {
+
+ // Map tuples (progress, done, fail) to arguments (done, fail, progress)
+ var fn = isFunction(fns[tuple[4]]) && fns[tuple[4]];
+
+ // deferred.progress(function() { bind to newDefer or newDefer.notify })
+ // deferred.done(function() { bind to newDefer or newDefer.resolve })
+ // deferred.fail(function() { bind to newDefer or newDefer.reject })
+ deferred[tuple[1]](function () {
+ var returned = fn && fn.apply(this, arguments);
+ if (returned && isFunction(returned.promise)) {
+ returned.promise()
+ .progress(newDefer.notify)
+ .done(newDefer.resolve)
+ .fail(newDefer.reject);
+ } else {
+ newDefer[tuple[0] + "With"](
+ this,
+ fn ? [returned] : arguments
+ );
+ }
+ });
+ });
+ fns = null;
+ }).promise();
+ },
+ then: function (onFulfilled, onRejected, onProgress) {
+ var maxDepth = 0;
+
+ function resolve(depth, deferred, handler, special) {
+ return function () {
+ var that = this,
+ args = arguments,
+ mightThrow = function () {
+ var returned, then;
+
+ // Support: Promises/A+ section 2.3.3.3.3
+ // https://promisesaplus.com/#point-59
+ // Ignore double-resolution attempts
+ if (depth < maxDepth) {
+ return;
+ }
+
+ returned = handler.apply(that, args);
+
+ // Support: Promises/A+ section 2.3.1
+ // https://promisesaplus.com/#point-48
+ if (returned === deferred.promise()) {
+ throw new TypeError("Thenable self-resolution");
+ }
+
+ // Support: Promises/A+ sections 2.3.3.1, 3.5
+ // https://promisesaplus.com/#point-54
+ // https://promisesaplus.com/#point-75
+ // Retrieve `then` only once
+ then = returned &&
+
+ // Support: Promises/A+ section 2.3.4
+ // https://promisesaplus.com/#point-64
+ // Only check objects and functions for thenability
+ (typeof returned === "object" ||
+ typeof returned === "function") &&
+ returned.then;
+
+ // Handle a returned thenable
+ if (isFunction(then)) {
+
+ // Special processors (notify) just wait for resolution
+ if (special) {
+ then.call(
+ returned,
+ resolve(maxDepth, deferred, Identity, special),
+ resolve(maxDepth, deferred, Thrower, special)
+ );
+
+ // Normal processors (resolve) also hook into progress
+ } else {
+
+ // ...and disregard older resolution values
+ maxDepth++;
+
+ then.call(
+ returned,
+ resolve(maxDepth, deferred, Identity, special),
+ resolve(maxDepth, deferred, Thrower, special),
+ resolve(maxDepth, deferred, Identity,
+ deferred.notifyWith)
+ );
+ }
+
+ // Handle all other returned values
+ } else {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if (handler !== Identity) {
+ that = undefined;
+ args = [returned];
+ }
+
+ // Process the value(s)
+ // Default process is resolve
+ (special || deferred.resolveWith)(that, args);
+ }
+ },
+
+ // Only normal processors (resolve) catch and reject exceptions
+ process = special ?
+ mightThrow :
+ function () {
+ try {
+ mightThrow();
+ } catch (e) {
+
+ if (jQuery.Deferred.exceptionHook) {
+ jQuery.Deferred.exceptionHook(e,
+ process.stackTrace);
+ }
+
+ // Support: Promises/A+ section 2.3.3.3.4.1
+ // https://promisesaplus.com/#point-61
+ // Ignore post-resolution exceptions
+ if (depth + 1 >= maxDepth) {
+
+ // Only substitute handlers pass on context
+ // and multiple values (non-spec behavior)
+ if (handler !== Thrower) {
+ that = undefined;
+ args = [e];
+ }
+
+ deferred.rejectWith(that, args);
+ }
+ }
+ };
+
+ // Support: Promises/A+ section 2.3.3.3.1
+ // https://promisesaplus.com/#point-57
+ // Re-resolve promises immediately to dodge false rejection from
+ // subsequent errors
+ if (depth) {
+ process();
+ } else {
+
+ // Call an optional hook to record the stack, in case of exception
+ // since it's otherwise lost when execution goes async
+ if (jQuery.Deferred.getStackHook) {
+ process.stackTrace = jQuery.Deferred.getStackHook();
+ }
+ window.setTimeout(process);
+ }
+ };
+ }
+
+ return jQuery.Deferred(function (newDefer) {
+
+ // progress_handlers.add( ... )
+ tuples[0][3].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction(onProgress) ?
+ onProgress :
+ Identity,
+ newDefer.notifyWith
+ )
+ );
+
+ // fulfilled_handlers.add( ... )
+ tuples[1][3].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction(onFulfilled) ?
+ onFulfilled :
+ Identity
+ )
+ );
+
+ // rejected_handlers.add( ... )
+ tuples[2][3].add(
+ resolve(
+ 0,
+ newDefer,
+ isFunction(onRejected) ?
+ onRejected :
+ Thrower
+ )
+ );
+ }).promise();
+ },
+
+ // Get a promise for this deferred
+ // If obj is provided, the promise aspect is added to the object
+ promise: function (obj) {
+ return obj != null ? jQuery.extend(obj, promise) : promise;
+ }
+ },
+ deferred = {};
+
+ // Add list-specific methods
+ jQuery.each(tuples, function (i, tuple) {
+ var list = tuple[2],
+ stateString = tuple[5];
+
+ // promise.progress = list.add
+ // promise.done = list.add
+ // promise.fail = list.add
+ promise[tuple[1]] = list.add;
+
+ // Handle state
+ if (stateString) {
+ list.add(
+ function () {
+
+ // state = "resolved" (i.e., fulfilled)
+ // state = "rejected"
+ state = stateString;
+ },
+
+ // rejected_callbacks.disable
+ // fulfilled_callbacks.disable
+ tuples[3 - i][2].disable,
+
+ // rejected_handlers.disable
+ // fulfilled_handlers.disable
+ tuples[3 - i][3].disable,
+
+ // progress_callbacks.lock
+ tuples[0][2].lock,
+
+ // progress_handlers.lock
+ tuples[0][3].lock
+ );
+ }
+
+ // progress_handlers.fire
+ // fulfilled_handlers.fire
+ // rejected_handlers.fire
+ list.add(tuple[3].fire);
+
+ // deferred.notify = function() { deferred.notifyWith(...) }
+ // deferred.resolve = function() { deferred.resolveWith(...) }
+ // deferred.reject = function() { deferred.rejectWith(...) }
+ deferred[tuple[0]] = function () {
+ deferred[tuple[0] + "With"](this === deferred ? undefined : this, arguments);
+ return this;
+ };
+
+ // deferred.notifyWith = list.fireWith
+ // deferred.resolveWith = list.fireWith
+ // deferred.rejectWith = list.fireWith
+ deferred[tuple[0] + "With"] = list.fireWith;
+ });
+
+ // Make the deferred a promise
+ promise.promise(deferred);
+
+ // Call given func if any
+ if (func) {
+ func.call(deferred, deferred);
+ }
+
+ // All done!
+ return deferred;
+ },
+
+ // Deferred helper
+ when: function (singleValue) {
+ var
+
+ // count of uncompleted subordinates
+ remaining = arguments.length,
+
+ // count of unprocessed arguments
+ i = remaining,
+
+ // subordinate fulfillment data
+ resolveContexts = Array(i),
+ resolveValues = slice.call(arguments),
+
+ // the master Deferred
+ master = jQuery.Deferred(),
+
+ // subordinate callback factory
+ updateFunc = function (i) {
+ return function (value) {
+ resolveContexts[i] = this;
+ resolveValues[i] = arguments.length > 1 ? slice.call(arguments) : value;
+ if (!(--remaining)) {
+ master.resolveWith(resolveContexts, resolveValues);
+ }
+ };
+ };
+
+ // Single- and empty arguments are adopted like Promise.resolve
+ if (remaining <= 1) {
+ adoptValue(singleValue, master.done(updateFunc(i)).resolve, master.reject,
+ !remaining);
+
+ // Use .then() to unwrap secondary thenables (cf. gh-3000)
+ if (master.state() === "pending" ||
+ isFunction(resolveValues[i] && resolveValues[i].then)) {
+
+ return master.then();
+ }
+ }
+
+ // Multiple arguments are aggregated like Promise.all array elements
+ while (i--) {
+ adoptValue(resolveValues[i], updateFunc(i), master.reject);
+ }
+
+ return master.promise();
+ }
+ });
+
+
+ // These usually indicate a programmer mistake during development,
+ // warn about them ASAP rather than swallowing them by default.
+ var rerrorNames = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;
+
+ jQuery.Deferred.exceptionHook = function (error, stack) {
+
+ // Support: IE 8 - 9 only
+ // Console exists when dev tools are open, which can happen at any time
+ if (window.console && window.console.warn && error && rerrorNames.test(error.name)) {
+ window.console.warn("jQuery.Deferred exception: " + error.message, error.stack, stack);
+ }
+ };
+
+
+ jQuery.readyException = function (error) {
+ window.setTimeout(function () {
+ throw error;
+ });
+ };
+
+
+ // The deferred used on DOM ready
+ var readyList = jQuery.Deferred();
+
+ jQuery.fn.ready = function (fn) {
+
+ readyList
+ .then(fn)
+
+ // Wrap jQuery.readyException in a function so that the lookup
+ // happens at the time of error handling instead of callback
+ // registration.
+ .catch(function (error) {
+ jQuery.readyException(error);
+ });
+
+ return this;
+ };
+
+ jQuery.extend({
+
+ // Is the DOM ready to be used? Set to true once it occurs.
+ isReady: false,
+
+ // A counter to track how many items to wait for before
+ // the ready event fires. See #6781
+ readyWait: 1,
+
+ // Handle when the DOM is ready
+ ready: function (wait) {
+
+ // Abort if there are pending holds or we're already ready
+ if (wait === true ? --jQuery.readyWait : jQuery.isReady) {
+ return;
+ }
+
+ // Remember that the DOM is ready
+ jQuery.isReady = true;
+
+ // If a normal DOM Ready event fired, decrement, and wait if need be
+ if (wait !== true && --jQuery.readyWait > 0) {
+ return;
+ }
+
+ // If there are functions bound, to execute
+ readyList.resolveWith(document, [jQuery]);
+ }
+ });
+
+ jQuery.ready.then = readyList.then;
+
+ // The ready event handler and self cleanup method
+ function completed() {
+ document.removeEventListener("DOMContentLoaded", completed);
+ window.removeEventListener("load", completed);
+ jQuery.ready();
+ }
+
+ // Catch cases where $(document).ready() is called
+ // after the browser event has already occurred.
+ // Support: IE <=9 - 10 only
+ // Older IE sometimes signals "interactive" too soon
+ if (document.readyState === "complete" ||
+ (document.readyState !== "loading" && !document.documentElement.doScroll)) {
+
+ // Handle it asynchronously to allow scripts the opportunity to delay ready
+ window.setTimeout(jQuery.ready);
+
+ } else {
+
+ // Use the handy event callback
+ document.addEventListener("DOMContentLoaded", completed);
+
+ // A fallback to window.onload, that will always work
+ window.addEventListener("load", completed);
+ }
+
+
+ // Multifunctional method to get and set values of a collection
+ // The value/s can optionally be executed if it's a function
+ var access = function (elems, fn, key, value, chainable, emptyGet, raw) {
+ var i = 0,
+ len = elems.length,
+ bulk = key == null;
+
+ // Sets many values
+ if (toType(key) === "object") {
+ chainable = true;
+ for (i in key) {
+ access(elems, fn, i, key[i], true, emptyGet, raw);
+ }
+
+ // Sets one value
+ } else if (value !== undefined) {
+ chainable = true;
+
+ if (!isFunction(value)) {
+ raw = true;
+ }
+
+ if (bulk) {
+
+ // Bulk operations run against the entire set
+ if (raw) {
+ fn.call(elems, value);
+ fn = null;
+
+ // ...except when executing function values
+ } else {
+ bulk = fn;
+ fn = function (elem, key, value) {
+ return bulk.call(jQuery(elem), value);
+ };
+ }
+ }
+
+ if (fn) {
+ for (; i < len; i++) {
+ fn(
+ elems[i], key, raw ?
+ value :
+ value.call(elems[i], i, fn(elems[i], key))
+ );
+ }
+ }
+ }
+
+ if (chainable) {
+ return elems;
+ }
+
+ // Gets
+ if (bulk) {
+ return fn.call(elems);
+ }
+
+ return len ? fn(elems[0], key) : emptyGet;
+ };
+
+
+ // Matches dashed string for camelizing
+ var rmsPrefix = /^-ms-/,
+ rdashAlpha = /-([a-z])/g;
+
+ // Used by camelCase as callback to replace()
+ function fcamelCase(all, letter) {
+ return letter.toUpperCase();
+ }
+
+ // Convert dashed to camelCase; used by the css and data modules
+ // Support: IE <=9 - 11, Edge 12 - 15
+ // Microsoft forgot to hump their vendor prefix (#9572)
+ function camelCase(string) {
+ return string.replace(rmsPrefix, "ms-").replace(rdashAlpha, fcamelCase);
+ }
+
+ var acceptData = function (owner) {
+
+ // Accepts only:
+ // - Node
+ // - Node.ELEMENT_NODE
+ // - Node.DOCUMENT_NODE
+ // - Object
+ // - Any
+ return owner.nodeType === 1 || owner.nodeType === 9 || !(+owner.nodeType);
+ };
+
+
+ function Data() {
+ this.expando = jQuery.expando + Data.uid++;
+ }
+
+ Data.uid = 1;
+
+ Data.prototype = {
+
+ cache: function (owner) {
+
+ // Check if the owner object already has a cache
+ var value = owner[this.expando];
+
+ // If not, create one
+ if (!value) {
+ value = {};
+
+ // We can accept data for non-element nodes in modern browsers,
+ // but we should not, see #8335.
+ // Always return an empty object.
+ if (acceptData(owner)) {
+
+ // If it is a node unlikely to be stringify-ed or looped over
+ // use plain assignment
+ if (owner.nodeType) {
+ owner[this.expando] = value;
+
+ // Otherwise secure it in a non-enumerable property
+ // configurable must be true to allow the property to be
+ // deleted when data is removed
+ } else {
+ Object.defineProperty(owner, this.expando, {
+ value: value,
+ configurable: true
+ });
+ }
+ }
+ }
+
+ return value;
+ },
+ set: function (owner, data, value) {
+ var prop,
+ cache = this.cache(owner);
+
+ // Handle: [ owner, key, value ] args
+ // Always use camelCase key (gh-2257)
+ if (typeof data === "string") {
+ cache[camelCase(data)] = value;
+
+ // Handle: [ owner, { properties } ] args
+ } else {
+
+ // Copy the properties one-by-one to the cache object
+ for (prop in data) {
+ cache[camelCase(prop)] = data[prop];
+ }
+ }
+ return cache;
+ },
+ get: function (owner, key) {
+ return key === undefined ?
+ this.cache(owner) :
+
+ // Always use camelCase key (gh-2257)
+ owner[this.expando] && owner[this.expando][camelCase(key)];
+ },
+ access: function (owner, key, value) {
+
+ // In cases where either:
+ //
+ // 1. No key was specified
+ // 2. A string key was specified, but no value provided
+ //
+ // Take the "read" path and allow the get method to determine
+ // which value to return, respectively either:
+ //
+ // 1. The entire cache object
+ // 2. The data stored at the key
+ //
+ if (key === undefined ||
+ ((key && typeof key === "string") && value === undefined)) {
+
+ return this.get(owner, key);
+ }
+
+ // When the key is not a string, or both a key and value
+ // are specified, set or extend (existing objects) with either:
+ //
+ // 1. An object of properties
+ // 2. A key and value
+ //
+ this.set(owner, key, value);
+
+ // Since the "set" path can have two possible entry points
+ // return the expected data based on which path was taken[*]
+ return value !== undefined ? value : key;
+ },
+ remove: function (owner, key) {
+ var i,
+ cache = owner[this.expando];
+
+ if (cache === undefined) {
+ return;
+ }
+
+ if (key !== undefined) {
+
+ // Support array or space separated string of keys
+ if (Array.isArray(key)) {
+
+ // If key is an array of keys...
+ // We always set camelCase keys, so remove that.
+ key = key.map(camelCase);
+ } else {
+ key = camelCase(key);
+
+ // If a key with the spaces exists, use it.
+ // Otherwise, create an array by matching non-whitespace
+ key = key in cache ?
+ [key] :
+ (key.match(rnothtmlwhite) || []);
+ }
+
+ i = key.length;
+
+ while (i--) {
+ delete cache[key[i]];
+ }
+ }
+
+ // Remove the expando if there's no more data
+ if (key === undefined || jQuery.isEmptyObject(cache)) {
+
+ // Support: Chrome <=35 - 45
+ // Webkit & Blink performance suffers when deleting properties
+ // from DOM nodes, so set to undefined instead
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=378607 (bug restricted)
+ if (owner.nodeType) {
+ owner[this.expando] = undefined;
+ } else {
+ delete owner[this.expando];
+ }
+ }
+ },
+ hasData: function (owner) {
+ var cache = owner[this.expando];
+ return cache !== undefined && !jQuery.isEmptyObject(cache);
+ }
+ };
+ var dataPriv = new Data();
+
+ var dataUser = new Data();
+
+
+ // Implementation Summary
+ //
+ // 1. Enforce API surface and semantic compatibility with 1.9.x branch
+ // 2. Improve the module's maintainability by reducing the storage
+ // paths to a single mechanism.
+ // 3. Use the same single mechanism to support "private" and "user" data.
+ // 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
+ // 5. Avoid exposing implementation details on user objects (eg. expando properties)
+ // 6. Provide a clear path for implementation upgrade to WeakMap in 2014
+
+ var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
+ rmultiDash = /[A-Z]/g;
+
+ function getData(data) {
+ if (data === "true") {
+ return true;
+ }
+
+ if (data === "false") {
+ return false;
+ }
+
+ if (data === "null") {
+ return null;
+ }
+
+ // Only convert to a number if it doesn't change the string
+ if (data === +data + "") {
+ return +data;
+ }
+
+ if (rbrace.test(data)) {
+ return JSON.parse(data);
+ }
+
+ return data;
+ }
+
+ function dataAttr(elem, key, data) {
+ var name;
+
+ // If nothing was found internally, try to fetch any
+ // data from the HTML5 data-* attribute
+ if (data === undefined && elem.nodeType === 1) {
+ name = "data-" + key.replace(rmultiDash, "-$&").toLowerCase();
+ data = elem.getAttribute(name);
+
+ if (typeof data === "string") {
+ try {
+ data = getData(data);
+ } catch (e) {
+ }
+
+ // Make sure we set the data so it isn't changed later
+ dataUser.set(elem, key, data);
+ } else {
+ data = undefined;
+ }
+ }
+ return data;
+ }
+
+ jQuery.extend({
+ hasData: function (elem) {
+ return dataUser.hasData(elem) || dataPriv.hasData(elem);
+ },
+
+ data: function (elem, name, data) {
+ return dataUser.access(elem, name, data);
+ },
+
+ removeData: function (elem, name) {
+ dataUser.remove(elem, name);
+ },
+
+ // TODO: Now that all calls to _data and _removeData have been replaced
+ // with direct calls to dataPriv methods, these can be deprecated.
+ _data: function (elem, name, data) {
+ return dataPriv.access(elem, name, data);
+ },
+
+ _removeData: function (elem, name) {
+ dataPriv.remove(elem, name);
+ }
+ });
+
+ jQuery.fn.extend({
+ data: function (key, value) {
+ var i, name, data,
+ elem = this[0],
+ attrs = elem && elem.attributes;
+
+ // Gets all values
+ if (key === undefined) {
+ if (this.length) {
+ data = dataUser.get(elem);
+
+ if (elem.nodeType === 1 && !dataPriv.get(elem, "hasDataAttrs")) {
+ i = attrs.length;
+ while (i--) {
+
+ // Support: IE 11 only
+ // The attrs elements can be null (#14894)
+ if (attrs[i]) {
+ name = attrs[i].name;
+ if (name.indexOf("data-") === 0) {
+ name = camelCase(name.slice(5));
+ dataAttr(elem, name, data[name]);
+ }
+ }
+ }
+ dataPriv.set(elem, "hasDataAttrs", true);
+ }
+ }
+
+ return data;
+ }
+
+ // Sets multiple values
+ if (typeof key === "object") {
+ return this.each(function () {
+ dataUser.set(this, key);
+ });
+ }
+
+ return access(this, function (value) {
+ var data;
+
+ // The calling jQuery object (element matches) is not empty
+ // (and therefore has an element appears at this[ 0 ]) and the
+ // `value` parameter was not undefined. An empty jQuery object
+ // will result in `undefined` for elem = this[ 0 ] which will
+ // throw an exception if an attempt to read a data cache is made.
+ if (elem && value === undefined) {
+
+ // Attempt to get data from the cache
+ // The key will always be camelCased in Data
+ data = dataUser.get(elem, key);
+ if (data !== undefined) {
+ return data;
+ }
+
+ // Attempt to "discover" the data in
+ // HTML5 custom data-* attrs
+ data = dataAttr(elem, key);
+ if (data !== undefined) {
+ return data;
+ }
+
+ // We tried really hard, but the data doesn't exist.
+ return;
+ }
+
+ // Set the data...
+ this.each(function () {
+
+ // We always store the camelCased key
+ dataUser.set(this, key, value);
+ });
+ }, null, value, arguments.length > 1, null, true);
+ },
+
+ removeData: function (key) {
+ return this.each(function () {
+ dataUser.remove(this, key);
+ });
+ }
+ });
+
+
+ jQuery.extend({
+ queue: function (elem, type, data) {
+ var queue;
+
+ if (elem) {
+ type = (type || "fx") + "queue";
+ queue = dataPriv.get(elem, type);
+
+ // Speed up dequeue by getting out quickly if this is just a lookup
+ if (data) {
+ if (!queue || Array.isArray(data)) {
+ queue = dataPriv.access(elem, type, jQuery.makeArray(data));
+ } else {
+ queue.push(data);
+ }
+ }
+ return queue || [];
+ }
+ },
+
+ dequeue: function (elem, type) {
+ type = type || "fx";
+
+ var queue = jQuery.queue(elem, type),
+ startLength = queue.length,
+ fn = queue.shift(),
+ hooks = jQuery._queueHooks(elem, type),
+ next = function () {
+ jQuery.dequeue(elem, type);
+ };
+
+ // If the fx queue is dequeued, always remove the progress sentinel
+ if (fn === "inprogress") {
+ fn = queue.shift();
+ startLength--;
+ }
+
+ if (fn) {
+
+ // Add a progress sentinel to prevent the fx queue from being
+ // automatically dequeued
+ if (type === "fx") {
+ queue.unshift("inprogress");
+ }
+
+ // Clear up the last queue stop function
+ delete hooks.stop;
+ fn.call(elem, next, hooks);
+ }
+
+ if (!startLength && hooks) {
+ hooks.empty.fire();
+ }
+ },
+
+ // Not public - generate a queueHooks object, or return the current one
+ _queueHooks: function (elem, type) {
+ var key = type + "queueHooks";
+ return dataPriv.get(elem, key) || dataPriv.access(elem, key, {
+ empty: jQuery.Callbacks("once memory").add(function () {
+ dataPriv.remove(elem, [type + "queue", key]);
+ })
+ });
+ }
+ });
+
+ jQuery.fn.extend({
+ queue: function (type, data) {
+ var setter = 2;
+
+ if (typeof type !== "string") {
+ data = type;
+ type = "fx";
+ setter--;
+ }
+
+ if (arguments.length < setter) {
+ return jQuery.queue(this[0], type);
+ }
+
+ return data === undefined ?
+ this :
+ this.each(function () {
+ var queue = jQuery.queue(this, type, data);
+
+ // Ensure a hooks for this queue
+ jQuery._queueHooks(this, type);
+
+ if (type === "fx" && queue[0] !== "inprogress") {
+ jQuery.dequeue(this, type);
+ }
+ });
+ },
+ dequeue: function (type) {
+ return this.each(function () {
+ jQuery.dequeue(this, type);
+ });
+ },
+ clearQueue: function (type) {
+ return this.queue(type || "fx", []);
+ },
+
+ // Get a promise resolved when queues of a certain type
+ // are emptied (fx is the type by default)
+ promise: function (type, obj) {
+ var tmp,
+ count = 1,
+ defer = jQuery.Deferred(),
+ elements = this,
+ i = this.length,
+ resolve = function () {
+ if (!(--count)) {
+ defer.resolveWith(elements, [elements]);
+ }
+ };
+
+ if (typeof type !== "string") {
+ obj = type;
+ type = undefined;
+ }
+ type = type || "fx";
+
+ while (i--) {
+ tmp = dataPriv.get(elements[i], type + "queueHooks");
+ if (tmp && tmp.empty) {
+ count++;
+ tmp.empty.add(resolve);
+ }
+ }
+ resolve();
+ return defer.promise(obj);
+ }
+ });
+ var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;
+
+ var rcssNum = new RegExp("^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i");
+
+
+ var cssExpand = ["Top", "Right", "Bottom", "Left"];
+
+ var isHiddenWithinTree = function (elem, el) {
+
+ // isHiddenWithinTree might be called from jQuery#filter function;
+ // in that case, element will be second argument
+ elem = el || elem;
+
+ // Inline style trumps all
+ return elem.style.display === "none" ||
+ elem.style.display === "" &&
+
+ // Otherwise, check computed style
+ // Support: Firefox <=43 - 45
+ // Disconnected elements can have computed display: none, so first confirm that elem is
+ // in the document.
+ jQuery.contains(elem.ownerDocument, elem) &&
+
+ jQuery.css(elem, "display") === "none";
+ };
+
+ var swap = function (elem, options, callback, args) {
+ var ret, name,
+ old = {};
+
+ // Remember the old values, and insert the new ones
+ for (name in options) {
+ old[name] = elem.style[name];
+ elem.style[name] = options[name];
+ }
+
+ ret = callback.apply(elem, args || []);
+
+ // Revert the old values
+ for (name in options) {
+ elem.style[name] = old[name];
+ }
+
+ return ret;
+ };
+
+
+ function adjustCSS(elem, prop, valueParts, tween) {
+ var adjusted, scale,
+ maxIterations = 20,
+ currentValue = tween ?
+ function () {
+ return tween.cur();
+ } :
+ function () {
+ return jQuery.css(elem, prop, "");
+ },
+ initial = currentValue(),
+ unit = valueParts && valueParts[3] || (jQuery.cssNumber[prop] ? "" : "px"),
+
+ // Starting value computation is required for potential unit mismatches
+ initialInUnit = (jQuery.cssNumber[prop] || unit !== "px" && +initial) &&
+ rcssNum.exec(jQuery.css(elem, prop));
+
+ if (initialInUnit && initialInUnit[3] !== unit) {
+
+ // Support: Firefox <=54
+ // Halve the iteration target value to prevent interference from CSS upper bounds (gh-2144)
+ initial = initial / 2;
+
+ // Trust units reported by jQuery.css
+ unit = unit || initialInUnit[3];
+
+ // Iteratively approximate from a nonzero starting point
+ initialInUnit = +initial || 1;
+
+ while (maxIterations--) {
+
+ // Evaluate and update our best guess (doubling guesses that zero out).
+ // Finish if the scale equals or crosses 1 (making the old*new product non-positive).
+ jQuery.style(elem, prop, initialInUnit + unit);
+ if ((1 - scale) * (1 - (scale = currentValue() / initial || 0.5)) <= 0) {
+ maxIterations = 0;
+ }
+ initialInUnit = initialInUnit / scale;
+
+ }
+
+ initialInUnit = initialInUnit * 2;
+ jQuery.style(elem, prop, initialInUnit + unit);
+
+ // Make sure we update the tween properties later on
+ valueParts = valueParts || [];
+ }
+
+ if (valueParts) {
+ initialInUnit = +initialInUnit || +initial || 0;
+
+ // Apply relative offset (+=/-=) if specified
+ adjusted = valueParts[1] ?
+ initialInUnit + (valueParts[1] + 1) * valueParts[2] :
+ +valueParts[2];
+ if (tween) {
+ tween.unit = unit;
+ tween.start = initialInUnit;
+ tween.end = adjusted;
+ }
+ }
+ return adjusted;
+ }
+
+
+ var defaultDisplayMap = {};
+
+ function getDefaultDisplay(elem) {
+ var temp,
+ doc = elem.ownerDocument,
+ nodeName = elem.nodeName,
+ display = defaultDisplayMap[nodeName];
+
+ if (display) {
+ return display;
+ }
+
+ temp = doc.body.appendChild(doc.createElement(nodeName));
+ display = jQuery.css(temp, "display");
+
+ temp.parentNode.removeChild(temp);
+
+ if (display === "none") {
+ display = "block";
+ }
+ defaultDisplayMap[nodeName] = display;
+
+ return display;
+ }
+
+ function showHide(elements, show) {
+ var display, elem,
+ values = [],
+ index = 0,
+ length = elements.length;
+
+ // Determine new display value for elements that need to change
+ for (; index < length; index++) {
+ elem = elements[index];
+ if (!elem.style) {
+ continue;
+ }
+
+ display = elem.style.display;
+ if (show) {
+
+ // Since we force visibility upon cascade-hidden elements, an immediate (and slow)
+ // check is required in this first loop unless we have a nonempty display value (either
+ // inline or about-to-be-restored)
+ if (display === "none") {
+ values[index] = dataPriv.get(elem, "display") || null;
+ if (!values[index]) {
+ elem.style.display = "";
+ }
+ }
+ if (elem.style.display === "" && isHiddenWithinTree(elem)) {
+ values[index] = getDefaultDisplay(elem);
+ }
+ } else {
+ if (display !== "none") {
+ values[index] = "none";
+
+ // Remember what we're overwriting
+ dataPriv.set(elem, "display", display);
+ }
+ }
+ }
+
+ // Set the display of the elements in a second loop to avoid constant reflow
+ for (index = 0; index < length; index++) {
+ if (values[index] != null) {
+ elements[index].style.display = values[index];
+ }
+ }
+
+ return elements;
+ }
+
+ jQuery.fn.extend({
+ show: function () {
+ return showHide(this, true);
+ },
+ hide: function () {
+ return showHide(this);
+ },
+ toggle: function (state) {
+ if (typeof state === "boolean") {
+ return state ? this.show() : this.hide();
+ }
+
+ return this.each(function () {
+ if (isHiddenWithinTree(this)) {
+ jQuery(this).show();
+ } else {
+ jQuery(this).hide();
+ }
+ });
+ }
+ });
+ var rcheckableType = (/^(?:checkbox|radio)$/i);
+
+ var rtagName = (/<([a-z][^\/\0>\x20\t\r\n\f]+)/i);
+
+ var rscriptType = (/^$|^module$|\/(?:java|ecma)script/i);
+
+
+ // We have to close these tags to support XHTML (#13200)
+ var wrapMap = {
+
+ // Support: IE <=9 only
+ option: [1, "<select multiple='multiple'>", "</select>"],
+
+ // XHTML parsers do not magically insert elements in the
+ // same way that tag soup parsers do. So we cannot shorten
+ // this by omitting <tbody> or other required elements.
+ 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, "", ""]
+ };
+
+ // Support: IE <=9 only
+ wrapMap.optgroup = wrapMap.option;
+
+ wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+ wrapMap.th = wrapMap.td;
+
+
+ function getAll(context, tag) {
+
+ // Support: IE <=9 - 11 only
+ // Use typeof to avoid zero-argument method invocation on host objects (#15151)
+ var ret;
+
+ if (typeof context.getElementsByTagName !== "undefined") {
+ ret = context.getElementsByTagName(tag || "*");
+
+ } else if (typeof context.querySelectorAll !== "undefined") {
+ ret = context.querySelectorAll(tag || "*");
+
+ } else {
+ ret = [];
+ }
+
+ if (tag === undefined || tag && nodeName(context, tag)) {
+ return jQuery.merge([context], ret);
+ }
+
+ return ret;
+ }
+
+
+ // Mark scripts as having already been evaluated
+ function setGlobalEval(elems, refElements) {
+ var i = 0,
+ l = elems.length;
+
+ for (; i < l; i++) {
+ dataPriv.set(
+ elems[i],
+ "globalEval",
+ !refElements || dataPriv.get(refElements[i], "globalEval")
+ );
+ }
+ }
+
+
+ var rhtml = /<|&#?\w+;/;
+
+ function buildFragment(elems, context, scripts, selection, ignored) {
+ var elem, tmp, tag, wrap, contains, j,
+ fragment = context.createDocumentFragment(),
+ nodes = [],
+ i = 0,
+ l = elems.length;
+
+ for (; i < l; i++) {
+ elem = elems[i];
+
+ if (elem || elem === 0) {
+
+ // Add nodes directly
+ if (toType(elem) === "object") {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge(nodes, elem.nodeType ? [elem] : elem);
+
+ // Convert non-html into a text node
+ } else if (!rhtml.test(elem)) {
+ nodes.push(context.createTextNode(elem));
+
+ // Convert html into DOM nodes
+ } else {
+ tmp = tmp || fragment.appendChild(context.createElement("div"));
+
+ // Deserialize a standard representation
+ tag = (rtagName.exec(elem) || ["", ""])[1].toLowerCase();
+ wrap = wrapMap[tag] || wrapMap._default;
+ tmp.innerHTML = wrap[1] + jQuery.htmlPrefilter(elem) + wrap[2];
+
+ // Descend through wrappers to the right content
+ j = wrap[0];
+ while (j--) {
+ tmp = tmp.lastChild;
+ }
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge(nodes, tmp.childNodes);
+
+ // Remember the top-level container
+ tmp = fragment.firstChild;
+
+ // Ensure the created nodes are orphaned (#12392)
+ tmp.textContent = "";
+ }
+ }
+ }
+
+ // Remove wrapper from fragment
+ fragment.textContent = "";
+
+ i = 0;
+ while ((elem = nodes[i++])) {
+
+ // Skip elements already in the context collection (trac-4087)
+ if (selection && jQuery.inArray(elem, selection) > -1) {
+ if (ignored) {
+ ignored.push(elem);
+ }
+ continue;
+ }
+
+ contains = jQuery.contains(elem.ownerDocument, elem);
+
+ // Append to fragment
+ tmp = getAll(fragment.appendChild(elem), "script");
+
+ // Preserve script evaluation history
+ if (contains) {
+ setGlobalEval(tmp);
+ }
+
+ // Capture executables
+ if (scripts) {
+ j = 0;
+ while ((elem = tmp[j++])) {
+ if (rscriptType.test(elem.type || "")) {
+ scripts.push(elem);
+ }
+ }
+ }
+ }
+
+ return fragment;
+ }
+
+
+ (function () {
+ var fragment = document.createDocumentFragment(),
+ div = fragment.appendChild(document.createElement("div")),
+ input = document.createElement("input");
+
+ // Support: Android 4.0 - 4.3 only
+ // Check state lost if the name is set (#11217)
+ // Support: Windows Web Apps (WWA)
+ // `name` and `type` must use .setAttribute for WWA (#14901)
+ input.setAttribute("type", "radio");
+ input.setAttribute("checked", "checked");
+ input.setAttribute("name", "t");
+
+ div.appendChild(input);
+
+ // Support: Android <=4.1 only
+ // Older WebKit doesn't clone checked state correctly in fragments
+ support.checkClone = div.cloneNode(true).cloneNode(true).lastChild.checked;
+
+ // Support: IE <=11 only
+ // Make sure textarea (and checkbox) defaultValue is properly cloned
+ div.innerHTML = "<textarea>x</textarea>";
+ support.noCloneChecked = !!div.cloneNode(true).lastChild.defaultValue;
+ })();
+ var documentElement = document.documentElement;
+
+
+ var
+ rkeyEvent = /^key/,
+ rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
+ rtypenamespace = /^([^.]*)(?:\.(.+)|)/;
+
+ function returnTrue() {
+ return true;
+ }
+
+ function returnFalse() {
+ return false;
+ }
+
+ // Support: IE <=9 only
+ // See #13393 for more info
+ function safeActiveElement() {
+ try {
+ return document.activeElement;
+ } catch (err) {
+ }
+ }
+
+ function on(elem, types, selector, data, fn, one) {
+ var origFn, type;
+
+ // Types can be a map of types/handlers
+ if (typeof types === "object") {
+
+ // ( types-Object, selector, data )
+ if (typeof selector !== "string") {
+
+ // ( types-Object, data )
+ data = data || selector;
+ selector = undefined;
+ }
+ for (type in types) {
+ on(elem, type, selector, data, types[type], one);
+ }
+ return elem;
+ }
+
+ if (data == null && fn == null) {
+
+ // ( types, fn )
+ fn = selector;
+ data = selector = undefined;
+ } else if (fn == null) {
+ if (typeof selector === "string") {
+
+ // ( types, selector, fn )
+ fn = data;
+ data = undefined;
+ } else {
+
+ // ( types, data, fn )
+ fn = data;
+ data = selector;
+ selector = undefined;
+ }
+ }
+ if (fn === false) {
+ fn = returnFalse;
+ } else if (!fn) {
+ return elem;
+ }
+
+ if (one === 1) {
+ origFn = fn;
+ fn = function (event) {
+
+ // Can use an empty set, since event contains the info
+ jQuery().off(event);
+ return origFn.apply(this, arguments);
+ };
+
+ // Use same guid so caller can remove using origFn
+ fn.guid = origFn.guid || (origFn.guid = jQuery.guid++);
+ }
+ return elem.each(function () {
+ jQuery.event.add(this, types, fn, data, selector);
+ });
+ }
+
+ /*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+ jQuery.event = {
+
+ global: {},
+
+ add: function (elem, types, handler, data, selector) {
+
+ var handleObjIn, eventHandle, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.get(elem);
+
+ // Don't attach events to noData or text/comment nodes (but allow plain objects)
+ if (!elemData) {
+ return;
+ }
+
+ // Caller can pass in an object of custom data in lieu of the handler
+ if (handler.handler) {
+ handleObjIn = handler;
+ handler = handleObjIn.handler;
+ selector = handleObjIn.selector;
+ }
+
+ // Ensure that invalid selectors throw exceptions at attach time
+ // Evaluate against documentElement in case elem is a non-element node (e.g., document)
+ if (selector) {
+ jQuery.find.matchesSelector(documentElement, selector);
+ }
+
+ // Make sure that the handler has a unique ID, used to find/remove it later
+ if (!handler.guid) {
+ handler.guid = jQuery.guid++;
+ }
+
+ // Init the element's event structure and main handler, if this is the first
+ if (!(events = elemData.events)) {
+ events = elemData.events = {};
+ }
+ if (!(eventHandle = elemData.handle)) {
+ eventHandle = elemData.handle = function (e) {
+
+ // Discard the second event of a jQuery.event.trigger() and
+ // when an event is called after a page has unloaded
+ return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
+ jQuery.event.dispatch.apply(elem, arguments) : undefined;
+ };
+ }
+
+ // Handle multiple events separated by a space
+ types = (types || "").match(rnothtmlwhite) || [""];
+ t = types.length;
+ while (t--) {
+ tmp = rtypenamespace.exec(types[t]) || [];
+ type = origType = tmp[1];
+ namespaces = (tmp[2] || "").split(".").sort();
+
+ // There *must* be a type, no attaching namespace-only handlers
+ if (!type) {
+ continue;
+ }
+
+ // If event changes its type, use the special event handlers for the changed type
+ special = jQuery.event.special[type] || {};
+
+ // If selector defined, determine special event api type, otherwise given type
+ type = (selector ? special.delegateType : special.bindType) || type;
+
+ // Update special based on newly reset type
+ special = jQuery.event.special[type] || {};
+
+ // handleObj is passed to all event handlers
+ handleObj = jQuery.extend({
+ type: type,
+ origType: origType,
+ data: data,
+ handler: handler,
+ guid: handler.guid,
+ selector: selector,
+ needsContext: selector && jQuery.expr.match.needsContext.test(selector),
+ namespace: namespaces.join(".")
+ }, handleObjIn);
+
+ // Init the event handler queue if we're the first
+ if (!(handlers = events[type])) {
+ handlers = events[type] = [];
+ handlers.delegateCount = 0;
+
+ // Only use addEventListener if the special events handler returns false
+ if (!special.setup ||
+ special.setup.call(elem, data, namespaces, eventHandle) === false) {
+
+ if (elem.addEventListener) {
+ elem.addEventListener(type, eventHandle);
+ }
+ }
+ }
+
+ if (special.add) {
+ special.add.call(elem, handleObj);
+
+ if (!handleObj.handler.guid) {
+ handleObj.handler.guid = handler.guid;
+ }
+ }
+
+ // Add to the element's handler list, delegates in front
+ if (selector) {
+ handlers.splice(handlers.delegateCount++, 0, handleObj);
+ } else {
+ handlers.push(handleObj);
+ }
+
+ // Keep track of which events have ever been used, for event optimization
+ jQuery.event.global[type] = true;
+ }
+
+ },
+
+ // Detach an event or set of events from an element
+ remove: function (elem, types, handler, selector, mappedTypes) {
+
+ var j, origCount, tmp,
+ events, t, handleObj,
+ special, handlers, type, namespaces, origType,
+ elemData = dataPriv.hasData(elem) && dataPriv.get(elem);
+
+ if (!elemData || !(events = elemData.events)) {
+ return;
+ }
+
+ // Once for each type.namespace in types; type may be omitted
+ types = (types || "").match(rnothtmlwhite) || [""];
+ t = types.length;
+ while (t--) {
+ tmp = rtypenamespace.exec(types[t]) || [];
+ type = origType = tmp[1];
+ namespaces = (tmp[2] || "").split(".").sort();
+
+ // Unbind all events (on this namespace, if provided) for the element
+ if (!type) {
+ for (type in events) {
+ jQuery.event.remove(elem, type + types[t], handler, selector, true);
+ }
+ continue;
+ }
+
+ special = jQuery.event.special[type] || {};
+ type = (selector ? special.delegateType : special.bindType) || type;
+ handlers = events[type] || [];
+ tmp = tmp[2] &&
+ new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)");
+
+ // Remove matching events
+ origCount = j = handlers.length;
+ while (j--) {
+ handleObj = handlers[j];
+
+ if ((mappedTypes || origType === handleObj.origType) &&
+ (!handler || handler.guid === handleObj.guid) &&
+ (!tmp || tmp.test(handleObj.namespace)) &&
+ (!selector || selector === handleObj.selector ||
+ selector === "**" && handleObj.selector)) {
+ handlers.splice(j, 1);
+
+ if (handleObj.selector) {
+ handlers.delegateCount--;
+ }
+ if (special.remove) {
+ special.remove.call(elem, handleObj);
+ }
+ }
+ }
+
+ // Remove generic event handler if we removed something and no more handlers exist
+ // (avoids potential for endless recursion during removal of special event handlers)
+ if (origCount && !handlers.length) {
+ if (!special.teardown ||
+ special.teardown.call(elem, namespaces, elemData.handle) === false) {
+
+ jQuery.removeEvent(elem, type, elemData.handle);
+ }
+
+ delete events[type];
+ }
+ }
+
+ // Remove data and the expando if it's no longer used
+ if (jQuery.isEmptyObject(events)) {
+ dataPriv.remove(elem, "handle events");
+ }
+ },
+
+ dispatch: function (nativeEvent) {
+
+ // Make a writable jQuery.Event from the native event object
+ var event = jQuery.event.fix(nativeEvent);
+
+ var i, j, ret, matched, handleObj, handlerQueue,
+ args = new Array(arguments.length),
+ handlers = (dataPriv.get(this, "events") || {})[event.type] || [],
+ special = jQuery.event.special[event.type] || {};
+
+ // Use the fix-ed jQuery.Event rather than the (read-only) native event
+ args[0] = event;
+
+ for (i = 1; i < arguments.length; i++) {
+ args[i] = arguments[i];
+ }
+
+ event.delegateTarget = this;
+
+ // Call the preDispatch hook for the mapped type, and let it bail if desired
+ if (special.preDispatch && special.preDispatch.call(this, event) === false) {
+ return;
+ }
+
+ // Determine handlers
+ handlerQueue = jQuery.event.handlers.call(this, event, handlers);
+
+ // Run delegates first; they may want to stop propagation beneath us
+ i = 0;
+ while ((matched = handlerQueue[i++]) && !event.isPropagationStopped()) {
+ event.currentTarget = matched.elem;
+
+ j = 0;
+ while ((handleObj = matched.handlers[j++]) &&
+ !event.isImmediatePropagationStopped()) {
+
+ // Triggered event must either 1) have no namespace, or 2) have namespace(s)
+ // a subset or equal to those in the bound event (both can have no namespace).
+ if (!event.rnamespace || event.rnamespace.test(handleObj.namespace)) {
+
+ event.handleObj = handleObj;
+ event.data = handleObj.data;
+
+ ret = ((jQuery.event.special[handleObj.origType] || {}).handle ||
+ handleObj.handler).apply(matched.elem, args);
+
+ if (ret !== undefined) {
+ if ((event.result = ret) === false) {
+ event.preventDefault();
+ event.stopPropagation();
+ }
+ }
+ }
+ }
+ }
+
+ // Call the postDispatch hook for the mapped type
+ if (special.postDispatch) {
+ special.postDispatch.call(this, event);
+ }
+
+ return event.result;
+ },
+
+ handlers: function (event, handlers) {
+ var i, handleObj, sel, matchedHandlers, matchedSelectors,
+ handlerQueue = [],
+ delegateCount = handlers.delegateCount,
+ cur = event.target;
+
+ // Find delegate handlers
+ if (delegateCount &&
+
+ // Support: IE <=9
+ // Black-hole SVG <use> instance trees (trac-13180)
+ cur.nodeType &&
+
+ // Support: Firefox <=42
+ // Suppress spec-violating clicks indicating a non-primary pointer button (trac-3861)
+ // https://www.w3.org/TR/DOM-Level-3-Events/#event-type-click
+ // Support: IE 11 only
+ // ...but not arrow key "clicks" of radio inputs, which can have `button` -1 (gh-2343)
+ !(event.type === "click" && event.button >= 1)) {
+
+ for (; cur !== this; cur = cur.parentNode || this) {
+
+ // Don't check non-elements (#13208)
+ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
+ if (cur.nodeType === 1 && !(event.type === "click" && cur.disabled === true)) {
+ matchedHandlers = [];
+ matchedSelectors = {};
+ for (i = 0; i < delegateCount; i++) {
+ handleObj = handlers[i];
+
+ // Don't conflict with Object.prototype properties (#13203)
+ sel = handleObj.selector + " ";
+
+ if (matchedSelectors[sel] === undefined) {
+ matchedSelectors[sel] = handleObj.needsContext ?
+ jQuery(sel, this).index(cur) > -1 :
+ jQuery.find(sel, this, null, [cur]).length;
+ }
+ if (matchedSelectors[sel]) {
+ matchedHandlers.push(handleObj);
+ }
+ }
+ if (matchedHandlers.length) {
+ handlerQueue.push({elem: cur, handlers: matchedHandlers});
+ }
+ }
+ }
+ }
+
+ // Add the remaining (directly-bound) handlers
+ cur = this;
+ if (delegateCount < handlers.length) {
+ handlerQueue.push({elem: cur, handlers: handlers.slice(delegateCount)});
+ }
+
+ return handlerQueue;
+ },
+
+ addProp: function (name, hook) {
+ Object.defineProperty(jQuery.Event.prototype, name, {
+ enumerable: true,
+ configurable: true,
+
+ get: isFunction(hook) ?
+ function () {
+ if (this.originalEvent) {
+ return hook(this.originalEvent);
+ }
+ } :
+ function () {
+ if (this.originalEvent) {
+ return this.originalEvent[name];
+ }
+ },
+
+ set: function (value) {
+ Object.defineProperty(this, name, {
+ enumerable: true,
+ configurable: true,
+ writable: true,
+ value: value
+ });
+ }
+ });
+ },
+
+ fix: function (originalEvent) {
+ return originalEvent[jQuery.expando] ?
+ originalEvent :
+ new jQuery.Event(originalEvent);
+ },
+
+ special: {
+ load: {
+
+ // Prevent triggered image.load events from bubbling to window.load
+ noBubble: true
+ },
+ focus: {
+
+ // Fire native event if possible so blur/focus sequence is correct
+ trigger: function () {
+ if (this !== safeActiveElement() && this.focus) {
+ this.focus();
+ return false;
+ }
+ },
+ delegateType: "focusin"
+ },
+ blur: {
+ trigger: function () {
+ if (this === safeActiveElement() && this.blur) {
+ this.blur();
+ return false;
+ }
+ },
+ delegateType: "focusout"
+ },
+ click: {
+
+ // For checkbox, fire native event so checked state will be right
+ trigger: function () {
+ if (this.type === "checkbox" && this.click && nodeName(this, "input")) {
+ this.click();
+ return false;
+ }
+ },
+
+ // For cross-browser consistency, don't fire native .click() on links
+ _default: function (event) {
+ return nodeName(event.target, "a");
+ }
+ },
+
+ beforeunload: {
+ postDispatch: function (event) {
+
+ // Support: Firefox 20+
+ // Firefox doesn't alert if the returnValue field is not set.
+ if (event.result !== undefined && event.originalEvent) {
+ event.originalEvent.returnValue = event.result;
+ }
+ }
+ }
+ }
+ };
+
+ jQuery.removeEvent = function (elem, type, handle) {
+
+ // This "if" is needed for plain objects
+ if (elem.removeEventListener) {
+ elem.removeEventListener(type, handle);
+ }
+ };
+
+ jQuery.Event = function (src, props) {
+
+ // Allow instantiation without the 'new' keyword
+ if (!(this instanceof jQuery.Event)) {
+ return new jQuery.Event(src, props);
+ }
+
+ // Event object
+ if (src && src.type) {
+ this.originalEvent = src;
+ this.type = src.type;
+
+ // Events bubbling up the document may have been marked as prevented
+ // by a handler lower down the tree; reflect the correct value.
+ this.isDefaultPrevented = src.defaultPrevented ||
+ src.defaultPrevented === undefined &&
+
+ // Support: Android <=2.3 only
+ src.returnValue === false ?
+ returnTrue :
+ returnFalse;
+
+ // Create target properties
+ // Support: Safari <=6 - 7 only
+ // Target should not be a text node (#504, #13143)
+ this.target = (src.target && src.target.nodeType === 3) ?
+ src.target.parentNode :
+ src.target;
+
+ this.currentTarget = src.currentTarget;
+ this.relatedTarget = src.relatedTarget;
+
+ // Event type
+ } else {
+ this.type = src;
+ }
+
+ // Put explicitly provided properties onto the event object
+ if (props) {
+ jQuery.extend(this, props);
+ }
+
+ // Create a timestamp if incoming event doesn't have one
+ this.timeStamp = src && src.timeStamp || Date.now();
+
+ // Mark it as fixed
+ this[jQuery.expando] = true;
+ };
+
+ // jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+ // https://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+ jQuery.Event.prototype = {
+ constructor: jQuery.Event,
+ isDefaultPrevented: returnFalse,
+ isPropagationStopped: returnFalse,
+ isImmediatePropagationStopped: returnFalse,
+ isSimulated: false,
+
+ preventDefault: function () {
+ var e = this.originalEvent;
+
+ this.isDefaultPrevented = returnTrue;
+
+ if (e && !this.isSimulated) {
+ e.preventDefault();
+ }
+ },
+ stopPropagation: function () {
+ var e = this.originalEvent;
+
+ this.isPropagationStopped = returnTrue;
+
+ if (e && !this.isSimulated) {
+ e.stopPropagation();
+ }
+ },
+ stopImmediatePropagation: function () {
+ var e = this.originalEvent;
+
+ this.isImmediatePropagationStopped = returnTrue;
+
+ if (e && !this.isSimulated) {
+ e.stopImmediatePropagation();
+ }
+
+ this.stopPropagation();
+ }
+ };
+
+ // Includes all common event props including KeyEvent and MouseEvent specific props
+ jQuery.each({
+ altKey: true,
+ bubbles: true,
+ cancelable: true,
+ changedTouches: true,
+ ctrlKey: true,
+ detail: true,
+ eventPhase: true,
+ metaKey: true,
+ pageX: true,
+ pageY: true,
+ shiftKey: true,
+ view: true,
+ "char": true,
+ charCode: true,
+ key: true,
+ keyCode: true,
+ button: true,
+ buttons: true,
+ clientX: true,
+ clientY: true,
+ offsetX: true,
+ offsetY: true,
+ pointerId: true,
+ pointerType: true,
+ screenX: true,
+ screenY: true,
+ targetTouches: true,
+ toElement: true,
+ touches: true,
+
+ which: function (event) {
+ var button = event.button;
+
+ // Add which for key events
+ if (event.which == null && rkeyEvent.test(event.type)) {
+ return event.charCode != null ? event.charCode : event.keyCode;
+ }
+
+ // Add which for click: 1 === left; 2 === middle; 3 === right
+ if (!event.which && button !== undefined && rmouseEvent.test(event.type)) {
+ if (button & 1) {
+ return 1;
+ }
+
+ if (button & 2) {
+ return 3;
+ }
+
+ if (button & 4) {
+ return 2;
+ }
+
+ return 0;
+ }
+
+ return event.which;
+ }
+ }, jQuery.event.addProp);
+
+ // Create mouseenter/leave events using mouseover/out and event-time checks
+ // so that event delegation works in jQuery.
+ // Do the same for pointerenter/pointerleave and pointerover/pointerout
+ //
+ // Support: Safari 7 only
+ // Safari sends mouseenter too often; see:
+ // https://bugs.chromium.org/p/chromium/issues/detail?id=470258
+ // for the description of the bug (it existed in older Chrome versions as well).
+ jQuery.each({
+ mouseenter: "mouseover",
+ mouseleave: "mouseout",
+ pointerenter: "pointerover",
+ pointerleave: "pointerout"
+ }, function (orig, fix) {
+ jQuery.event.special[orig] = {
+ delegateType: fix,
+ bindType: fix,
+
+ handle: function (event) {
+ var ret,
+ target = this,
+ related = event.relatedTarget,
+ handleObj = event.handleObj;
+
+ // For mouseenter/leave call the handler if related is outside the target.
+ // NB: No relatedTarget if the mouse left/entered the browser window
+ if (!related || (related !== target && !jQuery.contains(target, related))) {
+ event.type = handleObj.origType;
+ ret = handleObj.handler.apply(this, arguments);
+ event.type = fix;
+ }
+ return ret;
+ }
+ };
+ });
+
+ jQuery.fn.extend({
+
+ on: function (types, selector, data, fn) {
+ return on(this, types, selector, data, fn);
+ },
+ one: function (types, selector, data, fn) {
+ return on(this, types, selector, data, fn, 1);
+ },
+ off: function (types, selector, fn) {
+ var handleObj, type;
+ if (types && types.preventDefault && types.handleObj) {
+
+ // ( event ) dispatched jQuery.Event
+ handleObj = types.handleObj;
+ jQuery(types.delegateTarget).off(
+ handleObj.namespace ?
+ handleObj.origType + "." + handleObj.namespace :
+ handleObj.origType,
+ handleObj.selector,
+ handleObj.handler
+ );
+ return this;
+ }
+ if (typeof types === "object") {
+
+ // ( types-object [, selector] )
+ for (type in types) {
+ this.off(type, selector, types[type]);
+ }
+ return this;
+ }
+ if (selector === false || typeof selector === "function") {
+
+ // ( types [, fn] )
+ fn = selector;
+ selector = undefined;
+ }
+ if (fn === false) {
+ fn = returnFalse;
+ }
+ return this.each(function () {
+ jQuery.event.remove(this, types, fn, selector);
+ });
+ }
+ });
+
+
+ var
+
+ /* eslint-disable max-len */
+
+ // See https://github.com/eslint/eslint/issues/3229
+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi,
+
+ /* eslint-enable */
+
+ // Support: IE <=10 - 11, Edge 12 - 13 only
+ // In IE/Edge using regex groups here causes severe slowdowns.
+ // See https://connect.microsoft.com/IE/feedback/details/1736512/
+ rnoInnerhtml = /<script|<style|<link/i,
+
+ // checked="checked" or checked
+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;
+
+ // Prefer a tbody over its parent table for containing new rows
+ function manipulationTarget(elem, content) {
+ if (nodeName(elem, "table") &&
+ nodeName(content.nodeType !== 11 ? content : content.firstChild, "tr")) {
+
+ return jQuery(elem).children("tbody")[0] || elem;
+ }
+
+ return elem;
+ }
+
+ // Replace/restore the type attribute of script elements for safe DOM manipulation
+ function disableScript(elem) {
+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;
+ return elem;
+ }
+
+ function restoreScript(elem) {
+ if ((elem.type || "").slice(0, 5) === "true/") {
+ elem.type = elem.type.slice(5);
+ } else {
+ elem.removeAttribute("type");
+ }
+
+ return elem;
+ }
+
+ function cloneCopyEvent(src, dest) {
+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;
+
+ if (dest.nodeType !== 1) {
+ return;
+ }
+
+ // 1. Copy private data: events, handlers, etc.
+ if (dataPriv.hasData(src)) {
+ pdataOld = dataPriv.access(src);
+ pdataCur = dataPriv.set(dest, pdataOld);
+ events = pdataOld.events;
+
+ if (events) {
+ delete pdataCur.handle;
+ pdataCur.events = {};
+
+ for (type in events) {
+ for (i = 0, l = events[type].length; i < l; i++) {
+ jQuery.event.add(dest, type, events[type][i]);
+ }
+ }
+ }
+ }
+
+ // 2. Copy user data
+ if (dataUser.hasData(src)) {
+ udataOld = dataUser.access(src);
+ udataCur = jQuery.extend({}, udataOld);
+
+ dataUser.set(dest, udataCur);
+ }
+ }
+
+ // Fix IE bugs, see support tests
+ function fixInput(src, dest) {
+ var nodeName = dest.nodeName.toLowerCase();
+
+ // Fails to persist the checked state of a cloned checkbox or radio button.
+ if (nodeName === "input" && rcheckableType.test(src.type)) {
+ dest.checked = src.checked;
+
+ // Fails to return the selected option to the default selected state when cloning options
+ } else if (nodeName === "input" || nodeName === "textarea") {
+ dest.defaultValue = src.defaultValue;
+ }
+ }
+
+ function domManip(collection, args, callback, ignored) {
+
+ // Flatten any nested arrays
+ args = concat.apply([], args);
+
+ var fragment, first, scripts, hasScripts, node, doc,
+ i = 0,
+ l = collection.length,
+ iNoClone = l - 1,
+ value = args[0],
+ valueIsFunction = isFunction(value);
+
+ // We can't cloneNode fragments that contain checked, in WebKit
+ if (valueIsFunction ||
+ (l > 1 && typeof value === "string" &&
+ !support.checkClone && rchecked.test(value))) {
+ return collection.each(function (index) {
+ var self = collection.eq(index);
+ if (valueIsFunction) {
+ args[0] = value.call(this, index, self.html());
+ }
+ domManip(self, args, callback, ignored);
+ });
+ }
+
+ if (l) {
+ fragment = buildFragment(args, collection[0].ownerDocument, false, collection, ignored);
+ first = fragment.firstChild;
+
+ if (fragment.childNodes.length === 1) {
+ fragment = first;
+ }
+
+ // Require either new content or an interest in ignored elements to invoke the callback
+ if (first || ignored) {
+ scripts = jQuery.map(getAll(fragment, "script"), disableScript);
+ hasScripts = scripts.length;
+
+ // Use the original fragment for the last item
+ // instead of the first because it can end up
+ // being emptied incorrectly in certain situations (#8070).
+ for (; i < l; i++) {
+ node = fragment;
+
+ if (i !== iNoClone) {
+ node = jQuery.clone(node, true, true);
+
+ // Keep references to cloned scripts for later restoration
+ if (hasScripts) {
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // push.apply(_, arraylike) throws on ancient WebKit
+ jQuery.merge(scripts, getAll(node, "script"));
+ }
+ }
+
+ callback.call(collection[i], node, i);
+ }
+
+ if (hasScripts) {
+ doc = scripts[scripts.length - 1].ownerDocument;
+
+ // Reenable scripts
+ jQuery.map(scripts, restoreScript);
+
+ // Evaluate executable scripts on first document insertion
+ for (i = 0; i < hasScripts; i++) {
+ node = scripts[i];
+ if (rscriptType.test(node.type || "") &&
+ !dataPriv.access(node, "globalEval") &&
+ jQuery.contains(doc, node)) {
+
+ if (node.src && (node.type || "").toLowerCase() !== "module") {
+
+ // Optional AJAX dependency, but won't run scripts if not present
+ if (jQuery._evalUrl) {
+ jQuery._evalUrl(node.src);
+ }
+ } else {
+ DOMEval(node.textContent.replace(rcleanScript, ""), doc, node);
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return collection;
+ }
+
+ function remove(elem, selector, keepData) {
+ var node,
+ nodes = selector ? jQuery.filter(selector, elem) : elem,
+ i = 0;
+
+ for (; (node = nodes[i]) != null; i++) {
+ if (!keepData && node.nodeType === 1) {
+ jQuery.cleanData(getAll(node));
+ }
+
+ if (node.parentNode) {
+ if (keepData && jQuery.contains(node.ownerDocument, node)) {
+ setGlobalEval(getAll(node, "script"));
+ }
+ node.parentNode.removeChild(node);
+ }
+ }
+
+ return elem;
+ }
+
+ jQuery.extend({
+ htmlPrefilter: function (html) {
+ return html.replace(rxhtmlTag, "<$1></$2>");
+ },
+
+ clone: function (elem, dataAndEvents, deepDataAndEvents) {
+ var i, l, srcElements, destElements,
+ clone = elem.cloneNode(true),
+ inPage = jQuery.contains(elem.ownerDocument, elem);
+
+ // Fix IE cloning issues
+ if (!support.noCloneChecked && (elem.nodeType === 1 || elem.nodeType === 11) &&
+ !jQuery.isXMLDoc(elem)) {
+
+ // We eschew Sizzle here for performance reasons: https://jsperf.com/getall-vs-sizzle/2
+ destElements = getAll(clone);
+ srcElements = getAll(elem);
+
+ for (i = 0, l = srcElements.length; i < l; i++) {
+ fixInput(srcElements[i], destElements[i]);
+ }
+ }
+
+ // Copy the events from the original to the clone
+ if (dataAndEvents) {
+ if (deepDataAndEvents) {
+ srcElements = srcElements || getAll(elem);
+ destElements = destElements || getAll(clone);
+
+ for (i = 0, l = srcElements.length; i < l; i++) {
+ cloneCopyEvent(srcElements[i], destElements[i]);
+ }
+ } else {
+ cloneCopyEvent(elem, clone);
+ }
+ }
+
+ // Preserve script evaluation history
+ destElements = getAll(clone, "script");
+ if (destElements.length > 0) {
+ setGlobalEval(destElements, !inPage && getAll(elem, "script"));
+ }
+
+ // Return the cloned set
+ return clone;
+ },
+
+ cleanData: function (elems) {
+ var data, elem, type,
+ special = jQuery.event.special,
+ i = 0;
+
+ for (; (elem = elems[i]) !== undefined; i++) {
+ if (acceptData(elem)) {
+ if ((data = elem[dataPriv.expando])) {
+ if (data.events) {
+ for (type in data.events) {
+ if (special[type]) {
+ jQuery.event.remove(elem, type);
+
+ // This is a shortcut to avoid jQuery.event.remove's overhead
+ } else {
+ jQuery.removeEvent(elem, type, data.handle);
+ }
+ }
+ }
+
+ // Support: Chrome <=35 - 45+
+ // Assign undefined instead of using delete, see Data#remove
+ elem[dataPriv.expando] = undefined;
+ }
+ if (elem[dataUser.expando]) {
+
+ // Support: Chrome <=35 - 45+
+ // Assign undefined instead of using delete, see Data#remove
+ elem[dataUser.expando] = undefined;
+ }
+ }
+ }
+ }
+ });
+
+ jQuery.fn.extend({
+ detach: function (selector) {
+ return remove(this, selector, true);
+ },
+
+ remove: function (selector) {
+ return remove(this, selector);
+ },
+
+ text: function (value) {
+ return access(this, function (value) {
+ return value === undefined ?
+ jQuery.text(this) :
+ this.empty().each(function () {
+ if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
+ this.textContent = value;
+ }
+ });
+ }, null, value, arguments.length);
+ },
+
+ append: function () {
+ return domManip(this, arguments, function (elem) {
+ if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
+ var target = manipulationTarget(this, elem);
+ target.appendChild(elem);
+ }
+ });
+ },
+
+ prepend: function () {
+ return domManip(this, arguments, function (elem) {
+ if (this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9) {
+ var target = manipulationTarget(this, elem);
+ target.insertBefore(elem, target.firstChild);
+ }
+ });
+ },
+
+ before: function () {
+ return domManip(this, arguments, function (elem) {
+ if (this.parentNode) {
+ this.parentNode.insertBefore(elem, this);
+ }
+ });
+ },
+
+ after: function () {
+ return domManip(this, arguments, function (elem) {
+ if (this.parentNode) {
+ this.parentNode.insertBefore(elem, this.nextSibling);
+ }
+ });
+ },
+
+ empty: function () {
+ var elem,
+ i = 0;
+
+ for (; (elem = this[i]) != null; i++) {
+ if (elem.nodeType === 1) {
+
+ // Prevent memory leaks
+ jQuery.cleanData(getAll(elem, false));
+
+ // Remove any remaining nodes
+ elem.textContent = "";
+ }
+ }
+
+ return this;
+ },
+
+ clone: function (dataAndEvents, deepDataAndEvents) {
+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+
+ return this.map(function () {
+ return jQuery.clone(this, dataAndEvents, deepDataAndEvents);
+ });
+ },
+
+ html: function (value) {
+ return access(this, function (value) {
+ var elem = this[0] || {},
+ i = 0,
+ l = this.length;
+
+ if (value === undefined && elem.nodeType === 1) {
+ return elem.innerHTML;
+ }
+
+ // See if we can take a shortcut and just use innerHTML
+ if (typeof value === "string" && !rnoInnerhtml.test(value) &&
+ !wrapMap[(rtagName.exec(value) || ["", ""])[1].toLowerCase()]) {
+
+ value = jQuery.htmlPrefilter(value);
+
+ try {
+ for (; i < l; i++) {
+ elem = this[i] || {};
+
+ // Remove element nodes and prevent memory leaks
+ if (elem.nodeType === 1) {
+ jQuery.cleanData(getAll(elem, false));
+ elem.innerHTML = value;
+ }
+ }
+
+ elem = 0;
+
+ // If using innerHTML throws an exception, use the fallback method
+ } catch (e) {
+ }
+ }
+
+ if (elem) {
+ this.empty().append(value);
+ }
+ }, null, value, arguments.length);
+ },
+
+ replaceWith: function () {
+ var ignored = [];
+
+ // Make the changes, replacing each non-ignored context element with the new content
+ return domManip(this, arguments, function (elem) {
+ var parent = this.parentNode;
+
+ if (jQuery.inArray(this, ignored) < 0) {
+ jQuery.cleanData(getAll(this));
+ if (parent) {
+ parent.replaceChild(elem, this);
+ }
+ }
+
+ // Force callback invocation
+ }, ignored);
+ }
+ });
+
+ jQuery.each({
+ appendTo: "append",
+ prependTo: "prepend",
+ insertBefore: "before",
+ insertAfter: "after",
+ replaceAll: "replaceWith"
+ }, function (name, original) {
+ jQuery.fn[name] = function (selector) {
+ var elems,
+ ret = [],
+ insert = jQuery(selector),
+ last = insert.length - 1,
+ i = 0;
+
+ for (; i <= last; i++) {
+ elems = i === last ? this : this.clone(true);
+ jQuery(insert[i])[original](elems);
+
+ // Support: Android <=4.0 only, PhantomJS 1 only
+ // .get() because push.apply(_, arraylike) throws on ancient WebKit
+ push.apply(ret, elems.get());
+ }
+
+ return this.pushStack(ret);
+ };
+ });
+ var rnumnonpx = new RegExp("^(" + pnum + ")(?!px)[a-z%]+$", "i");
+
+ var getStyles = function (elem) {
+
+ // Support: IE <=11 only, Firefox <=30 (#15098, #14150)
+ // IE throws on elements created in popups
+ // FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
+ var view = elem.ownerDocument.defaultView;
+
+ if (!view || !view.opener) {
+ view = window;
+ }
+
+ return view.getComputedStyle(elem);
+ };
+
+ var rboxStyle = new RegExp(cssExpand.join("|"), "i");
+
+
+ (function () {
+
+ // Executing both pixelPosition & boxSizingReliable tests require only one layout
+ // so they're executed at the same time to save the second computation.
+ function computeStyleTests() {
+
+ // This is a singleton, we need to execute it only once
+ if (!div) {
+ return;
+ }
+
+ container.style.cssText = "position:absolute;left:-11111px;width:60px;" +
+ "margin-top:1px;padding:0;border:0";
+ div.style.cssText =
+ "position:relative;display:block;box-sizing:border-box;overflow:scroll;" +
+ "margin:auto;border:1px;padding:1px;" +
+ "width:60%;top:1%";
+ documentElement.appendChild(container).appendChild(div);
+
+ var divStyle = window.getComputedStyle(div);
+ pixelPositionVal = divStyle.top !== "1%";
+
+ // Support: Android 4.0 - 4.3 only, Firefox <=3 - 44
+ reliableMarginLeftVal = roundPixelMeasures(divStyle.marginLeft) === 12;
+
+ // Support: Android 4.0 - 4.3 only, Safari <=9.1 - 10.1, iOS <=7.0 - 9.3
+ // Some styles come back with percentage values, even though they shouldn't
+ div.style.right = "60%";
+ pixelBoxStylesVal = roundPixelMeasures(divStyle.right) === 36;
+
+ // Support: IE 9 - 11 only
+ // Detect misreporting of content dimensions for box-sizing:border-box elements
+ boxSizingReliableVal = roundPixelMeasures(divStyle.width) === 36;
+
+ // Support: IE 9 only
+ // Detect overflow:scroll screwiness (gh-3699)
+ div.style.position = "absolute";
+ scrollboxSizeVal = div.offsetWidth === 36 || "absolute";
+
+ documentElement.removeChild(container);
+
+ // Nullify the div so it wouldn't be stored in the memory and
+ // it will also be a sign that checks already performed
+ div = null;
+ }
+
+ function roundPixelMeasures(measure) {
+ return Math.round(parseFloat(measure));
+ }
+
+ var pixelPositionVal, boxSizingReliableVal, scrollboxSizeVal, pixelBoxStylesVal,
+ reliableMarginLeftVal,
+ container = document.createElement("div"),
+ div = document.createElement("div");
+
+ // Finish early in limited (non-browser) environments
+ if (!div.style) {
+ return;
+ }
+
+ // Support: IE <=9 - 11 only
+ // Style of cloned element affects source element cloned (#8908)
+ div.style.backgroundClip = "content-box";
+ div.cloneNode(true).style.backgroundClip = "";
+ support.clearCloneStyle = div.style.backgroundClip === "content-box";
+
+ jQuery.extend(support, {
+ boxSizingReliable: function () {
+ computeStyleTests();
+ return boxSizingReliableVal;
+ },
+ pixelBoxStyles: function () {
+ computeStyleTests();
+ return pixelBoxStylesVal;
+ },
+ pixelPosition: function () {
+ computeStyleTests();
+ return pixelPositionVal;
+ },
+ reliableMarginLeft: function () {
+ computeStyleTests();
+ return reliableMarginLeftVal;
+ },
+ scrollboxSize: function () {
+ computeStyleTests();
+ return scrollboxSizeVal;
+ }
+ });
+ })();
+
+
+ function curCSS(elem, name, computed) {
+ var width, minWidth, maxWidth, ret,
+
+ // Support: Firefox 51+
+ // Retrieving style before computed somehow
+ // fixes an issue with getting wrong values
+ // on detached elements
+ style = elem.style;
+
+ computed = computed || getStyles(elem);
+
+ // getPropertyValue is needed for:
+ // .css('filter') (IE 9 only, #12537)
+ // .css('--customProperty) (#3144)
+ if (computed) {
+ ret = computed.getPropertyValue(name) || computed[name];
+
+ if (ret === "" && !jQuery.contains(elem.ownerDocument, elem)) {
+ ret = jQuery.style(elem, name);
+ }
+
+ // A tribute to the "awesome hack by Dean Edwards"
+ // Android Browser returns percentage for some values,
+ // but width seems to be reliably pixels.
+ // This is against the CSSOM draft spec:
+ // https://drafts.csswg.org/cssom/#resolved-values
+ if (!support.pixelBoxStyles() && rnumnonpx.test(ret) && rboxStyle.test(name)) {
+
+ // Remember the original values
+ width = style.width;
+ minWidth = style.minWidth;
+ maxWidth = style.maxWidth;
+
+ // Put in the new values to get a computed value out
+ style.minWidth = style.maxWidth = style.width = ret;
+ ret = computed.width;
+
+ // Revert the changed values
+ style.width = width;
+ style.minWidth = minWidth;
+ style.maxWidth = maxWidth;
+ }
+ }
+
+ return ret !== undefined ?
+
+ // Support: IE <=9 - 11 only
+ // IE returns zIndex value as an integer.
+ ret + "" :
+ ret;
+ }
+
+
+ function addGetHookIf(conditionFn, hookFn) {
+
+ // Define the hook, we'll check on the first run if it's really needed.
+ return {
+ get: function () {
+ if (conditionFn()) {
+
+ // Hook not needed (or it's not possible to use it due
+ // to missing dependency), remove it.
+ delete this.get;
+ return;
+ }
+
+ // Hook needed; redefine it so that the support test is not executed again.
+ return (this.get = hookFn).apply(this, arguments);
+ }
+ };
+ }
+
+
+ var
+
+ // Swappable if display is none or starts with table
+ // except "table", "table-cell", or "table-caption"
+ // See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+ rcustomProp = /^--/,
+ cssShow = {position: "absolute", visibility: "hidden", display: "block"},
+ cssNormalTransform = {
+ letterSpacing: "0",
+ fontWeight: "400"
+ },
+
+ cssPrefixes = ["Webkit", "Moz", "ms"],
+ emptyStyle = document.createElement("div").style;
+
+ // Return a css property mapped to a potentially vendor prefixed property
+ function vendorPropName(name) {
+
+ // Shortcut for names that are not vendor prefixed
+ if (name in emptyStyle) {
+ return name;
+ }
+
+ // Check for vendor prefixed names
+ var capName = name[0].toUpperCase() + name.slice(1),
+ i = cssPrefixes.length;
+
+ while (i--) {
+ name = cssPrefixes[i] + capName;
+ if (name in emptyStyle) {
+ return name;
+ }
+ }
+ }
+
+ // Return a property mapped along what jQuery.cssProps suggests or to
+ // a vendor prefixed property.
+ function finalPropName(name) {
+ var ret = jQuery.cssProps[name];
+ if (!ret) {
+ ret = jQuery.cssProps[name] = vendorPropName(name) || name;
+ }
+ return ret;
+ }
+
+ function setPositiveNumber(elem, value, subtract) {
+
+ // Any relative (+/-) values have already been
+ // normalized at this point
+ var matches = rcssNum.exec(value);
+ return matches ?
+
+ // Guard against undefined "subtract", e.g., when used as in cssHooks
+ Math.max(0, matches[2] - (subtract || 0)) + (matches[3] || "px") :
+ value;
+ }
+
+ function boxModelAdjustment(elem, dimension, box, isBorderBox, styles, computedVal) {
+ var i = dimension === "width" ? 1 : 0,
+ extra = 0,
+ delta = 0;
+
+ // Adjustment may not be necessary
+ if (box === (isBorderBox ? "border" : "content")) {
+ return 0;
+ }
+
+ for (; i < 4; i += 2) {
+
+ // Both box models exclude margin
+ if (box === "margin") {
+ delta += jQuery.css(elem, box + cssExpand[i], true, styles);
+ }
+
+ // If we get here with a content-box, we're seeking "padding" or "border" or "margin"
+ if (!isBorderBox) {
+
+ // Add padding
+ delta += jQuery.css(elem, "padding" + cssExpand[i], true, styles);
+
+ // For "border" or "margin", add border
+ if (box !== "padding") {
+ delta += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
+
+ // But still keep track of it otherwise
+ } else {
+ extra += jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
+ }
+
+ // If we get here with a border-box (content + padding + border), we're seeking "content" or
+ // "padding" or "margin"
+ } else {
+
+ // For "content", subtract padding
+ if (box === "content") {
+ delta -= jQuery.css(elem, "padding" + cssExpand[i], true, styles);
+ }
+
+ // For "content" or "padding", subtract border
+ if (box !== "margin") {
+ delta -= jQuery.css(elem, "border" + cssExpand[i] + "Width", true, styles);
+ }
+ }
+ }
+
+ // Account for positive content-box scroll gutter when requested by providing computedVal
+ if (!isBorderBox && computedVal >= 0) {
+
+ // offsetWidth/offsetHeight is a rounded sum of content, padding, scroll gutter, and border
+ // Assuming integer scroll gutter, subtract the rest and round down
+ delta += Math.max(0, Math.ceil(
+ elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] -
+ computedVal -
+ delta -
+ extra -
+ 0.5
+ ));
+ }
+
+ return delta;
+ }
+
+ function getWidthOrHeight(elem, dimension, extra) {
+
+ // Start with computed style
+ var styles = getStyles(elem),
+ val = curCSS(elem, dimension, styles),
+ isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box",
+ valueIsBorderBox = isBorderBox;
+
+ // Support: Firefox <=54
+ // Return a confounding non-pixel value or feign ignorance, as appropriate.
+ if (rnumnonpx.test(val)) {
+ if (!extra) {
+ return val;
+ }
+ val = "auto";
+ }
+
+ // Check for style in case a browser which returns unreliable values
+ // for getComputedStyle silently falls back to the reliable elem.style
+ valueIsBorderBox = valueIsBorderBox &&
+ (support.boxSizingReliable() || val === elem.style[dimension]);
+
+ // Fall back to offsetWidth/offsetHeight when value is "auto"
+ // This happens for inline elements with no explicit setting (gh-3571)
+ // Support: Android <=4.1 - 4.3 only
+ // Also use offsetWidth/offsetHeight for misreported inline dimensions (gh-3602)
+ if (val === "auto" ||
+ !parseFloat(val) && jQuery.css(elem, "display", false, styles) === "inline") {
+
+ val = elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)];
+
+ // offsetWidth/offsetHeight provide border-box values
+ valueIsBorderBox = true;
+ }
+
+ // Normalize "" and auto
+ val = parseFloat(val) || 0;
+
+ // Adjust for the element's box model
+ return (val +
+ boxModelAdjustment(
+ elem,
+ dimension,
+ extra || (isBorderBox ? "border" : "content"),
+ valueIsBorderBox,
+ styles,
+
+ // Provide the current computed size to request scroll gutter calculation (gh-3589)
+ val
+ )
+ ) + "px";
+ }
+
+ jQuery.extend({
+
+ // Add in style property hooks for overriding the default
+ // behavior of getting and setting a style property
+ cssHooks: {
+ opacity: {
+ get: function (elem, computed) {
+ if (computed) {
+
+ // We should always get a number back from opacity
+ var ret = curCSS(elem, "opacity");
+ return ret === "" ? "1" : ret;
+ }
+ }
+ }
+ },
+
+ // Don't automatically add "px" to these possibly-unitless properties
+ cssNumber: {
+ "animationIterationCount": true,
+ "columnCount": true,
+ "fillOpacity": true,
+ "flexGrow": true,
+ "flexShrink": true,
+ "fontWeight": true,
+ "lineHeight": true,
+ "opacity": true,
+ "order": true,
+ "orphans": true,
+ "widows": true,
+ "zIndex": true,
+ "zoom": true
+ },
+
+ // Add in properties whose names you wish to fix before
+ // setting or getting the value
+ cssProps: {},
+
+ // Get and set the style property on a DOM Node
+ style: function (elem, name, value, extra) {
+
+ // Don't set styles on text and comment nodes
+ if (!elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style) {
+ return;
+ }
+
+ // Make sure that we're working with the right name
+ var ret, type, hooks,
+ origName = camelCase(name),
+ isCustomProp = rcustomProp.test(name),
+ style = elem.style;
+
+ // Make sure that we're working with the right name. We don't
+ // want to query the value if it is a CSS custom property
+ // since they are user-defined.
+ if (!isCustomProp) {
+ name = finalPropName(origName);
+ }
+
+ // Gets hook for the prefixed version, then unprefixed version
+ hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
+
+ // Check if we're setting a value
+ if (value !== undefined) {
+ type = typeof value;
+
+ // Convert "+=" or "-=" to relative numbers (#7345)
+ if (type === "string" && (ret = rcssNum.exec(value)) && ret[1]) {
+ value = adjustCSS(elem, name, ret);
+
+ // Fixes bug #9237
+ type = "number";
+ }
+
+ // Make sure that null and NaN values aren't set (#7116)
+ if (value == null || value !== value) {
+ return;
+ }
+
+ // If a number was passed in, add the unit (except for certain CSS properties)
+ if (type === "number") {
+ value += ret && ret[3] || (jQuery.cssNumber[origName] ? "" : "px");
+ }
+
+ // background-* props affect original clone's values
+ if (!support.clearCloneStyle && value === "" && name.indexOf("background") === 0) {
+ style[name] = "inherit";
+ }
+
+ // If a hook was provided, use that value, otherwise just set the specified value
+ if (!hooks || !("set" in hooks) ||
+ (value = hooks.set(elem, value, extra)) !== undefined) {
+
+ if (isCustomProp) {
+ style.setProperty(name, value);
+ } else {
+ style[name] = value;
+ }
+ }
+
+ } else {
+
+ // If a hook was provided get the non-computed value from there
+ if (hooks && "get" in hooks &&
+ (ret = hooks.get(elem, false, extra)) !== undefined) {
+
+ return ret;
+ }
+
+ // Otherwise just get the value from the style object
+ return style[name];
+ }
+ },
+
+ css: function (elem, name, extra, styles) {
+ var val, num, hooks,
+ origName = camelCase(name),
+ isCustomProp = rcustomProp.test(name);
+
+ // Make sure that we're working with the right name. We don't
+ // want to modify the value if it is a CSS custom property
+ // since they are user-defined.
+ if (!isCustomProp) {
+ name = finalPropName(origName);
+ }
+
+ // Try prefixed name followed by the unprefixed name
+ hooks = jQuery.cssHooks[name] || jQuery.cssHooks[origName];
+
+ // If a hook was provided get the computed value from there
+ if (hooks && "get" in hooks) {
+ val = hooks.get(elem, true, extra);
+ }
+
+ // Otherwise, if a way to get the computed value exists, use that
+ if (val === undefined) {
+ val = curCSS(elem, name, styles);
+ }
+
+ // Convert "normal" to computed value
+ if (val === "normal" && name in cssNormalTransform) {
+ val = cssNormalTransform[name];
+ }
+
+ // Make numeric if forced or a qualifier was provided and val looks numeric
+ if (extra === "" || extra) {
+ num = parseFloat(val);
+ return extra === true || isFinite(num) ? num || 0 : val;
+ }
+
+ return val;
+ }
+ });
+
+ jQuery.each(["height", "width"], function (i, dimension) {
+ jQuery.cssHooks[dimension] = {
+ get: function (elem, computed, extra) {
+ if (computed) {
+
+ // Certain elements can have dimension info if we invisibly show them
+ // but it must have a current display style that would benefit
+ return rdisplayswap.test(jQuery.css(elem, "display")) &&
+
+ // Support: Safari 8+
+ // Table columns in Safari have non-zero offsetWidth & zero
+ // getBoundingClientRect().width unless display is changed.
+ // Support: IE <=11 only
+ // Running getBoundingClientRect on a disconnected node
+ // in IE throws an error.
+ (!elem.getClientRects().length || !elem.getBoundingClientRect().width) ?
+ swap(elem, cssShow, function () {
+ return getWidthOrHeight(elem, dimension, extra);
+ }) :
+ getWidthOrHeight(elem, dimension, extra);
+ }
+ },
+
+ set: function (elem, value, extra) {
+ var matches,
+ styles = getStyles(elem),
+ isBorderBox = jQuery.css(elem, "boxSizing", false, styles) === "border-box",
+ subtract = extra && boxModelAdjustment(
+ elem,
+ dimension,
+ extra,
+ isBorderBox,
+ styles
+ );
+
+ // Account for unreliable border-box dimensions by comparing offset* to computed and
+ // faking a content-box to get border and padding (gh-3699)
+ if (isBorderBox && support.scrollboxSize() === styles.position) {
+ subtract -= Math.ceil(
+ elem["offset" + dimension[0].toUpperCase() + dimension.slice(1)] -
+ parseFloat(styles[dimension]) -
+ boxModelAdjustment(elem, dimension, "border", false, styles) -
+ 0.5
+ );
+ }
+
+ // Convert to pixels if value adjustment is needed
+ if (subtract && (matches = rcssNum.exec(value)) &&
+ (matches[3] || "px") !== "px") {
+
+ elem.style[dimension] = value;
+ value = jQuery.css(elem, dimension);
+ }
+
+ return setPositiveNumber(elem, value, subtract);
+ }
+ };
+ });
+
+ jQuery.cssHooks.marginLeft = addGetHookIf(support.reliableMarginLeft,
+ function (elem, computed) {
+ if (computed) {
+ return (parseFloat(curCSS(elem, "marginLeft")) ||
+ elem.getBoundingClientRect().left -
+ swap(elem, {marginLeft: 0}, function () {
+ return elem.getBoundingClientRect().left;
+ })
+ ) + "px";
+ }
+ }
+ );
+
+ // These hooks are used by animate to expand properties
+ jQuery.each({
+ margin: "",
+ padding: "",
+ border: "Width"
+ }, function (prefix, suffix) {
+ jQuery.cssHooks[prefix + suffix] = {
+ expand: function (value) {
+ var i = 0,
+ expanded = {},
+
+ // Assumes a single number if not a string
+ parts = typeof value === "string" ? value.split(" ") : [value];
+
+ for (; i < 4; i++) {
+ expanded[prefix + cssExpand[i] + suffix] =
+ parts[i] || parts[i - 2] || parts[0];
+ }
+
+ return expanded;
+ }
+ };
+
+ if (prefix !== "margin") {
+ jQuery.cssHooks[prefix + suffix].set = setPositiveNumber;
+ }
+ });
+
+ jQuery.fn.extend({
+ css: function (name, value) {
+ return access(this, function (elem, name, value) {
+ var styles, len,
+ map = {},
+ i = 0;
+
+ if (Array.isArray(name)) {
+ styles = getStyles(elem);
+ len = name.length;
+
+ for (; i < len; i++) {
+ map[name[i]] = jQuery.css(elem, name[i], false, styles);
+ }
+
+ return map;
+ }
+
+ return value !== undefined ?
+ jQuery.style(elem, name, value) :
+ jQuery.css(elem, name);
+ }, name, value, arguments.length > 1);
+ }
+ });
+
+
+ function Tween(elem, options, prop, end, easing) {
+ return new Tween.prototype.init(elem, options, prop, end, easing);
+ }
+
+ jQuery.Tween = Tween;
+
+ Tween.prototype = {
+ constructor: Tween,
+ init: function (elem, options, prop, end, easing, unit) {
+ this.elem = elem;
+ this.prop = prop;
+ this.easing = easing || jQuery.easing._default;
+ this.options = options;
+ this.start = this.now = this.cur();
+ this.end = end;
+ this.unit = unit || (jQuery.cssNumber[prop] ? "" : "px");
+ },
+ cur: function () {
+ var hooks = Tween.propHooks[this.prop];
+
+ return hooks && hooks.get ?
+ hooks.get(this) :
+ Tween.propHooks._default.get(this);
+ },
+ run: function (percent) {
+ var eased,
+ hooks = Tween.propHooks[this.prop];
+
+ if (this.options.duration) {
+ this.pos = eased = jQuery.easing[this.easing](
+ percent, this.options.duration * percent, 0, 1, this.options.duration
+ );
+ } else {
+ this.pos = eased = percent;
+ }
+ this.now = (this.end - this.start) * eased + this.start;
+
+ if (this.options.step) {
+ this.options.step.call(this.elem, this.now, this);
+ }
+
+ if (hooks && hooks.set) {
+ hooks.set(this);
+ } else {
+ Tween.propHooks._default.set(this);
+ }
+ return this;
+ }
+ };
+
+ Tween.prototype.init.prototype = Tween.prototype;
+
+ Tween.propHooks = {
+ _default: {
+ get: function (tween) {
+ var result;
+
+ // Use a property on the element directly when it is not a DOM element,
+ // or when there is no matching style property that exists.
+ if (tween.elem.nodeType !== 1 ||
+ tween.elem[tween.prop] != null && tween.elem.style[tween.prop] == null) {
+ return tween.elem[tween.prop];
+ }
+
+ // Passing an empty string as a 3rd parameter to .css will automatically
+ // attempt a parseFloat and fallback to a string if the parse fails.
+ // Simple values such as "10px" are parsed to Float;
+ // complex values such as "rotate(1rad)" are returned as-is.
+ result = jQuery.css(tween.elem, tween.prop, "");
+
+ // Empty strings, null, undefined and "auto" are converted to 0.
+ return !result || result === "auto" ? 0 : result;
+ },
+ set: function (tween) {
+
+ // Use step hook for back compat.
+ // Use cssHook if its there.
+ // Use .style if available and use plain properties where available.
+ if (jQuery.fx.step[tween.prop]) {
+ jQuery.fx.step[tween.prop](tween);
+ } else if (tween.elem.nodeType === 1 &&
+ (tween.elem.style[jQuery.cssProps[tween.prop]] != null ||
+ jQuery.cssHooks[tween.prop])) {
+ jQuery.style(tween.elem, tween.prop, tween.now + tween.unit);
+ } else {
+ tween.elem[tween.prop] = tween.now;
+ }
+ }
+ }
+ };
+
+ // Support: IE <=9 only
+ // Panic based approach to setting things on disconnected nodes
+ Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+ set: function (tween) {
+ if (tween.elem.nodeType && tween.elem.parentNode) {
+ tween.elem[tween.prop] = tween.now;
+ }
+ }
+ };
+
+ jQuery.easing = {
+ linear: function (p) {
+ return p;
+ },
+ swing: function (p) {
+ return 0.5 - Math.cos(p * Math.PI) / 2;
+ },
+ _default: "swing"
+ };
+
+ jQuery.fx = Tween.prototype.init;
+
+ // Back compat <1.8 extension point
+ jQuery.fx.step = {};
+
+
+ var
+ fxNow, inProgress,
+ rfxtypes = /^(?:toggle|show|hide)$/,
+ rrun = /queueHooks$/;
+
+ function schedule() {
+ if (inProgress) {
+ if (document.hidden === false && window.requestAnimationFrame) {
+ window.requestAnimationFrame(schedule);
+ } else {
+ window.setTimeout(schedule, jQuery.fx.interval);
+ }
+
+ jQuery.fx.tick();
+ }
+ }
+
+ // Animations created synchronously will run synchronously
+ function createFxNow() {
+ window.setTimeout(function () {
+ fxNow = undefined;
+ });
+ return (fxNow = Date.now());
+ }
+
+ // Generate parameters to create a standard animation
+ function genFx(type, includeWidth) {
+ var which,
+ i = 0,
+ attrs = {height: type};
+
+ // If we include width, step value is 1 to do all cssExpand values,
+ // otherwise step value is 2 to skip over Left and Right
+ includeWidth = includeWidth ? 1 : 0;
+ for (; i < 4; i += 2 - includeWidth) {
+ which = cssExpand[i];
+ attrs["margin" + which] = attrs["padding" + which] = type;
+ }
+
+ if (includeWidth) {
+ attrs.opacity = attrs.width = type;
+ }
+
+ return attrs;
+ }
+
+ function createTween(value, prop, animation) {
+ var tween,
+ collection = (Animation.tweeners[prop] || []).concat(Animation.tweeners["*"]),
+ index = 0,
+ length = collection.length;
+ for (; index < length; index++) {
+ if ((tween = collection[index].call(animation, prop, value))) {
+
+ // We're done with this property
+ return tween;
+ }
+ }
+ }
+
+ function defaultPrefilter(elem, props, opts) {
+ var prop, value, toggle, hooks, oldfire, propTween, restoreDisplay, display,
+ isBox = "width" in props || "height" in props,
+ anim = this,
+ orig = {},
+ style = elem.style,
+ hidden = elem.nodeType && isHiddenWithinTree(elem),
+ dataShow = dataPriv.get(elem, "fxshow");
+
+ // Queue-skipping animations hijack the fx hooks
+ if (!opts.queue) {
+ hooks = jQuery._queueHooks(elem, "fx");
+ if (hooks.unqueued == null) {
+ hooks.unqueued = 0;
+ oldfire = hooks.empty.fire;
+ hooks.empty.fire = function () {
+ if (!hooks.unqueued) {
+ oldfire();
+ }
+ };
+ }
+ hooks.unqueued++;
+
+ anim.always(function () {
+
+ // Ensure the complete handler is called before this completes
+ anim.always(function () {
+ hooks.unqueued--;
+ if (!jQuery.queue(elem, "fx").length) {
+ hooks.empty.fire();
+ }
+ });
+ });
+ }
+
+ // Detect show/hide animations
+ for (prop in props) {
+ value = props[prop];
+ if (rfxtypes.test(value)) {
+ delete props[prop];
+ toggle = toggle || value === "toggle";
+ if (value === (hidden ? "hide" : "show")) {
+
+ // Pretend to be hidden if this is a "show" and
+ // there is still data from a stopped show/hide
+ if (value === "show" && dataShow && dataShow[prop] !== undefined) {
+ hidden = true;
+
+ // Ignore all other no-op show/hide data
+ } else {
+ continue;
+ }
+ }
+ orig[prop] = dataShow && dataShow[prop] || jQuery.style(elem, prop);
+ }
+ }
+
+ // Bail out if this is a no-op like .hide().hide()
+ propTween = !jQuery.isEmptyObject(props);
+ if (!propTween && jQuery.isEmptyObject(orig)) {
+ return;
+ }
+
+ // Restrict "overflow" and "display" styles during box animations
+ if (isBox && elem.nodeType === 1) {
+
+ // Support: IE <=9 - 11, Edge 12 - 15
+ // Record all 3 overflow attributes because IE does not infer the shorthand
+ // from identically-valued overflowX and overflowY and Edge just mirrors
+ // the overflowX value there.
+ opts.overflow = [style.overflow, style.overflowX, style.overflowY];
+
+ // Identify a display type, preferring old show/hide data over the CSS cascade
+ restoreDisplay = dataShow && dataShow.display;
+ if (restoreDisplay == null) {
+ restoreDisplay = dataPriv.get(elem, "display");
+ }
+ display = jQuery.css(elem, "display");
+ if (display === "none") {
+ if (restoreDisplay) {
+ display = restoreDisplay;
+ } else {
+
+ // Get nonempty value(s) by temporarily forcing visibility
+ showHide([elem], true);
+ restoreDisplay = elem.style.display || restoreDisplay;
+ display = jQuery.css(elem, "display");
+ showHide([elem]);
+ }
+ }
+
+ // Animate inline elements as inline-block
+ if (display === "inline" || display === "inline-block" && restoreDisplay != null) {
+ if (jQuery.css(elem, "float") === "none") {
+
+ // Restore the original display value at the end of pure show/hide animations
+ if (!propTween) {
+ anim.done(function () {
+ style.display = restoreDisplay;
+ });
+ if (restoreDisplay == null) {
+ display = style.display;
+ restoreDisplay = display === "none" ? "" : display;
+ }
+ }
+ style.display = "inline-block";
+ }
+ }
+ }
+
+ if (opts.overflow) {
+ style.overflow = "hidden";
+ anim.always(function () {
+ style.overflow = opts.overflow[0];
+ style.overflowX = opts.overflow[1];
+ style.overflowY = opts.overflow[2];
+ });
+ }
+
+ // Implement show/hide animations
+ propTween = false;
+ for (prop in orig) {
+
+ // General show/hide setup for this element animation
+ if (!propTween) {
+ if (dataShow) {
+ if ("hidden" in dataShow) {
+ hidden = dataShow.hidden;
+ }
+ } else {
+ dataShow = dataPriv.access(elem, "fxshow", {display: restoreDisplay});
+ }
+
+ // Store hidden/visible for toggle so `.stop().toggle()` "reverses"
+ if (toggle) {
+ dataShow.hidden = !hidden;
+ }
+
+ // Show elements before animating them
+ if (hidden) {
+ showHide([elem], true);
+ }
+
+ /* eslint-disable no-loop-func */
+
+ anim.done(function () {
+
+ /* eslint-enable no-loop-func */
+
+ // The final step of a "hide" animation is actually hiding the element
+ if (!hidden) {
+ showHide([elem]);
+ }
+ dataPriv.remove(elem, "fxshow");
+ for (prop in orig) {
+ jQuery.style(elem, prop, orig[prop]);
+ }
+ });
+ }
+
+ // Per-property setup
+ propTween = createTween(hidden ? dataShow[prop] : 0, prop, anim);
+ if (!(prop in dataShow)) {
+ dataShow[prop] = propTween.start;
+ if (hidden) {
+ propTween.end = propTween.start;
+ propTween.start = 0;
+ }
+ }
+ }
+ }
+
+ function propFilter(props, specialEasing) {
+ var index, name, easing, value, hooks;
+
+ // camelCase, specialEasing and expand cssHook pass
+ for (index in props) {
+ name = camelCase(index);
+ easing = specialEasing[name];
+ value = props[index];
+ if (Array.isArray(value)) {
+ easing = value[1];
+ value = props[index] = value[0];
+ }
+
+ if (index !== name) {
+ props[name] = value;
+ delete props[index];
+ }
+
+ hooks = jQuery.cssHooks[name];
+ if (hooks && "expand" in hooks) {
+ value = hooks.expand(value);
+ delete props[name];
+
+ // Not quite $.extend, this won't overwrite existing keys.
+ // Reusing 'index' because we have the correct "name"
+ for (index in value) {
+ if (!(index in props)) {
+ props[index] = value[index];
+ specialEasing[index] = easing;
+ }
+ }
+ } else {
+ specialEasing[name] = easing;
+ }
+ }
+ }
+
+ function Animation(elem, properties, options) {
+ var result,
+ stopped,
+ index = 0,
+ length = Animation.prefilters.length,
+ deferred = jQuery.Deferred().always(function () {
+
+ // Don't match elem in the :animated selector
+ delete tick.elem;
+ }),
+ tick = function () {
+ if (stopped) {
+ return false;
+ }
+ var currentTime = fxNow || createFxNow(),
+ remaining = Math.max(0, animation.startTime + animation.duration - currentTime),
+
+ // Support: Android 2.3 only
+ // Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
+ temp = remaining / animation.duration || 0,
+ percent = 1 - temp,
+ index = 0,
+ length = animation.tweens.length;
+
+ for (; index < length; index++) {
+ animation.tweens[index].run(percent);
+ }
+
+ deferred.notifyWith(elem, [animation, percent, remaining]);
+
+ // If there's more to do, yield
+ if (percent < 1 && length) {
+ return remaining;
+ }
+
+ // If this was an empty animation, synthesize a final progress notification
+ if (!length) {
+ deferred.notifyWith(elem, [animation, 1, 0]);
+ }
+
+ // Resolve the animation and report its conclusion
+ deferred.resolveWith(elem, [animation]);
+ return false;
+ },
+ animation = deferred.promise({
+ elem: elem,
+ props: jQuery.extend({}, properties),
+ opts: jQuery.extend(true, {
+ specialEasing: {},
+ easing: jQuery.easing._default
+ }, options),
+ originalProperties: properties,
+ originalOptions: options,
+ startTime: fxNow || createFxNow(),
+ duration: options.duration,
+ tweens: [],
+ createTween: function (prop, end) {
+ var tween = jQuery.Tween(elem, animation.opts, prop, end,
+ animation.opts.specialEasing[prop] || animation.opts.easing);
+ animation.tweens.push(tween);
+ return tween;
+ },
+ stop: function (gotoEnd) {
+ var index = 0,
+
+ // If we are going to the end, we want to run all the tweens
+ // otherwise we skip this part
+ length = gotoEnd ? animation.tweens.length : 0;
+ if (stopped) {
+ return this;
+ }
+ stopped = true;
+ for (; index < length; index++) {
+ animation.tweens[index].run(1);
+ }
+
+ // Resolve when we played the last frame; otherwise, reject
+ if (gotoEnd) {
+ deferred.notifyWith(elem, [animation, 1, 0]);
+ deferred.resolveWith(elem, [animation, gotoEnd]);
+ } else {
+ deferred.rejectWith(elem, [animation, gotoEnd]);
+ }
+ return this;
+ }
+ }),
+ props = animation.props;
+
+ propFilter(props, animation.opts.specialEasing);
+
+ for (; index < length; index++) {
+ result = Animation.prefilters[index].call(animation, elem, props, animation.opts);
+ if (result) {
+ if (isFunction(result.stop)) {
+ jQuery._queueHooks(animation.elem, animation.opts.queue).stop =
+ result.stop.bind(result);
+ }
+ return result;
+ }
+ }
+
+ jQuery.map(props, createTween, animation);
+
+ if (isFunction(animation.opts.start)) {
+ animation.opts.start.call(elem, animation);
+ }
+
+ // Attach callbacks from options
+ animation
+ .progress(animation.opts.progress)
+ .done(animation.opts.done, animation.opts.complete)
+ .fail(animation.opts.fail)
+ .always(animation.opts.always);
+
+ jQuery.fx.timer(
+ jQuery.extend(tick, {
+ elem: elem,
+ anim: animation,
+ queue: animation.opts.queue
+ })
+ );
+
+ return animation;
+ }
+
+ jQuery.Animation = jQuery.extend(Animation, {
+
+ tweeners: {
+ "*": [function (prop, value) {
+ var tween = this.createTween(prop, value);
+ adjustCSS(tween.elem, prop, rcssNum.exec(value), tween);
+ return tween;
+ }]
+ },
+
+ tweener: function (props, callback) {
+ if (isFunction(props)) {
+ callback = props;
+ props = ["*"];
+ } else {
+ props = props.match(rnothtmlwhite);
+ }
+
+ var prop,
+ index = 0,
+ length = props.length;
+
+ for (; index < length; index++) {
+ prop = props[index];
+ Animation.tweeners[prop] = Animation.tweeners[prop] || [];
+ Animation.tweeners[prop].unshift(callback);
+ }
+ },
+
+ prefilters: [defaultPrefilter],
+
+ prefilter: function (callback, prepend) {
+ if (prepend) {
+ Animation.prefilters.unshift(callback);
+ } else {
+ Animation.prefilters.push(callback);
+ }
+ }
+ });
+
+ jQuery.speed = function (speed, easing, fn) {
+ var opt = speed && typeof speed === "object" ? jQuery.extend({}, speed) : {
+ complete: fn || !fn && easing ||
+ isFunction(speed) && speed,
+ duration: speed,
+ easing: fn && easing || easing && !isFunction(easing) && easing
+ };
+
+ // Go to the end state if fx are off
+ if (jQuery.fx.off) {
+ opt.duration = 0;
+
+ } else {
+ if (typeof opt.duration !== "number") {
+ if (opt.duration in jQuery.fx.speeds) {
+ opt.duration = jQuery.fx.speeds[opt.duration];
+
+ } else {
+ opt.duration = jQuery.fx.speeds._default;
+ }
+ }
+ }
+
+ // Normalize opt.queue - true/undefined/null -> "fx"
+ if (opt.queue == null || opt.queue === true) {
+ opt.queue = "fx";
+ }
+
+ // Queueing
+ opt.old = opt.complete;
+
+ opt.complete = function () {
+ if (isFunction(opt.old)) {
+ opt.old.call(this);
+ }
+
+ if (opt.queue) {
+ jQuery.dequeue(this, opt.queue);
+ }
+ };
+
+ return opt;
+ };
+
+ jQuery.fn.extend({
+ fadeTo: function (speed, to, easing, callback) {
+
+ // Show any hidden elements after setting opacity to 0
+ return this.filter(isHiddenWithinTree).css("opacity", 0).show()
+
+ // Animate to the value specified
+ .end().animate({opacity: to}, speed, easing, callback);
+ },
+ animate: function (prop, speed, easing, callback) {
+ var empty = jQuery.isEmptyObject(prop),
+ optall = jQuery.speed(speed, easing, callback),
+ doAnimation = function () {
+
+ // Operate on a copy of prop so per-property easing won't be lost
+ var anim = Animation(this, jQuery.extend({}, prop), optall);
+
+ // Empty animations, or finishing resolves immediately
+ if (empty || dataPriv.get(this, "finish")) {
+ anim.stop(true);
+ }
+ };
+ doAnimation.finish = doAnimation;
+
+ return empty || optall.queue === false ?
+ this.each(doAnimation) :
+ this.queue(optall.queue, doAnimation);
+ },
+ stop: function (type, clearQueue, gotoEnd) {
+ var stopQueue = function (hooks) {
+ var stop = hooks.stop;
+ delete hooks.stop;
+ stop(gotoEnd);
+ };
+
+ if (typeof type !== "string") {
+ gotoEnd = clearQueue;
+ clearQueue = type;
+ type = undefined;
+ }
+ if (clearQueue && type !== false) {
+ this.queue(type || "fx", []);
+ }
+
+ return this.each(function () {
+ var dequeue = true,
+ index = type != null && type + "queueHooks",
+ timers = jQuery.timers,
+ data = dataPriv.get(this);
+
+ if (index) {
+ if (data[index] && data[index].stop) {
+ stopQueue(data[index]);
+ }
+ } else {
+ for (index in data) {
+ if (data[index] && data[index].stop && rrun.test(index)) {
+ stopQueue(data[index]);
+ }
+ }
+ }
+
+ for (index = timers.length; index--;) {
+ if (timers[index].elem === this &&
+ (type == null || timers[index].queue === type)) {
+
+ timers[index].anim.stop(gotoEnd);
+ dequeue = false;
+ timers.splice(index, 1);
+ }
+ }
+
+ // Start the next in the queue if the last step wasn't forced.
+ // Timers currently will call their complete callbacks, which
+ // will dequeue but only if they were gotoEnd.
+ if (dequeue || !gotoEnd) {
+ jQuery.dequeue(this, type);
+ }
+ });
+ },
+ finish: function (type) {
+ if (type !== false) {
+ type = type || "fx";
+ }
+ return this.each(function () {
+ var index,
+ data = dataPriv.get(this),
+ queue = data[type + "queue"],
+ hooks = data[type + "queueHooks"],
+ timers = jQuery.timers,
+ length = queue ? queue.length : 0;
+
+ // Enable finishing flag on private data
+ data.finish = true;
+
+ // Empty the queue first
+ jQuery.queue(this, type, []);
+
+ if (hooks && hooks.stop) {
+ hooks.stop.call(this, true);
+ }
+
+ // Look for any active animations, and finish them
+ for (index = timers.length; index--;) {
+ if (timers[index].elem === this && timers[index].queue === type) {
+ timers[index].anim.stop(true);
+ timers.splice(index, 1);
+ }
+ }
+
+ // Look for any animations in the old queue and finish them
+ for (index = 0; index < length; index++) {
+ if (queue[index] && queue[index].finish) {
+ queue[index].finish.call(this);
+ }
+ }
+
+ // Turn off finishing flag
+ delete data.finish;
+ });
+ }
+ });
+
+ jQuery.each(["toggle", "show", "hide"], function (i, name) {
+ var cssFn = jQuery.fn[name];
+ jQuery.fn[name] = function (speed, easing, callback) {
+ return speed == null || typeof speed === "boolean" ?
+ cssFn.apply(this, arguments) :
+ this.animate(genFx(name, true), speed, easing, callback);
+ };
+ });
+
+ // Generate shortcuts for custom animations
+ jQuery.each({
+ slideDown: genFx("show"),
+ slideUp: genFx("hide"),
+ slideToggle: genFx("toggle"),
+ fadeIn: {opacity: "show"},
+ fadeOut: {opacity: "hide"},
+ fadeToggle: {opacity: "toggle"}
+ }, function (name, props) {
+ jQuery.fn[name] = function (speed, easing, callback) {
+ return this.animate(props, speed, easing, callback);
+ };
+ });
+
+ jQuery.timers = [];
+ jQuery.fx.tick = function () {
+ var timer,
+ i = 0,
+ timers = jQuery.timers;
+
+ fxNow = Date.now();
+
+ for (; i < timers.length; i++) {
+ timer = timers[i];
+
+ // Run the timer and safely remove it when done (allowing for external removal)
+ if (!timer() && timers[i] === timer) {
+ timers.splice(i--, 1);
+ }
+ }
+
+ if (!timers.length) {
+ jQuery.fx.stop();
+ }
+ fxNow = undefined;
+ };
+
+ jQuery.fx.timer = function (timer) {
+ jQuery.timers.push(timer);
+ jQuery.fx.start();
+ };
+
+ jQuery.fx.interval = 13;
+ jQuery.fx.start = function () {
+ if (inProgress) {
+ return;
+ }
+
+ inProgress = true;
+ schedule();
+ };
+
+ jQuery.fx.stop = function () {
+ inProgress = null;
+ };
+
+ jQuery.fx.speeds = {
+ slow: 600,
+ fast: 200,
+
+ // Default speed
+ _default: 400
+ };
+
+
+ // Based off of the plugin by Clint Helfers, with permission.
+ // https://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
+ jQuery.fn.delay = function (time, type) {
+ time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
+ type = type || "fx";
+
+ return this.queue(type, function (next, hooks) {
+ var timeout = window.setTimeout(next, time);
+ hooks.stop = function () {
+ window.clearTimeout(timeout);
+ };
+ });
+ };
+
+
+ (function () {
+ var input = document.createElement("input"),
+ select = document.createElement("select"),
+ opt = select.appendChild(document.createElement("option"));
+
+ input.type = "checkbox";
+
+ // Support: Android <=4.3 only
+ // Default value for a checkbox should be "on"
+ support.checkOn = input.value !== "";
+
+ // Support: IE <=11 only
+ // Must access selectedIndex to make default options select
+ support.optSelected = opt.selected;
+
+ // Support: IE <=11 only
+ // An input loses its value after becoming a radio
+ input = document.createElement("input");
+ input.value = "t";
+ input.type = "radio";
+ support.radioValue = input.value === "t";
+ })();
+
+
+ var boolHook,
+ attrHandle = jQuery.expr.attrHandle;
+
+ jQuery.fn.extend({
+ attr: function (name, value) {
+ return access(this, jQuery.attr, name, value, arguments.length > 1);
+ },
+
+ removeAttr: function (name) {
+ return this.each(function () {
+ jQuery.removeAttr(this, name);
+ });
+ }
+ });
+
+ jQuery.extend({
+ attr: function (elem, name, value) {
+ var ret, hooks,
+ nType = elem.nodeType;
+
+ // Don't get/set attributes on text, comment and attribute nodes
+ if (nType === 3 || nType === 8 || nType === 2) {
+ return;
+ }
+
+ // Fallback to prop when attributes are not supported
+ if (typeof elem.getAttribute === "undefined") {
+ return jQuery.prop(elem, name, value);
+ }
+
+ // Attribute hooks are determined by the lowercase version
+ // Grab necessary hook if one is defined
+ if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
+ hooks = jQuery.attrHooks[name.toLowerCase()] ||
+ (jQuery.expr.match.bool.test(name) ? boolHook : undefined);
+ }
+
+ if (value !== undefined) {
+ if (value === null) {
+ jQuery.removeAttr(elem, name);
+ return;
+ }
+
+ if (hooks && "set" in hooks &&
+ (ret = hooks.set(elem, value, name)) !== undefined) {
+ return ret;
+ }
+
+ elem.setAttribute(name, value + "");
+ return value;
+ }
+
+ if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
+ return ret;
+ }
+
+ ret = jQuery.find.attr(elem, name);
+
+ // Non-existent attributes return null, we normalize to undefined
+ return ret == null ? undefined : ret;
+ },
+
+ attrHooks: {
+ type: {
+ set: function (elem, value) {
+ if (!support.radioValue && value === "radio" &&
+ nodeName(elem, "input")) {
+ var val = elem.value;
+ elem.setAttribute("type", value);
+ if (val) {
+ elem.value = val;
+ }
+ return value;
+ }
+ }
+ }
+ },
+
+ removeAttr: function (elem, value) {
+ var name,
+ i = 0,
+
+ // Attribute names can contain non-HTML whitespace characters
+ // https://html.spec.whatwg.org/multipage/syntax.html#attributes-2
+ attrNames = value && value.match(rnothtmlwhite);
+
+ if (attrNames && elem.nodeType === 1) {
+ while ((name = attrNames[i++])) {
+ elem.removeAttribute(name);
+ }
+ }
+ }
+ });
+
+ // Hooks for boolean attributes
+ boolHook = {
+ set: function (elem, value, name) {
+ if (value === false) {
+
+ // Remove boolean attributes when set to false
+ jQuery.removeAttr(elem, name);
+ } else {
+ elem.setAttribute(name, name);
+ }
+ return name;
+ }
+ };
+
+ jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g), function (i, name) {
+ var getter = attrHandle[name] || jQuery.find.attr;
+
+ attrHandle[name] = function (elem, name, isXML) {
+ var ret, handle,
+ lowercaseName = name.toLowerCase();
+
+ if (!isXML) {
+
+ // Avoid an infinite loop by temporarily removing this function from the getter
+ handle = attrHandle[lowercaseName];
+ attrHandle[lowercaseName] = ret;
+ ret = getter(elem, name, isXML) != null ?
+ lowercaseName :
+ null;
+ attrHandle[lowercaseName] = handle;
+ }
+ return ret;
+ };
+ });
+
+
+ var rfocusable = /^(?:input|select|textarea|button)$/i,
+ rclickable = /^(?:a|area)$/i;
+
+ jQuery.fn.extend({
+ prop: function (name, value) {
+ return access(this, jQuery.prop, name, value, arguments.length > 1);
+ },
+
+ removeProp: function (name) {
+ return this.each(function () {
+ delete this[jQuery.propFix[name] || name];
+ });
+ }
+ });
+
+ jQuery.extend({
+ prop: function (elem, name, value) {
+ var ret, hooks,
+ nType = elem.nodeType;
+
+ // Don't get/set properties on text, comment and attribute nodes
+ if (nType === 3 || nType === 8 || nType === 2) {
+ return;
+ }
+
+ if (nType !== 1 || !jQuery.isXMLDoc(elem)) {
+
+ // Fix name and attach hooks
+ name = jQuery.propFix[name] || name;
+ hooks = jQuery.propHooks[name];
+ }
+
+ if (value !== undefined) {
+ if (hooks && "set" in hooks &&
+ (ret = hooks.set(elem, value, name)) !== undefined) {
+ return ret;
+ }
+
+ return (elem[name] = value);
+ }
+
+ if (hooks && "get" in hooks && (ret = hooks.get(elem, name)) !== null) {
+ return ret;
+ }
+
+ return elem[name];
+ },
+
+ propHooks: {
+ tabIndex: {
+ get: function (elem) {
+
+ // Support: IE <=9 - 11 only
+ // elem.tabIndex doesn't always return the
+ // correct value when it hasn't been explicitly set
+ // https://web.archive.org/web/20141116233347/http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+ // Use proper attribute retrieval(#12072)
+ var tabindex = jQuery.find.attr(elem, "tabindex");
+
+ if (tabindex) {
+ return parseInt(tabindex, 10);
+ }
+
+ if (
+ rfocusable.test(elem.nodeName) ||
+ rclickable.test(elem.nodeName) &&
+ elem.href
+ ) {
+ return 0;
+ }
+
+ return -1;
+ }
+ }
+ },
+
+ propFix: {
+ "for": "htmlFor",
+ "class": "className"
+ }
+ });
+
+ // Support: IE <=11 only
+ // Accessing the selectedIndex property
+ // forces the browser to respect setting selected
+ // on the option
+ // The getter ensures a default option is selected
+ // when in an optgroup
+ // eslint rule "no-unused-expressions" is disabled for this code
+ // since it considers such accessions noop
+ if (!support.optSelected) {
+ jQuery.propHooks.selected = {
+ get: function (elem) {
+
+ /* eslint no-unused-expressions: "off" */
+
+ var parent = elem.parentNode;
+ if (parent && parent.parentNode) {
+ parent.parentNode.selectedIndex;
+ }
+ return null;
+ },
+ set: function (elem) {
+
+ /* eslint no-unused-expressions: "off" */
+
+ var parent = elem.parentNode;
+ if (parent) {
+ parent.selectedIndex;
+
+ if (parent.parentNode) {
+ parent.parentNode.selectedIndex;
+ }
+ }
+ }
+ };
+ }
+
+ jQuery.each([
+ "tabIndex",
+ "readOnly",
+ "maxLength",
+ "cellSpacing",
+ "cellPadding",
+ "rowSpan",
+ "colSpan",
+ "useMap",
+ "frameBorder",
+ "contentEditable"
+ ], function () {
+ jQuery.propFix[this.toLowerCase()] = this;
+ });
+
+
+ // Strip and collapse whitespace according to HTML spec
+ // https://infra.spec.whatwg.org/#strip-and-collapse-ascii-whitespace
+ function stripAndCollapse(value) {
+ var tokens = value.match(rnothtmlwhite) || [];
+ return tokens.join(" ");
+ }
+
+
+ function getClass(elem) {
+ return elem.getAttribute && elem.getAttribute("class") || "";
+ }
+
+ function classesToArray(value) {
+ if (Array.isArray(value)) {
+ return value;
+ }
+ if (typeof value === "string") {
+ return value.match(rnothtmlwhite) || [];
+ }
+ return [];
+ }
+
+ jQuery.fn.extend({
+ addClass: function (value) {
+ var classes, elem, cur, curValue, clazz, j, finalValue,
+ i = 0;
+
+ if (isFunction(value)) {
+ return this.each(function (j) {
+ jQuery(this).addClass(value.call(this, j, getClass(this)));
+ });
+ }
+
+ classes = classesToArray(value);
+
+ if (classes.length) {
+ while ((elem = this[i++])) {
+ curValue = getClass(elem);
+ cur = elem.nodeType === 1 && (" " + stripAndCollapse(curValue) + " ");
+
+ if (cur) {
+ j = 0;
+ while ((clazz = classes[j++])) {
+ if (cur.indexOf(" " + clazz + " ") < 0) {
+ cur += clazz + " ";
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = stripAndCollapse(cur);
+ if (curValue !== finalValue) {
+ elem.setAttribute("class", finalValue);
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ removeClass: function (value) {
+ var classes, elem, cur, curValue, clazz, j, finalValue,
+ i = 0;
+
+ if (isFunction(value)) {
+ return this.each(function (j) {
+ jQuery(this).removeClass(value.call(this, j, getClass(this)));
+ });
+ }
+
+ if (!arguments.length) {
+ return this.attr("class", "");
+ }
+
+ classes = classesToArray(value);
+
+ if (classes.length) {
+ while ((elem = this[i++])) {
+ curValue = getClass(elem);
+
+ // This expression is here for better compressibility (see addClass)
+ cur = elem.nodeType === 1 && (" " + stripAndCollapse(curValue) + " ");
+
+ if (cur) {
+ j = 0;
+ while ((clazz = classes[j++])) {
+
+ // Remove *all* instances
+ while (cur.indexOf(" " + clazz + " ") > -1) {
+ cur = cur.replace(" " + clazz + " ", " ");
+ }
+ }
+
+ // Only assign if different to avoid unneeded rendering.
+ finalValue = stripAndCollapse(cur);
+ if (curValue !== finalValue) {
+ elem.setAttribute("class", finalValue);
+ }
+ }
+ }
+ }
+
+ return this;
+ },
+
+ toggleClass: function (value, stateVal) {
+ var type = typeof value,
+ isValidValue = type === "string" || Array.isArray(value);
+
+ if (typeof stateVal === "boolean" && isValidValue) {
+ return stateVal ? this.addClass(value) : this.removeClass(value);
+ }
+
+ if (isFunction(value)) {
+ return this.each(function (i) {
+ jQuery(this).toggleClass(
+ value.call(this, i, getClass(this), stateVal),
+ stateVal
+ );
+ });
+ }
+
+ return this.each(function () {
+ var className, i, self, classNames;
+
+ if (isValidValue) {
+
+ // Toggle individual class names
+ i = 0;
+ self = jQuery(this);
+ classNames = classesToArray(value);
+
+ while ((className = classNames[i++])) {
+
+ // Check each className given, space separated list
+ if (self.hasClass(className)) {
+ self.removeClass(className);
+ } else {
+ self.addClass(className);
+ }
+ }
+
+ // Toggle whole class name
+ } else if (value === undefined || type === "boolean") {
+ className = getClass(this);
+ if (className) {
+
+ // Store className if set
+ dataPriv.set(this, "__className__", className);
+ }
+
+ // If the element has a class name or if we're passed `false`,
+ // then remove the whole classname (if there was one, the above saved it).
+ // Otherwise bring back whatever was previously saved (if anything),
+ // falling back to the empty string if nothing was stored.
+ if (this.setAttribute) {
+ this.setAttribute("class",
+ className || value === false ?
+ "" :
+ dataPriv.get(this, "__className__") || ""
+ );
+ }
+ }
+ });
+ },
+
+ hasClass: function (selector) {
+ var className, elem,
+ i = 0;
+
+ className = " " + selector + " ";
+ while ((elem = this[i++])) {
+ if (elem.nodeType === 1 &&
+ (" " + stripAndCollapse(getClass(elem)) + " ").indexOf(className) > -1) {
+ return true;
+ }
+ }
+
+ return false;
+ }
+ });
+
+
+ var rreturn = /\r/g;
+
+ jQuery.fn.extend({
+ val: function (value) {
+ var hooks, ret, valueIsFunction,
+ elem = this[0];
+
+ if (!arguments.length) {
+ if (elem) {
+ hooks = jQuery.valHooks[elem.type] ||
+ jQuery.valHooks[elem.nodeName.toLowerCase()];
+
+ if (hooks &&
+ "get" in hooks &&
+ (ret = hooks.get(elem, "value")) !== undefined
+ ) {
+ return ret;
+ }
+
+ ret = elem.value;
+
+ // Handle most common string cases
+ if (typeof ret === "string") {
+ return ret.replace(rreturn, "");
+ }
+
+ // Handle cases where value is null/undef or number
+ return ret == null ? "" : ret;
+ }
+
+ return;
+ }
+
+ valueIsFunction = isFunction(value);
+
+ return this.each(function (i) {
+ var val;
+
+ if (this.nodeType !== 1) {
+ return;
+ }
+
+ if (valueIsFunction) {
+ val = value.call(this, i, jQuery(this).val());
+ } else {
+ val = value;
+ }
+
+ // Treat null/undefined as ""; convert numbers to string
+ if (val == null) {
+ val = "";
+
+ } else if (typeof val === "number") {
+ val += "";
+
+ } else if (Array.isArray(val)) {
+ val = jQuery.map(val, function (value) {
+ return value == null ? "" : value + "";
+ });
+ }
+
+ hooks = jQuery.valHooks[this.type] || jQuery.valHooks[this.nodeName.toLowerCase()];
+
+ // If set returns undefined, fall back to normal setting
+ if (!hooks || !("set" in hooks) || hooks.set(this, val, "value") === undefined) {
+ this.value = val;
+ }
+ });
+ }
+ });
+
+ jQuery.extend({
+ valHooks: {
+ option: {
+ get: function (elem) {
+
+ var val = jQuery.find.attr(elem, "value");
+ return val != null ?
+ val :
+
+ // Support: IE <=10 - 11 only
+ // option.text throws exceptions (#14686, #14858)
+ // Strip and collapse whitespace
+ // https://html.spec.whatwg.org/#strip-and-collapse-whitespace
+ stripAndCollapse(jQuery.text(elem));
+ }
+ },
+ select: {
+ get: function (elem) {
+ var value, option, i,
+ options = elem.options,
+ index = elem.selectedIndex,
+ one = elem.type === "select-one",
+ values = one ? null : [],
+ max = one ? index + 1 : options.length;
+
+ if (index < 0) {
+ i = max;
+
+ } else {
+ i = one ? index : 0;
+ }
+
+ // Loop through all the selected options
+ for (; i < max; i++) {
+ option = options[i];
+
+ // Support: IE <=9 only
+ // IE8-9 doesn't update selected after form reset (#2551)
+ if ((option.selected || i === index) &&
+
+ // Don't return options that are disabled or in a disabled optgroup
+ !option.disabled &&
+ (!option.parentNode.disabled ||
+ !nodeName(option.parentNode, "optgroup"))) {
+
+ // Get the specific value for the option
+ value = jQuery(option).val();
+
+ // We don't need an array for one selects
+ if (one) {
+ return value;
+ }
+
+ // Multi-Selects return an array
+ values.push(value);
+ }
+ }
+
+ return values;
+ },
+
+ set: function (elem, value) {
+ var optionSet, option,
+ options = elem.options,
+ values = jQuery.makeArray(value),
+ i = options.length;
+
+ while (i--) {
+ option = options[i];
+
+ /* eslint-disable no-cond-assign */
+
+ if (option.selected =
+ jQuery.inArray(jQuery.valHooks.option.get(option), values) > -1
+ ) {
+ optionSet = true;
+ }
+
+ /* eslint-enable no-cond-assign */
+ }
+
+ // Force browsers to behave consistently when non-matching value is set
+ if (!optionSet) {
+ elem.selectedIndex = -1;
+ }
+ return values;
+ }
+ }
+ }
+ });
+
+ // Radios and checkboxes getter/setter
+ jQuery.each(["radio", "checkbox"], function () {
+ jQuery.valHooks[this] = {
+ set: function (elem, value) {
+ if (Array.isArray(value)) {
+ return (elem.checked = jQuery.inArray(jQuery(elem).val(), value) > -1);
+ }
+ }
+ };
+ if (!support.checkOn) {
+ jQuery.valHooks[this].get = function (elem) {
+ return elem.getAttribute("value") === null ? "on" : elem.value;
+ };
+ }
+ });
+
+
+ // Return jQuery for attributes-only inclusion
+
+
+ support.focusin = "onfocusin" in window;
+
+
+ var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+ stopPropagationCallback = function (e) {
+ e.stopPropagation();
+ };
+
+ jQuery.extend(jQuery.event, {
+
+ trigger: function (event, data, elem, onlyHandlers) {
+
+ var i, cur, tmp, bubbleType, ontype, handle, special, lastElement,
+ eventPath = [elem || document],
+ type = hasOwn.call(event, "type") ? event.type : event,
+ namespaces = hasOwn.call(event, "namespace") ? event.namespace.split(".") : [];
+
+ cur = lastElement = tmp = elem = elem || document;
+
+ // Don't do events on text and comment nodes
+ if (elem.nodeType === 3 || elem.nodeType === 8) {
+ return;
+ }
+
+ // focus/blur morphs to focusin/out; ensure we're not firing them right now
+ if (rfocusMorph.test(type + jQuery.event.triggered)) {
+ return;
+ }
+
+ if (type.indexOf(".") > -1) {
+
+ // Namespaced trigger; create a regexp to match event type in handle()
+ namespaces = type.split(".");
+ type = namespaces.shift();
+ namespaces.sort();
+ }
+ ontype = type.indexOf(":") < 0 && "on" + type;
+
+ // Caller can pass in a jQuery.Event object, Object, or just an event type string
+ event = event[jQuery.expando] ?
+ event :
+ new jQuery.Event(type, typeof event === "object" && event);
+
+ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
+ event.isTrigger = onlyHandlers ? 2 : 3;
+ event.namespace = namespaces.join(".");
+ event.rnamespace = event.namespace ?
+ new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") :
+ null;
+
+ // Clean up the event in case it is being reused
+ event.result = undefined;
+ if (!event.target) {
+ event.target = elem;
+ }
+
+ // Clone any incoming data and prepend the event, creating the handler arg list
+ data = data == null ?
+ [event] :
+ jQuery.makeArray(data, [event]);
+
+ // Allow special events to draw outside the lines
+ special = jQuery.event.special[type] || {};
+ if (!onlyHandlers && special.trigger && special.trigger.apply(elem, data) === false) {
+ return;
+ }
+
+ // Determine event propagation path in advance, per W3C events spec (#9951)
+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+ if (!onlyHandlers && !special.noBubble && !isWindow(elem)) {
+
+ bubbleType = special.delegateType || type;
+ if (!rfocusMorph.test(bubbleType + type)) {
+ cur = cur.parentNode;
+ }
+ for (; cur; cur = cur.parentNode) {
+ eventPath.push(cur);
+ tmp = cur;
+ }
+
+ // Only add window if we got to document (e.g., not plain obj or detached DOM)
+ if (tmp === (elem.ownerDocument || document)) {
+ eventPath.push(tmp.defaultView || tmp.parentWindow || window);
+ }
+ }
+
+ // Fire handlers on the event path
+ i = 0;
+ while ((cur = eventPath[i++]) && !event.isPropagationStopped()) {
+ lastElement = cur;
+ event.type = i > 1 ?
+ bubbleType :
+ special.bindType || type;
+
+ // jQuery handler
+ handle = (dataPriv.get(cur, "events") || {})[event.type] &&
+ dataPriv.get(cur, "handle");
+ if (handle) {
+ handle.apply(cur, data);
+ }
+
+ // Native handler
+ handle = ontype && cur[ontype];
+ if (handle && handle.apply && acceptData(cur)) {
+ event.result = handle.apply(cur, data);
+ if (event.result === false) {
+ event.preventDefault();
+ }
+ }
+ }
+ event.type = type;
+
+ // If nobody prevented the default action, do it now
+ if (!onlyHandlers && !event.isDefaultPrevented()) {
+
+ if ((!special._default ||
+ special._default.apply(eventPath.pop(), data) === false) &&
+ acceptData(elem)) {
+
+ // Call a native DOM method on the target with the same name as the event.
+ // Don't do default actions on window, that's where global variables be (#6170)
+ if (ontype && isFunction(elem[type]) && !isWindow(elem)) {
+
+ // Don't re-trigger an onFOO event when we call its FOO() method
+ tmp = elem[ontype];
+
+ if (tmp) {
+ elem[ontype] = null;
+ }
+
+ // Prevent re-triggering of the same event, since we already bubbled it above
+ jQuery.event.triggered = type;
+
+ if (event.isPropagationStopped()) {
+ lastElement.addEventListener(type, stopPropagationCallback);
+ }
+
+ elem[type]();
+
+ if (event.isPropagationStopped()) {
+ lastElement.removeEventListener(type, stopPropagationCallback);
+ }
+
+ jQuery.event.triggered = undefined;
+
+ if (tmp) {
+ elem[ontype] = tmp;
+ }
+ }
+ }
+ }
+
+ return event.result;
+ },
+
+ // Piggyback on a donor event to simulate a different one
+ // Used only for `focus(in | out)` events
+ simulate: function (type, elem, event) {
+ var e = jQuery.extend(
+ new jQuery.Event(),
+ event,
+ {
+ type: type,
+ isSimulated: true
+ }
+ );
+
+ jQuery.event.trigger(e, null, elem);
+ }
+
+ });
+
+ jQuery.fn.extend({
+
+ trigger: function (type, data) {
+ return this.each(function () {
+ jQuery.event.trigger(type, data, this);
+ });
+ },
+ triggerHandler: function (type, data) {
+ var elem = this[0];
+ if (elem) {
+ return jQuery.event.trigger(type, data, elem, true);
+ }
+ }
+ });
+
+
+ // Support: Firefox <=44
+ // Firefox doesn't have focus(in | out) events
+ // Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
+ //
+ // Support: Chrome <=48 - 49, Safari <=9.0 - 9.1
+ // focus(in | out) events fire after focus & blur events,
+ // which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
+ // Related ticket - https://bugs.chromium.org/p/chromium/issues/detail?id=449857
+ if (!support.focusin) {
+ jQuery.each({focus: "focusin", blur: "focusout"}, function (orig, fix) {
+
+ // Attach a single capturing handler on the document while someone wants focusin/focusout
+ var handler = function (event) {
+ jQuery.event.simulate(fix, event.target, jQuery.event.fix(event));
+ };
+
+ jQuery.event.special[fix] = {
+ setup: function () {
+ var doc = this.ownerDocument || this,
+ attaches = dataPriv.access(doc, fix);
+
+ if (!attaches) {
+ doc.addEventListener(orig, handler, true);
+ }
+ dataPriv.access(doc, fix, (attaches || 0) + 1);
+ },
+ teardown: function () {
+ var doc = this.ownerDocument || this,
+ attaches = dataPriv.access(doc, fix) - 1;
+
+ if (!attaches) {
+ doc.removeEventListener(orig, handler, true);
+ dataPriv.remove(doc, fix);
+
+ } else {
+ dataPriv.access(doc, fix, attaches);
+ }
+ }
+ };
+ });
+ }
+ var location = window.location;
+
+ var nonce = Date.now();
+
+ var rquery = (/\?/);
+
+
+ // Cross-browser xml parsing
+ jQuery.parseXML = function (data) {
+ var xml;
+ if (!data || typeof data !== "string") {
+ return null;
+ }
+
+ // Support: IE 9 - 11 only
+ // IE throws on parseFromString with invalid input.
+ try {
+ xml = (new window.DOMParser()).parseFromString(data, "text/xml");
+ } catch (e) {
+ xml = undefined;
+ }
+
+ if (!xml || xml.getElementsByTagName("parsererror").length) {
+ jQuery.error("Invalid XML: " + data);
+ }
+ return xml;
+ };
+
+
+ var
+ rbracket = /\[\]$/,
+ rCRLF = /\r?\n/g,
+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
+ rsubmittable = /^(?:input|select|textarea|keygen)/i;
+
+ function buildParams(prefix, obj, traditional, add) {
+ var name;
+
+ if (Array.isArray(obj)) {
+
+ // Serialize array item.
+ jQuery.each(obj, function (i, v) {
+ if (traditional || rbracket.test(prefix)) {
+
+ // Treat each array item as a scalar.
+ add(prefix, v);
+
+ } else {
+
+ // Item is non-scalar (array or object), encode its numeric index.
+ buildParams(
+ prefix + "[" + (typeof v === "object" && v != null ? i : "") + "]",
+ v,
+ traditional,
+ add
+ );
+ }
+ });
+
+ } else if (!traditional && toType(obj) === "object") {
+
+ // Serialize object item.
+ for (name in obj) {
+ buildParams(prefix + "[" + name + "]", obj[name], traditional, add);
+ }
+
+ } else {
+
+ // Serialize scalar item.
+ add(prefix, obj);
+ }
+ }
+
+ // Serialize an array of form elements or a set of
+ // key/values into a query string
+ jQuery.param = function (a, traditional) {
+ var prefix,
+ s = [],
+ add = function (key, valueOrFunction) {
+
+ // If value is a function, invoke it and use its return value
+ var value = isFunction(valueOrFunction) ?
+ valueOrFunction() :
+ valueOrFunction;
+
+ s[s.length] = encodeURIComponent(key) + "=" +
+ encodeURIComponent(value == null ? "" : value);
+ };
+
+ // If an array was passed in, assume that it is an array of form elements.
+ if (Array.isArray(a) || (a.jquery && !jQuery.isPlainObject(a))) {
+
+ // Serialize the form elements
+ jQuery.each(a, function () {
+ add(this.name, this.value);
+ });
+
+ } else {
+
+ // If traditional, encode the "old" way (the way 1.3.2 or older
+ // did it), otherwise encode params recursively.
+ for (prefix in a) {
+ buildParams(prefix, a[prefix], traditional, add);
+ }
+ }
+
+ // Return the resulting serialization
+ return s.join("&");
+ };
+
+ jQuery.fn.extend({
+ serialize: function () {
+ return jQuery.param(this.serializeArray());
+ },
+ serializeArray: function () {
+ return this.map(function () {
+
+ // Can add propHook for "elements" to filter or add form elements
+ var elements = jQuery.prop(this, "elements");
+ return elements ? jQuery.makeArray(elements) : this;
+ })
+ .filter(function () {
+ var type = this.type;
+
+ // Use .is( ":disabled" ) so that fieldset[disabled] works
+ return this.name && !jQuery(this).is(":disabled") &&
+ rsubmittable.test(this.nodeName) && !rsubmitterTypes.test(type) &&
+ (this.checked || !rcheckableType.test(type));
+ })
+ .map(function (i, elem) {
+ var val = jQuery(this).val();
+
+ if (val == null) {
+ return null;
+ }
+
+ if (Array.isArray(val)) {
+ return jQuery.map(val, function (val) {
+ return {name: elem.name, value: val.replace(rCRLF, "\r\n")};
+ });
+ }
+
+ return {name: elem.name, value: val.replace(rCRLF, "\r\n")};
+ }).get();
+ }
+ });
+
+
+ var
+ r20 = /%20/g,
+ rhash = /#.*$/,
+ rantiCache = /([?&])_=[^&]*/,
+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,
+
+ // #7653, #8125, #8152: local protocol detection
+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
+ rnoContent = /^(?:GET|HEAD)$/,
+ rprotocol = /^\/\//,
+
+ /* Prefilters
+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+ * 2) These are called:
+ * - BEFORE asking for a transport
+ * - AFTER param serialization (s.data is a string if s.processData is true)
+ * 3) key is the dataType
+ * 4) the catchall symbol "*" can be used
+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed
+ */
+ prefilters = {},
+
+ /* Transports bindings
+ * 1) key is the dataType
+ * 2) the catchall symbol "*" can be used
+ * 3) selection will start with transport dataType and THEN go to "*" if needed
+ */
+ transports = {},
+
+ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+ allTypes = "*/".concat("*"),
+
+ // Anchor tag for parsing the document origin
+ originAnchor = document.createElement("a");
+ originAnchor.href = location.href;
+
+ // Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+ function addToPrefiltersOrTransports(structure) {
+
+ // dataTypeExpression is optional and defaults to "*"
+ return function (dataTypeExpression, func) {
+
+ if (typeof dataTypeExpression !== "string") {
+ func = dataTypeExpression;
+ dataTypeExpression = "*";
+ }
+
+ var dataType,
+ i = 0,
+ dataTypes = dataTypeExpression.toLowerCase().match(rnothtmlwhite) || [];
+
+ if (isFunction(func)) {
+
+ // For each dataType in the dataTypeExpression
+ while ((dataType = dataTypes[i++])) {
+
+ // Prepend if requested
+ if (dataType[0] === "+") {
+ dataType = dataType.slice(1) || "*";
+ (structure[dataType] = structure[dataType] || []).unshift(func);
+
+ // Otherwise append
+ } else {
+ (structure[dataType] = structure[dataType] || []).push(func);
+ }
+ }
+ }
+ };
+ }
+
+ // Base inspection function for prefilters and transports
+ function inspectPrefiltersOrTransports(structure, options, originalOptions, jqXHR) {
+
+ var inspected = {},
+ seekingTransport = (structure === transports);
+
+ function inspect(dataType) {
+ var selected;
+ inspected[dataType] = true;
+ jQuery.each(structure[dataType] || [], function (_, prefilterOrFactory) {
+ var dataTypeOrTransport = prefilterOrFactory(options, originalOptions, jqXHR);
+ if (typeof dataTypeOrTransport === "string" &&
+ !seekingTransport && !inspected[dataTypeOrTransport]) {
+
+ options.dataTypes.unshift(dataTypeOrTransport);
+ inspect(dataTypeOrTransport);
+ return false;
+ } else if (seekingTransport) {
+ return !(selected = dataTypeOrTransport);
+ }
+ });
+ return selected;
+ }
+
+ return inspect(options.dataTypes[0]) || !inspected["*"] && inspect("*");
+ }
+
+ // A special extend for ajax options
+ // that takes "flat" options (not to be deep extended)
+ // Fixes #9887
+ function ajaxExtend(target, src) {
+ var key, deep,
+ flatOptions = jQuery.ajaxSettings.flatOptions || {};
+
+ for (key in src) {
+ if (src[key] !== undefined) {
+ (flatOptions[key] ? target : (deep || (deep = {})))[key] = src[key];
+ }
+ }
+ if (deep) {
+ jQuery.extend(true, target, deep);
+ }
+
+ return target;
+ }
+
+ /* Handles responses to an ajax request:
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+ function ajaxHandleResponses(s, jqXHR, responses) {
+
+ var ct, type, finalDataType, firstDataType,
+ contents = s.contents,
+ dataTypes = s.dataTypes;
+
+ // Remove auto dataType and get content-type in the process
+ while (dataTypes[0] === "*") {
+ dataTypes.shift();
+ if (ct === undefined) {
+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");
+ }
+ }
+
+ // Check if we're dealing with a known content-type
+ if (ct) {
+ for (type in contents) {
+ if (contents[type] && contents[type].test(ct)) {
+ dataTypes.unshift(type);
+ break;
+ }
+ }
+ }
+
+ // Check to see if we have a response for the expected dataType
+ if (dataTypes[0] in responses) {
+ finalDataType = dataTypes[0];
+ } else {
+
+ // Try convertible dataTypes
+ for (type in responses) {
+ if (!dataTypes[0] || s.converters[type + " " + dataTypes[0]]) {
+ finalDataType = type;
+ break;
+ }
+ if (!firstDataType) {
+ firstDataType = type;
+ }
+ }
+
+ // Or just use first one
+ finalDataType = finalDataType || firstDataType;
+ }
+
+ // If we found a dataType
+ // We add the dataType to the list if needed
+ // and return the corresponding response
+ if (finalDataType) {
+ if (finalDataType !== dataTypes[0]) {
+ dataTypes.unshift(finalDataType);
+ }
+ return responses[finalDataType];
+ }
+ }
+
+ /* Chain conversions given the request and the original response
+ * Also sets the responseXXX fields on the jqXHR instance
+ */
+ function ajaxConvert(s, response, jqXHR, isSuccess) {
+ var conv2, current, conv, tmp, prev,
+ converters = {},
+
+ // Work with a copy of dataTypes in case we need to modify it for conversion
+ dataTypes = s.dataTypes.slice();
+
+ // Create converters map with lowercased keys
+ if (dataTypes[1]) {
+ for (conv in s.converters) {
+ converters[conv.toLowerCase()] = s.converters[conv];
+ }
+ }
+
+ current = dataTypes.shift();
+
+ // Convert to each sequential dataType
+ while (current) {
+
+ if (s.responseFields[current]) {
+ jqXHR[s.responseFields[current]] = response;
+ }
+
+ // Apply the dataFilter if provided
+ if (!prev && isSuccess && s.dataFilter) {
+ response = s.dataFilter(response, s.dataType);
+ }
+
+ prev = current;
+ current = dataTypes.shift();
+
+ if (current) {
+
+ // There's only work to do if current dataType is non-auto
+ if (current === "*") {
+
+ current = prev;
+
+ // Convert response if prev dataType is non-auto and differs from current
+ } else if (prev !== "*" && prev !== current) {
+
+ // Seek a direct converter
+ conv = converters[prev + " " + current] || converters["* " + current];
+
+ // If none found, seek a pair
+ if (!conv) {
+ for (conv2 in converters) {
+
+ // If conv2 outputs current
+ tmp = conv2.split(" ");
+ if (tmp[1] === current) {
+
+ // If prev can be converted to accepted input
+ conv = converters[prev + " " + tmp[0]] ||
+ converters["* " + tmp[0]];
+ if (conv) {
+
+ // Condense equivalence converters
+ if (conv === true) {
+ conv = converters[conv2];
+
+ // Otherwise, insert the intermediate dataType
+ } else if (converters[conv2] !== true) {
+ current = tmp[0];
+ dataTypes.unshift(tmp[1]);
+ }
+ break;
+ }
+ }
+ }
+ }
+
+ // Apply converter (if not an equivalence)
+ if (conv !== true) {
+
+ // Unless errors are allowed to bubble, catch and return them
+ if (conv && s.throws) {
+ response = conv(response);
+ } else {
+ try {
+ response = conv(response);
+ } catch (e) {
+ return {
+ state: "parsererror",
+ error: conv ? e : "No conversion from " + prev + " to " + current
+ };
+ }
+ }
+ }
+ }
+ }
+ }
+
+ return {state: "success", data: response};
+ }
+
+ jQuery.extend({
+
+ // Counter for holding the number of active queries
+ active: 0,
+
+ // Last-Modified header cache for next request
+ lastModified: {},
+ etag: {},
+
+ ajaxSettings: {
+ url: location.href,
+ type: "GET",
+ isLocal: rlocalProtocol.test(location.protocol),
+ global: true,
+ processData: true,
+ async: true,
+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+
+ /*
+ timeout: 0,
+ data: null,
+ dataType: null,
+ username: null,
+ password: null,
+ cache: null,
+ throws: false,
+ traditional: false,
+ headers: {},
+ */
+
+ accepts: {
+ "*": allTypes,
+ 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"
+ },
+
+ // Data converters
+ // Keys separate source (or catchall "*") and destination types with a single space
+ converters: {
+
+ // Convert anything to text
+ "* text": String,
+
+ // Text to html (true = no transformation)
+ "text html": true,
+
+ // Evaluate text as a json expression
+ "text json": JSON.parse,
+
+ // Parse text as xml
+ "text xml": jQuery.parseXML
+ },
+
+ // For options that shouldn't be deep extended:
+ // you can add your own custom options here if
+ // and when you create one that shouldn't be
+ // deep extended (see ajaxExtend)
+ flatOptions: {
+ url: true,
+ context: true
+ }
+ },
+
+ // Creates a full fledged settings object into target
+ // with both ajaxSettings and settings fields.
+ // If target is omitted, writes into ajaxSettings.
+ ajaxSetup: function (target, settings) {
+ return settings ?
+
+ // Building a settings object
+ ajaxExtend(ajaxExtend(target, jQuery.ajaxSettings), settings) :
+
+ // Extending ajaxSettings
+ ajaxExtend(jQuery.ajaxSettings, target);
+ },
+
+ ajaxPrefilter: addToPrefiltersOrTransports(prefilters),
+ ajaxTransport: addToPrefiltersOrTransports(transports),
+
+ // Main method
+ ajax: function (url, options) {
+
+ // If url is an object, simulate pre-1.5 signature
+ if (typeof url === "object") {
+ options = url;
+ url = undefined;
+ }
+
+ // Force options to be an object
+ options = options || {};
+
+ var transport,
+
+ // URL without anti-cache param
+ cacheURL,
+
+ // Response headers
+ responseHeadersString,
+ responseHeaders,
+
+ // timeout handle
+ timeoutTimer,
+
+ // Url cleanup var
+ urlAnchor,
+
+ // Request state (becomes false upon send and true upon completion)
+ completed,
+
+ // To know if global events are to be dispatched
+ fireGlobals,
+
+ // Loop variable
+ i,
+
+ // uncached part of the url
+ uncached,
+
+ // Create the final options object
+ s = jQuery.ajaxSetup({}, options),
+
+ // Callbacks context
+ callbackContext = s.context || s,
+
+ // Context for global events is callbackContext if it is a DOM node or jQuery collection
+ globalEventContext = s.context &&
+ (callbackContext.nodeType || callbackContext.jquery) ?
+ jQuery(callbackContext) :
+ jQuery.event,
+
+ // Deferreds
+ deferred = jQuery.Deferred(),
+ completeDeferred = jQuery.Callbacks("once memory"),
+
+ // Status-dependent callbacks
+ statusCode = s.statusCode || {},
+
+ // Headers (they are sent all at once)
+ requestHeaders = {},
+ requestHeadersNames = {},
+
+ // Default abort message
+ strAbort = "canceled",
+
+ // Fake xhr
+ jqXHR = {
+ readyState: 0,
+
+ // Builds headers hashtable if needed
+ getResponseHeader: function (key) {
+ var match;
+ if (completed) {
+ if (!responseHeaders) {
+ responseHeaders = {};
+ while ((match = rheaders.exec(responseHeadersString))) {
+ responseHeaders[match[1].toLowerCase()] = match[2];
+ }
+ }
+ match = responseHeaders[key.toLowerCase()];
+ }
+ return match == null ? null : match;
+ },
+
+ // Raw string
+ getAllResponseHeaders: function () {
+ return completed ? responseHeadersString : null;
+ },
+
+ // Caches the header
+ setRequestHeader: function (name, value) {
+ if (completed == null) {
+ name = requestHeadersNames[name.toLowerCase()] =
+ requestHeadersNames[name.toLowerCase()] || name;
+ requestHeaders[name] = value;
+ }
+ return this;
+ },
+
+ // Overrides response content-type header
+ overrideMimeType: function (type) {
+ if (completed == null) {
+ s.mimeType = type;
+ }
+ return this;
+ },
+
+ // Status-dependent callbacks
+ statusCode: function (map) {
+ var code;
+ if (map) {
+ if (completed) {
+
+ // Execute the appropriate callbacks
+ jqXHR.always(map[jqXHR.status]);
+ } else {
+
+ // Lazy-add the new callbacks in a way that preserves old ones
+ for (code in map) {
+ statusCode[code] = [statusCode[code], map[code]];
+ }
+ }
+ }
+ return this;
+ },
+
+ // Cancel the request
+ abort: function (statusText) {
+ var finalText = statusText || strAbort;
+ if (transport) {
+ transport.abort(finalText);
+ }
+ done(0, finalText);
+ return this;
+ }
+ };
+
+ // Attach deferreds
+ deferred.promise(jqXHR);
+
+ // Add protocol if not provided (prefilters might expect it)
+ // Handle falsy url in the settings object (#10093: consistency with old signature)
+ // We also use the url parameter if available
+ s.url = ((url || s.url || location.href) + "")
+ .replace(rprotocol, location.protocol + "//");
+
+ // Alias method option to type as per ticket #12004
+ s.type = options.method || options.type || s.method || s.type;
+
+ // Extract dataTypes list
+ s.dataTypes = (s.dataType || "*").toLowerCase().match(rnothtmlwhite) || [""];
+
+ // A cross-domain request is in order when the origin doesn't match the current origin.
+ if (s.crossDomain == null) {
+ urlAnchor = document.createElement("a");
+
+ // Support: IE <=8 - 11, Edge 12 - 15
+ // IE throws exception on accessing the href property if url is malformed,
+ // e.g. http://example.com:80x/
+ try {
+ urlAnchor.href = s.url;
+
+ // Support: IE <=8 - 11 only
+ // Anchor's host property isn't correctly set when s.url is relative
+ urlAnchor.href = urlAnchor.href;
+ s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
+ urlAnchor.protocol + "//" + urlAnchor.host;
+ } catch (e) {
+
+ // If there is an error parsing the URL, assume it is crossDomain,
+ // it can be rejected by the transport if it is invalid
+ s.crossDomain = true;
+ }
+ }
+
+ // Convert data if not already a string
+ if (s.data && s.processData && typeof s.data !== "string") {
+ s.data = jQuery.param(s.data, s.traditional);
+ }
+
+ // Apply prefilters
+ inspectPrefiltersOrTransports(prefilters, s, options, jqXHR);
+
+ // If request was aborted inside a prefilter, stop there
+ if (completed) {
+ return jqXHR;
+ }
+
+ // We can fire global events as of now if asked to
+ // Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
+ fireGlobals = jQuery.event && s.global;
+
+ // Watch for a new set of requests
+ if (fireGlobals && jQuery.active++ === 0) {
+ jQuery.event.trigger("ajaxStart");
+ }
+
+ // Uppercase the type
+ s.type = s.type.toUpperCase();
+
+ // Determine if request has content
+ s.hasContent = !rnoContent.test(s.type);
+
+ // Save the URL in case we're toying with the If-Modified-Since
+ // and/or If-None-Match header later on
+ // Remove hash to simplify url manipulation
+ cacheURL = s.url.replace(rhash, "");
+
+ // More options handling for requests with no content
+ if (!s.hasContent) {
+
+ // Remember the hash so we can put it back
+ uncached = s.url.slice(cacheURL.length);
+
+ // If data is available and should be processed, append data to url
+ if (s.data && (s.processData || typeof s.data === "string")) {
+ cacheURL += (rquery.test(cacheURL) ? "&" : "?") + s.data;
+
+ // #9682: remove data so that it's not used in an eventual retry
+ delete s.data;
+ }
+
+ // Add or update anti-cache param if needed
+ if (s.cache === false) {
+ cacheURL = cacheURL.replace(rantiCache, "$1");
+ uncached = (rquery.test(cacheURL) ? "&" : "?") + "_=" + (nonce++) + uncached;
+ }
+
+ // Put hash and anti-cache on the URL that will be requested (gh-1732)
+ s.url = cacheURL + uncached;
+
+ // Change '%20' to '+' if this is encoded form body content (gh-2658)
+ } else if (s.data && s.processData &&
+ (s.contentType || "").indexOf("application/x-www-form-urlencoded") === 0) {
+ s.data = s.data.replace(r20, "+");
+ }
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if (s.ifModified) {
+ if (jQuery.lastModified[cacheURL]) {
+ jqXHR.setRequestHeader("If-Modified-Since", jQuery.lastModified[cacheURL]);
+ }
+ if (jQuery.etag[cacheURL]) {
+ jqXHR.setRequestHeader("If-None-Match", jQuery.etag[cacheURL]);
+ }
+ }
+
+ // Set the correct header, if data is being sent
+ if (s.data && s.hasContent && s.contentType !== false || options.contentType) {
+ jqXHR.setRequestHeader("Content-Type", s.contentType);
+ }
+
+ // Set the Accepts header for the server, depending on the dataType
+ jqXHR.setRequestHeader(
+ "Accept",
+ s.dataTypes[0] && s.accepts[s.dataTypes[0]] ?
+ s.accepts[s.dataTypes[0]] +
+ (s.dataTypes[0] !== "*" ? ", " + allTypes + "; q=0.01" : "") :
+ s.accepts["*"]
+ );
+
+ // Check for headers option
+ for (i in s.headers) {
+ jqXHR.setRequestHeader(i, s.headers[i]);
+ }
+
+ // Allow custom headers/mimetypes and early abort
+ if (s.beforeSend &&
+ (s.beforeSend.call(callbackContext, jqXHR, s) === false || completed)) {
+
+ // Abort if not done already and return
+ return jqXHR.abort();
+ }
+
+ // Aborting is no longer a cancellation
+ strAbort = "abort";
+
+ // Install callbacks on deferreds
+ completeDeferred.add(s.complete);
+ jqXHR.done(s.success);
+ jqXHR.fail(s.error);
+
+ // Get transport
+ transport = inspectPrefiltersOrTransports(transports, s, options, jqXHR);
+
+ // If no transport, we auto-abort
+ if (!transport) {
+ done(-1, "No Transport");
+ } else {
+ jqXHR.readyState = 1;
+
+ // Send global event
+ if (fireGlobals) {
+ globalEventContext.trigger("ajaxSend", [jqXHR, s]);
+ }
+
+ // If request was aborted inside ajaxSend, stop there
+ if (completed) {
+ return jqXHR;
+ }
+
+ // Timeout
+ if (s.async && s.timeout > 0) {
+ timeoutTimer = window.setTimeout(function () {
+ jqXHR.abort("timeout");
+ }, s.timeout);
+ }
+
+ try {
+ completed = false;
+ transport.send(requestHeaders, done);
+ } catch (e) {
+
+ // Rethrow post-completion exceptions
+ if (completed) {
+ throw e;
+ }
+
+ // Propagate others as results
+ done(-1, e);
+ }
+ }
+
+ // Callback for when everything is done
+ function done(status, nativeStatusText, responses, headers) {
+ var isSuccess, success, error, response, modified,
+ statusText = nativeStatusText;
+
+ // Ignore repeat invocations
+ if (completed) {
+ return;
+ }
+
+ completed = true;
+
+ // Clear timeout if it exists
+ if (timeoutTimer) {
+ window.clearTimeout(timeoutTimer);
+ }
+
+ // Dereference transport for early garbage collection
+ // (no matter how long the jqXHR object will be used)
+ transport = undefined;
+
+ // Cache response headers
+ responseHeadersString = headers || "";
+
+ // Set readyState
+ jqXHR.readyState = status > 0 ? 4 : 0;
+
+ // Determine if successful
+ isSuccess = status >= 200 && status < 300 || status === 304;
+
+ // Get response data
+ if (responses) {
+ response = ajaxHandleResponses(s, jqXHR, responses);
+ }
+
+ // Convert no matter what (that way responseXXX fields are always set)
+ response = ajaxConvert(s, response, jqXHR, isSuccess);
+
+ // If successful, handle type chaining
+ if (isSuccess) {
+
+ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+ if (s.ifModified) {
+ modified = jqXHR.getResponseHeader("Last-Modified");
+ if (modified) {
+ jQuery.lastModified[cacheURL] = modified;
+ }
+ modified = jqXHR.getResponseHeader("etag");
+ if (modified) {
+ jQuery.etag[cacheURL] = modified;
+ }
+ }
+
+ // if no content
+ if (status === 204 || s.type === "HEAD") {
+ statusText = "nocontent";
+
+ // if not modified
+ } else if (status === 304) {
+ statusText = "notmodified";
+
+ // If we have data, let's convert it
+ } else {
+ statusText = response.state;
+ success = response.data;
+ error = response.error;
+ isSuccess = !error;
+ }
+ } else {
+
+ // Extract error from statusText and normalize for non-aborts
+ error = statusText;
+ if (status || !statusText) {
+ statusText = "error";
+ if (status < 0) {
+ status = 0;
+ }
+ }
+ }
+
+ // Set data for the fake xhr object
+ jqXHR.status = status;
+ jqXHR.statusText = (nativeStatusText || statusText) + "";
+
+ // Success/Error
+ if (isSuccess) {
+ deferred.resolveWith(callbackContext, [success, statusText, jqXHR]);
+ } else {
+ deferred.rejectWith(callbackContext, [jqXHR, statusText, error]);
+ }
+
+ // Status-dependent callbacks
+ jqXHR.statusCode(statusCode);
+ statusCode = undefined;
+
+ if (fireGlobals) {
+ globalEventContext.trigger(isSuccess ? "ajaxSuccess" : "ajaxError",
+ [jqXHR, s, isSuccess ? success : error]);
+ }
+
+ // Complete
+ completeDeferred.fireWith(callbackContext, [jqXHR, statusText]);
+
+ if (fireGlobals) {
+ globalEventContext.trigger("ajaxComplete", [jqXHR, s]);
+
+ // Handle the global AJAX counter
+ if (!(--jQuery.active)) {
+ jQuery.event.trigger("ajaxStop");
+ }
+ }
+ }
+
+ return jqXHR;
+ },
+
+ getJSON: function (url, data, callback) {
+ return jQuery.get(url, data, callback, "json");
+ },
+
+ getScript: function (url, callback) {
+ return jQuery.get(url, undefined, callback, "script");
+ }
+ });
+
+ jQuery.each(["get", "post"], function (i, method) {
+ jQuery[method] = function (url, data, callback, type) {
+
+ // Shift arguments if data argument was omitted
+ if (isFunction(data)) {
+ type = type || callback;
+ callback = data;
+ data = undefined;
+ }
+
+ // The url can be an options object (which then must have .url)
+ return jQuery.ajax(jQuery.extend({
+ url: url,
+ type: method,
+ dataType: type,
+ data: data,
+ success: callback,
+ error: function () {
+ layer.closeAll();
+ alerts("无法连接到服务器,请联系管理员");
+ }
+ }, jQuery.isPlainObject(url) && url));
+ };
+ });
+
+
+ jQuery._evalUrl = function (url) {
+ return jQuery.ajax({
+ url: url,
+
+ // Make this explicit, since user can override this through ajaxSetup (#11264)
+ type: "GET",
+ dataType: "script",
+ cache: true,
+ async: false,
+ global: false,
+ "throws": true
+ });
+ };
+
+
+ jQuery.fn.extend({
+ wrapAll: function (html) {
+ var wrap;
+
+ if (this[0]) {
+ if (isFunction(html)) {
+ html = html.call(this[0]);
+ }
+
+ // The elements to wrap the target around
+ wrap = jQuery(html, this[0].ownerDocument).eq(0).clone(true);
+
+ if (this[0].parentNode) {
+ wrap.insertBefore(this[0]);
+ }
+
+ wrap.map(function () {
+ var elem = this;
+
+ while (elem.firstElementChild) {
+ elem = elem.firstElementChild;
+ }
+
+ return elem;
+ }).append(this);
+ }
+
+ return this;
+ },
+
+ wrapInner: function (html) {
+ if (isFunction(html)) {
+ return this.each(function (i) {
+ jQuery(this).wrapInner(html.call(this, i));
+ });
+ }
+
+ return this.each(function () {
+ var self = jQuery(this),
+ contents = self.contents();
+
+ if (contents.length) {
+ contents.wrapAll(html);
+
+ } else {
+ self.append(html);
+ }
+ });
+ },
+
+ wrap: function (html) {
+ var htmlIsFunction = isFunction(html);
+
+ return this.each(function (i) {
+ jQuery(this).wrapAll(htmlIsFunction ? html.call(this, i) : html);
+ });
+ },
+
+ unwrap: function (selector) {
+ this.parent(selector).not("body").each(function () {
+ jQuery(this).replaceWith(this.childNodes);
+ });
+ return this;
+ }
+ });
+
+
+ jQuery.expr.pseudos.hidden = function (elem) {
+ return !jQuery.expr.pseudos.visible(elem);
+ };
+ jQuery.expr.pseudos.visible = function (elem) {
+ return !!(elem.offsetWidth || elem.offsetHeight || elem.getClientRects().length);
+ };
+
+
+ jQuery.ajaxSettings.xhr = function () {
+ try {
+ return new window.XMLHttpRequest();
+ } catch (e) {
+ }
+ };
+
+ var xhrSuccessStatus = {
+
+ // File protocol always yields status code 0, assume 200
+ 0: 200,
+
+ // Support: IE <=9 only
+ // #1450: sometimes IE returns 1223 when it should be 204
+ 1223: 204
+ },
+ xhrSupported = jQuery.ajaxSettings.xhr();
+
+ support.cors = !!xhrSupported && ("withCredentials" in xhrSupported);
+ support.ajax = xhrSupported = !!xhrSupported;
+
+ jQuery.ajaxTransport(function (options) {
+ var callback, errorCallback;
+
+ // Cross domain only allowed if supported through XMLHttpRequest
+ if (support.cors || xhrSupported && !options.crossDomain) {
+ return {
+ send: function (headers, complete) {
+ var i,
+ xhr = options.xhr();
+
+ xhr.open(
+ options.type,
+ options.url,
+ options.async,
+ options.username,
+ options.password
+ );
+
+ // Apply custom fields if provided
+ if (options.xhrFields) {
+ for (i in options.xhrFields) {
+ xhr[i] = options.xhrFields[i];
+ }
+ }
+
+ // Override mime type if needed
+ if (options.mimeType && xhr.overrideMimeType) {
+ xhr.overrideMimeType(options.mimeType);
+ }
+
+ // X-Requested-With header
+ // For cross-domain requests, seeing as conditions for a preflight are
+ // akin to a jigsaw puzzle, we simply never set it to be sure.
+ // (it can always be set on a per-request basis or even using ajaxSetup)
+ // For same-domain requests, won't change header if already provided.
+ if (!options.crossDomain && !headers["X-Requested-With"]) {
+ headers["X-Requested-With"] = "XMLHttpRequest";
+ }
+
+ // Set headers
+ for (i in headers) {
+ xhr.setRequestHeader(i, headers[i]);
+ }
+
+ // Callback
+ callback = function (type) {
+ return function () {
+ if (callback) {
+ callback = errorCallback = xhr.onload =
+ xhr.onerror = xhr.onabort = xhr.ontimeout =
+ xhr.onreadystatechange = null;
+
+ if (type === "abort") {
+ xhr.abort();
+ } else if (type === "error") {
+
+ // Support: IE <=9 only
+ // On a manual native abort, IE9 throws
+ // errors on any property access that is not readyState
+ if (typeof xhr.status !== "number") {
+ complete(0, "error");
+ } else {
+ complete(
+ // File: protocol always yields status 0; see #8605, #14207
+ xhr.status,
+ xhr.statusText
+ );
+ }
+ } else {
+ complete(
+ xhrSuccessStatus[xhr.status] || xhr.status,
+ xhr.statusText,
+
+ // Support: IE <=9 only
+ // IE9 has no XHR2 but throws on binary (trac-11426)
+ // For XHR2 non-text, let the caller handle it (gh-2498)
+ (xhr.responseType || "text") !== "text" ||
+ typeof xhr.responseText !== "string" ?
+ {binary: xhr.response} :
+ {text: xhr.responseText},
+ xhr.getAllResponseHeaders()
+ );
+ }
+ }
+ };
+ };
+
+ // Listen to events
+ xhr.onload = callback();
+ errorCallback = xhr.onerror = xhr.ontimeout = callback("error");
+
+ // Support: IE 9 only
+ // Use onreadystatechange to replace onabort
+ // to handle uncaught aborts
+ if (xhr.onabort !== undefined) {
+ xhr.onabort = errorCallback;
+ } else {
+ xhr.onreadystatechange = function () {
+
+ // Check readyState before timeout as it changes
+ if (xhr.readyState === 4) {
+
+ // Allow onerror to be called first,
+ // but that will not handle a native abort
+ // Also, save errorCallback to a variable
+ // as xhr.onerror cannot be accessed
+ window.setTimeout(function () {
+ if (callback) {
+ errorCallback();
+ }
+ });
+ }
+ };
+ }
+
+ // Create the abort callback
+ callback = callback("abort");
+
+ try {
+
+ // Do send the request (this may raise an exception)
+ xhr.send(options.hasContent && options.data || null);
+ } catch (e) {
+
+ // #14683: Only rethrow if this hasn't been notified as an error yet
+ if (callback) {
+ throw e;
+ }
+ }
+ },
+
+ abort: function () {
+ if (callback) {
+ callback();
+ }
+ }
+ };
+ }
+ });
+
+
+ // Prevent auto-execution of scripts when no explicit dataType was provided (See gh-2432)
+ jQuery.ajaxPrefilter(function (s) {
+ if (s.crossDomain) {
+ s.contents.script = false;
+ }
+ });
+
+ // Install script dataType
+ jQuery.ajaxSetup({
+ accepts: {
+ script: "text/javascript, application/javascript, " +
+ "application/ecmascript, application/x-ecmascript"
+ },
+ contents: {
+ script: /\b(?:java|ecma)script\b/
+ },
+ converters: {
+ "text script": function (text) {
+ jQuery.globalEval(text);
+ return text;
+ }
+ }
+ });
+
+ // Handle cache's special case and crossDomain
+ jQuery.ajaxPrefilter("script", function (s) {
+ if (s.cache === undefined) {
+ s.cache = false;
+ }
+ if (s.crossDomain) {
+ s.type = "GET";
+ }
+ });
+
+ // Bind script tag hack transport
+ jQuery.ajaxTransport("script", function (s) {
+
+ // This transport only deals with cross domain requests
+ if (s.crossDomain) {
+ var script, callback;
+ return {
+ send: function (_, complete) {
+ script = jQuery("<script>").prop({
+ charset: s.scriptCharset,
+ src: s.url
+ }).on(
+ "load error",
+ callback = function (evt) {
+ script.remove();
+ callback = null;
+ if (evt) {
+ complete(evt.type === "error" ? 404 : 200, evt.type);
+ }
+ }
+ );
+
+ // Use native DOM manipulation to avoid our domManip AJAX trickery
+ document.head.appendChild(script[0]);
+ },
+ abort: function () {
+ if (callback) {
+ callback();
+ }
+ }
+ };
+ }
+ });
+
+
+ var oldCallbacks = [],
+ rjsonp = /(=)\?(?=&|$)|\?\?/;
+
+ // Default jsonp settings
+ jQuery.ajaxSetup({
+ jsonp: "callback",
+ jsonpCallback: function () {
+ var callback = oldCallbacks.pop() || (jQuery.expando + "_" + (nonce++));
+ this[callback] = true;
+ return callback;
+ }
+ });
+
+ // Detect, normalize options and install callbacks for jsonp requests
+ jQuery.ajaxPrefilter("json jsonp", function (s, originalSettings, jqXHR) {
+
+ var callbackName, overwritten, responseContainer,
+ jsonProp = s.jsonp !== false && (rjsonp.test(s.url) ?
+ "url" :
+ typeof s.data === "string" &&
+ (s.contentType || "")
+ .indexOf("application/x-www-form-urlencoded") === 0 &&
+ rjsonp.test(s.data) && "data"
+ );
+
+ // Handle iff the expected data type is "jsonp" or we have a parameter to set
+ if (jsonProp || s.dataTypes[0] === "jsonp") {
+
+ // Get callback name, remembering preexisting value associated with it
+ callbackName = s.jsonpCallback = isFunction(s.jsonpCallback) ?
+ s.jsonpCallback() :
+ s.jsonpCallback;
+
+ // Insert callback into url or form data
+ if (jsonProp) {
+ s[jsonProp] = s[jsonProp].replace(rjsonp, "$1" + callbackName);
+ } else if (s.jsonp !== false) {
+ s.url += (rquery.test(s.url) ? "&" : "?") + s.jsonp + "=" + callbackName;
+ }
+
+ // Use data converter to retrieve json after script execution
+ s.converters["script json"] = function () {
+ if (!responseContainer) {
+ jQuery.error(callbackName + " was not called");
+ }
+ return responseContainer[0];
+ };
+
+ // Force json dataType
+ s.dataTypes[0] = "json";
+
+ // Install callback
+ overwritten = window[callbackName];
+ window[callbackName] = function () {
+ responseContainer = arguments;
+ };
+
+ // Clean-up function (fires after converters)
+ jqXHR.always(function () {
+
+ // If previous value didn't exist - remove it
+ if (overwritten === undefined) {
+ jQuery(window).removeProp(callbackName);
+
+ // Otherwise restore preexisting value
+ } else {
+ window[callbackName] = overwritten;
+ }
+
+ // Save back as free
+ if (s[callbackName]) {
+
+ // Make sure that re-using the options doesn't screw things around
+ s.jsonpCallback = originalSettings.jsonpCallback;
+
+ // Save the callback name for future use
+ oldCallbacks.push(callbackName);
+ }
+
+ // Call if it was a function and we have a response
+ if (responseContainer && isFunction(overwritten)) {
+ overwritten(responseContainer[0]);
+ }
+
+ responseContainer = overwritten = undefined;
+ });
+
+ // Delegate to script
+ return "script";
+ }
+ });
+
+
+ // Support: Safari 8 only
+ // In Safari 8 documents created via document.implementation.createHTMLDocument
+ // collapse sibling forms: the second one becomes a child of the first one.
+ // Because of that, this security measure has to be disabled in Safari 8.
+ // https://bugs.webkit.org/show_bug.cgi?id=137337
+ support.createHTMLDocument = (function () {
+ var body = document.implementation.createHTMLDocument("").body;
+ body.innerHTML = "<form></form><form></form>";
+ return body.childNodes.length === 2;
+ })();
+
+
+ // Argument "data" should be string of html
+ // context (optional): If specified, the fragment will be created in this context,
+ // defaults to document
+ // keepScripts (optional): If true, will include scripts passed in the html string
+ jQuery.parseHTML = function (data, context, keepScripts) {
+ if (typeof data !== "string") {
+ return [];
+ }
+ if (typeof context === "boolean") {
+ keepScripts = context;
+ context = false;
+ }
+
+ var base, parsed, scripts;
+
+ if (!context) {
+
+ // Stop scripts or inline event handlers from being executed immediately
+ // by using document.implementation
+ if (support.createHTMLDocument) {
+ context = document.implementation.createHTMLDocument("");
+
+ // Set the base href for the created document
+ // so any parsed elements with URLs
+ // are based on the document's URL (gh-2965)
+ base = context.createElement("base");
+ base.href = document.location.href;
+ context.head.appendChild(base);
+ } else {
+ context = document;
+ }
+ }
+
+ parsed = rsingleTag.exec(data);
+ scripts = !keepScripts && [];
+
+ // Single tag
+ if (parsed) {
+ return [context.createElement(parsed[1])];
+ }
+
+ parsed = buildFragment([data], context, scripts);
+
+ if (scripts && scripts.length) {
+ jQuery(scripts).remove();
+ }
+
+ return jQuery.merge([], parsed.childNodes);
+ };
+
+
+ /**
+ * Load a url into a page
+ */
+ jQuery.fn.load = function (url, params, callback) {
+ var selector, type, response,
+ self = this,
+ off = url.indexOf(" ");
+
+ if (off > -1) {
+ selector = stripAndCollapse(url.slice(off));
+ url = url.slice(0, off);
+ }
+
+ // If it's a function
+ if (isFunction(params)) {
+
+ // We assume that it's the callback
+ callback = params;
+ params = undefined;
+
+ // Otherwise, build a param string
+ } else if (params && typeof params === "object") {
+ type = "POST";
+ }
+
+ // If we have elements to modify, make the request
+ if (self.length > 0) {
+ jQuery.ajax({
+ url: url,
+
+ // If "type" variable is undefined, then "GET" method will be used.
+ // Make value of this field explicit since
+ // user can override it through ajaxSetup method
+ type: type || "GET",
+ dataType: "html",
+ data: params
+ }).done(function (responseText) {
+
+ // Save response for use in complete callback
+ response = arguments;
+
+ self.html(selector ?
+
+ // If a selector was specified, locate the right elements in a dummy div
+ // Exclude scripts to avoid IE 'Permission Denied' errors
+ jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector) :
+
+ // Otherwise use the full result
+ responseText);
+
+ // If the request succeeds, this function gets "data", "status", "jqXHR"
+ // but they are ignored because response was set above.
+ // If it fails, this function gets "jqXHR", "status", "error"
+ }).always(callback && function (jqXHR, status) {
+ self.each(function () {
+ callback.apply(this, response || [jqXHR.responseText, status, jqXHR]);
+ });
+ });
+ }
+
+ return this;
+ };
+
+
+ // Attach a bunch of functions for handling common AJAX events
+ jQuery.each([
+ "ajaxStart",
+ "ajaxStop",
+ "ajaxComplete",
+ "ajaxError",
+ "ajaxSuccess",
+ "ajaxSend"
+ ], function (i, type) {
+ jQuery.fn[type] = function (fn) {
+ return this.on(type, fn);
+ };
+ });
+
+
+ jQuery.expr.pseudos.animated = function (elem) {
+ return jQuery.grep(jQuery.timers, function (fn) {
+ return elem === fn.elem;
+ }).length;
+ };
+
+
+ jQuery.offset = {
+ setOffset: function (elem, options, i) {
+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
+ position = jQuery.css(elem, "position"),
+ curElem = jQuery(elem),
+ props = {};
+
+ // Set position first, in-case top/left are set even on static elem
+ if (position === "static") {
+ elem.style.position = "relative";
+ }
+
+ curOffset = curElem.offset();
+ curCSSTop = jQuery.css(elem, "top");
+ curCSSLeft = jQuery.css(elem, "left");
+ calculatePosition = (position === "absolute" || position === "fixed") &&
+ (curCSSTop + curCSSLeft).indexOf("auto") > -1;
+
+ // Need to be able to calculate position if either
+ // top or left is auto and position is either absolute or fixed
+ if (calculatePosition) {
+ curPosition = curElem.position();
+ curTop = curPosition.top;
+ curLeft = curPosition.left;
+
+ } else {
+ curTop = parseFloat(curCSSTop) || 0;
+ curLeft = parseFloat(curCSSLeft) || 0;
+ }
+
+ if (isFunction(options)) {
+
+ // Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
+ options = options.call(elem, i, jQuery.extend({}, curOffset));
+ }
+
+ if (options.top != null) {
+ props.top = (options.top - curOffset.top) + curTop;
+ }
+ if (options.left != null) {
+ props.left = (options.left - curOffset.left) + curLeft;
+ }
+
+ if ("using" in options) {
+ options.using.call(elem, props);
+
+ } else {
+ curElem.css(props);
+ }
+ }
+ };
+
+ jQuery.fn.extend({
+
+ // offset() relates an element's border box to the document origin
+ offset: function (options) {
+
+ // Preserve chaining for setter
+ if (arguments.length) {
+ return options === undefined ?
+ this :
+ this.each(function (i) {
+ jQuery.offset.setOffset(this, options, i);
+ });
+ }
+
+ var rect, win,
+ elem = this[0];
+
+ if (!elem) {
+ return;
+ }
+
+ // Return zeros for disconnected and hidden (display: none) elements (gh-2310)
+ // Support: IE <=11 only
+ // Running getBoundingClientRect on a
+ // disconnected node in IE throws an error
+ if (!elem.getClientRects().length) {
+ return {top: 0, left: 0};
+ }
+
+ // Get document-relative position by adding viewport scroll to viewport-relative gBCR
+ rect = elem.getBoundingClientRect();
+ win = elem.ownerDocument.defaultView;
+ return {
+ top: rect.top + win.pageYOffset,
+ left: rect.left + win.pageXOffset
+ };
+ },
+
+ // position() relates an element's margin box to its offset parent's padding box
+ // This corresponds to the behavior of CSS absolute positioning
+ position: function () {
+ if (!this[0]) {
+ return;
+ }
+
+ var offsetParent, offset, doc,
+ elem = this[0],
+ parentOffset = {top: 0, left: 0};
+
+ // position:fixed elements are offset from the viewport, which itself always has zero offset
+ if (jQuery.css(elem, "position") === "fixed") {
+
+ // Assume position:fixed implies availability of getBoundingClientRect
+ offset = elem.getBoundingClientRect();
+
+ } else {
+ offset = this.offset();
+
+ // Account for the *real* offset parent, which can be the document or its root element
+ // when a statically positioned element is identified
+ doc = elem.ownerDocument;
+ offsetParent = elem.offsetParent || doc.documentElement;
+ while (offsetParent &&
+ (offsetParent === doc.body || offsetParent === doc.documentElement) &&
+ jQuery.css(offsetParent, "position") === "static") {
+
+ offsetParent = offsetParent.parentNode;
+ }
+ if (offsetParent && offsetParent !== elem && offsetParent.nodeType === 1) {
+
+ // Incorporate borders into its offset, since they are outside its content origin
+ parentOffset = jQuery(offsetParent).offset();
+ parentOffset.top += jQuery.css(offsetParent, "borderTopWidth", true);
+ parentOffset.left += jQuery.css(offsetParent, "borderLeftWidth", true);
+ }
+ }
+
+ // Subtract parent offsets and element margins
+ return {
+ top: offset.top - parentOffset.top - jQuery.css(elem, "marginTop", true),
+ left: offset.left - parentOffset.left - jQuery.css(elem, "marginLeft", true)
+ };
+ },
+
+ // This method will return documentElement in the following cases:
+ // 1) For the element inside the iframe without offsetParent, this method will return
+ // documentElement of the parent window
+ // 2) For the hidden or detached element
+ // 3) For body or html element, i.e. in case of the html node - it will return itself
+ //
+ // but those exceptions were never presented as a real life use-cases
+ // and might be considered as more preferable results.
+ //
+ // This logic, however, is not guaranteed and can change at any point in the future
+ offsetParent: function () {
+ return this.map(function () {
+ var offsetParent = this.offsetParent;
+
+ while (offsetParent && jQuery.css(offsetParent, "position") === "static") {
+ offsetParent = offsetParent.offsetParent;
+ }
+
+ return offsetParent || documentElement;
+ });
+ }
+ });
+
+ // Create scrollLeft and scrollTop methods
+ jQuery.each({scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function (method, prop) {
+ var top = "pageYOffset" === prop;
+
+ jQuery.fn[method] = function (val) {
+ return access(this, function (elem, method, val) {
+
+ // Coalesce documents and windows
+ var win;
+ if (isWindow(elem)) {
+ win = elem;
+ } else if (elem.nodeType === 9) {
+ win = elem.defaultView;
+ }
+
+ if (val === undefined) {
+ return win ? win[prop] : elem[method];
+ }
+
+ if (win) {
+ win.scrollTo(
+ !top ? val : win.pageXOffset,
+ top ? val : win.pageYOffset
+ );
+
+ } else {
+ elem[method] = val;
+ }
+ }, method, val, arguments.length);
+ };
+ });
+
+ // Support: Safari <=7 - 9.1, Chrome <=37 - 49
+ // Add the top/left cssHooks using jQuery.fn.position
+ // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+ // Blink bug: https://bugs.chromium.org/p/chromium/issues/detail?id=589347
+ // getComputedStyle returns percent when specified for top/left/bottom/right;
+ // rather than make the css module depend on the offset module, just check for it here
+ jQuery.each(["top", "left"], function (i, prop) {
+ jQuery.cssHooks[prop] = addGetHookIf(support.pixelPosition,
+ function (elem, computed) {
+ if (computed) {
+ computed = curCSS(elem, prop);
+
+ // If curCSS returns percentage, fallback to offset
+ return rnumnonpx.test(computed) ?
+ jQuery(elem).position()[prop] + "px" :
+ computed;
+ }
+ }
+ );
+ });
+
+
+ // Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+ jQuery.each({Height: "height", Width: "width"}, function (name, type) {
+ jQuery.each({padding: "inner" + name, content: type, "": "outer" + name},
+ function (defaultExtra, funcName) {
+
+ // Margin is only for outerHeight, outerWidth
+ jQuery.fn[funcName] = function (margin, value) {
+ var chainable = arguments.length && (defaultExtra || typeof margin !== "boolean"),
+ extra = defaultExtra || (margin === true || value === true ? "margin" : "border");
+
+ return access(this, function (elem, type, value) {
+ var doc;
+
+ if (isWindow(elem)) {
+
+ // $( window ).outerWidth/Height return w/h including scrollbars (gh-1729)
+ return funcName.indexOf("outer") === 0 ?
+ elem["inner" + name] :
+ elem.document.documentElement["client" + name];
+ }
+
+ // Get document width or height
+ if (elem.nodeType === 9) {
+ doc = elem.documentElement;
+
+ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
+ // whichever is greatest
+ return Math.max(
+ elem.body["scroll" + name], doc["scroll" + name],
+ elem.body["offset" + name], doc["offset" + name],
+ doc["client" + name]
+ );
+ }
+
+ return value === undefined ?
+
+ // Get width or height on the element, requesting but not forcing parseFloat
+ jQuery.css(elem, type, extra) :
+
+ // Set width or height on the element
+ jQuery.style(elem, type, value, extra);
+ }, type, chainable ? margin : undefined, chainable);
+ };
+ });
+ });
+
+
+ jQuery.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 (i, name) {
+
+ // Handle event binding
+ jQuery.fn[name] = function (data, fn) {
+ return arguments.length > 0 ?
+ this.on(name, null, data, fn) :
+ this.trigger(name);
+ };
+ });
+
+ jQuery.fn.extend({
+ hover: function (fnOver, fnOut) {
+ return this.mouseenter(fnOver).mouseleave(fnOut || fnOver);
+ }
+ });
+
+
+ jQuery.fn.extend({
+
+ bind: function (types, data, fn) {
+ return this.on(types, null, data, fn);
+ },
+ unbind: function (types, fn) {
+ return this.off(types, null, fn);
+ },
+
+ delegate: function (selector, types, data, fn) {
+ return this.on(types, selector, data, fn);
+ },
+ undelegate: function (selector, types, fn) {
+
+ // ( namespace ) or ( selector, types [, fn] )
+ return arguments.length === 1 ?
+ this.off(selector, "**") :
+ this.off(types, selector || "**", fn);
+ }
+ });
+
+ // Bind a function to a context, optionally partially applying any
+ // arguments.
+ // jQuery.proxy is deprecated to promote standards (specifically Function#bind)
+ // However, it is not slated for removal any time soon
+ jQuery.proxy = function (fn, context) {
+ var tmp, args, proxy;
+
+ if (typeof context === "string") {
+ tmp = fn[context];
+ context = fn;
+ fn = tmp;
+ }
+
+ // Quick check to determine if target is callable, in the spec
+ // this throws a TypeError, but we will just return undefined.
+ if (!isFunction(fn)) {
+ return undefined;
+ }
+
+ // Simulated bind
+ args = slice.call(arguments, 2);
+ proxy = function () {
+ return fn.apply(context || this, args.concat(slice.call(arguments)));
+ };
+
+ // Set the guid of unique handler to the same of original handler, so it can be removed
+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;
+
+ return proxy;
+ };
+
+ jQuery.holdReady = function (hold) {
+ if (hold) {
+ jQuery.readyWait++;
+ } else {
+ jQuery.ready(true);
+ }
+ };
+ jQuery.isArray = Array.isArray;
+ jQuery.parseJSON = JSON.parse;
+ jQuery.nodeName = nodeName;
+ jQuery.isFunction = isFunction;
+ jQuery.isWindow = isWindow;
+ jQuery.camelCase = camelCase;
+ jQuery.type = toType;
+
+ jQuery.now = Date.now;
+
+ jQuery.isNumeric = function (obj) {
+
+ // As of jQuery 3.0, isNumeric is limited to
+ // strings and numbers (primitives or objects)
+ // that can be coerced to finite numbers (gh-2662)
+ var type = jQuery.type(obj);
+ return (type === "number" || type === "string") &&
+
+ // parseFloat NaNs numeric-cast false positives ("")
+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")
+ // subtraction forces infinities to NaN
+ !isNaN(obj - parseFloat(obj));
+ };
+
+
+ // Register as a named AMD module, since jQuery can be concatenated with other
+ // files that may use define, but not via a proper concatenation script that
+ // understands anonymous AMD modules. A named AMD is safest and most robust
+ // way to register. Lowercase jquery is used because AMD module names are
+ // derived from file names, and jQuery is normally delivered in a lowercase
+ // file name. Do this after creating the global so that if an AMD module wants
+ // to call noConflict to hide this version of jQuery, it will work.
+
+ // Note that for maximum portability, libraries that are not jQuery should
+ // declare themselves as anonymous modules, and avoid setting a global if an
+ // AMD loader is present. jQuery is a special case. For more information, see
+ // https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon
+
+ if (typeof define === "function" && define.amd) {
+ define("jquery", [], function () {
+ return jQuery;
+ });
+ }
+
+
+ var
+
+ // Map over jQuery in case of overwrite
+ _jQuery = window.jQuery,
+
+ // Map over the $ in case of overwrite
+ _$ = window.$;
+
+ jQuery.noConflict = function (deep) {
+ if (window.$ === jQuery) {
+ window.$ = _$;
+ }
+
+ if (deep && window.jQuery === jQuery) {
+ window.jQuery = _jQuery;
+ }
+
+ return jQuery;
+ };
+
+ // Expose jQuery and $ identifiers, even in AMD
+ // (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
+ // and CommonJS for browser emulators (#13566)
+ if (!noGlobal) {
+ window.jQuery = window.$ = jQuery;
+ }
+
+
+ return jQuery;
+});
diff --git a/src/main/resources/assets/js/layer.js b/src/main/resources/assets/js/layer.js
new file mode 100644
index 0000000..12cb6b5
--- /dev/null
+++ b/src/main/resources/assets/js/layer.js
@@ -0,0 +1,2 @@
+/*! layer-v3.1.1 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.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.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.1",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/src/main/resources/assets/js/mobile/layer.js b/src/main/resources/assets/js/mobile/layer.js
new file mode 100644
index 0000000..f9cf693
--- /dev/null
+++ b/src/main/resources/assets/js/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/src/main/resources/assets/js/mobile/need/layer.css b/src/main/resources/assets/js/mobile/need/layer.css
new file mode 100644
index 0000000..b9dbf20
--- /dev/null
+++ b/src/main/resources/assets/js/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/src/main/resources/assets/js/nav.js b/src/main/resources/assets/js/nav.js
new file mode 100644
index 0000000..1228889
--- /dev/null
+++ b/src/main/resources/assets/js/nav.js
@@ -0,0 +1,50 @@
+$(function () {
+ // nav收缩展开
+ $('.jq-nav-item>a').on('click', function () {
+ if (!$('.jq-nav').hasClass('jq-nav-mini')) {
+ if ($(this).next().css('display') === "none") {
+ //展开未展开
+ $('.jq-nav-item').children('ul').slideUp(300);
+ $(this).next('ul').slideDown(300);
+ $(this).parent('li').addClass('jq-nav-show').siblings('li').removeClass('jq-nav-show');
+ } else {
+ //收缩已展开
+ $(this).next('ul').slideUp(300);
+ $('.jq-nav-item.jq-nav-show').removeClass('jq-nav-show');
+ }
+ }
+ var tab = $(this).attr("href");
+ if (tab !== "filemanager") {
+ $(".jq-tab").addClass("hide");
+ $(tab).removeClass("hide");
+ try {
+ getTabInfo(tab);
+ if (isMobile()) {
+ $("#mini").click();
+ }
+ } catch (e) {
+ console.info("function 'getTabInfo' not found");
+ }
+ }
+ });
+ //nav-mini切换
+ $('#mini').on('click', function () {
+ var nav = $(".jq-nav");
+ if ($(nav).hasClass('jq-nav-mini')) {
+ $(nav).removeClass('jq-nav-mini');
+ } else {
+ $('.jq-nav-item.jq-nav-show').removeClass('jq-nav-show');
+ $('.jq-nav-item').children('ul').removeAttr('style');
+ $(nav).addClass('jq-nav-mini');
+ }
+ calculateContentWidth();
+ });
+});
+
+calculateContentWidth();
+
+function calculateContentWidth() {
+ setTimeout(function () {
+ $("#container").css("margin-left", $(".jq-nav").width() + "px");
+ }, 200);
+} \ No newline at end of file
diff --git a/src/main/resources/assets/js/ng-file-upload.min.js b/src/main/resources/assets/js/ng-file-upload.min.js
new file mode 100644
index 0000000..97a7137
--- /dev/null
+++ b/src/main/resources/assets/js/ng-file-upload.min.js
@@ -0,0 +1,1245 @@
+/*! 12.2.13 */
+!window.XMLHttpRequest || window.FileAPI && FileAPI.shouldLoad || (window.XMLHttpRequest.prototype.setRequestHeader = function (a) {
+ return function (b, c) {
+ if ("__setXHR_" === b) {
+ var d = c(this);
+ d instanceof Function && d(this)
+ } else a.apply(this, arguments)
+ }
+}(window.XMLHttpRequest.prototype.setRequestHeader));
+var ngFileUpload = angular.module("ngFileUpload", []);
+ngFileUpload.version = "12.2.13", ngFileUpload.service("UploadBase", ["$http", "$q", "$timeout", function (a, b, c) {
+ function d(d) {
+ function e(a) {
+ j.notify && j.notify(a), k.progressFunc && c(function () {
+ k.progressFunc(a)
+ })
+ }
+
+ function h(a) {
+ return null != d._start && g ? {
+ loaded: a.loaded + d._start,
+ total: d._file && d._file.size || a.total,
+ type: a.type,
+ config: d,
+ lengthComputable: !0,
+ target: a.target
+ } : a
+ }
+
+ function i() {
+ a(d).then(function (a) {
+ if (g && d._chunkSize && !d._finished && d._file) {
+ var b = d._file && d._file.size || 0;
+ e({loaded: Math.min(d._end, b), total: b, config: d, type: "progress"}), f.upload(d, !0)
+ } else d._finished && delete d._finished, j.resolve(a)
+ }, function (a) {
+ j.reject(a)
+ }, function (a) {
+ j.notify(a)
+ })
+ }
+
+ d.method = d.method || "POST", d.headers = d.headers || {};
+ var j = d._deferred = d._deferred || b.defer(), k = j.promise;
+ return d.disableProgress || (d.headers.__setXHR_ = function () {
+ return function (a) {
+ a && a.upload && a.upload.addEventListener && (d.__XHR = a, d.xhrFn && d.xhrFn(a), a.upload.addEventListener("progress", function (a) {
+ a.config = d, e(h(a))
+ }, !1), a.upload.addEventListener("load", function (a) {
+ a.lengthComputable && (a.config = d, e(h(a)))
+ }, !1))
+ }
+ }), g ? d._chunkSize && d._end && !d._finished ? (d._start = d._end, d._end += d._chunkSize, i()) : d.resumeSizeUrl ? a.get(d.resumeSizeUrl).then(function (a) {
+ d._start = d.resumeSizeResponseReader ? d.resumeSizeResponseReader(a.data) : parseInt((null == a.data.size ? a.data : a.data.size).toString()), d._chunkSize && (d._end = d._start + d._chunkSize), i()
+ }, function (a) {
+ throw a
+ }) : d.resumeSize ? d.resumeSize().then(function (a) {
+ d._start = a, d._chunkSize && (d._end = d._start + d._chunkSize), i()
+ }, function (a) {
+ throw a
+ }) : (d._chunkSize && (d._start = 0, d._end = d._start + d._chunkSize), i()) : i(), k.success = function (a) {
+ return k.then(function (b) {
+ a(b.data, b.status, b.headers, d)
+ }), k
+ }, k.error = function (a) {
+ return k.then(null, function (b) {
+ a(b.data, b.status, b.headers, d)
+ }), k
+ }, k.progress = function (a) {
+ return k.progressFunc = a, k.then(null, null, function (b) {
+ a(b)
+ }), k
+ }, k.abort = k.pause = function () {
+ return d.__XHR && c(function () {
+ d.__XHR.abort()
+ }), k
+ }, k.xhr = function (a) {
+ return d.xhrFn = function (b) {
+ return function () {
+ b && b.apply(k, arguments), a.apply(k, arguments)
+ }
+ }(d.xhrFn), k
+ }, f.promisesCount++, k["finally"] && k["finally"] instanceof Function && k["finally"](function () {
+ f.promisesCount--
+ }), k
+ }
+
+ function e(a) {
+ var b = {};
+ for (var c in a) a.hasOwnProperty(c) && (b[c] = a[c]);
+ return b
+ }
+
+ var f = this;
+ f.promisesCount = 0, this.isResumeSupported = function () {
+ return window.Blob && window.Blob.prototype.slice
+ };
+ var g = this.isResumeSupported();
+ this.isUploadInProgress = function () {
+ return f.promisesCount > 0
+ }, this.rename = function (a, b) {
+ return a.ngfName = b, a
+ }, this.jsonBlob = function (a) {
+ null == a || angular.isString(a) || (a = JSON.stringify(a));
+ var b = new window.Blob([a], {type: "application/json"});
+ return b._ngfBlob = !0, b
+ }, this.json = function (a) {
+ return angular.toJson(a)
+ }, this.isFile = function (a) {
+ return null != a && (a instanceof window.Blob || a.flashId && a.name && a.size)
+ }, this.upload = function (a, b) {
+ function c(b, c) {
+ if (b._ngfBlob) return b;
+ if (a._file = a._file || b, null != a._start && g) {
+ a._end && a._end >= b.size && (a._finished = !0, a._end = b.size);
+ var d = b.slice(a._start, a._end || b.size);
+ return d.name = b.name, d.ngfName = b.ngfName, a._chunkSize && (c.append("_chunkSize", a._chunkSize), c.append("_currentChunkSize", a._end - a._start), c.append("_chunkNumber", Math.floor(a._start / a._chunkSize)), c.append("_totalSize", a._file.size)), d
+ }
+ return b
+ }
+
+ function h(b, d, e) {
+ if (void 0 !== d) if (angular.isDate(d) && (d = d.toISOString()), angular.isString(d)) b.append(e, d); else if (f.isFile(d)) {
+ var g = c(d, b), i = e.split(",");
+ i[1] && (g.ngfName = i[1].replace(/^\s+|\s+$/g, ""), e = i[0]), a._fileKey = a._fileKey || e, b.append(e, g, g.ngfName || g.name)
+ } else if (angular.isObject(d)) {
+ if (d.$$ngfCircularDetection) throw"ngFileUpload: Circular reference in config.data. Make sure specified data for Upload.upload() has no circular reference: " + e;
+ d.$$ngfCircularDetection = !0;
+ try {
+ for (var j in d) if (d.hasOwnProperty(j) && "$$ngfCircularDetection" !== j) {
+ var k = null == a.objectKey ? "[i]" : a.objectKey;
+ d.length && parseInt(j) > -1 && (k = null == a.arrayKey ? k : a.arrayKey), h(b, d[j], e + k.replace(/[ik]/g, j))
+ }
+ } finally {
+ delete d.$$ngfCircularDetection
+ }
+ } else b.append(e, d)
+ }
+
+ function i() {
+ a._chunkSize = f.translateScalars(a.resumeChunkSize), a._chunkSize = a._chunkSize ? parseInt(a._chunkSize.toString()) : null, a.headers = a.headers || {}, a.headers["Content-Type"] = void 0, a.transformRequest = a.transformRequest ? angular.isArray(a.transformRequest) ? a.transformRequest : [a.transformRequest] : [], a.transformRequest.push(function (b) {
+ var c, d = new window.FormData;
+ b = b || a.fields || {}, a.file && (b.file = a.file);
+ for (c in b) if (b.hasOwnProperty(c)) {
+ var e = b[c];
+ a.formDataAppender ? a.formDataAppender(d, c, e) : h(d, e, c)
+ }
+ return d
+ })
+ }
+
+ return b || (a = e(a)), a._isDigested || (a._isDigested = !0, i()), d(a)
+ }, this.http = function (b) {
+ return b = e(b), b.transformRequest = b.transformRequest || function (b) {
+ return window.ArrayBuffer && b instanceof window.ArrayBuffer || b instanceof window.Blob ? b : a.defaults.transformRequest[0].apply(this, arguments)
+ }, b._chunkSize = f.translateScalars(b.resumeChunkSize), b._chunkSize = b._chunkSize ? parseInt(b._chunkSize.toString()) : null, d(b)
+ }, this.translateScalars = function (a) {
+ if (angular.isString(a)) {
+ if (a.search(/kb/i) === a.length - 2) return parseFloat(1024 * a.substring(0, a.length - 2));
+ if (a.search(/mb/i) === a.length - 2) return parseFloat(1048576 * a.substring(0, a.length - 2));
+ if (a.search(/gb/i) === a.length - 2) return parseFloat(1073741824 * a.substring(0, a.length - 2));
+ if (a.search(/b/i) === a.length - 1) return parseFloat(a.substring(0, a.length - 1));
+ if (a.search(/s/i) === a.length - 1) return parseFloat(a.substring(0, a.length - 1));
+ if (a.search(/m/i) === a.length - 1) return parseFloat(60 * a.substring(0, a.length - 1));
+ if (a.search(/h/i) === a.length - 1) return parseFloat(3600 * a.substring(0, a.length - 1))
+ }
+ return a
+ }, this.urlToBlob = function (c) {
+ var d = b.defer();
+ return a({url: c, method: "get", responseType: "arraybuffer"}).then(function (a) {
+ var b = new Uint8Array(a.data), e = a.headers("content-type") || "image/WebP",
+ f = new window.Blob([b], {type: e}), g = c.match(/.*\/(.+?)(\?.*)?$/);
+ g.length > 1 && (f.name = g[1]), d.resolve(f)
+ }, function (a) {
+ d.reject(a)
+ }), d.promise
+ }, this.setDefaults = function (a) {
+ this.defaults = a || {}
+ }, this.defaults = {}, this.version = ngFileUpload.version
+}]), ngFileUpload.service("Upload", ["$parse", "$timeout", "$compile", "$q", "UploadExif", function (a, b, c, d, e) {
+ function f(a, b, c) {
+ var e = [i.emptyPromise()];
+ return angular.forEach(a, function (d, f) {
+ 0 === d.type.indexOf("image/jpeg") && i.attrGetter("ngfFixOrientation", b, c, {$file: d}) && e.push(i.happyPromise(i.applyExifRotation(d), d).then(function (b) {
+ a.splice(f, 1, b)
+ }))
+ }), d.all(e)
+ }
+
+ function g(a, b, c, e) {
+ var f = i.attrGetter("ngfResize", b, c);
+ if (!f || !i.isResizeSupported() || !a.length) return i.emptyPromise();
+ if (f instanceof Function) {
+ var g = d.defer();
+ return f(a).then(function (d) {
+ h(d, a, b, c, e).then(function (a) {
+ g.resolve(a)
+ }, function (a) {
+ g.reject(a)
+ })
+ }, function (a) {
+ g.reject(a)
+ })
+ }
+ return h(f, a, b, c, e)
+ }
+
+ function h(a, b, c, e, f) {
+ function g(d, g) {
+ if (0 === d.type.indexOf("image")) {
+ if (a.pattern && !i.validatePattern(d, a.pattern)) return;
+ a.resizeIf = function (a, b) {
+ return i.attrGetter("ngfResizeIf", c, e, {$width: a, $height: b, $file: d})
+ };
+ var j = i.resize(d, a);
+ h.push(j), j.then(function (a) {
+ b.splice(g, 1, a)
+ }, function (a) {
+ d.$error = "resize", (d.$errorMessages = d.$errorMessages || {}).resize = !0, d.$errorParam = (a ? (a.message ? a.message : a) + ": " : "") + (d && d.name), f.$ngfValidations.push({
+ name: "resize",
+ valid: !1
+ }), i.applyModelValidation(f, b)
+ })
+ }
+ }
+
+ for (var h = [i.emptyPromise()], j = 0; j < b.length; j++) g(b[j], j);
+ return d.all(h)
+ }
+
+ var i = e;
+ return i.getAttrWithDefaults = function (a, b) {
+ if (null != a[b]) return a[b];
+ var c = i.defaults[b];
+ return null == c ? c : angular.isString(c) ? c : JSON.stringify(c)
+ }, i.attrGetter = function (b, c, d, e) {
+ var f = this.getAttrWithDefaults(c, b);
+ if (!d) return f;
+ try {
+ return e ? a(f)(d, e) : a(f)(d)
+ } catch (g) {
+ if (b.search(/min|max|pattern/i)) return f;
+ throw g
+ }
+ }, i.shouldUpdateOn = function (a, b, c) {
+ var d = i.attrGetter("ngfModelOptions", b, c);
+ return d && d.updateOn ? d.updateOn.split(" ").indexOf(a) > -1 : !0
+ }, i.emptyPromise = function () {
+ var a = d.defer(), c = arguments;
+ return b(function () {
+ a.resolve.apply(a, c)
+ }), a.promise
+ }, i.rejectPromise = function () {
+ var a = d.defer(), c = arguments;
+ return b(function () {
+ a.reject.apply(a, c)
+ }), a.promise
+ }, i.happyPromise = function (a, c) {
+ var e = d.defer();
+ return a.then(function (a) {
+ e.resolve(a)
+ }, function (a) {
+ b(function () {
+ throw a
+ }), e.resolve(c)
+ }), e.promise
+ }, i.updateModel = function (c, d, e, h, j, k, l) {
+ function m(f, g, j, l, m) {
+ d.$$ngfPrevValidFiles = f, d.$$ngfPrevInvalidFiles = g;
+ var n = f && f.length ? f[0] : null, o = g && g.length ? g[0] : null;
+ c && (i.applyModelValidation(c, f), c.$setViewValue(m ? n : f)), h && a(h)(e, {
+ $files: f,
+ $file: n,
+ $newFiles: j,
+ $duplicateFiles: l,
+ $invalidFiles: g,
+ $invalidFile: o,
+ $event: k
+ });
+ var p = i.attrGetter("ngfModelInvalid", d);
+ p && b(function () {
+ a(p).assign(e, m ? o : g)
+ }), b(function () {
+ })
+ }
+
+ function n() {
+ function a(a, b) {
+ return a.name === b.name && (a.$ngfOrigSize || a.size) === (b.$ngfOrigSize || b.size) && a.type === b.type
+ }
+
+ function b(b) {
+ var c;
+ for (c = 0; c < r.length; c++) if (a(b, r[c])) return !0;
+ for (c = 0; c < s.length; c++) if (a(b, s[c])) return !0;
+ return !1
+ }
+
+ if (j) {
+ q = [], t = [];
+ for (var c = 0; c < j.length; c++) b(j[c]) ? t.push(j[c]) : q.push(j[c])
+ }
+ }
+
+ function o(a) {
+ return angular.isArray(a) ? a : [a]
+ }
+
+ function p() {
+ function a() {
+ b(function () {
+ m(w ? r.concat(v) : v, w ? s.concat(u) : u, j, t, x)
+ }, z && z.debounce ? z.debounce.change || z.debounce : 0)
+ }
+
+ var f = y ? q : v;
+ g(f, d, e, c).then(function () {
+ y ? i.validate(q, w ? r.length : 0, c, d, e).then(function (b) {
+ v = b.validsFiles, u = b.invalidsFiles, a()
+ }) : a()
+ }, function () {
+ for (var b = 0; b < f.length; b++) {
+ var c = f[b];
+ if ("resize" === c.$error) {
+ var d = v.indexOf(c);
+ d > -1 && (v.splice(d, 1), u.push(c)), a()
+ }
+ }
+ })
+ }
+
+ var q, r, s, t = [], u = [], v = [];
+ r = d.$$ngfPrevValidFiles || [], s = d.$$ngfPrevInvalidFiles || [], c && c.$modelValue && (r = o(c.$modelValue));
+ var w = i.attrGetter("ngfKeep", d, e);
+ q = (j || []).slice(0), ("distinct" === w || i.attrGetter("ngfKeepDistinct", d, e) === !0) && n(d, e);
+ var x = !w && !i.attrGetter("ngfMultiple", d, e) && !i.attrGetter("multiple", d);
+ if (!w || q.length) {
+ i.attrGetter("ngfBeforeModelChange", d, e, {
+ $files: j,
+ $file: j && j.length ? j[0] : null,
+ $newFiles: q,
+ $duplicateFiles: t,
+ $event: k
+ });
+ var y = i.attrGetter("ngfValidateAfterResize", d, e), z = i.attrGetter("ngfModelOptions", d, e);
+ i.validate(q, w ? r.length : 0, c, d, e).then(function (a) {
+ l ? m(q, [], j, t, x) : (z && z.allowInvalid || y ? v = q : (v = a.validFiles, u = a.invalidFiles), i.attrGetter("ngfFixOrientation", d, e) && i.isExifSupported() ? f(v, d, e).then(function () {
+ p()
+ }) : p())
+ })
+ }
+ }, i
+}]), ngFileUpload.directive("ngfSelect", ["$parse", "$timeout", "$compile", "Upload", function (a, b, c, d) {
+ function e(a) {
+ var b = a.match(/Android[^\d]*(\d+)\.(\d+)/);
+ if (b && b.length > 2) {
+ var c = d.defaults.androidFixMinorVersion || 4;
+ return parseInt(b[1]) < 4 || parseInt(b[1]) === c && parseInt(b[2]) < c
+ }
+ return -1 === a.indexOf("Chrome") && /.*Windows.*Safari.*/.test(a)
+ }
+
+ function f(a, b, c, d, f, h, i, j) {
+ function k() {
+ return "input" === b[0].tagName.toLowerCase() && c.type && "file" === c.type.toLowerCase()
+ }
+
+ function l() {
+ return t("ngfChange") || t("ngfSelect")
+ }
+
+ function m(b) {
+ if (j.shouldUpdateOn("change", c, a)) {
+ var e = b.__files_ || b.target && b.target.files, f = [];
+ if (!e) return;
+ for (var g = 0; g < e.length; g++) f.push(e[g]);
+ j.updateModel(d, c, a, l(), f.length ? f : null, b)
+ }
+ }
+
+ function n(a, d) {
+ function e(b) {
+ a.attr("id", "ngf-" + b), d.attr("id", "ngf-label-" + b)
+ }
+
+ for (var f = 0; f < b[0].attributes.length; f++) {
+ var g = b[0].attributes[f];
+ "type" !== g.name && "class" !== g.name && "style" !== g.name && ("id" === g.name ? (e(g.value), u.push(c.$observe("id", e))) : a.attr(g.name, g.value || "required" !== g.name && "multiple" !== g.name ? g.value : g.name))
+ }
+ }
+
+ function o() {
+ if (k()) return b;
+ var a = angular.element('<input type="file">'), c = angular.element("<label>upload</label>");
+ return c.css("visibility", "hidden").css("position", "absolute").css("overflow", "hidden").css("width", "0px").css("height", "0px").css("border", "none").css("margin", "0px").css("padding", "0px").attr("tabindex", "-1"), n(a, c), g.push({
+ el: b,
+ ref: c
+ }), document.body.appendChild(c.append(a)[0]), a
+ }
+
+ function p(c) {
+ if (b.attr("disabled")) return !1;
+ if (!t("ngfSelectDisabled", a)) {
+ var d = q(c);
+ if (null != d) return d;
+ r(c);
+ try {
+ k() || document.body.contains(x[0]) || (g.push({
+ el: b,
+ ref: x.parent()
+ }), document.body.appendChild(x.parent()[0]), x.bind("change", m))
+ } catch (f) {
+ }
+ return e(navigator.userAgent) ? setTimeout(function () {
+ x[0].click()
+ }, 0) : x[0].click(), !1
+ }
+ }
+
+ function q(a) {
+ var b = a.changedTouches || a.originalEvent && a.originalEvent.changedTouches;
+ if (b) {
+ if ("touchstart" === a.type) return w = b[0].clientX, v = b[0].clientY, !0;
+ if ("touchend" === a.type) {
+ var c = b[0].clientX, d = b[0].clientY;
+ if (Math.abs(c - w) > 20 || Math.abs(d - v) > 20) return a.stopPropagation(), a.preventDefault(), !1
+ }
+ return !0
+ }
+ }
+
+ function r(b) {
+ j.shouldUpdateOn("click", c, a) && x.val() && (x.val(null), j.updateModel(d, c, a, l(), null, b, !0))
+ }
+
+ function s(a) {
+ if (x && !x.attr("__ngf_ie10_Fix_")) {
+ if (!x[0].parentNode) return void(x = null);
+ a.preventDefault(), a.stopPropagation(), x.unbind("click");
+ var b = x.clone();
+ return x.replaceWith(b), x = b, x.attr("__ngf_ie10_Fix_", "true"), x.bind("change", m), x.bind("click", s), x[0].click(), !1
+ }
+ x.removeAttr("__ngf_ie10_Fix_")
+ }
+
+ var t = function (a, b) {
+ return j.attrGetter(a, c, b)
+ };
+ j.registerModelChangeValidator(d, c, a);
+ var u = [];
+ t("ngfMultiple") && u.push(a.$watch(t("ngfMultiple"), function () {
+ x.attr("multiple", t("ngfMultiple", a))
+ })), t("ngfCapture") && u.push(a.$watch(t("ngfCapture"), function () {
+ x.attr("capture", t("ngfCapture", a))
+ })), t("ngfAccept") && u.push(a.$watch(t("ngfAccept"), function () {
+ x.attr("accept", t("ngfAccept", a))
+ })), u.push(c.$observe("accept", function () {
+ x.attr("accept", t("accept"))
+ }));
+ var v = 0, w = 0, x = b;
+ k() || (x = o()), x.bind("change", m), k() ? b.bind("click", r) : b.bind("click touchstart touchend", p), -1 !== navigator.appVersion.indexOf("MSIE 10") && x.bind("click", s), d && d.$formatters.push(function (a) {
+ return (null == a || 0 === a.length) && x.val() && x.val(null), a
+ }), a.$on("$destroy", function () {
+ k() || x.parent().remove(), angular.forEach(u, function (a) {
+ a()
+ })
+ }), h(function () {
+ for (var a = 0; a < g.length; a++) {
+ var b = g[a];
+ document.body.contains(b.el[0]) || (g.splice(a, 1), b.ref.remove())
+ }
+ }), window.FileAPI && window.FileAPI.ngfFixIE && window.FileAPI.ngfFixIE(b, x, m)
+ }
+
+ var g = [];
+ return {
+ restrict: "AEC", require: "?ngModel", link: function (e, g, h, i) {
+ f(e, g, h, i, a, b, c, d)
+ }
+ }
+}]), function () {
+ function a(a) {
+ return "img" === a.tagName.toLowerCase() ? "image" : "audio" === a.tagName.toLowerCase() ? "audio" : "video" === a.tagName.toLowerCase() ? "video" : /./
+ }
+
+ function b(b, c, d, e, f, g, h, i) {
+ function j(a) {
+ var g = b.attrGetter("ngfNoObjectUrl", f, d);
+ b.dataUrl(a, g)["finally"](function () {
+ c(function () {
+ var b = (g ? a.$ngfDataUrl : a.$ngfBlobUrl) || a.$ngfDataUrl;
+ i ? e.css("background-image", "url('" + (b || "") + "')") : e.attr("src", b), b ? e.removeClass("ng-hide") : e.addClass("ng-hide")
+ })
+ })
+ }
+
+ c(function () {
+ var c = d.$watch(f[g], function (c) {
+ var k = h;
+ if ("ngfThumbnail" === g && (k || (k = {
+ width: e[0].naturalWidth || e[0].clientWidth,
+ height: e[0].naturalHeight || e[0].clientHeight
+ }), 0 === k.width && window.getComputedStyle)) {
+ var l = getComputedStyle(e[0]);
+ l.width && l.width.indexOf("px") > -1 && l.height && l.height.indexOf("px") > -1 && (k = {
+ width: parseInt(l.width.slice(0, -2)),
+ height: parseInt(l.height.slice(0, -2))
+ })
+ }
+ return angular.isString(c) ? (e.removeClass("ng-hide"), i ? e.css("background-image", "url('" + c + "')") : e.attr("src", c)) : void(!c || !c.type || 0 !== c.type.search(a(e[0])) || i && 0 !== c.type.indexOf("image") ? e.addClass("ng-hide") : k && b.isResizeSupported() ? (k.resizeIf = function (a, e) {
+ return b.attrGetter("ngfResizeIf", f, d, {$width: a, $height: e, $file: c})
+ }, b.resize(c, k).then(function (a) {
+ j(a)
+ }, function (a) {
+ throw a
+ })) : j(c))
+ });
+ d.$on("$destroy", function () {
+ c()
+ })
+ })
+ }
+
+ ngFileUpload.service("UploadDataUrl", ["UploadBase", "$timeout", "$q", function (a, b, c) {
+ var d = a;
+ return d.base64DataUrl = function (a) {
+ if (angular.isArray(a)) {
+ var b = c.defer(), e = 0;
+ return angular.forEach(a, function (c) {
+ d.dataUrl(c, !0)["finally"](function () {
+ if (e++, e === a.length) {
+ var c = [];
+ angular.forEach(a, function (a) {
+ c.push(a.$ngfDataUrl)
+ }), b.resolve(c, a)
+ }
+ })
+ }), b.promise
+ }
+ return d.dataUrl(a, !0)
+ }, d.dataUrl = function (a, e) {
+ if (!a) return d.emptyPromise(a, a);
+ if (e && null != a.$ngfDataUrl || !e && null != a.$ngfBlobUrl) return d.emptyPromise(e ? a.$ngfDataUrl : a.$ngfBlobUrl, a);
+ var f = e ? a.$$ngfDataUrlPromise : a.$$ngfBlobUrlPromise;
+ if (f) return f;
+ var g = c.defer();
+ return b(function () {
+ if (window.FileReader && a && (!window.FileAPI || -1 === navigator.userAgent.indexOf("MSIE 8") || a.size < 2e4) && (!window.FileAPI || -1 === navigator.userAgent.indexOf("MSIE 9") || a.size < 4e6)) {
+ var c = window.URL || window.webkitURL;
+ if (c && c.createObjectURL && !e) {
+ var f;
+ try {
+ f = c.createObjectURL(a)
+ } catch (h) {
+ return void b(function () {
+ a.$ngfBlobUrl = "", g.reject()
+ })
+ }
+ b(function () {
+ if (a.$ngfBlobUrl = f, f) {
+ g.resolve(f, a), d.blobUrls = d.blobUrls || [], d.blobUrlsTotalSize = d.blobUrlsTotalSize || 0, d.blobUrls.push({
+ url: f,
+ size: a.size
+ }), d.blobUrlsTotalSize += a.size || 0;
+ for (var b = d.defaults.blobUrlsMaxMemory || 268435456, e = d.defaults.blobUrlsMaxQueueSize || 200; (d.blobUrlsTotalSize > b || d.blobUrls.length > e) && d.blobUrls.length > 1;) {
+ var h = d.blobUrls.splice(0, 1)[0];
+ c.revokeObjectURL(h.url), d.blobUrlsTotalSize -= h.size
+ }
+ }
+ })
+ } else {
+ var i = new FileReader;
+ i.onload = function (c) {
+ b(function () {
+ a.$ngfDataUrl = c.target.result, g.resolve(c.target.result, a), b(function () {
+ delete a.$ngfDataUrl
+ }, 1e3)
+ })
+ }, i.onerror = function () {
+ b(function () {
+ a.$ngfDataUrl = "", g.reject()
+ })
+ }, i.readAsDataURL(a)
+ }
+ } else b(function () {
+ a[e ? "$ngfDataUrl" : "$ngfBlobUrl"] = "", g.reject()
+ })
+ }), f = e ? a.$$ngfDataUrlPromise = g.promise : a.$$ngfBlobUrlPromise = g.promise, f["finally"](function () {
+ delete a[e ? "$$ngfDataUrlPromise" : "$$ngfBlobUrlPromise"]
+ }), f
+ }, d
+ }]), ngFileUpload.directive("ngfSrc", ["Upload", "$timeout", function (a, c) {
+ return {
+ restrict: "AE", link: function (d, e, f) {
+ b(a, c, d, e, f, "ngfSrc", a.attrGetter("ngfResize", f, d), !1)
+ }
+ }
+ }]), ngFileUpload.directive("ngfBackground", ["Upload", "$timeout", function (a, c) {
+ return {
+ restrict: "AE", link: function (d, e, f) {
+ b(a, c, d, e, f, "ngfBackground", a.attrGetter("ngfResize", f, d), !0)
+ }
+ }
+ }]), ngFileUpload.directive("ngfThumbnail", ["Upload", "$timeout", function (a, c) {
+ return {
+ restrict: "AE", link: function (d, e, f) {
+ var g = a.attrGetter("ngfSize", f, d);
+ b(a, c, d, e, f, "ngfThumbnail", g, a.attrGetter("ngfAsBackground", f, d))
+ }
+ }
+ }]), ngFileUpload.config(["$compileProvider", function (a) {
+ a.imgSrcSanitizationWhitelist && a.imgSrcSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|webcal|local|file|data|blob):/), a.aHrefSanitizationWhitelist && a.aHrefSanitizationWhitelist(/^\s*(https?|ftp|mailto|tel|webcal|local|file|data|blob):/)
+ }]), ngFileUpload.filter("ngfDataUrl", ["UploadDataUrl", "$sce", function (a, b) {
+ return function (c, d, e) {
+ if (angular.isString(c)) return b.trustAsResourceUrl(c);
+ var f = c && ((d ? c.$ngfDataUrl : c.$ngfBlobUrl) || c.$ngfDataUrl);
+ return c && !f ? (!c.$ngfDataUrlFilterInProgress && angular.isObject(c) && (c.$ngfDataUrlFilterInProgress = !0, a.dataUrl(c, d)), "") : (c && delete c.$ngfDataUrlFilterInProgress, (c && f ? e ? b.trustAsResourceUrl(f) : f : c) || "")
+ }
+ }])
+}(), ngFileUpload.service("UploadValidate", ["UploadDataUrl", "$q", "$timeout", function (a, b, c) {
+ function d(a) {
+ var b = "", c = [];
+ if (a.length > 2 && "/" === a[0] && "/" === a[a.length - 1]) b = a.substring(1, a.length - 1); else {
+ var e = a.split(",");
+ if (e.length > 1) for (var f = 0; f < e.length; f++) {
+ var g = d(e[f]);
+ g.regexp ? (b += "(" + g.regexp + ")", f < e.length - 1 && (b += "|")) : c = c.concat(g.excludes)
+ } else 0 === a.indexOf("!") ? c.push("^((?!" + d(a.substring(1)).regexp + ").)*$") : (0 === a.indexOf(".") && (a = "*" + a), b = "^" + a.replace(new RegExp("[.\\\\+*?\\[\\^\\]$(){}=!<>|:\\-]", "g"), "\\$&") + "$", b = b.replace(/\\\*/g, ".*").replace(/\\\?/g, "."))
+ }
+ return {regexp: b, excludes: c}
+ }
+
+ function e(a, b) {
+ null == b || a.$dirty || (a.$setDirty ? a.$setDirty() : a.$dirty = !0)
+ }
+
+ var f = a;
+ return f.validatePattern = function (a, b) {
+ if (!b) return !0;
+ var c = d(b), e = !0;
+ if (c.regexp && c.regexp.length) {
+ var f = new RegExp(c.regexp, "i");
+ e = null != a.type && f.test(a.type) || null != a.name && f.test(a.name)
+ }
+ for (var g = c.excludes.length; g--;) {
+ var h = new RegExp(c.excludes[g], "i");
+ e = e && (null == a.type || h.test(a.type)) && (null == a.name || h.test(a.name))
+ }
+ return e
+ }, f.ratioToFloat = function (a) {
+ var b = a.toString(), c = b.search(/[x:]/i);
+ return b = c > -1 ? parseFloat(b.substring(0, c)) / parseFloat(b.substring(c + 1)) : parseFloat(b)
+ }, f.registerModelChangeValidator = function (a, b, c) {
+ a && a.$formatters.push(function (d) {
+ if (a.$dirty) {
+ var e = d;
+ d && !angular.isArray(d) && (e = [d]), f.validate(e, 0, a, b, c).then(function () {
+ f.applyModelValidation(a, e)
+ })
+ }
+ return d
+ })
+ }, f.applyModelValidation = function (a, b) {
+ e(a, b), angular.forEach(a.$ngfValidations, function (b) {
+ a.$setValidity(b.name, b.valid)
+ })
+ }, f.getValidationAttr = function (a, b, c, d, e) {
+ var g = "ngf" + c[0].toUpperCase() + c.substr(1), h = f.attrGetter(g, a, b, {$file: e});
+ if (null == h && (h = f.attrGetter("ngfValidate", a, b, {$file: e}))) {
+ var i = (d || c).split(".");
+ h = h[i[0]], i.length > 1 && (h = h && h[i[1]])
+ }
+ return h
+ }, f.validate = function (a, c, d, e, g) {
+ function h(b, c, h) {
+ if (a) {
+ for (var i = a.length, j = null; i--;) {
+ var n = a[i];
+ if (n) {
+ var o = f.getValidationAttr(e, g, b, c, n);
+ null != o && (h(n, o, i) || (-1 === k.indexOf(b) ? (n.$error = b, (n.$errorMessages = n.$errorMessages || {})[b] = !0, n.$errorParam = o, -1 === m.indexOf(n) && m.push(n), l || a.splice(i, 1), j = !1) : a.splice(i, 1)))
+ }
+ }
+ null !== j && d.$ngfValidations.push({name: b, valid: j})
+ }
+ }
+
+ function i(c, h, i, n, o) {
+ function p(b, d, e) {
+ function f(f) {
+ if (f()) if (-1 === k.indexOf(c)) {
+ if (d.$error = c, (d.$errorMessages = d.$errorMessages || {})[c] = !0, d.$errorParam = e, -1 === m.indexOf(d) && m.push(d), !l) {
+ var g = a.indexOf(d);
+ g > -1 && a.splice(g, 1)
+ }
+ b.resolve(!1)
+ } else {
+ var h = a.indexOf(d);
+ h > -1 && a.splice(h, 1), b.resolve(!0)
+ } else b.resolve(!0)
+ }
+
+ null != e ? n(d, e).then(function (a) {
+ f(function () {
+ return !o(a, e)
+ })
+ }, function () {
+ f(function () {
+ return j("ngfValidateForce", {$file: d})
+ })
+ }) : b.resolve(!0)
+ }
+
+ var q = [f.emptyPromise(!0)];
+ a && (a = void 0 === a.length ? [a] : a, angular.forEach(a, function (a) {
+ var d = b.defer();
+ return q.push(d.promise), !i || null != a.type && 0 === a.type.search(i) ? void("dimensions" === c && null != f.attrGetter("ngfDimensions", e) ? f.imageDimensions(a).then(function (b) {
+ p(d, a, j("ngfDimensions", {$file: a, $width: b.width, $height: b.height}))
+ }, function () {
+ d.resolve(!1)
+ }) : "duration" === c && null != f.attrGetter("ngfDuration", e) ? f.mediaDuration(a).then(function (b) {
+ p(d, a, j("ngfDuration", {$file: a, $duration: b}))
+ }, function () {
+ d.resolve(!1)
+ }) : p(d, a, f.getValidationAttr(e, g, c, h, a))) : void d.resolve(!0)
+ }));
+ var r = b.defer();
+ return b.all(q).then(function (a) {
+ for (var b = !0, e = 0; e < a.length; e++) if (!a[e]) {
+ b = !1;
+ break
+ }
+ d.$ngfValidations.push({name: c, valid: b}), r.resolve(b)
+ }), r.promise
+ }
+
+ d = d || {}, d.$ngfValidations = d.$ngfValidations || [], angular.forEach(d.$ngfValidations, function (a) {
+ a.valid = !0
+ });
+ var j = function (a, b) {
+ return f.attrGetter(a, e, g, b)
+ }, k = (f.attrGetter("ngfIgnoreInvalid", e, g) || "").split(" "),
+ l = f.attrGetter("ngfRunAllValidations", e, g);
+ if (null == a || 0 === a.length) return f.emptyPromise({validFiles: a, invalidFiles: []});
+ a = void 0 === a.length ? [a] : a.slice(0);
+ var m = [];
+ h("pattern", null, f.validatePattern), h("minSize", "size.min", function (a, b) {
+ return a.size + .1 >= f.translateScalars(b)
+ }), h("maxSize", "size.max", function (a, b) {
+ return a.size - .1 <= f.translateScalars(b)
+ });
+ var n = 0;
+ if (h("maxTotalSize", null, function (b, c) {
+ return n += b.size, n > f.translateScalars(c) ? (a.splice(0, a.length), !1) : !0
+ }), h("validateFn", null, function (a, b) {
+ return b === !0 || null === b || "" === b
+ }), !a.length) return f.emptyPromise({validFiles: [], invalidFiles: m});
+ var o = b.defer(), p = [];
+ return p.push(i("maxHeight", "height.max", /image/, this.imageDimensions, function (a, b) {
+ return a.height <= b
+ })), p.push(i("minHeight", "height.min", /image/, this.imageDimensions, function (a, b) {
+ return a.height >= b
+ })), p.push(i("maxWidth", "width.max", /image/, this.imageDimensions, function (a, b) {
+ return a.width <= b
+ })), p.push(i("minWidth", "width.min", /image/, this.imageDimensions, function (a, b) {
+ return a.width >= b
+ })), p.push(i("dimensions", null, /image/, function (a, b) {
+ return f.emptyPromise(b)
+ }, function (a) {
+ return a
+ })), p.push(i("ratio", null, /image/, this.imageDimensions, function (a, b) {
+ for (var c = b.toString().split(","), d = !1, e = 0; e < c.length; e++) Math.abs(a.width / a.height - f.ratioToFloat(c[e])) < .01 && (d = !0);
+ return d
+ })), p.push(i("maxRatio", "ratio.max", /image/, this.imageDimensions, function (a, b) {
+ return a.width / a.height - f.ratioToFloat(b) < 1e-4
+ })), p.push(i("minRatio", "ratio.min", /image/, this.imageDimensions, function (a, b) {
+ return a.width / a.height - f.ratioToFloat(b) > -1e-4
+ })), p.push(i("maxDuration", "duration.max", /audio|video/, this.mediaDuration, function (a, b) {
+ return a <= f.translateScalars(b)
+ })), p.push(i("minDuration", "duration.min", /audio|video/, this.mediaDuration, function (a, b) {
+ return a >= f.translateScalars(b)
+ })), p.push(i("duration", null, /audio|video/, function (a, b) {
+ return f.emptyPromise(b)
+ }, function (a) {
+ return a
+ })), p.push(i("validateAsyncFn", null, null, function (a, b) {
+ return b
+ }, function (a) {
+ return a === !0 || null === a || "" === a
+ })), b.all(p).then(function () {
+ if (l) for (var b = 0; b < a.length; b++) {
+ var d = a[b];
+ d.$error && a.splice(b--, 1)
+ }
+ l = !1, h("maxFiles", null, function (a, b, d) {
+ return b > c + d
+ }), o.resolve({validFiles: a, invalidFiles: m})
+ }), o.promise
+ }, f.imageDimensions = function (a) {
+ if (a.$ngfWidth && a.$ngfHeight) {
+ var d = b.defer();
+ return c(function () {
+ d.resolve({width: a.$ngfWidth, height: a.$ngfHeight})
+ }), d.promise
+ }
+ if (a.$ngfDimensionPromise) return a.$ngfDimensionPromise;
+ var e = b.defer();
+ return c(function () {
+ return 0 !== a.type.indexOf("image") ? void e.reject("not image") : void f.dataUrl(a).then(function (b) {
+ function d() {
+ var b = h[0].naturalWidth || h[0].clientWidth, c = h[0].naturalHeight || h[0].clientHeight;
+ h.remove(), a.$ngfWidth = b, a.$ngfHeight = c, e.resolve({width: b, height: c})
+ }
+
+ function f() {
+ h.remove(), e.reject("load error")
+ }
+
+ function g() {
+ c(function () {
+ h[0].parentNode && (h[0].clientWidth ? d() : i++ > 10 ? f() : g())
+ }, 1e3)
+ }
+
+ var h = angular.element("<img>").attr("src", b).css("visibility", "hidden").css("position", "fixed").css("max-width", "none !important").css("max-height", "none !important");
+ h.on("load", d), h.on("error", f);
+ var i = 0;
+ g(), angular.element(document.getElementsByTagName("body")[0]).append(h)
+ }, function () {
+ e.reject("load error")
+ })
+ }), a.$ngfDimensionPromise = e.promise, a.$ngfDimensionPromise["finally"](function () {
+ delete a.$ngfDimensionPromise
+ }), a.$ngfDimensionPromise
+ }, f.mediaDuration = function (a) {
+ if (a.$ngfDuration) {
+ var d = b.defer();
+ return c(function () {
+ d.resolve(a.$ngfDuration)
+ }), d.promise
+ }
+ if (a.$ngfDurationPromise) return a.$ngfDurationPromise;
+ var e = b.defer();
+ return c(function () {
+ return 0 !== a.type.indexOf("audio") && 0 !== a.type.indexOf("video") ? void e.reject("not media") : void f.dataUrl(a).then(function (b) {
+ function d() {
+ var b = h[0].duration;
+ a.$ngfDuration = b, h.remove(), e.resolve(b)
+ }
+
+ function f() {
+ h.remove(), e.reject("load error")
+ }
+
+ function g() {
+ c(function () {
+ h[0].parentNode && (h[0].duration ? d() : i > 10 ? f() : g())
+ }, 1e3)
+ }
+
+ var h = angular.element(0 === a.type.indexOf("audio") ? "<audio>" : "<video>").attr("src", b).css("visibility", "none").css("position", "fixed");
+ h.on("loadedmetadata", d), h.on("error", f);
+ var i = 0;
+ g(), angular.element(document.body).append(h)
+ }, function () {
+ e.reject("load error")
+ })
+ }), a.$ngfDurationPromise = e.promise, a.$ngfDurationPromise["finally"](function () {
+ delete a.$ngfDurationPromise
+ }), a.$ngfDurationPromise
+ }, f
+}]), ngFileUpload.service("UploadResize", ["UploadValidate", "$q", function (a, b) {
+ var c = a, d = function (a, b, c, d, e) {
+ var f = e ? Math.max(c / a, d / b) : Math.min(c / a, d / b);
+ return {width: a * f, height: b * f, marginX: a * f - c, marginY: b * f - d}
+ }, e = function (a, e, f, g, h, i, j, k) {
+ var l = b.defer(), m = document.createElement("canvas"), n = document.createElement("img");
+ return n.setAttribute("style", "visibility:hidden;position:fixed;z-index:-100000"), document.body.appendChild(n), n.onload = function () {
+ var a = n.width, b = n.height;
+ if (n.parentNode.removeChild(n), null != k && k(a, b) === !1) return void l.reject("resizeIf");
+ try {
+ if (i) {
+ var o = c.ratioToFloat(i), p = a / b;
+ o > p ? (e = a, f = e / o) : (f = b, e = f * o)
+ }
+ e || (e = a), f || (f = b);
+ var q = d(a, b, e, f, j);
+ m.width = Math.min(q.width, e), m.height = Math.min(q.height, f);
+ var r = m.getContext("2d");
+ r.drawImage(n, Math.min(0, -q.marginX / 2), Math.min(0, -q.marginY / 2), q.width, q.height), l.resolve(m.toDataURL(h || "image/WebP", g || .934))
+ } catch (s) {
+ l.reject(s)
+ }
+ }, n.onerror = function () {
+ n.parentNode.removeChild(n), l.reject()
+ }, n.src = a, l.promise
+ };
+ return c.dataUrltoBlob = function (a, b, c) {
+ for (var d = a.split(","), e = d[0].match(/:(.*?);/)[1], f = atob(d[1]), g = f.length, h = new Uint8Array(g); g--;) h[g] = f.charCodeAt(g);
+ var i = new window.Blob([h], {type: e});
+ return i.name = b, i.$ngfOrigSize = c, i
+ }, c.isResizeSupported = function () {
+ var a = document.createElement("canvas");
+ return window.atob && a.getContext && a.getContext("2d") && window.Blob
+ }, c.isResizeSupported() && Object.defineProperty(window.Blob.prototype, "name", {
+ get: function () {
+ return this.$ngfName
+ }, set: function (a) {
+ this.$ngfName = a
+ }, configurable: !0
+ }), c.resize = function (a, d) {
+ if (0 !== a.type.indexOf("image")) return c.emptyPromise(a);
+ var f = b.defer();
+ return c.dataUrl(a, !0).then(function (b) {
+ e(b, d.width, d.height, d.quality, d.type || a.type, d.ratio, d.centerCrop, d.resizeIf).then(function (e) {
+ if ("image/jpeg" === a.type && d.restoreExif !== !1) try {
+ e = c.restoreExif(b, e)
+ } catch (g) {
+ setTimeout(function () {
+ throw g
+ }, 1)
+ }
+ try {
+ var h = c.dataUrltoBlob(e, a.name, a.size);
+ f.resolve(h)
+ } catch (g) {
+ f.reject(g)
+ }
+ }, function (b) {
+ "resizeIf" === b && f.resolve(a), f.reject(b)
+ })
+ }, function (a) {
+ f.reject(a)
+ }), f.promise
+ }, c
+}]), function () {
+ function a(a, c, d, e, f, g, h, i, j, k) {
+ function l() {
+ return c.attr("disabled") || s("ngfDropDisabled", a)
+ }
+
+ function m(b, c, d) {
+ if (b) {
+ var e;
+ try {
+ e = b && b.getData && b.getData("text/html")
+ } catch (f) {
+ }
+ q(b.items, b.files, s("ngfAllowDir", a) !== !1, s("multiple") || s("ngfMultiple", a)).then(function (a) {
+ a.length ? n(a, c) : o(d, e).then(function (a) {
+ n(a, c)
+ })
+ })
+ }
+ }
+
+ function n(b, c) {
+ i.updateModel(e, d, a, s("ngfChange") || s("ngfDrop"), b, c)
+ }
+
+ function o(b, c) {
+ if (!i.shouldUpdateOn(b, d, a) || "string" != typeof c) return i.rejectPromise([]);
+ var e = [];
+ c.replace(/<(img src|img [^>]* src) *=\"([^\"]*)\"/gi, function (a, b, c) {
+ e.push(c)
+ });
+ var f = [], g = [];
+ if (e.length) {
+ angular.forEach(e, function (a) {
+ f.push(i.urlToBlob(a).then(function (a) {
+ g.push(a)
+ }))
+ });
+ var h = k.defer();
+ return k.all(f).then(function () {
+ h.resolve(g)
+ }, function (a) {
+ h.reject(a)
+ }), h.promise
+ }
+ return i.emptyPromise()
+ }
+
+ function p(a, b, c, d) {
+ var e = s("ngfDragOverClass", a, {$event: c}), f = "dragover";
+ if (angular.isString(e)) f = e; else if (e && (e.delay && (w = e.delay), e.accept || e.reject)) {
+ var g = c.dataTransfer.items;
+ if (null != g && g.length) for (var h = e.pattern || s("ngfPattern", a, {$event: c}), j = g.length; j--;) {
+ if (!i.validatePattern(g[j], h)) {
+ f = e.reject;
+ break
+ }
+ f = e.accept
+ } else f = e.accept
+ }
+ d(f)
+ }
+
+ function q(b, c, e, f) {
+ function g(a, b) {
+ var c = k.defer();
+ if (null != a) if (a.isDirectory) {
+ var d = [i.emptyPromise()];
+ if (m) {
+ var e = {type: "directory"};
+ e.name = e.path = (b || "") + a.name, n.push(e)
+ }
+ var f = a.createReader(), h = [], p = function () {
+ f.readEntries(function (e) {
+ try {
+ e.length ? (h = h.concat(Array.prototype.slice.call(e || [], 0)), p()) : (angular.forEach(h.slice(0), function (c) {
+ n.length <= j && l >= o && d.push(g(c, (b ? b : "") + a.name + "/"))
+ }), k.all(d).then(function () {
+ c.resolve()
+ }, function (a) {
+ c.reject(a)
+ }))
+ } catch (f) {
+ c.reject(f)
+ }
+ }, function (a) {
+ c.reject(a)
+ })
+ };
+ p()
+ } else a.file(function (a) {
+ try {
+ a.path = (b ? b : "") + a.name, m && (a = i.rename(a, a.path)), n.push(a), o += a.size, c.resolve()
+ } catch (d) {
+ c.reject(d)
+ }
+ }, function (a) {
+ c.reject(a)
+ });
+ return c.promise
+ }
+
+ var j = i.getValidationAttr(d, a, "maxFiles");
+ null == j && (j = Number.MAX_VALUE);
+ var l = i.getValidationAttr(d, a, "maxTotalSize");
+ null == l && (l = Number.MAX_VALUE);
+ var m = s("ngfIncludeDir", a), n = [], o = 0, p = [i.emptyPromise()];
+ if (b && b.length > 0 && "file:" !== h.location.protocol) for (var q = 0; q < b.length; q++) {
+ if (b[q].webkitGetAsEntry && b[q].webkitGetAsEntry() && b[q].webkitGetAsEntry().isDirectory) {
+ var r = b[q].webkitGetAsEntry();
+ if (r.isDirectory && !e) continue;
+ null != r && p.push(g(r))
+ } else {
+ var t = b[q].getAsFile();
+ null != t && (n.push(t), o += t.size)
+ }
+ if (n.length > j || o > l || !f && n.length > 0) break
+ } else if (null != c) for (var u = 0; u < c.length; u++) {
+ var v = c.item(u);
+ if ((v.type || v.size > 0) && (n.push(v), o += v.size), n.length > j || o > l || !f && n.length > 0) break
+ }
+ var w = k.defer();
+ return k.all(p).then(function () {
+ if (f || m || !n.length) w.resolve(n); else {
+ for (var a = 0; n[a] && "directory" === n[a].type;) a++;
+ w.resolve([n[a]])
+ }
+ }, function (a) {
+ w.reject(a)
+ }), w.promise
+ }
+
+ var r = b(), s = function (a, b, c) {
+ return i.attrGetter(a, d, b, c)
+ };
+ if (s("dropAvailable") && g(function () {
+ a[s("dropAvailable")] ? a[s("dropAvailable")].value = r : a[s("dropAvailable")] = r
+ }), !r) return void(s("ngfHideOnDropNotAvailable", a) === !0 && c.css("display", "none"));
+ null == s("ngfSelect") && i.registerModelChangeValidator(e, d, a);
+ var t, u = null, v = f(s("ngfStopPropagation")), w = 1;
+ c[0].addEventListener("dragover", function (b) {
+ if (!l() && i.shouldUpdateOn("drop", d, a)) {
+ if (b.preventDefault(), v(a) && b.stopPropagation(), navigator.userAgent.indexOf("Chrome") > -1) {
+ var e = b.dataTransfer.effectAllowed;
+ b.dataTransfer.dropEffect = "move" === e || "linkMove" === e ? "move" : "copy"
+ }
+ g.cancel(u), t || (t = "C", p(a, d, b, function (d) {
+ t = d, c.addClass(t), s("ngfDrag", a, {$isDragging: !0, $class: t, $event: b})
+ }))
+ }
+ }, !1), c[0].addEventListener("dragenter", function (b) {
+ !l() && i.shouldUpdateOn("drop", d, a) && (b.preventDefault(), v(a) && b.stopPropagation())
+ }, !1), c[0].addEventListener("dragleave", function (b) {
+ !l() && i.shouldUpdateOn("drop", d, a) && (b.preventDefault(),
+ v(a) && b.stopPropagation(), u = g(function () {
+ t && c.removeClass(t), t = null, s("ngfDrag", a, {$isDragging: !1, $event: b})
+ }, w || 100))
+ }, !1), c[0].addEventListener("drop", function (b) {
+ !l() && i.shouldUpdateOn("drop", d, a) && (b.preventDefault(), v(a) && b.stopPropagation(), t && c.removeClass(t), t = null, m(b.dataTransfer, b, "dropUrl"))
+ }, !1), c[0].addEventListener("paste", function (b) {
+ navigator.userAgent.toLowerCase().indexOf("firefox") > -1 && s("ngfEnableFirefoxPaste", a) && b.preventDefault(), !l() && i.shouldUpdateOn("paste", d, a) && m(b.clipboardData || b.originalEvent.clipboardData, b, "pasteUrl")
+ }, !1), navigator.userAgent.toLowerCase().indexOf("firefox") > -1 && s("ngfEnableFirefoxPaste", a) && (c.attr("contenteditable", !0), c.on("keypress", function (a) {
+ a.metaKey || a.ctrlKey || a.preventDefault()
+ }))
+ }
+
+ function b() {
+ var a = document.createElement("div");
+ return "draggable" in a && "ondrop" in a && !/Edge\/12./i.test(navigator.userAgent)
+ }
+
+ ngFileUpload.directive("ngfDrop", ["$parse", "$timeout", "$window", "Upload", "$http", "$q", function (b, c, d, e, f, g) {
+ return {
+ restrict: "AEC", require: "?ngModel", link: function (h, i, j, k) {
+ a(h, i, j, k, b, c, d, e, f, g)
+ }
+ }
+ }]), ngFileUpload.directive("ngfNoFileDrop", function () {
+ return function (a, c) {
+ b() && c.css("display", "none")
+ }
+ }), ngFileUpload.directive("ngfDropAvailable", ["$parse", "$timeout", "Upload", function (a, c, d) {
+ return function (e, f, g) {
+ if (b()) {
+ var h = a(d.attrGetter("ngfDropAvailable", g));
+ c(function () {
+ h(e), h.assign && h.assign(e, !0)
+ })
+ }
+ }
+ }])
+}(), ngFileUpload.service("UploadExif", ["UploadResize", "$q", function (a, b) {
+ function c(a, b, c, d) {
+ switch (b) {
+ case 2:
+ return a.transform(-1, 0, 0, 1, c, 0);
+ case 3:
+ return a.transform(-1, 0, 0, -1, c, d);
+ case 4:
+ return a.transform(1, 0, 0, -1, 0, d);
+ case 5:
+ return a.transform(0, 1, 1, 0, 0, 0);
+ case 6:
+ return a.transform(0, 1, -1, 0, d, 0);
+ case 7:
+ return a.transform(0, -1, -1, 0, d, c);
+ case 8:
+ return a.transform(0, -1, 1, 0, 0, c)
+ }
+ }
+
+ function d(a) {
+ for (var b = "", c = new Uint8Array(a), d = c.byteLength, e = 0; d > e; e++) b += String.fromCharCode(c[e]);
+ return window.btoa(b)
+ }
+
+ var e = a;
+ return e.isExifSupported = function () {
+ return window.FileReader && (new FileReader).readAsArrayBuffer && e.isResizeSupported()
+ }, e.readOrientation = function (a) {
+ var c = b.defer(), d = new FileReader, e = a.slice ? a.slice(0, 65536) : a;
+ return d.readAsArrayBuffer(e), d.onerror = function (a) {
+ return c.reject(a)
+ }, d.onload = function (a) {
+ var b = {orientation: 1}, d = new DataView(this.result);
+ if (65496 !== d.getUint16(0, !1)) return c.resolve(b);
+ for (var e = d.byteLength, f = 2; e > f;) {
+ var g = d.getUint16(f, !1);
+ if (f += 2, 65505 === g) {
+ if (1165519206 !== d.getUint32(f += 2, !1)) return c.resolve(b);
+ var h = 18761 === d.getUint16(f += 6, !1);
+ f += d.getUint32(f + 4, h);
+ var i = d.getUint16(f, h);
+ f += 2;
+ for (var j = 0; i > j; j++) if (274 === d.getUint16(f + 12 * j, h)) {
+ var k = d.getUint16(f + 12 * j + 8, h);
+ return k >= 2 && 8 >= k && (d.setUint16(f + 12 * j + 8, 1, h), b.fixedArrayBuffer = a.target.result), b.orientation = k, c.resolve(b)
+ }
+ } else {
+ if (65280 !== (65280 & g)) break;
+ f += d.getUint16(f, !1)
+ }
+ }
+ return c.resolve(b)
+ }, c.promise
+ }, e.applyExifRotation = function (a) {
+ if (0 !== a.type.indexOf("image/jpeg")) return e.emptyPromise(a);
+ var f = b.defer();
+ return e.readOrientation(a).then(function (b) {
+ return b.orientation < 2 || b.orientation > 8 ? f.resolve(a) : void e.dataUrl(a, !0).then(function (g) {
+ var h = document.createElement("canvas"), i = document.createElement("img");
+ i.onload = function () {
+ try {
+ h.width = b.orientation > 4 ? i.height : i.width, h.height = b.orientation > 4 ? i.width : i.height;
+ var g = h.getContext("2d");
+ c(g, b.orientation, i.width, i.height), g.drawImage(i, 0, 0);
+ var j = h.toDataURL(a.type || "image/WebP", .934);
+ j = e.restoreExif(d(b.fixedArrayBuffer), j);
+ var k = e.dataUrltoBlob(j, a.name);
+ f.resolve(k)
+ } catch (l) {
+ return f.reject(l)
+ }
+ }, i.onerror = function () {
+ f.reject()
+ }, i.src = g
+ }, function (a) {
+ f.reject(a)
+ })
+ }, function (a) {
+ f.reject(a)
+ }), f.promise
+ }, e.restoreExif = function (a, b) {
+ var c = {};
+ return c.KEY_STR = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", c.encode64 = function (a) {
+ var b, c, d, e, f, g = "", h = "", i = "", j = 0;
+ do b = a[j++], c = a[j++], h = a[j++], d = b >> 2, e = (3 & b) << 4 | c >> 4, f = (15 & c) << 2 | h >> 6, i = 63 & h, isNaN(c) ? f = i = 64 : isNaN(h) && (i = 64), g = g + this.KEY_STR.charAt(d) + this.KEY_STR.charAt(e) + this.KEY_STR.charAt(f) + this.KEY_STR.charAt(i), b = c = h = "", d = e = f = i = ""; while (j < a.length);
+ return g
+ }, c.restore = function (a, b) {
+ a.match("data:image/jpeg;base64,") && (a = a.replace("data:image/jpeg;base64,", ""));
+ var c = this.decode64(a), d = this.slice2Segments(c), e = this.exifManipulation(b, d);
+ return "data:image/jpeg;base64," + this.encode64(e)
+ }, c.exifManipulation = function (a, b) {
+ var c = this.getExifArray(b), d = this.insertExif(a, c);
+ return new Uint8Array(d)
+ }, c.getExifArray = function (a) {
+ for (var b, c = 0; c < a.length; c++) if (b = a[c], 255 === b[0] & 225 === b[1]) return b;
+ return []
+ }, c.insertExif = function (a, b) {
+ var c = a.replace("data:image/jpeg;base64,", ""), d = this.decode64(c), e = d.indexOf(255, 3),
+ f = d.slice(0, e), g = d.slice(e), h = f;
+ return h = h.concat(b), h = h.concat(g)
+ }, c.slice2Segments = function (a) {
+ for (var b = 0, c = []; ;) {
+ if (255 === a[b] & 218 === a[b + 1]) break;
+ if (255 === a[b] & 216 === a[b + 1]) b += 2; else {
+ var d = 256 * a[b + 2] + a[b + 3], e = b + d + 2, f = a.slice(b, e);
+ c.push(f), b = e
+ }
+ if (b > a.length) break
+ }
+ return c
+ }, c.decode64 = function (a) {
+ var b, c, d, e, f, g = "", h = "", i = 0, j = [], k = /[^A-Za-z0-9\+\/\=]/g;
+ k.exec(a) && console.log("There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, NaNExpect errors in decoding."), a = a.replace(/[^A-Za-z0-9\+\/\=]/g, "");
+ do d = this.KEY_STR.indexOf(a.charAt(i++)), e = this.KEY_STR.indexOf(a.charAt(i++)), f = this.KEY_STR.indexOf(a.charAt(i++)), h = this.KEY_STR.indexOf(a.charAt(i++)), b = d << 2 | e >> 4, c = (15 & e) << 4 | f >> 2, g = (3 & f) << 6 | h, j.push(b), 64 !== f && j.push(c), 64 !== h && j.push(g), b = c = g = "", d = e = f = h = ""; while (i < a.length);
+ return j
+ }, c.restore(a, b)
+ }, e
+}]); \ No newline at end of file
diff --git a/src/main/resources/assets/js/old/bootstrap.min.js b/src/main/resources/assets/js/old/bootstrap.min.js
new file mode 100644
index 0000000..9bcd2fc
--- /dev/null
+++ b/src/main/resources/assets/js/old/bootstrap.min.js
@@ -0,0 +1,7 @@
+/*!
+ * Bootstrap v3.3.7 (http://getbootstrap.com)
+ * Copyright 2011-2016 Twitter, Inc.
+ * Licensed under the MIT license
+ */
+if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&j<i.length-1&&j++,~j||(j=0),i.eq(j).trigger("focus")}}}};var h=a.fn.dropdown;a.fn.dropdown=d,a.fn.dropdown.Constructor=g,a.fn.dropdown.noConflict=function(){return a.fn.dropdown=h,this},a(document).on("click.bs.dropdown.data-api",c).on("click.bs.dropdown.data-api",".dropdown form",function(a){a.stopPropagation()}).on("click.bs.dropdown.data-api",f,g.prototype.toggle).on("keydown.bs.dropdown.data-api",f,g.prototype.keydown).on("keydown.bs.dropdown.data-api",".dropdown-menu",g.prototype.keydown)}(jQuery),+function(a){"use strict";function b(b,d){return this.each(function(){var e=a(this),f=e.data("bs.modal"),g=a.extend({},c.DEFAULTS,e.data(),"object"==typeof b&&b);f||e.data("bs.modal",f=new c(this,g)),"string"==typeof b?f[b](d):g.show&&f.show(d)})}var c=function(b,c){this.options=c,this.$body=a(document.body),this.$element=a(b),this.$dialog=this.$element.find(".modal-dialog"),this.$backdrop=null,this.isShown=null,this.originalBodyPad=null,this.scrollbarWidth=0,this.ignoreBackdropClick=!1,this.options.remote&&this.$element.find(".modal-content").load(this.options.remote,a.proxy(function(){this.$element.trigger("loaded.bs.modal")},this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=300,c.BACKDROP_TRANSITION_DURATION=150,c.DEFAULTS={backdrop:!0,keyboard:!0,show:!0},c.prototype.toggle=function(a){return this.isShown?this.hide():this.show(a)},c.prototype.show=function(b){var d=this,e=a.Event("show.bs.modal",{relatedTarget:b});this.$element.trigger(e),this.isShown||e.isDefaultPrevented()||(this.isShown=!0,this.checkScrollbar(),this.setScrollbar(),this.$body.addClass("modal-open"),this.escape(),this.resize(),this.$element.on("click.dismiss.bs.modal",'[data-dismiss="modal"]',a.proxy(this.hide,this)),this.$dialog.on("mousedown.dismiss.bs.modal",function(){d.$element.one("mouseup.dismiss.bs.modal",function(b){a(b.target).is(d.$element)&&(d.ignoreBackdropClick=!0)})}),this.backdrop(function(){var e=a.support.transition&&d.$element.hasClass("fade");d.$element.parent().length||d.$element.appendTo(d.$body),d.$element.show().scrollTop(0),d.adjustDialog(),e&&d.$element[0].offsetWidth,d.$element.addClass("in"),d.enforceFocus();var f=a.Event("shown.bs.modal",{relatedTarget:b});e?d.$dialog.one("bsTransitionEnd",function(){d.$element.trigger("focus").trigger(f)}).emulateTransitionEnd(c.TRANSITION_DURATION):d.$element.trigger("focus").trigger(f)}))},c.prototype.hide=function(b){b&&b.preventDefault(),b=a.Event("hide.bs.modal"),this.$element.trigger(b),this.isShown&&!b.isDefaultPrevented()&&(this.isShown=!1,this.escape(),this.resize(),a(document).off("focusin.bs.modal"),this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"),this.$dialog.off("mousedown.dismiss.bs.modal"),a.support.transition&&this.$element.hasClass("fade")?this.$element.one("bsTransitionEnd",a.proxy(this.hideModal,this)).emulateTransitionEnd(c.TRANSITION_DURATION):this.hideModal())},c.prototype.enforceFocus=function(){a(document).off("focusin.bs.modal").on("focusin.bs.modal",a.proxy(function(a){document===a.target||this.$element[0]===a.target||this.$element.has(a.target).length||this.$element.trigger("focus")},this))},c.prototype.escape=function(){this.isShown&&this.options.keyboard?this.$element.on("keydown.dismiss.bs.modal",a.proxy(function(a){27==a.which&&this.hide()},this)):this.isShown||this.$element.off("keydown.dismiss.bs.modal")},c.prototype.resize=function(){this.isShown?a(window).on("resize.bs.modal",a.proxy(this.handleUpdate,this)):a(window).off("resize.bs.modal")},c.prototype.hideModal=function(){var a=this;this.$element.hide(),this.backdrop(function(){a.$body.removeClass("modal-open"),a.resetAdjustments(),a.resetScrollbar(),a.$element.trigger("hidden.bs.modal")})},c.prototype.removeBackdrop=function(){this.$backdrop&&this.$backdrop.remove(),this.$backdrop=null},c.prototype.backdrop=function(b){var d=this,e=this.$element.hasClass("fade")?"fade":"";if(this.isShown&&this.options.backdrop){var f=a.support.transition&&e;if(this.$backdrop=a(document.createElement("div")).addClass("modal-backdrop "+e).appendTo(this.$body),this.$element.on("click.dismiss.bs.modal",a.proxy(function(a){return this.ignoreBackdropClick?void(this.ignoreBackdropClick=!1):void(a.target===a.currentTarget&&("static"==this.options.backdrop?this.$element[0].focus():this.hide()))},this)),f&&this.$backdrop[0].offsetWidth,this.$backdrop.addClass("in"),!b)return;f?this.$backdrop.one("bsTransitionEnd",b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):b()}else if(!this.isShown&&this.$backdrop){this.$backdrop.removeClass("in");var g=function(){d.removeBackdrop(),b&&b()};a.support.transition&&this.$element.hasClass("fade")?this.$backdrop.one("bsTransitionEnd",g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION):g()}else b&&b()},c.prototype.handleUpdate=function(){this.adjustDialog()},c.prototype.adjustDialog=function(){var a=this.$element[0].scrollHeight>document.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth<a,this.scrollbarWidth=this.measureScrollbar()},c.prototype.setScrollbar=function(){var a=parseInt(this.$body.css("padding-right")||0,10);this.originalBodyPad=document.body.style.paddingRight||"",this.bodyIsOverflowing&&this.$body.css("padding-right",a+this.scrollbarWidth)},c.prototype.resetScrollbar=function(){this.$body.css("padding-right",this.originalBodyPad)},c.prototype.measureScrollbar=function(){var a=document.createElement("div");a.className="modal-scrollbar-measure",this.$body.append(a);var b=a.offsetWidth-a.clientWidth;return this.$body[0].removeChild(a),b};var d=a.fn.modal;a.fn.modal=b,a.fn.modal.Constructor=c,a.fn.modal.noConflict=function(){return a.fn.modal=d,this},a(document).on("click.bs.modal.data-api",'[data-toggle="modal"]',function(c){var d=a(this),e=d.attr("href"),f=a(d.attr("data-target")||e&&e.replace(/.*(?=#[^\s]+$)/,"")),g=f.data("bs.modal")?"toggle":a.extend({remote:!/#/.test(e)&&e},f.data(),d.data());d.is("a")&&c.preventDefault(),f.one("show.bs.modal",function(a){a.isDefaultPrevented()||f.one("hidden.bs.modal",function(){d.is(":visible")&&d.trigger("focus")})}),b.call(f,g,this)})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tooltip"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.tooltip",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.type=null,this.options=null,this.enabled=null,this.timeout=null,this.hoverState=null,this.$element=null,this.inState=null,this.init("tooltip",a,b)};c.VERSION="3.3.7",c.TRANSITION_DURATION=150,c.DEFAULTS={animation:!0,placement:"top",selector:!1,template:'<div class="tooltip" role="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-m<o.top?"bottom":"right"==h&&k.right+l>o.width?"left":"left"==h&&k.left-l<o.left?"right":h,f.removeClass(n).addClass(h)}var p=this.getCalculatedOffset(h,k,l,m);this.applyPlacement(p,h);var q=function(){var a=e.hoverState;e.$element.trigger("shown.bs."+e.type),e.hoverState=null,"out"==a&&e.leave(e)};a.support.transition&&this.$tip.hasClass("fade")?f.one("bsTransitionEnd",q).emulateTransitionEnd(c.TRANSITION_DURATION):q()}},c.prototype.applyPlacement=function(b,c){var d=this.tip(),e=d[0].offsetWidth,f=d[0].offsetHeight,g=parseInt(d.css("margin-top"),10),h=parseInt(d.css("margin-left"),10);isNaN(g)&&(g=0),isNaN(h)&&(h=0),b.top+=g,b.left+=h,a.offset.setOffset(d[0],a.extend({using:function(a){d.css({top:Math.round(a.top),left:Math.round(a.left)})}},b),0),d.addClass("in");var i=d[0].offsetWidth,j=d[0].offsetHeight;"top"==c&&j!=f&&(b.top=b.top+f-j);var k=this.getViewportAdjustedDelta(c,b,i,j);k.left?b.left+=k.left:b.top+=k.top;var l=/top|bottom/.test(c),m=l?2*k.left-e+i:2*k.top-f+j,n=l?"offsetWidth":"offsetHeight";d.offset(b),this.replaceArrow(m,d[0][n],l)},c.prototype.replaceArrow=function(a,b,c){this.arrow().css(c?"left":"top",50*(1-a/b)+"%").css(c?"top":"left","")},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle();a.find(".tooltip-inner")[this.options.html?"html":"text"](b),a.removeClass("fade in top bottom left right")},c.prototype.hide=function(b){function d(){"in"!=e.hoverState&&f.detach(),e.$element&&e.$element.removeAttr("aria-describedby").trigger("hidden.bs."+e.type),b&&b()}var e=this,f=a(this.$tip),g=a.Event("hide.bs."+this.type);if(this.$element.trigger(g),!g.isDefaultPrevented())return f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one("bsTransitionEnd",d).emulateTransitionEnd(c.TRANSITION_DURATION):d(),this.hoverState=null,this},c.prototype.fixTitle=function(){var a=this.$element;(a.attr("title")||"string"!=typeof a.attr("data-original-title"))&&a.attr("data-original-title",a.attr("title")||"").attr("title","")},c.prototype.hasContent=function(){return this.getTitle()},c.prototype.getPosition=function(b){b=b||this.$element;var c=b[0],d="BODY"==c.tagName,e=c.getBoundingClientRect();null==e.width&&(e=a.extend({},e,{width:e.right-e.left,height:e.bottom-e.top}));var f=window.SVGElement&&c instanceof window.SVGElement,g=d?{top:0,left:0}:f?null:b.offset(),h={scroll:d?document.documentElement.scrollTop||document.body.scrollTop:b.scrollTop()},i=d?{width:a(window).width(),height:a(window).height()}:null;return a.extend({},e,h,i,g)},c.prototype.getCalculatedOffset=function(a,b,c,d){return"bottom"==a?{top:b.top+b.height,left:b.left+b.width/2-c/2}:"top"==a?{top:b.top-d,left:b.left+b.width/2-c/2}:"left"==a?{top:b.top+b.height/2-d/2,left:b.left-c}:{top:b.top+b.height/2-d/2,left:b.left+b.width}},c.prototype.getViewportAdjustedDelta=function(a,b,c,d){var e={top:0,left:0};if(!this.$viewport)return e;var f=this.options.viewport&&this.options.viewport.padding||0,g=this.getPosition(this.$viewport);if(/right|left/.test(a)){var h=b.top-f-g.scroll,i=b.top+f-g.scroll+d;h<g.top?e.top=g.top-h:i>g.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;j<g.left?e.left=g.left-j:k>g.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:'<div class="popover" role="tooltip"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b<e[0])return this.activeTarget=null,this.clear();for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(void 0===e[a+1]||b<e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){
+this.activeTarget=b,this.clear();var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate.bs.scrollspy")},b.prototype.clear=function(){a(this.selector).parentsUntil(this.options.target,".active").removeClass("active")};var d=a.fn.scrollspy;a.fn.scrollspy=c,a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=d,this},a(window).on("load.bs.scrollspy.data-api",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);c.call(b,b.data())})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new c(this)),"string"==typeof b&&e[b]()})}var c=function(b){this.element=a(b)};c.VERSION="3.3.7",c.TRANSITION_DURATION=150,c.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.data("target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a"),f=a.Event("hide.bs.tab",{relatedTarget:b[0]}),g=a.Event("show.bs.tab",{relatedTarget:e[0]});if(e.trigger(f),b.trigger(g),!g.isDefaultPrevented()&&!f.isDefaultPrevented()){var h=a(d);this.activate(b.closest("li"),c),this.activate(h,h.parent(),function(){e.trigger({type:"hidden.bs.tab",relatedTarget:b[0]}),b.trigger({type:"shown.bs.tab",relatedTarget:e[0]})})}}},c.prototype.activate=function(b,d,e){function f(){g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e<c&&"top";if("bottom"==this.affixed)return null!=c?!(e+this.unpin<=f.top)&&"bottom":!(e+g<=a-d)&&"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&e<=c?"top":null!=d&&i+j>=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file
diff --git a/src/main/resources/assets/js/old/jquery.min.js b/src/main/resources/assets/js/old/jquery.min.js
new file mode 100644
index 0000000..4c5be4c
--- /dev/null
+++ b/src/main/resources/assets/js/old/jquery.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/src/main/resources/assets/js/particles.js b/src/main/resources/assets/js/particles.js
new file mode 100644
index 0000000..ef0a534
--- /dev/null
+++ b/src/main/resources/assets/js/particles.js
@@ -0,0 +1,1533 @@
+/* -----------------------------------------------
+/* Author : Vincent Garreau - vincentgarreau.com
+/* MIT license: http://opensource.org/licenses/MIT
+/* Demo / Generator : vincentgarreau.com/particles.js
+/* GitHub : github.com/VincentGarreau/particles.js
+/* How to use? : Check the GitHub README
+/* v2.0.0
+/* ----------------------------------------------- */
+var pJS = function (tag_id, params) {
+
+ var canvas_el = document.querySelector('#' + tag_id + ' > .particles-js-canvas-el');
+
+ /* particles.js variables with default values */
+ this.pJS = {
+ canvas: {
+ el: canvas_el,
+ w: canvas_el.offsetWidth,
+ h: canvas_el.offsetHeight
+ },
+ particles: {
+ number: {
+ value: 400,
+ density: {
+ enable: true,
+ value_area: 800
+ }
+ },
+ color: {
+ value: '#fff'
+ },
+ shape: {
+ type: 'circle',
+ stroke: {
+ width: 0,
+ color: '#ff0000'
+ },
+ polygon: {
+ nb_sides: 5
+ },
+ image: {
+ src: '',
+ width: 100,
+ height: 100
+ }
+ },
+ opacity: {
+ value: 1,
+ random: false,
+ anim: {
+ enable: false,
+ speed: 2,
+ opacity_min: 0,
+ sync: false
+ }
+ },
+ size: {
+ value: 20,
+ random: false,
+ anim: {
+ enable: false,
+ speed: 20,
+ size_min: 0,
+ sync: false
+ }
+ },
+ line_linked: {
+ enable: true,
+ distance: 100,
+ color: '#fff',
+ opacity: 1,
+ width: 1
+ },
+ move: {
+ enable: true,
+ speed: 2,
+ direction: 'none',
+ random: false,
+ straight: false,
+ out_mode: 'out',
+ bounce: false,
+ attract: {
+ enable: false,
+ rotateX: 3000,
+ rotateY: 3000
+ }
+ },
+ array: []
+ },
+ interactivity: {
+ detect_on: 'canvas',
+ events: {
+ onhover: {
+ enable: true,
+ mode: 'grab'
+ },
+ onclick: {
+ enable: true,
+ mode: 'push'
+ },
+ resize: true
+ },
+ modes: {
+ grab: {
+ distance: 100,
+ line_linked: {
+ opacity: 1
+ }
+ },
+ bubble: {
+ distance: 200,
+ size: 80,
+ duration: 0.4
+ },
+ repulse: {
+ distance: 200,
+ duration: 0.4
+ },
+ push: {
+ particles_nb: 4
+ },
+ remove: {
+ particles_nb: 2
+ }
+ },
+ mouse: {}
+ },
+ retina_detect: false,
+ fn: {
+ interact: {},
+ modes: {},
+ vendors: {}
+ },
+ tmp: {}
+ };
+
+ var pJS = this.pJS;
+
+ /* params settings */
+ if (params) {
+ Object.deepExtend(pJS, params);
+ }
+
+ pJS.tmp.obj = {
+ size_value: pJS.particles.size.value,
+ size_anim_speed: pJS.particles.size.anim.speed,
+ move_speed: pJS.particles.move.speed,
+ line_linked_distance: pJS.particles.line_linked.distance,
+ line_linked_width: pJS.particles.line_linked.width,
+ mode_grab_distance: pJS.interactivity.modes.grab.distance,
+ mode_bubble_distance: pJS.interactivity.modes.bubble.distance,
+ mode_bubble_size: pJS.interactivity.modes.bubble.size,
+ mode_repulse_distance: pJS.interactivity.modes.repulse.distance
+ };
+
+
+ pJS.fn.retinaInit = function () {
+
+ if (pJS.retina_detect && window.devicePixelRatio > 1) {
+ pJS.canvas.pxratio = window.devicePixelRatio;
+ pJS.tmp.retina = true;
+ }
+ else {
+ pJS.canvas.pxratio = 1;
+ pJS.tmp.retina = false;
+ }
+
+ pJS.canvas.w = pJS.canvas.el.offsetWidth * pJS.canvas.pxratio;
+ pJS.canvas.h = pJS.canvas.el.offsetHeight * pJS.canvas.pxratio;
+
+ pJS.particles.size.value = pJS.tmp.obj.size_value * pJS.canvas.pxratio;
+ pJS.particles.size.anim.speed = pJS.tmp.obj.size_anim_speed * pJS.canvas.pxratio;
+ pJS.particles.move.speed = pJS.tmp.obj.move_speed * pJS.canvas.pxratio;
+ pJS.particles.line_linked.distance = pJS.tmp.obj.line_linked_distance * pJS.canvas.pxratio;
+ pJS.interactivity.modes.grab.distance = pJS.tmp.obj.mode_grab_distance * pJS.canvas.pxratio;
+ pJS.interactivity.modes.bubble.distance = pJS.tmp.obj.mode_bubble_distance * pJS.canvas.pxratio;
+ pJS.particles.line_linked.width = pJS.tmp.obj.line_linked_width * pJS.canvas.pxratio;
+ pJS.interactivity.modes.bubble.size = pJS.tmp.obj.mode_bubble_size * pJS.canvas.pxratio;
+ pJS.interactivity.modes.repulse.distance = pJS.tmp.obj.mode_repulse_distance * pJS.canvas.pxratio;
+
+ };
+
+
+ /* ---------- pJS functions - canvas ------------ */
+
+ pJS.fn.canvasInit = function () {
+ pJS.canvas.ctx = pJS.canvas.el.getContext('2d');
+ };
+
+ pJS.fn.canvasSize = function () {
+
+ pJS.canvas.el.width = pJS.canvas.w;
+ pJS.canvas.el.height = pJS.canvas.h;
+
+ if (pJS && pJS.interactivity.events.resize) {
+
+ window.addEventListener('resize', function () {
+
+ pJS.canvas.w = pJS.canvas.el.offsetWidth;
+ pJS.canvas.h = pJS.canvas.el.offsetHeight;
+
+ /* resize canvas */
+ if (pJS.tmp.retina) {
+ pJS.canvas.w *= pJS.canvas.pxratio;
+ pJS.canvas.h *= pJS.canvas.pxratio;
+ }
+
+ pJS.canvas.el.width = pJS.canvas.w;
+ pJS.canvas.el.height = pJS.canvas.h;
+
+ /* repaint canvas on anim disabled */
+ if (!pJS.particles.move.enable) {
+ pJS.fn.particlesEmpty();
+ pJS.fn.particlesCreate();
+ pJS.fn.particlesDraw();
+ pJS.fn.vendors.densityAutoParticles();
+ }
+
+ /* density particles enabled */
+ pJS.fn.vendors.densityAutoParticles();
+
+ });
+
+ }
+
+ };
+
+
+ pJS.fn.canvasPaint = function () {
+ pJS.canvas.ctx.fillRect(0, 0, pJS.canvas.w, pJS.canvas.h);
+ };
+
+ pJS.fn.canvasClear = function () {
+ pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h);
+ };
+
+
+ /* --------- pJS functions - particles ----------- */
+
+ pJS.fn.particle = function (color, opacity, position) {
+
+ /* size */
+ this.radius = (pJS.particles.size.random ? Math.random() : 1) * pJS.particles.size.value;
+ if (pJS.particles.size.anim.enable) {
+ this.size_status = false;
+ this.vs = pJS.particles.size.anim.speed / 100;
+ if (!pJS.particles.size.anim.sync) {
+ this.vs = this.vs * Math.random();
+ }
+ }
+
+ /* position */
+ this.x = position ? position.x : Math.random() * pJS.canvas.w;
+ this.y = position ? position.y : Math.random() * pJS.canvas.h;
+
+ /* check position - into the canvas */
+ if (this.x > pJS.canvas.w - this.radius * 2) this.x = this.x - this.radius;
+ else if (this.x < this.radius * 2) this.x = this.x + this.radius;
+ if (this.y > pJS.canvas.h - this.radius * 2) this.y = this.y - this.radius;
+ else if (this.y < this.radius * 2) this.y = this.y + this.radius;
+
+ /* check position - avoid overlap */
+ if (pJS.particles.move.bounce) {
+ pJS.fn.vendors.checkOverlap(this, position);
+ }
+
+ /* color */
+ this.color = {};
+ if (typeof(color.value) == 'object') {
+
+ if (color.value instanceof Array) {
+ var color_selected = color.value[Math.floor(Math.random() * pJS.particles.color.value.length)];
+ this.color.rgb = hexToRgb(color_selected);
+ } else {
+ if (color.value.r != undefined && color.value.g != undefined && color.value.b != undefined) {
+ this.color.rgb = {
+ r: color.value.r,
+ g: color.value.g,
+ b: color.value.b
+ }
+ }
+ if (color.value.h != undefined && color.value.s != undefined && color.value.l != undefined) {
+ this.color.hsl = {
+ h: color.value.h,
+ s: color.value.s,
+ l: color.value.l
+ }
+ }
+ }
+
+ }
+ else if (color.value == 'random') {
+ this.color.rgb = {
+ r: (Math.floor(Math.random() * (255 - 0 + 1)) + 0),
+ g: (Math.floor(Math.random() * (255 - 0 + 1)) + 0),
+ b: (Math.floor(Math.random() * (255 - 0 + 1)) + 0)
+ }
+ }
+ else if (typeof(color.value) == 'string') {
+ this.color = color;
+ this.color.rgb = hexToRgb(this.color.value);
+ }
+
+ /* opacity */
+ this.opacity = (pJS.particles.opacity.random ? Math.random() : 1) * pJS.particles.opacity.value;
+ if (pJS.particles.opacity.anim.enable) {
+ this.opacity_status = false;
+ this.vo = pJS.particles.opacity.anim.speed / 100;
+ if (!pJS.particles.opacity.anim.sync) {
+ this.vo = this.vo * Math.random();
+ }
+ }
+
+ /* animation - velocity for speed */
+ var velbase = {}
+ switch (pJS.particles.move.direction) {
+ case 'top':
+ velbase = {x: 0, y: -1};
+ break;
+ case 'top-right':
+ velbase = {x: 0.5, y: -0.5};
+ break;
+ case 'right':
+ velbase = {x: 1, y: -0};
+ break;
+ case 'bottom-right':
+ velbase = {x: 0.5, y: 0.5};
+ break;
+ case 'bottom':
+ velbase = {x: 0, y: 1};
+ break;
+ case 'bottom-left':
+ velbase = {x: -0.5, y: 1};
+ break;
+ case 'left':
+ velbase = {x: -1, y: 0};
+ break;
+ case 'top-left':
+ velbase = {x: -0.5, y: -0.5};
+ break;
+ default:
+ velbase = {x: 0, y: 0};
+ break;
+ }
+
+ if (pJS.particles.move.straight) {
+ this.vx = velbase.x;
+ this.vy = velbase.y;
+ if (pJS.particles.move.random) {
+ this.vx = this.vx * (Math.random());
+ this.vy = this.vy * (Math.random());
+ }
+ } else {
+ this.vx = velbase.x + Math.random() - 0.5;
+ this.vy = velbase.y + Math.random() - 0.5;
+ }
+
+ // var theta = 2.0 * Math.PI * Math.random();
+ // this.vx = Math.cos(theta);
+ // this.vy = Math.sin(theta);
+
+ this.vx_i = this.vx;
+ this.vy_i = this.vy;
+
+
+ /* if shape is image */
+
+ var shape_type = pJS.particles.shape.type;
+ if (typeof(shape_type) == 'object') {
+ if (shape_type instanceof Array) {
+ var shape_selected = shape_type[Math.floor(Math.random() * shape_type.length)];
+ this.shape = shape_selected;
+ }
+ } else {
+ this.shape = shape_type;
+ }
+
+ if (this.shape == 'image') {
+ var sh = pJS.particles.shape;
+ this.img = {
+ src: sh.image.src,
+ ratio: sh.image.width / sh.image.height
+ }
+ if (!this.img.ratio) this.img.ratio = 1;
+ if (pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg != undefined) {
+ pJS.fn.vendors.createSvgImg(this);
+ if (pJS.tmp.pushing) {
+ this.img.loaded = false;
+ }
+ }
+ }
+
+
+ };
+
+
+ pJS.fn.particle.prototype.draw = function () {
+
+ var p = this;
+
+ if (p.radius_bubble != undefined) {
+ var radius = p.radius_bubble;
+ } else {
+ var radius = p.radius;
+ }
+
+ if (p.opacity_bubble != undefined) {
+ var opacity = p.opacity_bubble;
+ } else {
+ var opacity = p.opacity;
+ }
+
+ if (p.color.rgb) {
+ var color_value = 'rgba(' + p.color.rgb.r + ',' + p.color.rgb.g + ',' + p.color.rgb.b + ',' + opacity + ')';
+ } else {
+ var color_value = 'hsla(' + p.color.hsl.h + ',' + p.color.hsl.s + '%,' + p.color.hsl.l + '%,' + opacity + ')';
+ }
+
+ pJS.canvas.ctx.fillStyle = color_value;
+ pJS.canvas.ctx.beginPath();
+
+ switch (p.shape) {
+
+ case 'circle':
+ pJS.canvas.ctx.arc(p.x, p.y, radius, 0, Math.PI * 2, false);
+ break;
+
+ case 'edge':
+ pJS.canvas.ctx.rect(p.x - radius, p.y - radius, radius * 2, radius * 2);
+ break;
+
+ case 'triangle':
+ pJS.fn.vendors.drawShape(pJS.canvas.ctx, p.x - radius, p.y + radius / 1.66, radius * 2, 3, 2);
+ break;
+
+ case 'polygon':
+ pJS.fn.vendors.drawShape(
+ pJS.canvas.ctx,
+ p.x - radius / (pJS.particles.shape.polygon.nb_sides / 3.5), // startX
+ p.y - radius / (2.66 / 3.5), // startY
+ radius * 2.66 / (pJS.particles.shape.polygon.nb_sides / 3), // sideLength
+ pJS.particles.shape.polygon.nb_sides, // sideCountNumerator
+ 1 // sideCountDenominator
+ );
+ break;
+
+ case 'star':
+ pJS.fn.vendors.drawShape(
+ pJS.canvas.ctx,
+ p.x - radius * 2 / (pJS.particles.shape.polygon.nb_sides / 4), // startX
+ p.y - radius / (2 * 2.66 / 3.5), // startY
+ radius * 2 * 2.66 / (pJS.particles.shape.polygon.nb_sides / 3), // sideLength
+ pJS.particles.shape.polygon.nb_sides, // sideCountNumerator
+ 2 // sideCountDenominator
+ );
+ break;
+
+ case 'image':
+
+ function draw() {
+ pJS.canvas.ctx.drawImage(
+ img_obj,
+ p.x - radius,
+ p.y - radius,
+ radius * 2,
+ radius * 2 / p.img.ratio
+ );
+ }
+
+ if (pJS.tmp.img_type == 'svg') {
+ var img_obj = p.img.obj;
+ } else {
+ var img_obj = pJS.tmp.img_obj;
+ }
+
+ if (img_obj) {
+ draw();
+ }
+
+ break;
+
+ }
+
+ pJS.canvas.ctx.closePath();
+
+ if (pJS.particles.shape.stroke.width > 0) {
+ pJS.canvas.ctx.strokeStyle = pJS.particles.shape.stroke.color;
+ pJS.canvas.ctx.lineWidth = pJS.particles.shape.stroke.width;
+ pJS.canvas.ctx.stroke();
+ }
+
+ pJS.canvas.ctx.fill();
+
+ };
+
+
+ pJS.fn.particlesCreate = function () {
+ for (var i = 0; i < pJS.particles.number.value; i++) {
+ pJS.particles.array.push(new pJS.fn.particle(pJS.particles.color, pJS.particles.opacity.value));
+ }
+ };
+
+ pJS.fn.particlesUpdate = function () {
+
+ for (var i = 0; i < pJS.particles.array.length; i++) {
+
+ /* the particle */
+ var p = pJS.particles.array[i];
+
+ // var d = ( dx = pJS.interactivity.mouse.click_pos_x - p.x ) * dx + ( dy = pJS.interactivity.mouse.click_pos_y - p.y ) * dy;
+ // var f = -BANG_SIZE / d;
+ // if ( d < BANG_SIZE ) {
+ // var t = Math.atan2( dy, dx );
+ // p.vx = f * Math.cos(t);
+ // p.vy = f * Math.sin(t);
+ // }
+
+ /* move the particle */
+ if (pJS.particles.move.enable) {
+ var ms = pJS.particles.move.speed / 2;
+ p.x += p.vx * ms;
+ p.y += p.vy * ms;
+ }
+
+ /* change opacity status */
+ if (pJS.particles.opacity.anim.enable) {
+ if (p.opacity_status == true) {
+ if (p.opacity >= pJS.particles.opacity.value) p.opacity_status = false;
+ p.opacity += p.vo;
+ } else {
+ if (p.opacity <= pJS.particles.opacity.anim.opacity_min) p.opacity_status = true;
+ p.opacity -= p.vo;
+ }
+ if (p.opacity < 0) p.opacity = 0;
+ }
+
+ /* change size */
+ if (pJS.particles.size.anim.enable) {
+ if (p.size_status == true) {
+ if (p.radius >= pJS.particles.size.value) p.size_status = false;
+ p.radius += p.vs;
+ } else {
+ if (p.radius <= pJS.particles.size.anim.size_min) p.size_status = true;
+ p.radius -= p.vs;
+ }
+ if (p.radius < 0) p.radius = 0;
+ }
+
+ /* change particle position if it is out of canvas */
+ if (pJS.particles.move.out_mode == 'bounce') {
+ var new_pos = {
+ x_left: p.radius,
+ x_right: pJS.canvas.w,
+ y_top: p.radius,
+ y_bottom: pJS.canvas.h
+ }
+ } else {
+ var new_pos = {
+ x_left: -p.radius,
+ x_right: pJS.canvas.w + p.radius,
+ y_top: -p.radius,
+ y_bottom: pJS.canvas.h + p.radius
+ }
+ }
+
+ if (p.x - p.radius > pJS.canvas.w) {
+ p.x = new_pos.x_left;
+ p.y = Math.random() * pJS.canvas.h;
+ }
+ else if (p.x + p.radius < 0) {
+ p.x = new_pos.x_right;
+ p.y = Math.random() * pJS.canvas.h;
+ }
+ if (p.y - p.radius > pJS.canvas.h) {
+ p.y = new_pos.y_top;
+ p.x = Math.random() * pJS.canvas.w;
+ }
+ else if (p.y + p.radius < 0) {
+ p.y = new_pos.y_bottom;
+ p.x = Math.random() * pJS.canvas.w;
+ }
+
+ /* out of canvas modes */
+ switch (pJS.particles.move.out_mode) {
+ case 'bounce':
+ if (p.x + p.radius > pJS.canvas.w) p.vx = -p.vx;
+ else if (p.x - p.radius < 0) p.vx = -p.vx;
+ if (p.y + p.radius > pJS.canvas.h) p.vy = -p.vy;
+ else if (p.y - p.radius < 0) p.vy = -p.vy;
+ break;
+ }
+
+ /* events */
+ if (isInArray('grab', pJS.interactivity.events.onhover.mode)) {
+ pJS.fn.modes.grabParticle(p);
+ }
+
+ if (isInArray('bubble', pJS.interactivity.events.onhover.mode) || isInArray('bubble', pJS.interactivity.events.onclick.mode)) {
+ pJS.fn.modes.bubbleParticle(p);
+ }
+
+ if (isInArray('repulse', pJS.interactivity.events.onhover.mode) || isInArray('repulse', pJS.interactivity.events.onclick.mode)) {
+ pJS.fn.modes.repulseParticle(p);
+ }
+
+ /* interaction auto between particles */
+ if (pJS.particles.line_linked.enable || pJS.particles.move.attract.enable) {
+ for (var j = i + 1; j < pJS.particles.array.length; j++) {
+ var p2 = pJS.particles.array[j];
+
+ /* link particles */
+ if (pJS.particles.line_linked.enable) {
+ pJS.fn.interact.linkParticles(p, p2);
+ }
+
+ /* attract particles */
+ if (pJS.particles.move.attract.enable) {
+ pJS.fn.interact.attractParticles(p, p2);
+ }
+
+ /* bounce particles */
+ if (pJS.particles.move.bounce) {
+ pJS.fn.interact.bounceParticles(p, p2);
+ }
+
+ }
+ }
+
+
+ }
+
+ };
+
+ pJS.fn.particlesDraw = function () {
+
+ /* clear canvas */
+ pJS.canvas.ctx.clearRect(0, 0, pJS.canvas.w, pJS.canvas.h);
+
+ /* update each particles param */
+ pJS.fn.particlesUpdate();
+
+ /* draw each particle */
+ for (var i = 0; i < pJS.particles.array.length; i++) {
+ var p = pJS.particles.array[i];
+ p.draw();
+ }
+
+ };
+
+ pJS.fn.particlesEmpty = function () {
+ pJS.particles.array = [];
+ };
+
+ pJS.fn.particlesRefresh = function () {
+
+ /* init all */
+ cancelRequestAnimFrame(pJS.fn.checkAnimFrame);
+ cancelRequestAnimFrame(pJS.fn.drawAnimFrame);
+ pJS.tmp.source_svg = undefined;
+ pJS.tmp.img_obj = undefined;
+ pJS.tmp.count_svg = 0;
+ pJS.fn.particlesEmpty();
+ pJS.fn.canvasClear();
+
+ /* restart */
+ pJS.fn.vendors.start();
+
+ };
+
+
+ /* ---------- pJS functions - particles interaction ------------ */
+
+ pJS.fn.interact.linkParticles = function (p1, p2) {
+
+ var dx = p1.x - p2.x,
+ dy = p1.y - p2.y,
+ dist = Math.sqrt(dx * dx + dy * dy);
+
+ /* draw a line between p1 and p2 if the distance between them is under the config distance */
+ if (dist <= pJS.particles.line_linked.distance) {
+
+ var opacity_line = pJS.particles.line_linked.opacity - (dist / (1 / pJS.particles.line_linked.opacity)) / pJS.particles.line_linked.distance;
+
+ if (opacity_line > 0) {
+
+ /* style */
+ var color_line = pJS.particles.line_linked.color_rgb_line;
+ pJS.canvas.ctx.strokeStyle = 'rgba(' + color_line.r + ',' + color_line.g + ',' + color_line.b + ',' + opacity_line + ')';
+ pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width;
+ //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */
+
+ /* path */
+ pJS.canvas.ctx.beginPath();
+ pJS.canvas.ctx.moveTo(p1.x, p1.y);
+ pJS.canvas.ctx.lineTo(p2.x, p2.y);
+ pJS.canvas.ctx.stroke();
+ pJS.canvas.ctx.closePath();
+
+ }
+
+ }
+
+ };
+
+
+ pJS.fn.interact.attractParticles = function (p1, p2) {
+
+ /* condensed particles */
+ var dx = p1.x - p2.x,
+ dy = p1.y - p2.y,
+ dist = Math.sqrt(dx * dx + dy * dy);
+
+ if (dist <= pJS.particles.line_linked.distance) {
+
+ var ax = dx / (pJS.particles.move.attract.rotateX * 1000),
+ ay = dy / (pJS.particles.move.attract.rotateY * 1000);
+
+ p1.vx -= ax;
+ p1.vy -= ay;
+
+ p2.vx += ax;
+ p2.vy += ay;
+
+ }
+
+
+ }
+
+
+ pJS.fn.interact.bounceParticles = function (p1, p2) {
+
+ var dx = p1.x - p2.x,
+ dy = p1.y - p2.y,
+ dist = Math.sqrt(dx * dx + dy * dy),
+ dist_p = p1.radius + p2.radius;
+
+ if (dist <= dist_p) {
+ p1.vx = -p1.vx;
+ p1.vy = -p1.vy;
+
+ p2.vx = -p2.vx;
+ p2.vy = -p2.vy;
+ }
+
+ }
+
+
+ /* ---------- pJS functions - modes events ------------ */
+
+ pJS.fn.modes.pushParticles = function (nb, pos) {
+
+ pJS.tmp.pushing = true;
+
+ for (var i = 0; i < nb; i++) {
+ pJS.particles.array.push(
+ new pJS.fn.particle(
+ pJS.particles.color,
+ pJS.particles.opacity.value,
+ {
+ 'x': pos ? pos.pos_x : Math.random() * pJS.canvas.w,
+ 'y': pos ? pos.pos_y : Math.random() * pJS.canvas.h
+ }
+ )
+ )
+ if (i == nb - 1) {
+ if (!pJS.particles.move.enable) {
+ pJS.fn.particlesDraw();
+ }
+ pJS.tmp.pushing = false;
+ }
+ }
+
+ };
+
+
+ pJS.fn.modes.removeParticles = function (nb) {
+
+ pJS.particles.array.splice(0, nb);
+ if (!pJS.particles.move.enable) {
+ pJS.fn.particlesDraw();
+ }
+
+ };
+
+
+ pJS.fn.modes.bubbleParticle = function (p) {
+
+ /* on hover event */
+ if (pJS.interactivity.events.onhover.enable && isInArray('bubble', pJS.interactivity.events.onhover.mode)) {
+
+ var dx_mouse = p.x - pJS.interactivity.mouse.pos_x,
+ dy_mouse = p.y - pJS.interactivity.mouse.pos_y,
+ dist_mouse = Math.sqrt(dx_mouse * dx_mouse + dy_mouse * dy_mouse),
+ ratio = 1 - dist_mouse / pJS.interactivity.modes.bubble.distance;
+
+ function init() {
+ p.opacity_bubble = p.opacity;
+ p.radius_bubble = p.radius;
+ }
+
+ /* mousemove - check ratio */
+ if (dist_mouse <= pJS.interactivity.modes.bubble.distance) {
+
+ if (ratio >= 0 && pJS.interactivity.status == 'mousemove') {
+
+ /* size */
+ if (pJS.interactivity.modes.bubble.size != pJS.particles.size.value) {
+
+ if (pJS.interactivity.modes.bubble.size > pJS.particles.size.value) {
+ var size = p.radius + (pJS.interactivity.modes.bubble.size * ratio);
+ if (size >= 0) {
+ p.radius_bubble = size;
+ }
+ } else {
+ var dif = p.radius - pJS.interactivity.modes.bubble.size,
+ size = p.radius - (dif * ratio);
+ if (size > 0) {
+ p.radius_bubble = size;
+ } else {
+ p.radius_bubble = 0;
+ }
+ }
+
+ }
+
+ /* opacity */
+ if (pJS.interactivity.modes.bubble.opacity != pJS.particles.opacity.value) {
+
+ if (pJS.interactivity.modes.bubble.opacity > pJS.particles.opacity.value) {
+ var opacity = pJS.interactivity.modes.bubble.opacity * ratio;
+ if (opacity > p.opacity && opacity <= pJS.interactivity.modes.bubble.opacity) {
+ p.opacity_bubble = opacity;
+ }
+ } else {
+ var opacity = p.opacity - (pJS.particles.opacity.value - pJS.interactivity.modes.bubble.opacity) * ratio;
+ if (opacity < p.opacity && opacity >= pJS.interactivity.modes.bubble.opacity) {
+ p.opacity_bubble = opacity;
+ }
+ }
+
+ }
+
+ }
+
+ } else {
+ init();
+ }
+
+
+ /* mouseleave */
+ if (pJS.interactivity.status == 'mouseleave') {
+ init();
+ }
+
+ }
+
+ /* on click event */
+ else if (pJS.interactivity.events.onclick.enable && isInArray('bubble', pJS.interactivity.events.onclick.mode)) {
+
+
+ if (pJS.tmp.bubble_clicking) {
+ var dx_mouse = p.x - pJS.interactivity.mouse.click_pos_x,
+ dy_mouse = p.y - pJS.interactivity.mouse.click_pos_y,
+ dist_mouse = Math.sqrt(dx_mouse * dx_mouse + dy_mouse * dy_mouse),
+ time_spent = (new Date().getTime() - pJS.interactivity.mouse.click_time) / 1000;
+
+ if (time_spent > pJS.interactivity.modes.bubble.duration) {
+ pJS.tmp.bubble_duration_end = true;
+ }
+
+ if (time_spent > pJS.interactivity.modes.bubble.duration * 2) {
+ pJS.tmp.bubble_clicking = false;
+ pJS.tmp.bubble_duration_end = false;
+ }
+ }
+
+
+ function process(bubble_param, particles_param, p_obj_bubble, p_obj, id) {
+
+ if (bubble_param != particles_param) {
+
+ if (!pJS.tmp.bubble_duration_end) {
+ if (dist_mouse <= pJS.interactivity.modes.bubble.distance) {
+ if (p_obj_bubble != undefined) var obj = p_obj_bubble;
+ else var obj = p_obj;
+ if (obj != bubble_param) {
+ var value = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration);
+ if (id == 'size') p.radius_bubble = value;
+ if (id == 'opacity') p.opacity_bubble = value;
+ }
+ } else {
+ if (id == 'size') p.radius_bubble = undefined;
+ if (id == 'opacity') p.opacity_bubble = undefined;
+ }
+ } else {
+ if (p_obj_bubble != undefined) {
+ var value_tmp = p_obj - (time_spent * (p_obj - bubble_param) / pJS.interactivity.modes.bubble.duration),
+ dif = bubble_param - value_tmp;
+ value = bubble_param + dif;
+ if (id == 'size') p.radius_bubble = value;
+ if (id == 'opacity') p.opacity_bubble = value;
+ }
+ }
+
+ }
+
+ }
+
+ if (pJS.tmp.bubble_clicking) {
+ /* size */
+ process(pJS.interactivity.modes.bubble.size, pJS.particles.size.value, p.radius_bubble, p.radius, 'size');
+ /* opacity */
+ process(pJS.interactivity.modes.bubble.opacity, pJS.particles.opacity.value, p.opacity_bubble, p.opacity, 'opacity');
+ }
+
+ }
+
+ };
+
+
+ pJS.fn.modes.repulseParticle = function (p) {
+
+ if (pJS.interactivity.events.onhover.enable && isInArray('repulse', pJS.interactivity.events.onhover.mode) && pJS.interactivity.status == 'mousemove') {
+
+ var dx_mouse = p.x - pJS.interactivity.mouse.pos_x,
+ dy_mouse = p.y - pJS.interactivity.mouse.pos_y,
+ dist_mouse = Math.sqrt(dx_mouse * dx_mouse + dy_mouse * dy_mouse);
+
+ var normVec = {x: dx_mouse / dist_mouse, y: dy_mouse / dist_mouse},
+ repulseRadius = pJS.interactivity.modes.repulse.distance,
+ velocity = 100,
+ repulseFactor = clamp((1 / repulseRadius) * (-1 * Math.pow(dist_mouse / repulseRadius, 2) + 1) * repulseRadius * velocity, 0, 50);
+
+ var pos = {
+ x: p.x + normVec.x * repulseFactor,
+ y: p.y + normVec.y * repulseFactor
+ }
+
+ if (pJS.particles.move.out_mode == 'bounce') {
+ if (pos.x - p.radius > 0 && pos.x + p.radius < pJS.canvas.w) p.x = pos.x;
+ if (pos.y - p.radius > 0 && pos.y + p.radius < pJS.canvas.h) p.y = pos.y;
+ } else {
+ p.x = pos.x;
+ p.y = pos.y;
+ }
+
+ }
+
+
+ else if (pJS.interactivity.events.onclick.enable && isInArray('repulse', pJS.interactivity.events.onclick.mode)) {
+
+ if (!pJS.tmp.repulse_finish) {
+ pJS.tmp.repulse_count++;
+ if (pJS.tmp.repulse_count == pJS.particles.array.length) {
+ pJS.tmp.repulse_finish = true;
+ }
+ }
+
+ if (pJS.tmp.repulse_clicking) {
+
+ var repulseRadius = Math.pow(pJS.interactivity.modes.repulse.distance / 6, 3);
+
+ var dx = pJS.interactivity.mouse.click_pos_x - p.x,
+ dy = pJS.interactivity.mouse.click_pos_y - p.y,
+ d = dx * dx + dy * dy;
+
+ var force = -repulseRadius / d * 1;
+
+ function process() {
+
+ var f = Math.atan2(dy, dx);
+ p.vx = force * Math.cos(f);
+ p.vy = force * Math.sin(f);
+
+ if (pJS.particles.move.out_mode == 'bounce') {
+ var pos = {
+ x: p.x + p.vx,
+ y: p.y + p.vy
+ }
+ if (pos.x + p.radius > pJS.canvas.w) p.vx = -p.vx;
+ else if (pos.x - p.radius < 0) p.vx = -p.vx;
+ if (pos.y + p.radius > pJS.canvas.h) p.vy = -p.vy;
+ else if (pos.y - p.radius < 0) p.vy = -p.vy;
+ }
+
+ }
+
+ // default
+ if (d <= repulseRadius) {
+ process();
+ }
+
+ // bang - slow motion mode
+ // if(!pJS.tmp.repulse_finish){
+ // if(d <= repulseRadius){
+ // process();
+ // }
+ // }else{
+ // process();
+ // }
+
+
+ } else {
+
+ if (pJS.tmp.repulse_clicking == false) {
+
+ p.vx = p.vx_i;
+ p.vy = p.vy_i;
+
+ }
+
+ }
+
+ }
+
+ }
+
+
+ pJS.fn.modes.grabParticle = function (p) {
+
+ if (pJS.interactivity.events.onhover.enable && pJS.interactivity.status == 'mousemove') {
+
+ var dx_mouse = p.x - pJS.interactivity.mouse.pos_x,
+ dy_mouse = p.y - pJS.interactivity.mouse.pos_y,
+ dist_mouse = Math.sqrt(dx_mouse * dx_mouse + dy_mouse * dy_mouse);
+
+ /* draw a line between the cursor and the particle if the distance between them is under the config distance */
+ if (dist_mouse <= pJS.interactivity.modes.grab.distance) {
+
+ var opacity_line = pJS.interactivity.modes.grab.line_linked.opacity - (dist_mouse / (1 / pJS.interactivity.modes.grab.line_linked.opacity)) / pJS.interactivity.modes.grab.distance;
+
+ if (opacity_line > 0) {
+
+ /* style */
+ var color_line = pJS.particles.line_linked.color_rgb_line;
+ pJS.canvas.ctx.strokeStyle = 'rgba(' + color_line.r + ',' + color_line.g + ',' + color_line.b + ',' + opacity_line + ')';
+ pJS.canvas.ctx.lineWidth = pJS.particles.line_linked.width;
+ //pJS.canvas.ctx.lineCap = 'round'; /* performance issue */
+
+ /* path */
+ pJS.canvas.ctx.beginPath();
+ pJS.canvas.ctx.moveTo(p.x, p.y);
+ pJS.canvas.ctx.lineTo(pJS.interactivity.mouse.pos_x, pJS.interactivity.mouse.pos_y);
+ pJS.canvas.ctx.stroke();
+ pJS.canvas.ctx.closePath();
+
+ }
+
+ }
+
+ }
+
+ };
+
+
+ /* ---------- pJS functions - vendors ------------ */
+
+ pJS.fn.vendors.eventsListeners = function () {
+
+ /* events target element */
+ if (pJS.interactivity.detect_on == 'window') {
+ pJS.interactivity.el = window;
+ } else {
+ pJS.interactivity.el = pJS.canvas.el;
+ }
+
+
+ /* detect mouse pos - on hover / click event */
+ if (pJS.interactivity.events.onhover.enable || pJS.interactivity.events.onclick.enable) {
+
+ /* el on mousemove */
+ pJS.interactivity.el.addEventListener('mousemove', function (e) {
+
+ if (pJS.interactivity.el == window) {
+ var pos_x = e.clientX,
+ pos_y = e.clientY;
+ }
+ else {
+ var pos_x = e.offsetX || e.clientX,
+ pos_y = e.offsetY || e.clientY;
+ }
+
+ pJS.interactivity.mouse.pos_x = pos_x;
+ pJS.interactivity.mouse.pos_y = pos_y;
+
+ if (pJS.tmp.retina) {
+ pJS.interactivity.mouse.pos_x *= pJS.canvas.pxratio;
+ pJS.interactivity.mouse.pos_y *= pJS.canvas.pxratio;
+ }
+
+ pJS.interactivity.status = 'mousemove';
+
+ });
+
+ /* el on onmouseleave */
+ pJS.interactivity.el.addEventListener('mouseleave', function (e) {
+
+ pJS.interactivity.mouse.pos_x = null;
+ pJS.interactivity.mouse.pos_y = null;
+ pJS.interactivity.status = 'mouseleave';
+
+ });
+
+ }
+
+ /* on click event */
+ if (pJS.interactivity.events.onclick.enable) {
+
+ pJS.interactivity.el.addEventListener('click', function () {
+
+ pJS.interactivity.mouse.click_pos_x = pJS.interactivity.mouse.pos_x;
+ pJS.interactivity.mouse.click_pos_y = pJS.interactivity.mouse.pos_y;
+ pJS.interactivity.mouse.click_time = new Date().getTime();
+
+ if (pJS.interactivity.events.onclick.enable) {
+
+ switch (pJS.interactivity.events.onclick.mode) {
+
+ case 'push':
+ if (pJS.particles.move.enable) {
+ pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse);
+ } else {
+ if (pJS.interactivity.modes.push.particles_nb == 1) {
+ pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb, pJS.interactivity.mouse);
+ }
+ else if (pJS.interactivity.modes.push.particles_nb > 1) {
+ pJS.fn.modes.pushParticles(pJS.interactivity.modes.push.particles_nb);
+ }
+ }
+ break;
+
+ case 'remove':
+ pJS.fn.modes.removeParticles(pJS.interactivity.modes.remove.particles_nb);
+ break;
+
+ case 'bubble':
+ pJS.tmp.bubble_clicking = true;
+ break;
+
+ case 'repulse':
+ pJS.tmp.repulse_clicking = true;
+ pJS.tmp.repulse_count = 0;
+ pJS.tmp.repulse_finish = false;
+ setTimeout(function () {
+ pJS.tmp.repulse_clicking = false;
+ }, pJS.interactivity.modes.repulse.duration * 1000)
+ break;
+
+ }
+
+ }
+
+ });
+
+ }
+
+
+ };
+
+ pJS.fn.vendors.densityAutoParticles = function () {
+
+ if (pJS.particles.number.density.enable) {
+
+ /* calc area */
+ var area = pJS.canvas.el.width * pJS.canvas.el.height / 1000;
+ if (pJS.tmp.retina) {
+ area = area / (pJS.canvas.pxratio * 2);
+ }
+
+ /* calc number of particles based on density area */
+ var nb_particles = area * pJS.particles.number.value / pJS.particles.number.density.value_area;
+
+ /* add or remove X particles */
+ var missing_particles = pJS.particles.array.length - nb_particles;
+ if (missing_particles < 0) pJS.fn.modes.pushParticles(Math.abs(missing_particles));
+ else pJS.fn.modes.removeParticles(missing_particles);
+
+ }
+
+ };
+
+
+ pJS.fn.vendors.checkOverlap = function (p1, position) {
+ for (var i = 0; i < pJS.particles.array.length; i++) {
+ var p2 = pJS.particles.array[i];
+
+ var dx = p1.x - p2.x,
+ dy = p1.y - p2.y,
+ dist = Math.sqrt(dx * dx + dy * dy);
+
+ if (dist <= p1.radius + p2.radius) {
+ p1.x = position ? position.x : Math.random() * pJS.canvas.w;
+ p1.y = position ? position.y : Math.random() * pJS.canvas.h;
+ pJS.fn.vendors.checkOverlap(p1);
+ }
+ }
+ };
+
+
+ pJS.fn.vendors.createSvgImg = function (p) {
+
+ /* set color to svg element */
+ var svgXml = pJS.tmp.source_svg,
+ rgbHex = /#([0-9A-F]{3,6})/gi,
+ coloredSvgXml = svgXml.replace(rgbHex, function (m, r, g, b) {
+ if (p.color.rgb) {
+ var color_value = 'rgba(' + p.color.rgb.r + ',' + p.color.rgb.g + ',' + p.color.rgb.b + ',' + p.opacity + ')';
+ } else {
+ var color_value = 'hsla(' + p.color.hsl.h + ',' + p.color.hsl.s + '%,' + p.color.hsl.l + '%,' + p.opacity + ')';
+ }
+ return color_value;
+ });
+
+ /* prepare to create img with colored svg */
+ var svg = new Blob([coloredSvgXml], {type: 'image/svg+xml;charset=utf-8'}),
+ DOMURL = window.URL || window.webkitURL || window,
+ url = DOMURL.createObjectURL(svg);
+
+ /* create particle img obj */
+ var img = new Image();
+ img.addEventListener('load', function () {
+ p.img.obj = img;
+ p.img.loaded = true;
+ DOMURL.revokeObjectURL(url);
+ pJS.tmp.count_svg++;
+ });
+ img.src = url;
+
+ };
+
+
+ pJS.fn.vendors.destroypJS = function () {
+ cancelAnimationFrame(pJS.fn.drawAnimFrame);
+ canvas_el.remove();
+ pJSDom = null;
+ };
+
+
+ pJS.fn.vendors.drawShape = function (c, startX, startY, sideLength, sideCountNumerator, sideCountDenominator) {
+
+ // By Programming Thomas - https://programmingthomas.wordpress.com/2013/04/03/n-sided-shapes/
+ var sideCount = sideCountNumerator * sideCountDenominator;
+ var decimalSides = sideCountNumerator / sideCountDenominator;
+ var interiorAngleDegrees = (180 * (decimalSides - 2)) / decimalSides;
+ var interiorAngle = Math.PI - Math.PI * interiorAngleDegrees / 180; // convert to radians
+ c.save();
+ c.beginPath();
+ c.translate(startX, startY);
+ c.moveTo(0, 0);
+ for (var i = 0; i < sideCount; i++) {
+ c.lineTo(sideLength, 0);
+ c.translate(sideLength, 0);
+ c.rotate(interiorAngle);
+ }
+ //c.stroke();
+ c.fill();
+ c.restore();
+
+ };
+
+ pJS.fn.vendors.exportImg = function () {
+ window.open(pJS.canvas.el.toDataURL('image/png'), '_blank');
+ };
+
+
+ pJS.fn.vendors.loadImg = function (type) {
+
+ pJS.tmp.img_error = undefined;
+
+ if (pJS.particles.shape.image.src != '') {
+
+ if (type == 'svg') {
+
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', pJS.particles.shape.image.src);
+ xhr.onreadystatechange = function (data) {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200) {
+ pJS.tmp.source_svg = data.currentTarget.response;
+ pJS.fn.vendors.checkBeforeDraw();
+ } else {
+ console.log('Error pJS - Image not found');
+ pJS.tmp.img_error = true;
+ }
+ }
+ }
+ xhr.send();
+
+ } else {
+
+ var img = new Image();
+ img.addEventListener('load', function () {
+ pJS.tmp.img_obj = img;
+ pJS.fn.vendors.checkBeforeDraw();
+ });
+ img.src = pJS.particles.shape.image.src;
+
+ }
+
+ } else {
+ console.log('Error pJS - No image.src');
+ pJS.tmp.img_error = true;
+ }
+
+ };
+
+
+ pJS.fn.vendors.draw = function () {
+
+ if (pJS.particles.shape.type == 'image') {
+
+ if (pJS.tmp.img_type == 'svg') {
+
+ if (pJS.tmp.count_svg >= pJS.particles.number.value) {
+ pJS.fn.particlesDraw();
+ if (!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame);
+ else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw);
+ } else {
+ //console.log('still loading...');
+ if (!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw);
+ }
+
+ } else {
+
+ if (pJS.tmp.img_obj != undefined) {
+ pJS.fn.particlesDraw();
+ if (!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame);
+ else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw);
+ } else {
+ if (!pJS.tmp.img_error) pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw);
+ }
+
+ }
+
+ } else {
+ pJS.fn.particlesDraw();
+ if (!pJS.particles.move.enable) cancelRequestAnimFrame(pJS.fn.drawAnimFrame);
+ else pJS.fn.drawAnimFrame = requestAnimFrame(pJS.fn.vendors.draw);
+ }
+
+ };
+
+
+ pJS.fn.vendors.checkBeforeDraw = function () {
+
+ // if shape is image
+ if (pJS.particles.shape.type == 'image') {
+
+ if (pJS.tmp.img_type == 'svg' && pJS.tmp.source_svg == undefined) {
+ pJS.tmp.checkAnimFrame = requestAnimFrame(check);
+ } else {
+ //console.log('images loaded! cancel check');
+ cancelRequestAnimFrame(pJS.tmp.checkAnimFrame);
+ if (!pJS.tmp.img_error) {
+ pJS.fn.vendors.init();
+ pJS.fn.vendors.draw();
+ }
+
+ }
+
+ } else {
+ pJS.fn.vendors.init();
+ pJS.fn.vendors.draw();
+ }
+
+ };
+
+
+ pJS.fn.vendors.init = function () {
+
+ /* init canvas + particles */
+ pJS.fn.retinaInit();
+ pJS.fn.canvasInit();
+ pJS.fn.canvasSize();
+ pJS.fn.canvasPaint();
+ pJS.fn.particlesCreate();
+ pJS.fn.vendors.densityAutoParticles();
+
+ /* particles.line_linked - convert hex colors to rgb */
+ pJS.particles.line_linked.color_rgb_line = hexToRgb(pJS.particles.line_linked.color);
+
+ };
+
+
+ pJS.fn.vendors.start = function () {
+
+ if (isInArray('image', pJS.particles.shape.type)) {
+ pJS.tmp.img_type = pJS.particles.shape.image.src.substr(pJS.particles.shape.image.src.length - 3);
+ pJS.fn.vendors.loadImg(pJS.tmp.img_type);
+ } else {
+ pJS.fn.vendors.checkBeforeDraw();
+ }
+
+ };
+
+
+ /* ---------- pJS - start ------------ */
+
+
+ pJS.fn.vendors.eventsListeners();
+
+ pJS.fn.vendors.start();
+
+
+};
+
+/* ---------- global functions - vendors ------------ */
+
+Object.deepExtend = function (destination, source) {
+ for (var property in source) {
+ if (source[property] && source[property].constructor &&
+ source[property].constructor === Object) {
+ destination[property] = destination[property] || {};
+ arguments.callee(destination[property], source[property]);
+ } else {
+ destination[property] = source[property];
+ }
+ }
+ return destination;
+};
+
+window.requestAnimFrame = (function () {
+ return window.requestAnimationFrame ||
+ window.webkitRequestAnimationFrame ||
+ window.mozRequestAnimationFrame ||
+ window.oRequestAnimationFrame ||
+ window.msRequestAnimationFrame ||
+ function (callback) {
+ window.setTimeout(callback, 1000 / 60);
+ };
+})();
+
+window.cancelRequestAnimFrame = (function () {
+ return window.cancelAnimationFrame ||
+ window.webkitCancelRequestAnimationFrame ||
+ window.mozCancelRequestAnimationFrame ||
+ window.oCancelRequestAnimationFrame ||
+ window.msCancelRequestAnimationFrame ||
+ clearTimeout
+})();
+
+function hexToRgb(hex) {
+ // By Tim Down - http://stackoverflow.com/a/5624139/3493650
+ // Expand shorthand form (e.g. "03F") to full form (e.g. "0033FF")
+ var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
+ hex = hex.replace(shorthandRegex, function (m, r, g, b) {
+ return r + r + g + g + b + b;
+ });
+ var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex);
+ return result ? {
+ r: parseInt(result[1], 16),
+ g: parseInt(result[2], 16),
+ b: parseInt(result[3], 16)
+ } : null;
+};
+
+function clamp(number, min, max) {
+ return Math.min(Math.max(number, min), max);
+};
+
+function isInArray(value, array) {
+ return array.indexOf(value) > -1;
+}
+
+
+/* ---------- particles.js functions - start ------------ */
+
+window.pJSDom = [];
+
+window.particlesJS = function (tag_id, params) {
+
+ //console.log(params);
+
+ /* no string id? so it's object params, and set the id with default id */
+ if (typeof(tag_id) != 'string') {
+ params = tag_id;
+ tag_id = 'particles-js';
+ }
+
+ /* no id? set the id to default id */
+ if (!tag_id) {
+ tag_id = 'particles-js';
+ }
+
+ /* pJS elements */
+ var pJS_tag = document.getElementById(tag_id),
+ pJS_canvas_class = 'particles-js-canvas-el',
+ exist_canvas = pJS_tag.getElementsByClassName(pJS_canvas_class);
+
+ /* remove canvas if exists into the pJS target tag */
+ if (exist_canvas.length) {
+ while (exist_canvas.length > 0) {
+ pJS_tag.removeChild(exist_canvas[0]);
+ }
+ }
+
+ /* create canvas element */
+ var canvas_el = document.createElement('canvas');
+ canvas_el.className = pJS_canvas_class;
+
+ /* set size canvas */
+ canvas_el.style.width = "100%";
+ canvas_el.style.height = "100%";
+
+ /* append canvas */
+ var canvas = document.getElementById(tag_id).appendChild(canvas_el);
+
+ /* launch particle.js */
+ if (canvas != null) {
+ pJSDom.push(new pJS(tag_id, params));
+ }
+
+};
+
+window.particlesJS.load = function (tag_id, path_config_json, callback) {
+
+ /* load json config */
+ var xhr = new XMLHttpRequest();
+ xhr.open('GET', path_config_json);
+ xhr.onreadystatechange = function (data) {
+ if (xhr.readyState == 4) {
+ if (xhr.status == 200) {
+ var params = JSON.parse(data.currentTarget.response);
+ window.particlesJS(tag_id, params);
+ if (callback) callback();
+ } else {
+ console.log('Error pJS - XMLHttpRequest status: ' + xhr.status);
+ console.log('Error pJS - File config not found');
+ }
+ }
+ };
+ xhr.send();
+
+}; \ No newline at end of file
diff --git a/src/main/resources/assets/js/particles.json b/src/main/resources/assets/js/particles.json
new file mode 100644
index 0000000..c0c09d3
--- /dev/null
+++ b/src/main/resources/assets/js/particles.json
@@ -0,0 +1,110 @@
+{
+ "particles": {
+ "number": {
+ "value": 60,
+ "density": {
+ "enable": true,
+ "value_area": 1000
+ }
+ },
+ "color": {
+ "value": "#0000FF"
+ },
+ "shape": {
+ "type": "circle",
+ "stroke": {
+ "width": 0,
+ "color": "#000000"
+ },
+ "polygon": {
+ "nb_sides": 5
+ },
+ "image": {
+ "src": "img/github.svg",
+ "width": 100,
+ "height": 100
+ }
+ },
+ "opacity": {
+ "value": 0.5,
+ "random": false,
+ "anim": {
+ "enable": false,
+ "speed": 1,
+ "opacity_min": 0.1,
+ "sync": false
+ }
+ },
+ "size": {
+ "value": 2,
+ "random": false,
+ "anim": {
+ "enable": false,
+ "speed": 10,
+ "size_min": 0.1,
+ "sync": false
+ }
+ },
+ "line_linked": {
+ "enable": true,
+ "distance": 100,
+ "color": "#0000FF",
+ "opacity": 0.4,
+ "width": 1
+ },
+ "move": {
+ "enable": true,
+ "speed": 3,
+ "direction": "none",
+ "random": false,
+ "straight": false,
+ "out_mode": "out",
+ "bounce": false,
+ "attract": {
+ "enable": false,
+ "rotateX": 600,
+ "rotateY": 100
+ }
+ }
+ },
+ "interactivity": {
+ "detect_on": "canvas",
+ "events": {
+ "onhover": {
+ "enable": false,
+ "mode": "repulse"
+ },
+ "onclick": {
+ "enable": true,
+ "mode": "push"
+ },
+ "resize": true
+ },
+ "modes": {
+ "grab": {
+ "distance": 800,
+ "line_linked": {
+ "opacity": 1
+ }
+ },
+ "bubble": {
+ "distance": 800,
+ "size": 80,
+ "duration": 2,
+ "opacity": 0.8,
+ "speed": 3
+ },
+ "repulse": {
+ "distance": 400,
+ "duration": 0.4
+ },
+ "push": {
+ "particles_nb": 4
+ },
+ "remove": {
+ "particles_nb": 2
+ }
+ }
+ },
+ "retina_detect": true
+} \ No newline at end of file
diff --git a/src/main/resources/assets/js/piexif.min.js b/src/main/resources/assets/js/piexif.min.js
new file mode 100644
index 0000000..10d6124
--- /dev/null
+++ b/src/main/resources/assets/js/piexif.min.js
@@ -0,0 +1 @@
+!function(){"use strict";function e(e){return JSON.parse(JSON.stringify(e))}function t(e){for(var t=y(e);"ÿà"<=t[1].slice(0,2)&&t[1].slice(0,2)<="ÿï";)t=[t[0]].concat(t.slice(2));return t.join("")}function a(e){return s(">"+p("B",e.length),e)}function i(e){return s(">"+p("H",e.length),e)}function n(e){return s(">"+p("L",e.length),e)}function r(e,t,r){var o,l,m,y,c="",S="";if("Byte"==t)o=e.length,4>=o?S=a(e)+p("\x00",4-o):(S=s(">L",[r]),c=a(e));else if("Short"==t)o=e.length,2>=o?S=i(e)+p("\x00\x00",2-o):(S=s(">L",[r]),c=i(e));else if("Long"==t)o=e.length,1>=o?S=n(e):(S=s(">L",[r]),c=n(e));else if("Ascii"==t)l=e+"\x00",o=l.length,o>4?(S=s(">L",[r]),c=l):S=l+p("\x00",4-o);else if("Rational"==t){if("number"==typeof e[0])o=1,m=e[0],y=e[1],l=s(">L",[m])+s(">L",[y]);else{o=e.length,l="";for(var f=0;o>f;f++)m=e[f][0],y=e[f][1],l+=s(">L",[m])+s(">L",[y])}S=s(">L",[r]),c=l}else if("SRational"==t){if("number"==typeof e[0])o=1,m=e[0],y=e[1],l=s(">l",[m])+s(">l",[y]);else{o=e.length,l="";for(var f=0;o>f;f++)m=e[f][0],y=e[f][1],l+=s(">l",[m])+s(">l",[y])}S=s(">L",[r]),c=l}else"Undefined"==t&&(o=e.length,o>4?(S=s(">L",[r]),c=e):S=e+p("\x00",4-o));var h=s(">L",[o]);return[h,S,c]}function o(e,t,a){var i,n=8,o=Object.keys(e).length,l=s(">H",[o]);i=["0th","1st"].indexOf(t)>-1?2+12*o+4:2+12*o;var m,p="",y="";for(var m in e)if("string"==typeof m&&(m=parseInt(m)),!("0th"==t&&[34665,34853].indexOf(m)>-1||"Exif"==t&&40965==m||"1st"==t&&[513,514].indexOf(m)>-1)){var c=e[m],S=s(">H",[m]),f=u[t][m].type,h=s(">H",[g[f]]);"number"==typeof c&&(c=[c]);var d=n+i+a+y.length,P=r(c,f,d),C=P[0],R=P[1],L=P[2];p+=S+h+C+R,y+=L}return[l+p,y]}function l(e){var t,a;if("ÿØ"==e.slice(0,2))t=y(e),a=c(t),a?this.tiftag=a.slice(10):this.tiftag=null;else if(["II","MM"].indexOf(e.slice(0,2))>-1)this.tiftag=e;else{if("Exif"!=e.slice(0,4))throw"Given file is neither JPEG nor TIFF.";this.tiftag=e.slice(6)}}function s(e,t){if(!(t instanceof Array))throw"'pack' error. Got invalid type argument.";if(e.length-1!=t.length)throw"'pack' error. "+(e.length-1)+" marks, "+t.length+" elements.";var a;if("<"==e[0])a=!0;else{if(">"!=e[0])throw"";a=!1}for(var i="",n=1,r=null,o=null,l=null;o=e[n];){if("b"==o.toLowerCase()){if(r=t[n-1],"b"==o&&0>r&&(r+=256),r>255||0>r)throw"'pack' error.";l=String.fromCharCode(r)}else if("H"==o){if(r=t[n-1],r>65535||0>r)throw"'pack' error.";l=String.fromCharCode(Math.floor(r%65536/256))+String.fromCharCode(r%256),a&&(l=l.split("").reverse().join(""))}else{if("l"!=o.toLowerCase())throw"'pack' error.";if(r=t[n-1],"l"==o&&0>r&&(r+=4294967296),r>4294967295||0>r)throw"'pack' error.";l=String.fromCharCode(Math.floor(r/16777216))+String.fromCharCode(Math.floor(r%16777216/65536))+String.fromCharCode(Math.floor(r%65536/256))+String.fromCharCode(r%256),a&&(l=l.split("").reverse().join(""))}i+=l,n+=1}return i}function m(e,t){if("string"!=typeof t)throw"'unpack' error. Got invalid type argument.";for(var a=0,i=1;i<e.length;i++)if("b"==e[i].toLowerCase())a+=1;else if("h"==e[i].toLowerCase())a+=2;else{if("l"!=e[i].toLowerCase())throw"'unpack' error. Got invalid mark.";a+=4}if(a!=t.length)throw"'unpack' error. Mismatch between symbol and string length. "+a+":"+t.length;var n;if("<"==e[0])n=!0;else{if(">"!=e[0])throw"'unpack' error.";n=!1}for(var r=[],o=0,l=1,s=null,m=null,p=null,y="";m=e[l];){if("b"==m.toLowerCase())p=1,y=t.slice(o,o+p),s=y.charCodeAt(0),"b"==m&&s>=128&&(s-=256);else if("H"==m)p=2,y=t.slice(o,o+p),n&&(y=y.split("").reverse().join("")),s=256*y.charCodeAt(0)+y.charCodeAt(1);else{if("l"!=m.toLowerCase())throw"'unpack' error. "+m;p=4,y=t.slice(o,o+p),n&&(y=y.split("").reverse().join("")),s=16777216*y.charCodeAt(0)+65536*y.charCodeAt(1)+256*y.charCodeAt(2)+y.charCodeAt(3),"l"==m&&s>=2147483648&&(s-=4294967296)}r.push(s),o+=p,l+=1}return r}function p(e,t){for(var a="",i=0;t>i;i++)a+=e;return a}function y(e){if("ÿØ"!=e.slice(0,2))throw"Given data isn't JPEG.";for(var t=2,a=["ÿØ"];;){if("ÿÚ"==e.slice(t,t+2)){a.push(e.slice(t));break}var i=m(">H",e.slice(t+2,t+4))[0],n=t+i+2;if(a.push(e.slice(t,n)),t=n,t>=e.length)throw"Wrong JPEG data."}return a}function c(e){for(var t,a=0;a<e.length;a++)if(t=e[a],"ÿá"==t.slice(0,2)&&"Exif\x00\x00"==t.slice(4,10))return t;return null}function S(e,t){return"ÿà"==e[1].slice(0,2)&&"ÿá"==e[2].slice(0,2)&&"Exif\x00\x00"==e[2].slice(4,10)?t?(e[2]=t,e=["ÿØ"].concat(e.slice(2))):e=null==t?e.slice(0,2).concat(e.slice(3)):e.slice(0).concat(e.slice(2)):"ÿà"==e[1].slice(0,2)?t&&(e[1]=t):"ÿá"==e[1].slice(0,2)&&"Exif\x00\x00"==e[1].slice(4,10)?t?e[1]=t:null==t&&(e=e.slice(0).concat(e.slice(2))):t&&(e=[e[0],t].concat(e.slice(1))),e.join("")}var f={};if(f.version="1.03",f.remove=function(e){var t=!1;if("ÿØ"==e.slice(0,2));else{if("data:image/jpeg;base64,"!=e.slice(0,23)&&"data:image/jpg;base64,"!=e.slice(0,22))throw"Given data is not jpeg.";e=d(e.split(",")[1]),t=!0}var a=y(e);if("ÿá"==a[1].slice(0,2)&&"Exif\x00\x00"==a[1].slice(4,10))a=[a[0]].concat(a.slice(2));else{if("ÿá"!=a[2].slice(0,2)||"Exif\x00\x00"!=a[2].slice(4,10))throw"Exif not found.";a=a.slice(0,2).concat(a.slice(3))}var i=a.join("");return t&&(i="data:image/jpeg;base64,"+h(i)),i},f.insert=function(e,t){var a=!1;if("Exif\x00\x00"!=e.slice(0,6))throw"Given data is not exif.";if("ÿØ"==t.slice(0,2));else{if("data:image/jpeg;base64,"!=t.slice(0,23)&&"data:image/jpg;base64,"!=t.slice(0,22))throw"Given data is not jpeg.";t=d(t.split(",")[1]),a=!0}var i="ÿá"+s(">H",[e.length+2])+e,n=y(t),r=S(n,i);return a&&(r="data:image/jpeg;base64,"+h(r)),r},f.load=function(e){var t;if("string"!=typeof e)throw"'load' gots invalid type argument.";if("ÿØ"==e.slice(0,2))t=e;else if("data:image/jpeg;base64,"==e.slice(0,23)||"data:image/jpg;base64,"==e.slice(0,22))t=d(e.split(",")[1]);else{if("Exif"!=e.slice(0,4))throw"'load' gots invalid file data.";t=e.slice(6)}var a={"0th":{},Exif:{},GPS:{},Interop:{},"1st":{},thumbnail:null},i=new l(t);if(null===i.tiftag)return a;"II"==i.tiftag.slice(0,2)?i.endian_mark="<":i.endian_mark=">";var n=m(i.endian_mark+"L",i.tiftag.slice(4,8))[0];a["0th"]=i.get_ifd(n,"0th");var r=a["0th"].first_ifd_pointer;if(delete a["0th"].first_ifd_pointer,34665 in a["0th"]&&(n=a["0th"][34665],a.Exif=i.get_ifd(n,"Exif")),34853 in a["0th"]&&(n=a["0th"][34853],a.GPS=i.get_ifd(n,"GPS")),40965 in a.Exif&&(n=a.Exif[40965],a.Interop=i.get_ifd(n,"Interop")),"\x00\x00\x00\x00"!=r&&(n=m(i.endian_mark+"L",r)[0],a["1st"]=i.get_ifd(n,"1st"),513 in a["1st"]&&514 in a["1st"])){var o=a["1st"][513]+a["1st"][514],s=i.tiftag.slice(a["1st"][513],o);a.thumbnail=s}return a},f.dump=function(a){var i,n,r,l,m,p=8,y=e(a),c="Exif\x00\x00MM\x00*\x00\x00\x00\b",S=!1,h=!1,d=!1,u=!1;i="0th"in y?y["0th"]:{},"Exif"in y&&Object.keys(y.Exif).length||"Interop"in y&&Object.keys(y.Interop).length?(i[34665]=1,S=!0,n=y.Exif,"Interop"in y&&Object.keys(y.Interop).length?(n[40965]=1,d=!0,r=y.Interop):Object.keys(n).indexOf(f.ExifIFD.InteroperabilityTag.toString())>-1&&delete n[40965]):Object.keys(i).indexOf(f.ImageIFD.ExifTag.toString())>-1&&delete i[34665],"GPS"in y&&Object.keys(y.GPS).length?(i[f.ImageIFD.GPSTag]=1,h=!0,l=y.GPS):Object.keys(i).indexOf(f.ImageIFD.GPSTag.toString())>-1&&delete i[f.ImageIFD.GPSTag],"1st"in y&&"thumbnail"in y&&null!=y.thumbnail&&(u=!0,y["1st"][513]=1,y["1st"][514]=1,m=y["1st"]);var P,C,R,L,x,I=o(i,"0th",0),D=I[0].length+12*S+12*h+4+I[1].length,G="",A=0,v="",b=0,T="",k=0,w="";if(S&&(P=o(n,"Exif",D),A=P[0].length+12*d+P[1].length),h&&(C=o(l,"GPS",D+A),v=C.join(""),b=v.length),d){var F=D+A+b;R=o(r,"Interop",F),T=R.join(""),k=T.length}if(u){var F=D+A+b+k;if(L=o(m,"1st",F),x=t(y.thumbnail),x.length>64e3)throw"Given thumbnail is too large. max 64kB"}var B="",E="",M="",O="\x00\x00\x00\x00";if(S){var N=p+D,U=s(">L",[N]),_=34665,H=s(">H",[_]),j=s(">H",[g.Long]),V=s(">L",[1]);B=H+j+V+U}if(h){var N=p+D+A,U=s(">L",[N]),_=34853,H=s(">H",[_]),j=s(">H",[g.Long]),V=s(">L",[1]);E=H+j+V+U}if(d){var N=p+D+A+b,U=s(">L",[N]),_=40965,H=s(">H",[_]),j=s(">H",[g.Long]),V=s(">L",[1]);M=H+j+V+U}if(u){var N=p+D+A+b+k;O=s(">L",[N]);var J=N+L[0].length+24+4+L[1].length,X="\x00\x00\x00\x00"+s(">L",[J]),z="\x00\x00\x00\x00"+s(">L",[x.length]);w=L[0]+X+z+"\x00\x00\x00\x00"+L[1]+x}var Y=I[0]+B+E+O+I[1];return S&&(G=P[0]+M+P[1]),c+Y+G+v+T+w},l.prototype={get_ifd:function(e,t){var a,i={},n=m(this.endian_mark+"H",this.tiftag.slice(e,e+2))[0],r=e+2;a=["0th","1st"].indexOf(t)>-1?"Image":t;for(var o=0;n>o;o++){e=r+12*o;var l=m(this.endian_mark+"H",this.tiftag.slice(e,e+2))[0],s=m(this.endian_mark+"H",this.tiftag.slice(e+2,e+4))[0],p=m(this.endian_mark+"L",this.tiftag.slice(e+4,e+8))[0],y=this.tiftag.slice(e+8,e+12),c=[s,p,y];l in u[a]&&(i[l]=this.convert_value(c))}return"0th"==t&&(e=r+12*n,i.first_ifd_pointer=this.tiftag.slice(e,e+4)),i},convert_value:function(e){var t,a=null,i=e[0],n=e[1],r=e[2];if(1==i)n>4?(t=m(this.endian_mark+"L",r)[0],a=m(this.endian_mark+p("B",n),this.tiftag.slice(t,t+n))):a=m(this.endian_mark+p("B",n),r.slice(0,n));else if(2==i)n>4?(t=m(this.endian_mark+"L",r)[0],a=this.tiftag.slice(t,t+n-1)):a=r.slice(0,n-1);else if(3==i)n>2?(t=m(this.endian_mark+"L",r)[0],a=m(this.endian_mark+p("H",n),this.tiftag.slice(t,t+2*n))):a=m(this.endian_mark+p("H",n),r.slice(0,2*n));else if(4==i)n>1?(t=m(this.endian_mark+"L",r)[0],a=m(this.endian_mark+p("L",n),this.tiftag.slice(t,t+4*n))):a=m(this.endian_mark+p("L",n),r);else if(5==i)if(t=m(this.endian_mark+"L",r)[0],n>1){a=[];for(var o=0;n>o;o++)a.push([m(this.endian_mark+"L",this.tiftag.slice(t+8*o,t+4+8*o))[0],m(this.endian_mark+"L",this.tiftag.slice(t+4+8*o,t+8+8*o))[0]])}else a=[m(this.endian_mark+"L",this.tiftag.slice(t,t+4))[0],m(this.endian_mark+"L",this.tiftag.slice(t+4,t+8))[0]];else if(7==i)n>4?(t=m(this.endian_mark+"L",r)[0],a=this.tiftag.slice(t,t+n)):a=r.slice(0,n);else{if(10!=i)throw"Exif might be wrong. Got incorrect value type to decode. type:"+i;if(t=m(this.endian_mark+"L",r)[0],n>1){a=[];for(var o=0;n>o;o++)a.push([m(this.endian_mark+"l",this.tiftag.slice(t+8*o,t+4+8*o))[0],m(this.endian_mark+"l",this.tiftag.slice(t+4+8*o,t+8+8*o))[0]])}else a=[m(this.endian_mark+"l",this.tiftag.slice(t,t+4))[0],m(this.endian_mark+"l",this.tiftag.slice(t+4,t+8))[0]]}return a instanceof Array&&1==a.length?a[0]:a}},"undefined"!=typeof window&&"function"==typeof window.btoa)var h=window.btoa;if("undefined"==typeof h)var h=function(e){for(var t,a,i,n,r,o,l,s="",m=0,p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";m<e.length;)t=e.charCodeAt(m++),a=e.charCodeAt(m++),i=e.charCodeAt(m++),n=t>>2,r=(3&t)<<4|a>>4,o=(15&a)<<2|i>>6,l=63&i,isNaN(a)?o=l=64:isNaN(i)&&(l=64),s=s+p.charAt(n)+p.charAt(r)+p.charAt(o)+p.charAt(l);return s};if("undefined"!=typeof window&&"function"==typeof window.atob)var d=window.atob;if("undefined"==typeof d)var d=function(e){var t,a,i,n,r,o,l,s="",m=0,p="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";for(e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");m<e.length;)n=p.indexOf(e.charAt(m++)),r=p.indexOf(e.charAt(m++)),o=p.indexOf(e.charAt(m++)),l=p.indexOf(e.charAt(m++)),t=n<<2|r>>4,a=(15&r)<<4|o>>2,i=(3&o)<<6|l,s+=String.fromCharCode(t),64!=o&&(s+=String.fromCharCode(a)),64!=l&&(s+=String.fromCharCode(i));return s};var g={Byte:1,Ascii:2,Short:3,Long:4,Rational:5,Undefined:7,SLong:9,SRational:10},u={Image:{11:{name:"ProcessingSoftware",type:"Ascii"},254:{name:"NewSubfileType",type:"Long"},255:{name:"SubfileType",type:"Short"},256:{name:"ImageWidth",type:"Long"},257:{name:"ImageLength",type:"Long"},258:{name:"BitsPerSample",type:"Short"},259:{name:"Compression",type:"Short"},262:{name:"PhotometricInterpretation",type:"Short"},263:{name:"Threshholding",type:"Short"},264:{name:"CellWidth",type:"Short"},265:{name:"CellLength",type:"Short"},266:{name:"FillOrder",type:"Short"},269:{name:"DocumentName",type:"Ascii"},270:{name:"ImageDescription",type:"Ascii"},271:{name:"Make",type:"Ascii"},272:{name:"Model",type:"Ascii"},273:{name:"StripOffsets",type:"Long"},274:{name:"Orientation",type:"Short"},277:{name:"SamplesPerPixel",type:"Short"},278:{name:"RowsPerStrip",type:"Long"},279:{name:"StripByteCounts",type:"Long"},282:{name:"XResolution",type:"Rational"},283:{name:"YResolution",type:"Rational"},284:{name:"PlanarConfiguration",type:"Short"},290:{name:"GrayResponseUnit",type:"Short"},291:{name:"GrayResponseCurve",type:"Short"},292:{name:"T4Options",type:"Long"},293:{name:"T6Options",type:"Long"},296:{name:"ResolutionUnit",type:"Short"},301:{name:"TransferFunction",type:"Short"},305:{name:"Software",type:"Ascii"},306:{name:"DateTime",type:"Ascii"},315:{name:"Artist",type:"Ascii"},316:{name:"HostComputer",type:"Ascii"},317:{name:"Predictor",type:"Short"},318:{name:"WhitePoint",type:"Rational"},319:{name:"PrimaryChromaticities",type:"Rational"},320:{name:"ColorMap",type:"Short"},321:{name:"HalftoneHints",type:"Short"},322:{name:"TileWidth",type:"Short"},323:{name:"TileLength",type:"Short"},324:{name:"TileOffsets",type:"Short"},325:{name:"TileByteCounts",type:"Short"},330:{name:"SubIFDs",type:"Long"},332:{name:"InkSet",type:"Short"},333:{name:"InkNames",type:"Ascii"},334:{name:"NumberOfInks",type:"Short"},336:{name:"DotRange",type:"Byte"},337:{name:"TargetPrinter",type:"Ascii"},338:{name:"ExtraSamples",type:"Short"},339:{name:"SampleFormat",type:"Short"},340:{name:"SMinSampleValue",type:"Short"},341:{name:"SMaxSampleValue",type:"Short"},342:{name:"TransferRange",type:"Short"},343:{name:"ClipPath",type:"Byte"},344:{name:"XClipPathUnits",type:"Long"},345:{name:"YClipPathUnits",type:"Long"},346:{name:"Indexed",type:"Short"},347:{name:"JPEGTables",type:"Undefined"},351:{name:"OPIProxy",type:"Short"},512:{name:"JPEGProc",type:"Long"},513:{name:"JPEGInterchangeFormat",type:"Long"},514:{name:"JPEGInterchangeFormatLength",type:"Long"},515:{name:"JPEGRestartInterval",type:"Short"},517:{name:"JPEGLosslessPredictors",type:"Short"},518:{name:"JPEGPointTransforms",type:"Short"},519:{name:"JPEGQTables",type:"Long"},520:{name:"JPEGDCTables",type:"Long"},521:{name:"JPEGACTables",type:"Long"},529:{name:"YCbCrCoefficients",type:"Rational"},530:{name:"YCbCrSubSampling",type:"Short"},531:{name:"YCbCrPositioning",type:"Short"},532:{name:"ReferenceBlackWhite",type:"Rational"},700:{name:"XMLPacket",type:"Byte"},18246:{name:"Rating",type:"Short"},18249:{name:"RatingPercent",type:"Short"},32781:{name:"ImageID",type:"Ascii"},33421:{name:"CFARepeatPatternDim",type:"Short"},33422:{name:"CFAPattern",type:"Byte"},33423:{name:"BatteryLevel",type:"Rational"},33432:{name:"Copyright",type:"Ascii"},33434:{name:"ExposureTime",type:"Rational"},34377:{name:"ImageResources",type:"Byte"},34665:{name:"ExifTag",type:"Long"},34675:{name:"InterColorProfile",type:"Undefined"},34853:{name:"GPSTag",type:"Long"},34857:{name:"Interlace",type:"Short"},34858:{name:"TimeZoneOffset",type:"Long"},34859:{name:"SelfTimerMode",type:"Short"},37387:{name:"FlashEnergy",type:"Rational"},37388:{name:"SpatialFrequencyResponse",type:"Undefined"},37389:{name:"Noise",type:"Undefined"},37390:{name:"FocalPlaneXResolution",type:"Rational"},37391:{name:"FocalPlaneYResolution",type:"Rational"},37392:{name:"FocalPlaneResolutionUnit",type:"Short"},37393:{name:"ImageNumber",type:"Long"},37394:{name:"SecurityClassification",type:"Ascii"},37395:{name:"ImageHistory",type:"Ascii"},37397:{name:"ExposureIndex",type:"Rational"},37398:{name:"TIFFEPStandardID",type:"Byte"},37399:{name:"SensingMethod",type:"Short"},40091:{name:"XPTitle",type:"Byte"},40092:{name:"XPComment",type:"Byte"},40093:{name:"XPAuthor",type:"Byte"},40094:{name:"XPKeywords",type:"Byte"},40095:{name:"XPSubject",type:"Byte"},50341:{name:"PrintImageMatching",type:"Undefined"},50706:{name:"DNGVersion",type:"Byte"},50707:{name:"DNGBackwardVersion",type:"Byte"},50708:{name:"UniqueCameraModel",type:"Ascii"},50709:{name:"LocalizedCameraModel",type:"Byte"},50710:{name:"CFAPlaneColor",type:"Byte"},50711:{name:"CFALayout",type:"Short"},50712:{name:"LinearizationTable",type:"Short"},50713:{name:"BlackLevelRepeatDim",type:"Short"},50714:{name:"BlackLevel",type:"Rational"},50715:{name:"BlackLevelDeltaH",type:"SRational"},50716:{name:"BlackLevelDeltaV",type:"SRational"},50717:{name:"WhiteLevel",type:"Short"},50718:{name:"DefaultScale",type:"Rational"},50719:{name:"DefaultCropOrigin",type:"Short"},50720:{name:"DefaultCropSize",type:"Short"},50721:{name:"ColorMatrix1",type:"SRational"},50722:{name:"ColorMatrix2",type:"SRational"},50723:{name:"CameraCalibration1",type:"SRational"},50724:{name:"CameraCalibration2",type:"SRational"},50725:{name:"ReductionMatrix1",type:"SRational"},50726:{name:"ReductionMatrix2",type:"SRational"},50727:{name:"AnalogBalance",type:"Rational"},50728:{name:"AsShotNeutral",type:"Short"},50729:{name:"AsShotWhiteXY",type:"Rational"},50730:{name:"BaselineExposure",type:"SRational"},50731:{name:"BaselineNoise",type:"Rational"},50732:{name:"BaselineSharpness",type:"Rational"},50733:{name:"BayerGreenSplit",type:"Long"},50734:{name:"LinearResponseLimit",type:"Rational"},50735:{name:"CameraSerialNumber",type:"Ascii"},50736:{name:"LensInfo",type:"Rational"},50737:{name:"ChromaBlurRadius",type:"Rational"},50738:{name:"AntiAliasStrength",type:"Rational"},50739:{name:"ShadowScale",type:"SRational"},50740:{name:"DNGPrivateData",type:"Byte"},50741:{name:"MakerNoteSafety",type:"Short"},50778:{name:"CalibrationIlluminant1",type:"Short"},50779:{name:"CalibrationIlluminant2",type:"Short"},50780:{name:"BestQualityScale",type:"Rational"},50781:{name:"RawDataUniqueID",type:"Byte"},50827:{name:"OriginalRawFileName",type:"Byte"},50828:{name:"OriginalRawFileData",type:"Undefined"},50829:{name:"ActiveArea",type:"Short"},50830:{name:"MaskedAreas",type:"Short"},50831:{name:"AsShotICCProfile",type:"Undefined"},50832:{name:"AsShotPreProfileMatrix",type:"SRational"},50833:{name:"CurrentICCProfile",type:"Undefined"},50834:{name:"CurrentPreProfileMatrix",type:"SRational"},50879:{name:"ColorimetricReference",type:"Short"},50931:{name:"CameraCalibrationSignature",type:"Byte"},50932:{name:"ProfileCalibrationSignature",type:"Byte"},50934:{name:"AsShotProfileName",type:"Byte"},50935:{name:"NoiseReductionApplied",type:"Rational"},50936:{name:"ProfileName",type:"Byte"},50937:{name:"ProfileHueSatMapDims",type:"Long"},50938:{name:"ProfileHueSatMapData1",type:"Float"},50939:{name:"ProfileHueSatMapData2",type:"Float"},50940:{name:"ProfileToneCurve",type:"Float"},50941:{name:"ProfileEmbedPolicy",type:"Long"},50942:{name:"ProfileCopyright",type:"Byte"},50964:{name:"ForwardMatrix1",type:"SRational"},50965:{name:"ForwardMatrix2",type:"SRational"},50966:{name:"PreviewApplicationName",type:"Byte"},50967:{name:"PreviewApplicationVersion",type:"Byte"},50968:{name:"PreviewSettingsName",type:"Byte"},50969:{name:"PreviewSettingsDigest",type:"Byte"},50970:{name:"PreviewColorSpace",type:"Long"},50971:{name:"PreviewDateTime",type:"Ascii"},50972:{name:"RawImageDigest",type:"Undefined"},50973:{name:"OriginalRawFileDigest",type:"Undefined"},50974:{name:"SubTileBlockSize",type:"Long"},50975:{name:"RowInterleaveFactor",type:"Long"},50981:{name:"ProfileLookTableDims",type:"Long"},50982:{name:"ProfileLookTableData",type:"Float"},51008:{name:"OpcodeList1",type:"Undefined"},51009:{name:"OpcodeList2",type:"Undefined"},51022:{name:"OpcodeList3",type:"Undefined"}},Exif:{33434:{name:"ExposureTime",type:"Rational"},33437:{name:"FNumber",type:"Rational"},34850:{name:"ExposureProgram",type:"Short"},34852:{name:"SpectralSensitivity",type:"Ascii"},34855:{name:"ISOSpeedRatings",type:"Short"},34856:{name:"OECF",type:"Undefined"},34864:{name:"SensitivityType",type:"Short"},34865:{name:"StandardOutputSensitivity",type:"Long"},34866:{name:"RecommendedExposureIndex",type:"Long"},34867:{name:"ISOSpeed",type:"Long"},34868:{name:"ISOSpeedLatitudeyyy",type:"Long"},34869:{name:"ISOSpeedLatitudezzz",type:"Long"},36864:{name:"ExifVersion",type:"Undefined"},36867:{name:"DateTimeOriginal",type:"Ascii"},36868:{name:"DateTimeDigitized",type:"Ascii"},37121:{name:"ComponentsConfiguration",type:"Undefined"},37122:{name:"CompressedBitsPerPixel",type:"Rational"},37377:{name:"ShutterSpeedValue",type:"SRational"},37378:{name:"ApertureValue",type:"Rational"},37379:{name:"BrightnessValue",type:"SRational"},37380:{name:"ExposureBiasValue",type:"SRational"},37381:{name:"MaxApertureValue",type:"Rational"},37382:{name:"SubjectDistance",type:"Rational"},37383:{name:"MeteringMode",type:"Short"},37384:{name:"LightSource",type:"Short"},37385:{name:"Flash",type:"Short"},37386:{name:"FocalLength",type:"Rational"},37396:{name:"SubjectArea",type:"Short"},37500:{name:"MakerNote",type:"Undefined"},37510:{name:"UserComment",type:"Ascii"},37520:{name:"SubSecTime",type:"Ascii"},37521:{name:"SubSecTimeOriginal",type:"Ascii"},37522:{name:"SubSecTimeDigitized",type:"Ascii"},40960:{name:"FlashpixVersion",type:"Undefined"},40961:{name:"ColorSpace",type:"Short"},40962:{name:"PixelXDimension",type:"Long"},40963:{name:"PixelYDimension",type:"Long"},40964:{name:"RelatedSoundFile",type:"Ascii"},40965:{name:"InteroperabilityTag",type:"Long"},41483:{name:"FlashEnergy",type:"Rational"},41484:{name:"SpatialFrequencyResponse",type:"Undefined"},41486:{name:"FocalPlaneXResolution",type:"Rational"},41487:{name:"FocalPlaneYResolution",type:"Rational"},41488:{name:"FocalPlaneResolutionUnit",type:"Short"},41492:{name:"SubjectLocation",type:"Short"},41493:{name:"ExposureIndex",type:"Rational"},41495:{name:"SensingMethod",type:"Short"},41728:{name:"FileSource",type:"Undefined"},41729:{name:"SceneType",type:"Undefined"},41730:{name:"CFAPattern",type:"Undefined"},41985:{name:"CustomRendered",type:"Short"},41986:{name:"ExposureMode",type:"Short"},41987:{name:"WhiteBalance",type:"Short"},41988:{name:"DigitalZoomRatio",type:"Rational"},41989:{name:"FocalLengthIn35mmFilm",type:"Short"},41990:{name:"SceneCaptureType",type:"Short"},41991:{name:"GainControl",type:"Short"},41992:{name:"Contrast",type:"Short"},41993:{name:"Saturation",type:"Short"},41994:{name:"Sharpness",type:"Short"},41995:{name:"DeviceSettingDescription",type:"Undefined"},41996:{name:"SubjectDistanceRange",type:"Short"},42016:{name:"ImageUniqueID",type:"Ascii"},42032:{name:"CameraOwnerName",type:"Ascii"},42033:{name:"BodySerialNumber",type:"Ascii"},42034:{name:"LensSpecification",type:"Rational"},42035:{name:"LensMake",type:"Ascii"},42036:{name:"LensModel",type:"Ascii"},42037:{name:"LensSerialNumber",type:"Ascii"},42240:{name:"Gamma",type:"Rational"}},GPS:{0:{name:"GPSVersionID",type:"Byte"},1:{name:"GPSLatitudeRef",type:"Ascii"},2:{name:"GPSLatitude",type:"Rational"},3:{name:"GPSLongitudeRef",type:"Ascii"},4:{name:"GPSLongitude",type:"Rational"},5:{name:"GPSAltitudeRef",type:"Byte"},6:{name:"GPSAltitude",type:"Rational"},7:{name:"GPSTimeStamp",type:"Rational"},8:{name:"GPSSatellites",type:"Ascii"},9:{name:"GPSStatus",type:"Ascii"},10:{name:"GPSMeasureMode",type:"Ascii"},11:{name:"GPSDOP",type:"Rational"},12:{name:"GPSSpeedRef",type:"Ascii"},13:{name:"GPSSpeed",type:"Rational"},14:{name:"GPSTrackRef",type:"Ascii"},15:{name:"GPSTrack",type:"Rational"},16:{name:"GPSImgDirectionRef",type:"Ascii"},17:{name:"GPSImgDirection",type:"Rational"},18:{name:"GPSMapDatum",type:"Ascii"},19:{name:"GPSDestLatitudeRef",type:"Ascii"},20:{name:"GPSDestLatitude",type:"Rational"},21:{name:"GPSDestLongitudeRef",type:"Ascii"},22:{name:"GPSDestLongitude",type:"Rational"},23:{name:"GPSDestBearingRef",type:"Ascii"},24:{name:"GPSDestBearing",type:"Rational"},25:{name:"GPSDestDistanceRef",type:"Ascii"},26:{name:"GPSDestDistance",type:"Rational"},27:{name:"GPSProcessingMethod",type:"Undefined"},28:{name:"GPSAreaInformation",type:"Undefined"},29:{name:"GPSDateStamp",type:"Ascii"},30:{name:"GPSDifferential",type:"Short"},31:{name:"GPSHPositioningError",type:"Rational"}},Interop:{1:{name:"InteroperabilityIndex",type:"Ascii"}}};u["0th"]=u.Image,u["1st"]=u.Image,f.TAGS=u,f.ImageIFD={ProcessingSoftware:11,NewSubfileType:254,SubfileType:255,ImageWidth:256,ImageLength:257,BitsPerSample:258,Compression:259,PhotometricInterpretation:262,Threshholding:263,CellWidth:264,CellLength:265,FillOrder:266,DocumentName:269,ImageDescription:270,Make:271,Model:272,StripOffsets:273,Orientation:274,SamplesPerPixel:277,RowsPerStrip:278,StripByteCounts:279,XResolution:282,YResolution:283,PlanarConfiguration:284,GrayResponseUnit:290,GrayResponseCurve:291,T4Options:292,T6Options:293,ResolutionUnit:296,TransferFunction:301,Software:305,DateTime:306,Artist:315,HostComputer:316,Predictor:317,WhitePoint:318,PrimaryChromaticities:319,ColorMap:320,HalftoneHints:321,TileWidth:322,TileLength:323,TileOffsets:324,TileByteCounts:325,SubIFDs:330,InkSet:332,InkNames:333,NumberOfInks:334,DotRange:336,TargetPrinter:337,ExtraSamples:338,SampleFormat:339,SMinSampleValue:340,SMaxSampleValue:341,TransferRange:342,ClipPath:343,XClipPathUnits:344,YClipPathUnits:345,Indexed:346,JPEGTables:347,OPIProxy:351,JPEGProc:512,JPEGInterchangeFormat:513,JPEGInterchangeFormatLength:514,JPEGRestartInterval:515,JPEGLosslessPredictors:517,JPEGPointTransforms:518,JPEGQTables:519,JPEGDCTables:520,JPEGACTables:521,YCbCrCoefficients:529,YCbCrSubSampling:530,YCbCrPositioning:531,ReferenceBlackWhite:532,XMLPacket:700,Rating:18246,RatingPercent:18249,ImageID:32781,CFARepeatPatternDim:33421,CFAPattern:33422,BatteryLevel:33423,Copyright:33432,ExposureTime:33434,ImageResources:34377,ExifTag:34665,InterColorProfile:34675,GPSTag:34853,Interlace:34857,TimeZoneOffset:34858,SelfTimerMode:34859,FlashEnergy:37387,SpatialFrequencyResponse:37388,Noise:37389,FocalPlaneXResolution:37390,FocalPlaneYResolution:37391,FocalPlaneResolutionUnit:37392,ImageNumber:37393,SecurityClassification:37394,ImageHistory:37395,ExposureIndex:37397,TIFFEPStandardID:37398,SensingMethod:37399,XPTitle:40091,XPComment:40092,XPAuthor:40093,XPKeywords:40094,XPSubject:40095,PrintImageMatching:50341,DNGVersion:50706,DNGBackwardVersion:50707,UniqueCameraModel:50708,LocalizedCameraModel:50709,CFAPlaneColor:50710,CFALayout:50711,LinearizationTable:50712,BlackLevelRepeatDim:50713,BlackLevel:50714,BlackLevelDeltaH:50715,BlackLevelDeltaV:50716,WhiteLevel:50717,DefaultScale:50718,DefaultCropOrigin:50719,DefaultCropSize:50720,ColorMatrix1:50721,ColorMatrix2:50722,CameraCalibration1:50723,CameraCalibration2:50724,ReductionMatrix1:50725,ReductionMatrix2:50726,AnalogBalance:50727,AsShotNeutral:50728,AsShotWhiteXY:50729,BaselineExposure:50730,BaselineNoise:50731,BaselineSharpness:50732,BayerGreenSplit:50733,LinearResponseLimit:50734,CameraSerialNumber:50735,LensInfo:50736,ChromaBlurRadius:50737,AntiAliasStrength:50738,ShadowScale:50739,DNGPrivateData:50740,MakerNoteSafety:50741,CalibrationIlluminant1:50778,CalibrationIlluminant2:50779,BestQualityScale:50780,RawDataUniqueID:50781,OriginalRawFileName:50827,OriginalRawFileData:50828,ActiveArea:50829,MaskedAreas:50830,AsShotICCProfile:50831,AsShotPreProfileMatrix:50832,CurrentICCProfile:50833,CurrentPreProfileMatrix:50834,ColorimetricReference:50879,CameraCalibrationSignature:50931,ProfileCalibrationSignature:50932,AsShotProfileName:50934,NoiseReductionApplied:50935,ProfileName:50936,ProfileHueSatMapDims:50937,ProfileHueSatMapData1:50938,ProfileHueSatMapData2:50939,ProfileToneCurve:50940,ProfileEmbedPolicy:50941,ProfileCopyright:50942,ForwardMatrix1:50964,ForwardMatrix2:50965,PreviewApplicationName:50966,PreviewApplicationVersion:50967,PreviewSettingsName:50968,PreviewSettingsDigest:50969,PreviewColorSpace:50970,PreviewDateTime:50971,RawImageDigest:50972,OriginalRawFileDigest:50973,SubTileBlockSize:50974,RowInterleaveFactor:50975,ProfileLookTableDims:50981,ProfileLookTableData:50982,OpcodeList1:51008,OpcodeList2:51009,OpcodeList3:51022,NoiseProfile:51041},f.ExifIFD={ExposureTime:33434,FNumber:33437,ExposureProgram:34850,SpectralSensitivity:34852,ISOSpeedRatings:34855,OECF:34856,SensitivityType:34864,StandardOutputSensitivity:34865,RecommendedExposureIndex:34866,ISOSpeed:34867,ISOSpeedLatitudeyyy:34868,ISOSpeedLatitudezzz:34869,ExifVersion:36864,DateTimeOriginal:36867,DateTimeDigitized:36868,ComponentsConfiguration:37121,CompressedBitsPerPixel:37122,ShutterSpeedValue:37377,ApertureValue:37378,BrightnessValue:37379,ExposureBiasValue:37380,MaxApertureValue:37381,SubjectDistance:37382,MeteringMode:37383,LightSource:37384,Flash:37385,FocalLength:37386,SubjectArea:37396,MakerNote:37500,UserComment:37510,SubSecTime:37520,SubSecTimeOriginal:37521,SubSecTimeDigitized:37522,FlashpixVersion:40960,ColorSpace:40961,PixelXDimension:40962,PixelYDimension:40963,RelatedSoundFile:40964,InteroperabilityTag:40965,FlashEnergy:41483,SpatialFrequencyResponse:41484,FocalPlaneXResolution:41486,FocalPlaneYResolution:41487,FocalPlaneResolutionUnit:41488,SubjectLocation:41492,ExposureIndex:41493,SensingMethod:41495,FileSource:41728,SceneType:41729,CFAPattern:41730,CustomRendered:41985,ExposureMode:41986,WhiteBalance:41987,DigitalZoomRatio:41988,FocalLengthIn35mmFilm:41989,SceneCaptureType:41990,GainControl:41991,Contrast:41992,Saturation:41993,Sharpness:41994,DeviceSettingDescription:41995,SubjectDistanceRange:41996,ImageUniqueID:42016,CameraOwnerName:42032,BodySerialNumber:42033,LensSpecification:42034,LensMake:42035,LensModel:42036,LensSerialNumber:42037,Gamma:42240},f.GPSIFD={GPSVersionID:0,GPSLatitudeRef:1,GPSLatitude:2,GPSLongitudeRef:3,GPSLongitude:4,GPSAltitudeRef:5,GPSAltitude:6,GPSTimeStamp:7,GPSSatellites:8,GPSStatus:9,GPSMeasureMode:10,GPSDOP:11,GPSSpeedRef:12,GPSSpeed:13,GPSTrackRef:14,GPSTrack:15,GPSImgDirectionRef:16,GPSImgDirection:17,GPSMapDatum:18,GPSDestLatitudeRef:19,GPSDestLatitude:20,GPSDestLongitudeRef:21,GPSDestLongitude:22,GPSDestBearingRef:23,GPSDestBearing:24,GPSDestDistanceRef:25,GPSDestDistance:26,GPSProcessingMethod:27,GPSAreaInformation:28,GPSDateStamp:29,GPSDifferential:30,GPSHPositioningError:31},f.InteropIFD={InteroperabilityIndex:1},f.GPSHelper={degToDmsRational:function(e){var t=e%1*60,a=t%1*60,i=Math.floor(e),n=Math.floor(t),r=Math.round(100*a);return[[i,1],[n,1],[r,100]]}},"undefined"!=typeof exports?("undefined"!=typeof module&&module.exports&&(exports=module.exports=f),exports.piexif=f):window.piexif=f}(); \ No newline at end of file
diff --git a/src/main/resources/assets/js/popper.min.js b/src/main/resources/assets/js/popper.min.js
new file mode 100644
index 0000000..311d391
--- /dev/null
+++ b/src/main/resources/assets/js/popper.min.js
@@ -0,0 +1,4 @@
+/*
+ Copyright (C) Federico Zivolo 2017
+ Distributed under the MIT License (license terms are at http://opensource.org/licenses/MIT).
+ */(function(e,t){'object'==typeof exports&&'undefined'!=typeof module?module.exports=t():'function'==typeof define&&define.amd?define(t):e.Popper=t()})(this,function(){'use strict';function e(e){return e&&'[object Function]'==={}.toString.call(e)}function t(e,t){if(1!==e.nodeType)return[];var o=getComputedStyle(e,null);return t?o[t]:o}function o(e){return'HTML'===e.nodeName?e:e.parentNode||e.host}function n(e){if(!e)return document.body;switch(e.nodeName){case'HTML':case'BODY':return e.ownerDocument.body;case'#document':return e.body;}var i=t(e),r=i.overflow,p=i.overflowX,s=i.overflowY;return /(auto|scroll)/.test(r+s+p)?e:n(o(e))}function r(e){var o=e&&e.offsetParent,i=o&&o.nodeName;return i&&'BODY'!==i&&'HTML'!==i?-1!==['TD','TABLE'].indexOf(o.nodeName)&&'static'===t(o,'position')?r(o):o:e?e.ownerDocument.documentElement:document.documentElement}function p(e){var t=e.nodeName;return'BODY'!==t&&('HTML'===t||r(e.firstElementChild)===e)}function s(e){return null===e.parentNode?e:s(e.parentNode)}function d(e,t){if(!e||!e.nodeType||!t||!t.nodeType)return document.documentElement;var o=e.compareDocumentPosition(t)&Node.DOCUMENT_POSITION_FOLLOWING,i=o?e:t,n=o?t:e,a=document.createRange();a.setStart(i,0),a.setEnd(n,0);var l=a.commonAncestorContainer;if(e!==l&&t!==l||i.contains(n))return p(l)?l:r(l);var f=s(e);return f.host?d(f.host,t):d(e,s(t).host)}function a(e){var t=1<arguments.length&&void 0!==arguments[1]?arguments[1]:'top',o='top'===t?'scrollTop':'scrollLeft',i=e.nodeName;if('BODY'===i||'HTML'===i){var n=e.ownerDocument.documentElement,r=e.ownerDocument.scrollingElement||n;return r[o]}return e[o]}function l(e,t){var o=2<arguments.length&&void 0!==arguments[2]&&arguments[2],i=a(t,'top'),n=a(t,'left'),r=o?-1:1;return e.top+=i*r,e.bottom+=i*r,e.left+=n*r,e.right+=n*r,e}function f(e,t){var o='x'===t?'Left':'Top',i='Left'==o?'Right':'Bottom';return parseFloat(e['border'+o+'Width'],10)+parseFloat(e['border'+i+'Width'],10)}function m(e,t,o,i){return J(t['offset'+e],t['scroll'+e],o['client'+e],o['offset'+e],o['scroll'+e],ie()?o['offset'+e]+i['margin'+('Height'===e?'Top':'Left')]+i['margin'+('Height'===e?'Bottom':'Right')]:0)}function h(){var e=document.body,t=document.documentElement,o=ie()&&getComputedStyle(t);return{height:m('Height',e,t,o),width:m('Width',e,t,o)}}function c(e){return se({},e,{right:e.left+e.width,bottom:e.top+e.height})}function g(e){var o={};if(ie())try{o=e.getBoundingClientRect();var i=a(e,'top'),n=a(e,'left');o.top+=i,o.left+=n,o.bottom+=i,o.right+=n}catch(e){}else o=e.getBoundingClientRect();var r={left:o.left,top:o.top,width:o.right-o.left,height:o.bottom-o.top},p='HTML'===e.nodeName?h():{},s=p.width||e.clientWidth||r.right-r.left,d=p.height||e.clientHeight||r.bottom-r.top,l=e.offsetWidth-s,m=e.offsetHeight-d;if(l||m){var g=t(e);l-=f(g,'x'),m-=f(g,'y'),r.width-=l,r.height-=m}return c(r)}function u(e,o){var i=ie(),r='HTML'===o.nodeName,p=g(e),s=g(o),d=n(e),a=t(o),f=parseFloat(a.borderTopWidth,10),m=parseFloat(a.borderLeftWidth,10),h=c({top:p.top-s.top-f,left:p.left-s.left-m,width:p.width,height:p.height});if(h.marginTop=0,h.marginLeft=0,!i&&r){var u=parseFloat(a.marginTop,10),b=parseFloat(a.marginLeft,10);h.top-=f-u,h.bottom-=f-u,h.left-=m-b,h.right-=m-b,h.marginTop=u,h.marginLeft=b}return(i?o.contains(d):o===d&&'BODY'!==d.nodeName)&&(h=l(h,o)),h}function b(e){var t=e.ownerDocument.documentElement,o=u(e,t),i=J(t.clientWidth,window.innerWidth||0),n=J(t.clientHeight,window.innerHeight||0),r=a(t),p=a(t,'left'),s={top:r-o.top+o.marginTop,left:p-o.left+o.marginLeft,width:i,height:n};return c(s)}function w(e){var i=e.nodeName;return'BODY'===i||'HTML'===i?!1:'fixed'===t(e,'position')||w(o(e))}function y(e,t,i,r){var p={top:0,left:0},s=d(e,t);if('viewport'===r)p=b(s);else{var a;'scrollParent'===r?(a=n(o(t)),'BODY'===a.nodeName&&(a=e.ownerDocument.documentElement)):'window'===r?a=e.ownerDocument.documentElement:a=r;var l=u(a,s);if('HTML'===a.nodeName&&!w(s)){var f=h(),m=f.height,c=f.width;p.top+=l.top-l.marginTop,p.bottom=m+l.top,p.left+=l.left-l.marginLeft,p.right=c+l.left}else p=l}return p.left+=i,p.top+=i,p.right-=i,p.bottom-=i,p}function E(e){var t=e.width,o=e.height;return t*o}function v(e,t,o,i,n){var r=5<arguments.length&&void 0!==arguments[5]?arguments[5]:0;if(-1===e.indexOf('auto'))return e;var p=y(o,i,r,n),s={top:{width:p.width,height:t.top-p.top},right:{width:p.right-t.right,height:p.height},bottom:{width:p.width,height:p.bottom-t.bottom},left:{width:t.left-p.left,height:p.height}},d=Object.keys(s).map(function(e){return se({key:e},s[e],{area:E(s[e])})}).sort(function(e,t){return t.area-e.area}),a=d.filter(function(e){var t=e.width,i=e.height;return t>=o.clientWidth&&i>=o.clientHeight}),l=0<a.length?a[0].key:d[0].key,f=e.split('-')[1];return l+(f?'-'+f:'')}function O(e,t,o){var i=d(t,o);return u(o,i)}function L(e){var t=getComputedStyle(e),o=parseFloat(t.marginTop)+parseFloat(t.marginBottom),i=parseFloat(t.marginLeft)+parseFloat(t.marginRight),n={width:e.offsetWidth+i,height:e.offsetHeight+o};return n}function x(e){var t={left:'right',right:'left',bottom:'top',top:'bottom'};return e.replace(/left|right|bottom|top/g,function(e){return t[e]})}function S(e,t,o){o=o.split('-')[0];var i=L(e),n={width:i.width,height:i.height},r=-1!==['right','left'].indexOf(o),p=r?'top':'left',s=r?'left':'top',d=r?'height':'width',a=r?'width':'height';return n[p]=t[p]+t[d]/2-i[d]/2,n[s]=o===s?t[s]-i[a]:t[x(s)],n}function T(e,t){return Array.prototype.find?e.find(t):e.filter(t)[0]}function D(e,t,o){if(Array.prototype.findIndex)return e.findIndex(function(e){return e[t]===o});var i=T(e,function(e){return e[t]===o});return e.indexOf(i)}function C(t,o,i){var n=void 0===i?t:t.slice(0,D(t,'name',i));return n.forEach(function(t){t['function']&&console.warn('`modifier.function` is deprecated, use `modifier.fn`!');var i=t['function']||t.fn;t.enabled&&e(i)&&(o.offsets.popper=c(o.offsets.popper),o.offsets.reference=c(o.offsets.reference),o=i(o,t))}),o}function N(){if(!this.state.isDestroyed){var e={instance:this,styles:{},arrowStyles:{},attributes:{},flipped:!1,offsets:{}};e.offsets.reference=O(this.state,this.popper,this.reference),e.placement=v(this.options.placement,e.offsets.reference,this.popper,this.reference,this.options.modifiers.flip.boundariesElement,this.options.modifiers.flip.padding),e.originalPlacement=e.placement,e.offsets.popper=S(this.popper,e.offsets.reference,e.placement),e.offsets.popper.position='absolute',e=C(this.modifiers,e),this.state.isCreated?this.options.onUpdate(e):(this.state.isCreated=!0,this.options.onCreate(e))}}function k(e,t){return e.some(function(e){var o=e.name,i=e.enabled;return i&&o===t})}function W(e){for(var t=[!1,'ms','Webkit','Moz','O'],o=e.charAt(0).toUpperCase()+e.slice(1),n=0;n<t.length-1;n++){var i=t[n],r=i?''+i+o:e;if('undefined'!=typeof document.body.style[r])return r}return null}function P(){return this.state.isDestroyed=!0,k(this.modifiers,'applyStyle')&&(this.popper.removeAttribute('x-placement'),this.popper.style.left='',this.popper.style.position='',this.popper.style.top='',this.popper.style[W('transform')]=''),this.disableEventListeners(),this.options.removeOnDestroy&&this.popper.parentNode.removeChild(this.popper),this}function B(e){var t=e.ownerDocument;return t?t.defaultView:window}function H(e,t,o,i){var r='BODY'===e.nodeName,p=r?e.ownerDocument.defaultView:e;p.addEventListener(t,o,{passive:!0}),r||H(n(p.parentNode),t,o,i),i.push(p)}function A(e,t,o,i){o.updateBound=i,B(e).addEventListener('resize',o.updateBound,{passive:!0});var r=n(e);return H(r,'scroll',o.updateBound,o.scrollParents),o.scrollElement=r,o.eventsEnabled=!0,o}function I(){this.state.eventsEnabled||(this.state=A(this.reference,this.options,this.state,this.scheduleUpdate))}function M(e,t){return B(e).removeEventListener('resize',t.updateBound),t.scrollParents.forEach(function(e){e.removeEventListener('scroll',t.updateBound)}),t.updateBound=null,t.scrollParents=[],t.scrollElement=null,t.eventsEnabled=!1,t}function R(){this.state.eventsEnabled&&(cancelAnimationFrame(this.scheduleUpdate),this.state=M(this.reference,this.state))}function U(e){return''!==e&&!isNaN(parseFloat(e))&&isFinite(e)}function Y(e,t){Object.keys(t).forEach(function(o){var i='';-1!==['width','height','top','right','bottom','left'].indexOf(o)&&U(t[o])&&(i='px'),e.style[o]=t[o]+i})}function j(e,t){Object.keys(t).forEach(function(o){var i=t[o];!1===i?e.removeAttribute(o):e.setAttribute(o,t[o])})}function F(e,t,o){var i=T(e,function(e){var o=e.name;return o===t}),n=!!i&&e.some(function(e){return e.name===o&&e.enabled&&e.order<i.order});if(!n){var r='`'+t+'`';console.warn('`'+o+'`'+' modifier is required by '+r+' modifier in order to work, be sure to include it before '+r+'!')}return n}function K(e){return'end'===e?'start':'start'===e?'end':e}function q(e){var t=1<arguments.length&&void 0!==arguments[1]&&arguments[1],o=ae.indexOf(e),i=ae.slice(o+1).concat(ae.slice(0,o));return t?i.reverse():i}function V(e,t,o,i){var n=e.match(/((?:\-|\+)?\d*\.?\d*)(.*)/),r=+n[1],p=n[2];if(!r)return e;if(0===p.indexOf('%')){var s;switch(p){case'%p':s=o;break;case'%':case'%r':default:s=i;}var d=c(s);return d[t]/100*r}if('vh'===p||'vw'===p){var a;return a='vh'===p?J(document.documentElement.clientHeight,window.innerHeight||0):J(document.documentElement.clientWidth,window.innerWidth||0),a/100*r}return r}function z(e,t,o,i){var n=[0,0],r=-1!==['right','left'].indexOf(i),p=e.split(/(\+|\-)/).map(function(e){return e.trim()}),s=p.indexOf(T(p,function(e){return-1!==e.search(/,|\s/)}));p[s]&&-1===p[s].indexOf(',')&&console.warn('Offsets separated by white space(s) are deprecated, use a comma (,) instead.');var d=/\s*,\s*|\s+/,a=-1===s?[p]:[p.slice(0,s).concat([p[s].split(d)[0]]),[p[s].split(d)[1]].concat(p.slice(s+1))];return a=a.map(function(e,i){var n=(1===i?!r:r)?'height':'width',p=!1;return e.reduce(function(e,t){return''===e[e.length-1]&&-1!==['+','-'].indexOf(t)?(e[e.length-1]=t,p=!0,e):p?(e[e.length-1]+=t,p=!1,e):e.concat(t)},[]).map(function(e){return V(e,n,t,o)})}),a.forEach(function(e,t){e.forEach(function(o,i){U(o)&&(n[t]+=o*('-'===e[i-1]?-1:1))})}),n}function G(e,t){var o,i=t.offset,n=e.placement,r=e.offsets,p=r.popper,s=r.reference,d=n.split('-')[0];return o=U(+i)?[+i,0]:z(i,p,s,d),'left'===d?(p.top+=o[0],p.left-=o[1]):'right'===d?(p.top+=o[0],p.left+=o[1]):'top'===d?(p.left+=o[0],p.top-=o[1]):'bottom'===d&&(p.left+=o[0],p.top+=o[1]),e.popper=p,e}for(var _=Math.min,X=Math.floor,J=Math.max,Q='undefined'!=typeof window&&'undefined'!=typeof document,Z=['Edge','Trident','Firefox'],$=0,ee=0;ee<Z.length;ee+=1)if(Q&&0<=navigator.userAgent.indexOf(Z[ee])){$=1;break}var i,te=Q&&window.Promise,oe=te?function(e){var t=!1;return function(){t||(t=!0,window.Promise.resolve().then(function(){t=!1,e()}))}}:function(e){var t=!1;return function(){t||(t=!0,setTimeout(function(){t=!1,e()},$))}},ie=function(){return void 0==i&&(i=-1!==navigator.appVersion.indexOf('MSIE 10')),i},ne=function(e,t){if(!(e instanceof t))throw new TypeError('Cannot call a class as a function')},re=function(){function e(e,t){for(var o,n=0;n<t.length;n++)o=t[n],o.enumerable=o.enumerable||!1,o.configurable=!0,'value'in o&&(o.writable=!0),Object.defineProperty(e,o.key,o)}return function(t,o,i){return o&&e(t.prototype,o),i&&e(t,i),t}}(),pe=function(e,t,o){return t in e?Object.defineProperty(e,t,{value:o,enumerable:!0,configurable:!0,writable:!0}):e[t]=o,e},se=Object.assign||function(e){for(var t,o=1;o<arguments.length;o++)for(var i in t=arguments[o],t)Object.prototype.hasOwnProperty.call(t,i)&&(e[i]=t[i]);return e},de=['auto-start','auto','auto-end','top-start','top','top-end','right-start','right','right-end','bottom-end','bottom','bottom-start','left-end','left','left-start'],ae=de.slice(3),le={FLIP:'flip',CLOCKWISE:'clockwise',COUNTERCLOCKWISE:'counterclockwise'},fe=function(){function t(o,i){var n=this,r=2<arguments.length&&void 0!==arguments[2]?arguments[2]:{};ne(this,t),this.scheduleUpdate=function(){return requestAnimationFrame(n.update)},this.update=oe(this.update.bind(this)),this.options=se({},t.Defaults,r),this.state={isDestroyed:!1,isCreated:!1,scrollParents:[]},this.reference=o&&o.jquery?o[0]:o,this.popper=i&&i.jquery?i[0]:i,this.options.modifiers={},Object.keys(se({},t.Defaults.modifiers,r.modifiers)).forEach(function(e){n.options.modifiers[e]=se({},t.Defaults.modifiers[e]||{},r.modifiers?r.modifiers[e]:{})}),this.modifiers=Object.keys(this.options.modifiers).map(function(e){return se({name:e},n.options.modifiers[e])}).sort(function(e,t){return e.order-t.order}),this.modifiers.forEach(function(t){t.enabled&&e(t.onLoad)&&t.onLoad(n.reference,n.popper,n.options,t,n.state)}),this.update();var p=this.options.eventsEnabled;p&&this.enableEventListeners(),this.state.eventsEnabled=p}return re(t,[{key:'update',value:function(){return N.call(this)}},{key:'destroy',value:function(){return P.call(this)}},{key:'enableEventListeners',value:function(){return I.call(this)}},{key:'disableEventListeners',value:function(){return R.call(this)}}]),t}();return fe.Utils=('undefined'==typeof window?global:window).PopperUtils,fe.placements=de,fe.Defaults={placement:'bottom',eventsEnabled:!0,removeOnDestroy:!1,onCreate:function(){},onUpdate:function(){},modifiers:{shift:{order:100,enabled:!0,fn:function(e){var t=e.placement,o=t.split('-')[0],i=t.split('-')[1];if(i){var n=e.offsets,r=n.reference,p=n.popper,s=-1!==['bottom','top'].indexOf(o),d=s?'left':'top',a=s?'width':'height',l={start:pe({},d,r[d]),end:pe({},d,r[d]+r[a]-p[a])};e.offsets.popper=se({},p,l[i])}return e}},offset:{order:200,enabled:!0,fn:G,offset:0},preventOverflow:{order:300,enabled:!0,fn:function(e,t){var o=t.boundariesElement||r(e.instance.popper);e.instance.reference===o&&(o=r(o));var i=y(e.instance.popper,e.instance.reference,t.padding,o);t.boundaries=i;var n=t.priority,p=e.offsets.popper,s={primary:function(e){var o=p[e];return p[e]<i[e]&&!t.escapeWithReference&&(o=J(p[e],i[e])),pe({},e,o)},secondary:function(e){var o='right'===e?'left':'top',n=p[o];return p[e]>i[e]&&!t.escapeWithReference&&(n=_(p[o],i[e]-('right'===e?p.width:p.height))),pe({},o,n)}};return n.forEach(function(e){var t=-1===['left','top'].indexOf(e)?'secondary':'primary';p=se({},p,s[t](e))}),e.offsets.popper=p,e},priority:['left','right','top','bottom'],padding:5,boundariesElement:'scrollParent'},keepTogether:{order:400,enabled:!0,fn:function(e){var t=e.offsets,o=t.popper,i=t.reference,n=e.placement.split('-')[0],r=X,p=-1!==['top','bottom'].indexOf(n),s=p?'right':'bottom',d=p?'left':'top',a=p?'width':'height';return o[s]<r(i[d])&&(e.offsets.popper[d]=r(i[d])-o[a]),o[d]>r(i[s])&&(e.offsets.popper[d]=r(i[s])),e}},arrow:{order:500,enabled:!0,fn:function(e,o){var i;if(!F(e.instance.modifiers,'arrow','keepTogether'))return e;var n=o.element;if('string'==typeof n){if(n=e.instance.popper.querySelector(n),!n)return e;}else if(!e.instance.popper.contains(n))return console.warn('WARNING: `arrow.element` must be child of its popper element!'),e;var r=e.placement.split('-')[0],p=e.offsets,s=p.popper,d=p.reference,a=-1!==['left','right'].indexOf(r),l=a?'height':'width',f=a?'Top':'Left',m=f.toLowerCase(),h=a?'left':'top',g=a?'bottom':'right',u=L(n)[l];d[g]-u<s[m]&&(e.offsets.popper[m]-=s[m]-(d[g]-u)),d[m]+u>s[g]&&(e.offsets.popper[m]+=d[m]+u-s[g]),e.offsets.popper=c(e.offsets.popper);var b=d[m]+d[l]/2-u/2,w=t(e.instance.popper),y=parseFloat(w['margin'+f],10),E=parseFloat(w['border'+f+'Width'],10),v=b-e.offsets.popper[m]-y-E;return v=J(_(s[l]-u,v),0),e.arrowElement=n,e.offsets.arrow=(i={},pe(i,m,Math.round(v)),pe(i,h,''),i),e},element:'[x-arrow]'},flip:{order:600,enabled:!0,fn:function(e,t){if(k(e.instance.modifiers,'inner'))return e;if(e.flipped&&e.placement===e.originalPlacement)return e;var o=y(e.instance.popper,e.instance.reference,t.padding,t.boundariesElement),i=e.placement.split('-')[0],n=x(i),r=e.placement.split('-')[1]||'',p=[];switch(t.behavior){case le.FLIP:p=[i,n];break;case le.CLOCKWISE:p=q(i);break;case le.COUNTERCLOCKWISE:p=q(i,!0);break;default:p=t.behavior;}return p.forEach(function(s,d){if(i!==s||p.length===d+1)return e;i=e.placement.split('-')[0],n=x(i);var a=e.offsets.popper,l=e.offsets.reference,f=X,m='left'===i&&f(a.right)>f(l.left)||'right'===i&&f(a.left)<f(l.right)||'top'===i&&f(a.bottom)>f(l.top)||'bottom'===i&&f(a.top)<f(l.bottom),h=f(a.left)<f(o.left),c=f(a.right)>f(o.right),g=f(a.top)<f(o.top),u=f(a.bottom)>f(o.bottom),b='left'===i&&h||'right'===i&&c||'top'===i&&g||'bottom'===i&&u,w=-1!==['top','bottom'].indexOf(i),y=!!t.flipVariations&&(w&&'start'===r&&h||w&&'end'===r&&c||!w&&'start'===r&&g||!w&&'end'===r&&u);(m||b||y)&&(e.flipped=!0,(m||b)&&(i=p[d+1]),y&&(r=K(r)),e.placement=i+(r?'-'+r:''),e.offsets.popper=se({},e.offsets.popper,S(e.instance.popper,e.offsets.reference,e.placement)),e=C(e.instance.modifiers,e,'flip'))}),e},behavior:'flip',padding:5,boundariesElement:'viewport'},inner:{order:700,enabled:!1,fn:function(e){var t=e.placement,o=t.split('-')[0],i=e.offsets,n=i.popper,r=i.reference,p=-1!==['left','right'].indexOf(o),s=-1===['top','left'].indexOf(o);return n[p?'left':'top']=r[o]-(s?n[p?'width':'height']:0),e.placement=x(t),e.offsets.popper=c(n),e}},hide:{order:800,enabled:!0,fn:function(e){if(!F(e.instance.modifiers,'hide','preventOverflow'))return e;var t=e.offsets.reference,o=T(e.instance.modifiers,function(e){return'preventOverflow'===e.name}).boundaries;if(t.bottom<o.top||t.left>o.right||t.top>o.bottom||t.right<o.left){if(!0===e.hide)return e;e.hide=!0,e.attributes['x-out-of-boundaries']=''}else{if(!1===e.hide)return e;e.hide=!1,e.attributes['x-out-of-boundaries']=!1}return e}},computeStyle:{order:850,enabled:!0,fn:function(e,t){var o=t.x,i=t.y,n=e.offsets.popper,p=T(e.instance.modifiers,function(e){return'applyStyle'===e.name}).gpuAcceleration;void 0!==p&&console.warn('WARNING: `gpuAcceleration` option moved to `computeStyle` modifier and will not be supported in future versions of Popper.js!');var s,d,a=void 0===p?t.gpuAcceleration:p,l=r(e.instance.popper),f=g(l),m={position:n.position},h={left:X(n.left),top:X(n.top),bottom:X(n.bottom),right:X(n.right)},c='bottom'===o?'top':'bottom',u='right'===i?'left':'right',b=W('transform');if(d='bottom'==c?-f.height+h.bottom:h.top,s='right'==u?-f.width+h.right:h.left,a&&b)m[b]='translate3d('+s+'px, '+d+'px, 0)',m[c]=0,m[u]=0,m.willChange='transform';else{var w='bottom'==c?-1:1,y='right'==u?-1:1;m[c]=d*w,m[u]=s*y,m.willChange=c+', '+u}var E={"x-placement":e.placement};return e.attributes=se({},E,e.attributes),e.styles=se({},m,e.styles),e.arrowStyles=se({},e.offsets.arrow,e.arrowStyles),e},gpuAcceleration:!0,x:'bottom',y:'right'},applyStyle:{order:900,enabled:!0,fn:function(e){return Y(e.instance.popper,e.styles),j(e.instance.popper,e.attributes),e.arrowElement&&Object.keys(e.arrowStyles).length&&Y(e.arrowElement,e.arrowStyles),e},onLoad:function(e,t,o,i,n){var r=O(n,t,e),p=v(o.placement,r,t,e,o.modifiers.flip.boundariesElement,o.modifiers.flip.padding);return t.setAttribute('x-placement',p),Y(t,{position:'absolute'}),o},gpuAcceleration:void 0}}},fe});
diff --git a/src/main/resources/assets/js/purify.min.js b/src/main/resources/assets/js/purify.min.js
new file mode 100644
index 0000000..c782f14
--- /dev/null
+++ b/src/main/resources/assets/js/purify.min.js
@@ -0,0 +1 @@
+(function(e){"use strict";var t=typeof window==="undefined"?null:window;if(typeof define==="function"&&define.amd){define(function(){return e(t)})}else if(typeof module!=="undefined"){module.exports=e(t)}else{t.DOMPurify=e(t)}})(function e(t){"use strict";var r=function(t){return e(t)};r.version="0.7.4";if(!t||!t.document||t.document.nodeType!==9){r.isSupported=false;return r}var n=t.document;var a=n;var i=t.DocumentFragment;var o=t.HTMLTemplateElement;var l=t.NodeFilter;var s=t.NamedNodeMap||t.MozNamedAttrMap;var f=t.Text;var c=t.Comment;var u=t.DOMParser;if(typeof o==="function"){var d=n.createElement("template");if(d.content&&d.content.ownerDocument){n=d.content.ownerDocument}}var m=n.implementation;var p=n.createNodeIterator;var h=n.getElementsByTagName;var v=n.createDocumentFragment;var g=a.importNode;var y={};r.isSupported=typeof m.createHTMLDocument!=="undefined"&&n.documentMode!==9;var b=function(e,t){var r=t.length;while(r--){if(typeof t[r]==="string"){t[r]=t[r].toLowerCase()}e[t[r]]=true}return e};var T=function(e){var t={};var r;for(r in e){if(e.hasOwnProperty(r)){t[r]=e[r]}}return t};var x=null;var k=b({},["a","abbr","acronym","address","area","article","aside","audio","b","bdi","bdo","big","blink","blockquote","body","br","button","canvas","caption","center","cite","code","col","colgroup","content","data","datalist","dd","decorator","del","details","dfn","dir","div","dl","dt","element","em","fieldset","figcaption","figure","font","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","img","input","ins","kbd","label","legend","li","main","map","mark","marquee","menu","menuitem","meter","nav","nobr","ol","optgroup","option","output","p","pre","progress","q","rp","rt","ruby","s","samp","section","select","shadow","small","source","spacer","span","strike","strong","style","sub","summary","sup","table","tbody","td","template","textarea","tfoot","th","thead","time","tr","track","tt","u","ul","var","video","wbr","svg","altglyph","altglyphdef","altglyphitem","animatecolor","animatemotion","animatetransform","circle","clippath","defs","desc","ellipse","filter","font","g","glyph","glyphref","hkern","image","line","lineargradient","marker","mask","metadata","mpath","path","pattern","polygon","polyline","radialgradient","rect","stop","switch","symbol","text","textpath","title","tref","tspan","view","vkern","feBlend","feColorMatrix","feComponentTransfer","feComposite","feConvolveMatrix","feDiffuseLighting","feDisplacementMap","feFlood","feFuncA","feFuncB","feFuncG","feFuncR","feGaussianBlur","feMerge","feMergeNode","feMorphology","feOffset","feSpecularLighting","feTile","feTurbulence","math","menclose","merror","mfenced","mfrac","mglyph","mi","mlabeledtr","mmuliscripts","mn","mo","mover","mpadded","mphantom","mroot","mrow","ms","mpspace","msqrt","mystyle","msub","msup","msubsup","mtable","mtd","mtext","mtr","munder","munderover","#text"]);var A=null;var w=b({},["accept","action","align","alt","autocomplete","background","bgcolor","border","cellpadding","cellspacing","checked","cite","class","clear","color","cols","colspan","coords","datetime","default","dir","disabled","download","enctype","face","for","headers","height","hidden","high","href","hreflang","id","ismap","label","lang","list","loop","low","max","maxlength","media","method","min","multiple","name","noshade","novalidate","nowrap","open","optimum","pattern","placeholder","poster","preload","pubdate","radiogroup","readonly","rel","required","rev","reversed","rows","rowspan","spellcheck","scope","selected","shape","size","span","srclang","start","src","step","style","summary","tabindex","title","type","usemap","valign","value","width","xmlns","accent-height","accumulate","additivive","alignment-baseline","ascent","attributename","attributetype","azimuth","basefrequency","baseline-shift","begin","bias","by","clip","clip-path","clip-rule","color","color-interpolation","color-interpolation-filters","color-profile","color-rendering","cx","cy","d","dx","dy","diffuseconstant","direction","display","divisor","dur","edgemode","elevation","end","fill","fill-opacity","fill-rule","filter","flood-color","flood-opacity","font-family","font-size","font-size-adjust","font-stretch","font-style","font-variant","font-weight","fx","fy","g1","g2","glyph-name","glyphref","gradientunits","gradienttransform","image-rendering","in","in2","k","k1","k2","k3","k4","kerning","keypoints","keysplines","keytimes","lengthadjust","letter-spacing","kernelmatrix","kernelunitlength","lighting-color","local","marker-end","marker-mid","marker-start","markerheight","markerunits","markerwidth","maskcontentunits","maskunits","max","mask","mode","min","numoctaves","offset","operator","opacity","order","orient","orientation","origin","overflow","paint-order","path","pathlength","patterncontentunits","patterntransform","patternunits","points","preservealpha","r","rx","ry","radius","refx","refy","repeatcount","repeatdur","restart","result","rotate","scale","seed","shape-rendering","specularconstant","specularexponent","spreadmethod","stddeviation","stitchtiles","stop-color","stop-opacity","stroke-dasharray","stroke-dashoffset","stroke-linecap","stroke-linejoin","stroke-miterlimit","stroke-opacity","stroke","stroke-width","surfacescale","targetx","targety","transform","text-anchor","text-decoration","text-rendering","textlength","u1","u2","unicode","values","viewbox","visibility","vert-adv-y","vert-origin-x","vert-origin-y","word-spacing","wrap","writing-mode","xchannelselector","ychannelselector","x","x1","x2","y","y1","y2","z","zoomandpan","accent","accentunder","bevelled","close","columnsalign","columnlines","columnspan","denomalign","depth","display","displaystyle","fence","frame","largeop","length","linethickness","lspace","lquote","mathbackground","mathcolor","mathsize","mathvariant","maxsize","minsize","movablelimits","notation","numalign","open","rowalign","rowlines","rowspacing","rowspan","rspace","rquote","scriptlevel","scriptminsize","scriptsizemultiplier","selection","separator","separators","stretchy","subscriptshift","supscriptshift","symmetric","voffset","xlink:href","xml:id","xlink:title","xml:space","xmlns:xlink"]);var E=null;var S=null;var M=true;var O=false;var L=false;var D=false;var N=/\{\{[\s\S]*|[\s\S]*\}\}/gm;var _=/<%[\s\S]*|[\s\S]*%>/gm;var C=false;var z=false;var R=false;var F=false;var H=true;var B=true;var W=b({},["audio","head","math","script","style","svg","video"]);var j=b({},["audio","video","img","source"]);var G=b({},["alt","class","for","id","label","name","pattern","placeholder","summary","title","value","style","xmlns"]);var I=null;var q=n.createElement("form");var P=function(e){if(typeof e!=="object"){e={}}x="ALLOWED_TAGS"in e?b({},e.ALLOWED_TAGS):k;A="ALLOWED_ATTR"in e?b({},e.ALLOWED_ATTR):w;E="FORBID_TAGS"in e?b({},e.FORBID_TAGS):{};S="FORBID_ATTR"in e?b({},e.FORBID_ATTR):{};M=e.ALLOW_DATA_ATTR!==false;O=e.ALLOW_UNKNOWN_PROTOCOLS||false;L=e.SAFE_FOR_JQUERY||false;D=e.SAFE_FOR_TEMPLATES||false;C=e.WHOLE_DOCUMENT||false;z=e.RETURN_DOM||false;R=e.RETURN_DOM_FRAGMENT||false;F=e.RETURN_DOM_IMPORT||false;H=e.SANITIZE_DOM!==false;B=e.KEEP_CONTENT!==false;if(D){M=false}if(R){z=true}if(e.ADD_TAGS){if(x===k){x=T(x)}b(x,e.ADD_TAGS)}if(e.ADD_ATTR){if(A===w){A=T(A)}b(A,e.ADD_ATTR)}if(B){x["#text"]=true}if(Object&&"freeze"in Object){Object.freeze(e)}I=e};var U=function(e){try{e.parentNode.removeChild(e)}catch(t){e.outerHTML=""}};var V=function(e){var t,r;try{t=(new u).parseFromString(e,"text/html")}catch(n){}if(!t){t=m.createHTMLDocument("");r=t.body;r.parentNode.removeChild(r.parentNode.firstElementChild);r.outerHTML=e}if(typeof t.getElementsByTagName==="function"){return t.getElementsByTagName(C?"html":"body")[0]}return h.call(t,C?"html":"body")[0]};var K=function(e){return p.call(e.ownerDocument||e,e,l.SHOW_ELEMENT|l.SHOW_COMMENT|l.SHOW_TEXT,function(){return l.FILTER_ACCEPT},false)};var J=function(e){if(e instanceof f||e instanceof c){return false}if(typeof e.nodeName!=="string"||typeof e.textContent!=="string"||typeof e.removeChild!=="function"||!(e.attributes instanceof s)||typeof e.removeAttribute!=="function"||typeof e.setAttribute!=="function"){return true}return false};var Q=function(e){var t,r;re("beforeSanitizeElements",e,null);if(J(e)){U(e);return true}t=e.nodeName.toLowerCase();re("uponSanitizeElement",e,{tagName:t});if(!x[t]||E[t]){if(B&&!W[t]&&typeof e.insertAdjacentHTML==="function"){try{e.insertAdjacentHTML("AfterEnd",e.innerHTML)}catch(n){}}U(e);return true}if(L&&!e.firstElementChild&&(!e.content||!e.content.firstElementChild)){e.innerHTML=e.textContent.replace(/</g,"&lt;")}if(D&&e.nodeType===3){r=e.textContent;r=r.replace(N," ");r=r.replace(_," ");e.textContent=r}re("afterSanitizeElements",e,null);return false};var X=/^data-[\w.\u00B7-\uFFFF-]/;var Y=/^(?:(?:(?:f|ht)tps?|mailto|tel):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i;var Z=/^(?:\w+script|data):/i;var $=/[\x00-\x20\xA0\u1680\u180E\u2000-\u2029\u205f\u3000]/g;var ee=function(e){var r,a,i,o,l,s,f,c;re("beforeSanitizeAttributes",e,null);s=e.attributes;if(!s){return}f={attrName:"",attrValue:"",keepAttr:true};c=s.length;while(c--){r=s[c];a=r.name;i=r.value;o=a.toLowerCase();f.attrName=o;f.attrValue=i;f.keepAttr=true;re("uponSanitizeAttribute",e,f);i=f.attrValue;if(o==="name"&&e.nodeName==="IMG"&&s.id){l=s.id;s=Array.prototype.slice.apply(s);e.removeAttribute("id");e.removeAttribute(a);if(s.indexOf(l)>c){e.setAttribute("id",l.value)}}else{if(a==="id"){e.setAttribute(a,"")}e.removeAttribute(a)}if(!f.keepAttr){continue}if(H&&(o==="id"||o==="name")&&(i in t||i in n||i in q)){continue}if(D){i=i.replace(N," ");i=i.replace(_," ")}if(A[o]&&!S[o]&&(G[o]||Y.test(i.replace($,""))||o==="src"&&i.indexOf("data:")===0&&j[e.nodeName.toLowerCase()])||M&&X.test(o)||O&&!Z.test(i.replace($,""))){try{e.setAttribute(a,i)}catch(u){}}}re("afterSanitizeAttributes",e,null)};var te=function(e){var t;var r=K(e);re("beforeSanitizeShadowDOM",e,null);while(t=r.nextNode()){re("uponSanitizeShadowNode",t,null);if(Q(t)){continue}if(t.content instanceof i){te(t.content)}ee(t)}re("afterSanitizeShadowDOM",e,null)};var re=function(e,t,n){if(!y[e]){return}y[e].forEach(function(e){e.call(r,t,n,I)})};r.sanitize=function(e,n){var o,l,s,f,c;if(!e){e=""}if(typeof e!=="string"){if(typeof e.toString!=="function"){throw new TypeError("toString is not a function")}else{e=e.toString()}}if(!r.isSupported){if(typeof t.toStaticHTML==="object"||typeof t.toStaticHTML==="function"){return t.toStaticHTML(e)}return e}P(n);if(!z&&!C&&e.indexOf("<")===-1){return e}o=V(e);if(!o){return z?null:""}f=K(o);while(l=f.nextNode()){if(l.nodeType===3&&l===s){continue}if(Q(l)){continue}if(l.content instanceof i){te(l.content)}ee(l);s=l}if(z){if(R){c=v.call(o.ownerDocument);while(o.firstChild){c.appendChild(o.firstChild)}}else{c=o}if(F){c=g.call(a,c,true)}return c}return C?o.outerHTML:o.innerHTML};r.addHook=function(e,t){if(typeof t!=="function"){return}y[e]=y[e]||[];y[e].push(t)};r.removeHook=function(e){if(y[e]){y[e].pop()}};r.removeHooks=function(e){if(y[e]){y[e]=[]}};r.removeAllHooks=function(){y=[]};return r}); \ No newline at end of file
diff --git a/src/main/resources/assets/js/signin.js b/src/main/resources/assets/js/signin.js
new file mode 100644
index 0000000..fbbf1bb
--- /dev/null
+++ b/src/main/resources/assets/js/signin.js
@@ -0,0 +1,227 @@
+var signinItem = new Vue({
+ el: "#signin-div",
+ data: {
+ emailVerify: false,
+ description: "",
+ emailErrorTip: "",
+ emailVerifyStatus: "",
+ passwordVerify: "",
+ passwordConfirm: ""
+ }
+});
+
+if (!window.location.href.replace(/https?:\/\/[a-zA-Z0-9.]*(:\d+)?/g, "").startsWith("/signin")) {
+ window.location.href = "/signin#login";
+}
+
+function reset() {
+ var email = $("#res-email").val();
+ var code = $("#res-email-verify").val();
+ var password = $("#res-password").val();
+ var passwordConfirm = $("#res-confirm-password").val();
+ var isValid = isEmail(email) && 6 === code.length && checkPassword(password, passwordConfirm);
+ if (submit() && isValid) {
+ layer.load(1);
+ $.ajax({
+ url: "/user/password/reset",
+ type: "PUT",
+ data: {email: email, code: code, password: password},
+ success: function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.status === "success") {
+ alerts("密码重置成功");
+ switchToLogin();
+ } else {
+ alerts(json.message);
+ }
+ }
+ });
+ } else {
+ alerts("格式不合法,无法提交");
+ }
+}
+
+function register() {
+ /** @namespace globalConfig.allowRegister */
+ if (globalConfig.allowRegister) {
+ var username = $("#username").val();
+ var email = $("#email").val();
+ var verifyCode = $("#email-verify-code").val();
+ var password = $("#reg-password").val();
+ var passwordConfirm = $("#confirm-password").val();
+ var canRegister = username.match(userConfig.usernameMatch.pattern) && (!userConfig.emailVerify || 6 === verifyCode.length) && isEmail(email) && checkPassword(password, passwordConfirm);
+ if (submit() && canRegister) {
+ layer.load(1);
+ $.post("/user/register", {
+ username: username,
+ email: email,
+ password: password,
+ code: verifyCode
+ }, function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.status === "success") {
+ alerts("注册成功");
+ switchToLogin();
+ } else {
+ alerts(json.message);
+ }
+ });
+ } else {
+ alerts("有非法内容,无法提交");
+ }
+ } else {
+ alerts("该站点已禁止注册,请联系管理员");
+ }
+}
+
+function login() {
+ /** @namespace globalConfig.allowLogin */
+ if (globalConfig.allowLogin) {
+ var username = $("#loginName").val();
+ var password = $("#password").val();
+ var remember = document.getElementById("remember").checked;
+ if (username && password) {
+ layer.load(1);
+ $.ajax({
+ url: "/user/login", type: "PUT", data: {
+ username: username,
+ password: password,
+ auto: remember,
+ token: getCookie("token")
+ }, success: function (data) {
+ layer.closeAll();
+ var json = JSON.parse(data);
+ if (json.status === "success") {
+ if (remember) {
+ var exp = new Date();
+ document.cookie = "token=" + json.token + ";expires=" + exp.setTime(exp.getTime() + 30 * 24 * 60 * 60 * 1000);
+ }
+ window.location.href = "/index";
+ } else {
+ alerts("登录失败,用户名或密码不正确");
+ }
+ }
+ });
+ } else {
+ alerts("用户名或密码不能为空");
+ }
+ } else {
+ alerts("该站点已禁止登录,请联系管理员");
+ }
+}
+
+function switchToRegister() {
+ switchTo("none", "none", "block", "register", signinItem.emailVerify ? 30 : 26);
+}
+
+function switchToLogin() {
+ switchTo("block", "none", "none", "login", 24);
+}
+
+function switchToReset() {
+ switchTo("none", "block", "none", "reset", 26);
+}
+
+function switchTo(login, reset, register, hash, height) {
+ $("#login-div").css("display", login);
+ $("#reset-div").css("display", reset);
+ $("#register-div").css("display", register);
+ window.location.hash = "#" + hash;
+ $(".center-vertical").css("height", height + "rem");
+ signinItem.description = "";
+ signinItem.emailErrorTip = "";
+ signinItem.emailVerifyStatus = "";
+ signinItem.passwordVerify = "";
+ signinItem.passwordConfirm = "";
+}
+
+function submit() {
+ return isEmpty(signinItem.description) && isEmpty(signinItem.emailErrorTip) && isEmpty(signinItem.emailVerifyStatus) && isEmpty(signinItem.passwordVerify) && isEmpty(signinItem.passwordConfirm);
+}
+
+$(document).ready(
+ function () {
+ $("#username").keyup(function () {
+ var username = event.srcElement.value;
+ if (username.match(userConfig.usernameMatch.pattern)) {
+ $.get("/user/username/exists", {username: username}, function (data) {
+ var json = JSON.parse(data);
+ /** @namespace json.exists */
+ signinItem.description = json.exists ? "用户名已经存在" : "";
+ });
+ } else {
+ signinItem.description = userConfig.usernameMatch.description;
+ }
+ }
+ );
+ $(".email").keyup(function () {
+ var email = event.srcElement.value;
+ if (isEmail(email)) {
+ if (location.hash === "#register") {
+ $.get("/user/email/exists", {email: email}, function (data) {
+ var json = JSON.parse(data);
+ signinItem.emailErrorTip = json.exists ? "该邮箱已经被注册啦" : "";
+ });
+ }
+ signinItem.emailErrorTip = "";
+ } else {
+ signinItem.emailErrorTip = "邮箱格式不正确";
+ }
+ });
+ $(".password").keyup(function () {
+ var len = event.srcElement.value.length;
+ if (len >= userConfig.password.minLength && len <= userConfig.password.maxLength) {
+ signinItem.passwordVerify = "";
+ } else {
+ signinItem.passwordVerify = "密码长度限定为" + userConfig.password.minLength + "至" + userConfig.password.maxLength + "位";
+ }
+ });
+ $(".confirm-password").keyup(function () {
+ var ele = event.srcElement;
+ signinItem.passwordConfirm = (ele.value === $(ele).siblings(".password").val()) ? "" : "两次输入的密码不一样";
+ });
+ $(".sendVerifyCode").click(function () {
+ var eventSrc = event.srcElement;
+ console.info("test");
+ sendVerifyCode($(eventSrc).parents(location.hash + "-div").find(".email").val(), eventSrc);
+ });
+ $(".email-verify-code").keyup(function () {
+ var code = event.srcElement.value;
+ if (code.length === 6) {
+ $.ajax({
+ url: "/common/" + code + "/verification", type: "PUT", success: function (data) {
+ var json = JSON.parse(data);
+ signinItem.emailVerifyStatus = json.status === "success" ? "" : "验证码错误";
+ }
+ });
+ } else {
+ signinItem.emailVerifyStatus = "";
+ }
+ });
+ }
+);
+
+switch (window.location.hash) {
+ case "#register":
+ switchToRegister();
+ break;
+ case "#reset":
+ switchToReset();
+ break;
+ default:
+ switchToLogin();
+ break;
+}
+
+layer.load(1);
+$.get("/config/user", function (data) {
+ layer.closeAll();
+ userConfig = JSON.parse(data);
+ signinItem.emailVerify = userConfig.emailVerify;
+ /** @namespace userConfig.usernameMatch */
+ if (window.location.hash === "#register") {
+ switchToRegister();
+ }
+}); \ No newline at end of file
diff --git a/src/main/resources/assets/js/sortable.min.js b/src/main/resources/assets/js/sortable.min.js
new file mode 100644
index 0000000..602876a
--- /dev/null
+++ b/src/main/resources/assets/js/sortable.min.js
@@ -0,0 +1 @@
+!function(t){"use strict";"function"==typeof define&&define.amd?define(t):"undefined"!=typeof module&&void 0!==module.exports?module.exports=t():window.KvSortable=t()}(function(){"use strict";function t(e,n){if(!e||!e.nodeType||1!==e.nodeType)throw"KvSortable: `el` must be HTMLElement, and not "+{}.toString.call(e);this.el=e,this.options=n=g({},n),e[U]=this;var i={group:Math.random(),sort:!0,disabled:!1,store:null,handle:null,scroll:!0,scrollSensitivity:30,scrollSpeed:10,draggable:/[uo]l/i.test(e.nodeName)?"li":">*",ghostClass:"kvsortable-ghost",chosenClass:"kvsortable-chosen",dragClass:"kvsortable-drag",ignore:"a, img",filter:null,preventOnFilter:!0,animation:0,setData:function(t,e){t.setData("Text",e.textContent)},dropBubble:!1,dragoverBubble:!1,dataIdAttr:"data-id",delay:0,forceFallback:!1,fallbackClass:"kvsortable-fallback",fallbackOnBody:!1,fallbackTolerance:0,fallbackOffset:{x:0,y:0},supportPointer:!1!==t.supportPointer};for(var r in i)!(r in n)&&(n[r]=i[r]);rt(n);for(var a in this)"_"===a.charAt(0)&&"function"==typeof this[a]&&(this[a]=this[a].bind(this));this.nativeDraggable=!n.forceFallback&&Z,o(e,"mousedown",this._onTapStart),o(e,"touchstart",this._onTapStart),n.supportPointer&&o(e,"pointerdown",this._onTapStart),this.nativeDraggable&&(o(e,"dragover",this),o(e,"dragenter",this)),ot.push(this._onDragOver),n.store&&this.sort(n.store.get(this))}function e(t,e){"clone"!==t.lastPullMode&&(e=!0),w&&w.state!==e&&(a(w,"display",e?"none":""),e||w.state&&(t.options.group.revertClone?(T.insertBefore(w,C),t._animate(_,w)):T.insertBefore(w,_)),w.state=e)}function n(t,e,n){if(t){n=n||W;do{if(">*"===e&&t.parentNode===n||f(t,e))return t}while(t=function(t){var e=t.host;return e&&e.nodeType?e:t.parentNode}(t))}return null}function o(t,e,n){t.addEventListener(e,n,G)}function i(t,e,n){t.removeEventListener(e,n,G)}function r(t,e,n){if(t)if(t.classList)t.classList[n?"add":"remove"](e);else{var o=(" "+t.className+" ").replace(L," ").replace(" "+e+" "," ");t.className=(o+(n?" "+e:"")).replace(L," ")}}function a(t,e,n){var o=t&&t.style;if(o){if(void 0===n)return W.defaultView&&W.defaultView.getComputedStyle?n=W.defaultView.getComputedStyle(t,""):t.currentStyle&&(n=t.currentStyle),void 0===e?n:n[e];e in o||(e="-webkit-"+e),o[e]=n+("string"==typeof n?"":"px")}}function s(t,e,n){if(t){var o=t.getElementsByTagName(e),i=0,r=o.length;if(n)for(;i<r;i++)n(o[i],i);return o}return[]}function l(t,e,n,o,i,r,a,s){t=t||e[U];var l=W.createEvent("Event"),c=t.options,d="on"+n.charAt(0).toUpperCase()+n.substr(1);l.initEvent(n,!0,!0),l.to=i||e,l.from=r||e,l.item=o||e,l.clone=w,l.oldIndex=a,l.newIndex=s,e.dispatchEvent(l),c[d]&&c[d].call(t,l)}function c(t,e,n,o,i,r,a,s){var l,c,d=t[U],h=d.options.onMove;return(l=W.createEvent("Event")).initEvent("move",!0,!0),l.to=e,l.from=t,l.dragged=n,l.draggedRect=o,l.related=i||e,l.relatedRect=r||e.getBoundingClientRect(),l.willInsertAfter=s,t.dispatchEvent(l),h&&(c=h.call(d,l,a)),c}function d(t){t.draggable=!1}function h(){$=!1}function u(t,e){var n=0;if(!t||!t.parentNode)return-1;for(;t&&(t=t.previousElementSibling);)"TEMPLATE"===t.nodeName.toUpperCase()||">*"!==e&&!f(t,e)||n++;return n}function f(t,e){if(t){var n=(e=e.split(".")).shift().toUpperCase(),o=new RegExp("\\s("+e.join("|")+")(?=\\s)","g");return!(""!==n&&t.nodeName.toUpperCase()!=n||e.length&&((" "+t.className+" ").match(o)||[]).length!=e.length)}return!1}function p(t,e){var n,o;return function(){void 0===n&&(n=arguments,o=this,q(function(){1===n.length?t.call(o,n[0]):t.apply(o,n),n=void 0},e))}}function g(t,e){if(t&&e)for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}function v(t){return z&&z.dom?z.dom(t).cloneNode(!0):V?V(t).clone(!0)[0]:t.cloneNode(!0)}function m(t){return q(t,0)}function b(t){return clearTimeout(t)}if("undefined"==typeof window||!window.document)return function(){throw new Error("KvSortable.js requires a window with a document")};var _,D,y,w,T,C,S,E,k,x,N,B,P,Y,O,X,I,R,A,M,j={},L=/\s+/g,F=/left|right|inline/,U="KvSortable"+(new Date).getTime(),H=window,W=H.document,K=H.parseInt,q=H.setTimeout,V=H.jQuery||H.Zepto,z=H.Polymer,G=!1,Q=!1,Z="draggable"in W.createElement("div"),J=function(t){return!navigator.userAgent.match(/(?:Trident.*rv[ :]?11\.|msie)/i)&&(t=W.createElement("x"),t.style.cssText="pointer-events:auto","auto"===t.style.pointerEvents)}(),$=!1,tt=Math.abs,et=Math.min,nt=[],ot=[],it=p(function(t,e,n){if(n&&e.scroll){var o,i,r,a,s,l,c=n[U],d=e.scrollSensitivity,h=e.scrollSpeed,u=t.clientX,f=t.clientY,p=window.innerWidth,g=window.innerHeight;if(k!==n&&(E=e.scroll,k=n,x=e.scrollFn,!0===E)){E=n;do{if(E.offsetWidth<E.scrollWidth||E.offsetHeight<E.scrollHeight)break}while(E=E.parentNode)}E&&(o=E,i=E.getBoundingClientRect(),r=(tt(i.right-u)<=d)-(tt(i.left-u)<=d),a=(tt(i.bottom-f)<=d)-(tt(i.top-f)<=d)),r||a||(a=(g-f<=d)-(f<=d),((r=(p-u<=d)-(u<=d))||a)&&(o=H)),j.vx===r&&j.vy===a&&j.el===o||(j.el=o,j.vx=r,j.vy=a,clearInterval(j.pid),o&&(j.pid=setInterval(function(){if(l=a?a*h:0,s=r?r*h:0,"function"==typeof x)return x.call(c,s,l,t);o===H?H.scrollTo(H.pageXOffset+s,H.pageYOffset+l):(o.scrollTop+=l,o.scrollLeft+=s)},24)))}},30),rt=function(t){function e(t,e){return void 0!==t&&!0!==t||(t=n.name),"function"==typeof t?t:function(n,o){var i=o.options.group.name;return e?t:t&&(t.join?t.indexOf(i)>-1:i==t)}}var n={},o=t.group;o&&"object"==typeof o||(o={name:o}),n.name=o.name,n.checkPull=e(o.pull,!0),n.checkPut=e(o.put),n.revertClone=o.revertClone,t.group=n};try{window.addEventListener("test",null,Object.defineProperty({},"passive",{get:function(){G={capture:!1,passive:Q=!1}}}))}catch(t){}return t.prototype={constructor:t,_onTapStart:function(t){var e,o=this,i=this.el,r=this.options,a=r.preventOnFilter,s=t.type,c=t.touches&&t.touches[0],d=(c||t).target,h=t.target.shadowRoot&&t.path&&t.path[0]||d,f=r.filter;if(function(t){for(var e=t.getElementsByTagName("input"),n=e.length;n--;){var o=e[n];o.checked&&nt.push(o)}}(i),!_&&!(/mousedown|pointerdown/.test(s)&&0!==t.button||r.disabled)&&!h.isContentEditable&&(d=n(d,r.draggable,i))&&S!==d){if(e=u(d,r.draggable),"function"==typeof f){if(f.call(this,t,d,this))return l(o,h,"filter",d,i,i,e),void(a&&t.preventDefault())}else if(f&&(f=f.split(",").some(function(t){if(t=n(h,t.trim(),i))return l(o,t,"filter",d,i,i,e),!0})))return void(a&&t.preventDefault());r.handle&&!n(h,r.handle,i)||this._prepareDragStart(t,c,d,e)}},_prepareDragStart:function(t,e,n,i){var a,c=this,h=c.el,u=c.options,f=h.ownerDocument;n&&!_&&n.parentNode===h&&(R=t,T=h,D=(_=n).parentNode,C=_.nextSibling,S=n,X=u.group,Y=i,this._lastX=(e||t).clientX,this._lastY=(e||t).clientY,_.style["will-change"]="all",a=function(){c._disableDelayedDrag(),_.draggable=c.nativeDraggable,r(_,u.chosenClass,!0),c._triggerDragStart(t,e),l(c,T,"choose",_,T,T,Y)},u.ignore.split(",").forEach(function(t){s(_,t.trim(),d)}),o(f,"mouseup",c._onDrop),o(f,"touchend",c._onDrop),o(f,"touchcancel",c._onDrop),o(f,"selectstart",c),u.supportPointer&&o(f,"pointercancel",c._onDrop),u.delay?(o(f,"mouseup",c._disableDelayedDrag),o(f,"touchend",c._disableDelayedDrag),o(f,"touchcancel",c._disableDelayedDrag),o(f,"mousemove",c._disableDelayedDrag),o(f,"touchmove",c._disableDelayedDrag),u.supportPointer&&o(f,"pointermove",c._disableDelayedDrag),c._dragStartTimer=q(a,u.delay)):a())},_disableDelayedDrag:function(){var t=this.el.ownerDocument;clearTimeout(this._dragStartTimer),i(t,"mouseup",this._disableDelayedDrag),i(t,"touchend",this._disableDelayedDrag),i(t,"touchcancel",this._disableDelayedDrag),i(t,"mousemove",this._disableDelayedDrag),i(t,"touchmove",this._disableDelayedDrag),i(t,"pointermove",this._disableDelayedDrag)},_triggerDragStart:function(t,e){(e=e||("touch"==t.pointerType?t:null))?(R={target:_,clientX:e.clientX,clientY:e.clientY},this._onDragStart(R,"touch")):this.nativeDraggable?(o(_,"dragend",this),o(T,"dragstart",this._onDragStart)):this._onDragStart(R,!0);try{W.selection?m(function(){W.selection.empty()}):window.getSelection().removeAllRanges()}catch(t){}},_dragStarted:function(){if(T&&_){var e=this.options;r(_,e.ghostClass,!0),r(_,e.dragClass,!1),t.active=this,l(this,T,"start",_,T,T,Y)}else this._nulling()},_emulateDragOver:function(){if(A){if(this._lastX===A.clientX&&this._lastY===A.clientY)return;this._lastX=A.clientX,this._lastY=A.clientY,J||a(y,"display","none");var t=W.elementFromPoint(A.clientX,A.clientY),e=t,n=ot.length;if(t&&t.shadowRoot&&(e=t=t.shadowRoot.elementFromPoint(A.clientX,A.clientY)),e)do{if(e[U]){for(;n--;)ot[n]({clientX:A.clientX,clientY:A.clientY,target:t,rootEl:e});break}t=e}while(e=e.parentNode);J||a(y,"display","")}},_onTouchMove:function(e){if(R){var n=this.options,o=n.fallbackTolerance,i=n.fallbackOffset,r=e.touches?e.touches[0]:e,s=r.clientX-R.clientX+i.x,l=r.clientY-R.clientY+i.y,c=e.touches?"translate3d("+s+"px,"+l+"px,0)":"translate("+s+"px,"+l+"px)";if(!t.active){if(o&&et(tt(r.clientX-this._lastX),tt(r.clientY-this._lastY))<o)return;this._dragStarted()}this._appendGhost(),M=!0,A=r,a(y,"webkitTransform",c),a(y,"mozTransform",c),a(y,"msTransform",c),a(y,"transform",c),e.preventDefault()}},_appendGhost:function(){if(!y){var t,e=_.getBoundingClientRect(),n=a(_),o=this.options;r(y=_.cloneNode(!0),o.ghostClass,!1),r(y,o.fallbackClass,!0),r(y,o.dragClass,!0),a(y,"top",e.top-K(n.marginTop,10)),a(y,"left",e.left-K(n.marginLeft,10)),a(y,"width",e.width),a(y,"height",e.height),a(y,"opacity","0.8"),a(y,"position","fixed"),a(y,"zIndex","100000"),a(y,"pointerEvents","none"),o.fallbackOnBody&&W.body.appendChild(y)||T.appendChild(y),t=y.getBoundingClientRect(),a(y,"width",2*e.width-t.width),a(y,"height",2*e.height-t.height)}},_onDragStart:function(t,e){var n=this,i=t.dataTransfer,s=n.options;n._offUpEvents(),X.checkPull(n,n,_,t)&&((w=v(_)).draggable=!1,w.style["will-change"]="",a(w,"display","none"),r(w,n.options.chosenClass,!1),n._cloneId=m(function(){T.insertBefore(w,_),l(n,T,"clone",_)})),r(_,s.dragClass,!0),e?("touch"===e?(o(W,"touchmove",n._onTouchMove),o(W,"touchend",n._onDrop),o(W,"touchcancel",n._onDrop),s.supportPointer&&(o(W,"pointermove",n._onTouchMove),o(W,"pointerup",n._onDrop))):(o(W,"mousemove",n._onTouchMove),o(W,"mouseup",n._onDrop)),n._loopId=setInterval(n._emulateDragOver,50)):(i&&(i.effectAllowed="move",s.setData&&s.setData.call(n,i,_)),o(W,"drop",n),n._dragStartId=m(n._dragStarted))},_onDragOver:function(o){var i,r,s,l,d=this.el,u=this.options,f=u.group,p=t.active,g=X===f,v=!1,m=u.sort;if(void 0!==o.preventDefault&&(o.preventDefault(),!u.dragoverBubble&&o.stopPropagation()),!_.animated&&(M=!0,p&&!u.disabled&&(g?m||(l=!T.contains(_)):I===this||(p.lastPullMode=X.checkPull(this,p,_,o))&&f.checkPut(this,p,_,o))&&(void 0===o.rootEl||o.rootEl===this.el))){if(it(o,u,this.el),$)return;if(i=n(o.target,u.draggable,d),r=_.getBoundingClientRect(),I!==this&&(I=this,v=!0),l)return e(p,!0),D=T,void(w||C?T.insertBefore(_,w||C):m||T.appendChild(_));if(0===d.children.length||d.children[0]===y||d===o.target&&function(t,e){var n=t.lastElementChild.getBoundingClientRect();return e.clientY-(n.top+n.height)>5||e.clientX-(n.left+n.width)>5}(d,o)){if(0!==d.children.length&&d.children[0]!==y&&d===o.target&&(i=d.lastElementChild),i){if(i.animated)return;s=i.getBoundingClientRect()}e(p,g),!1!==c(T,d,_,r,i,s,o)&&(_.contains(d)||(d.appendChild(_),D=d),this._animate(r,_),i&&this._animate(s,i))}else if(i&&!i.animated&&i!==_&&void 0!==i.parentNode[U]){N!==i&&(N=i,B=a(i),P=a(i.parentNode));var b=(s=i.getBoundingClientRect()).right-s.left,S=s.bottom-s.top,E=F.test(B.cssFloat+B.display)||"flex"==P.display&&0===P["flex-direction"].indexOf("row"),k=i.offsetWidth>_.offsetWidth,x=i.offsetHeight>_.offsetHeight,Y=(E?(o.clientX-s.left)/b:(o.clientY-s.top)/S)>.5,O=i.nextElementSibling,R=!1;if(E){var A=_.offsetTop,j=i.offsetTop;R=A===j?i.previousElementSibling===_&&!k||Y&&k:i.previousElementSibling===_||_.previousElementSibling===i?(o.clientY-s.top)/S>.5:j>A}else v||(R=O!==_&&!x||Y&&x);var L=c(T,d,_,r,i,s,o,R);!1!==L&&(1!==L&&-1!==L||(R=1===L),$=!0,q(h,30),e(p,g),_.contains(d)||(R&&!O?d.appendChild(_):i.parentNode.insertBefore(_,R?O:i)),D=_.parentNode,this._animate(r,_),this._animate(s,i))}}},_animate:function(t,e){var n=this.options.animation;if(n){var o=e.getBoundingClientRect();1===t.nodeType&&(t=t.getBoundingClientRect()),a(e,"transition","none"),a(e,"transform","translate3d("+(t.left-o.left)+"px,"+(t.top-o.top)+"px,0)"),e.offsetWidth,a(e,"transition","all "+n+"ms"),a(e,"transform","translate3d(0,0,0)"),clearTimeout(e.animated),e.animated=q(function(){a(e,"transition",""),a(e,"transform",""),e.animated=!1},n)}},_offUpEvents:function(){var t=this.el.ownerDocument;i(W,"touchmove",this._onTouchMove),i(W,"pointermove",this._onTouchMove),i(t,"mouseup",this._onDrop),i(t,"touchend",this._onDrop),i(t,"pointerup",this._onDrop),i(t,"touchcancel",this._onDrop),i(t,"pointercancel",this._onDrop),i(t,"selectstart",this)},_onDrop:function(e){var n=this.el,o=this.options;clearInterval(this._loopId),clearInterval(j.pid),clearTimeout(this._dragStartTimer),b(this._cloneId),b(this._dragStartId),i(W,"mouseover",this),i(W,"mousemove",this._onTouchMove),this.nativeDraggable&&(i(W,"drop",this),i(n,"dragstart",this._onDragStart)),this._offUpEvents(),e&&(M&&(e.preventDefault(),!o.dropBubble&&e.stopPropagation()),y&&y.parentNode&&y.parentNode.removeChild(y),T!==D&&"clone"===t.active.lastPullMode||w&&w.parentNode&&w.parentNode.removeChild(w),_&&(this.nativeDraggable&&i(_,"dragend",this),d(_),_.style["will-change"]="",r(_,this.options.ghostClass,!1),r(_,this.options.chosenClass,!1),l(this,T,"unchoose",_,D,T,Y),T!==D?(O=u(_,o.draggable))>=0&&(l(null,D,"add",_,D,T,Y,O),l(this,T,"remove",_,D,T,Y,O),l(null,D,"sort",_,D,T,Y,O),l(this,T,"sort",_,D,T,Y,O)):_.nextSibling!==C&&(O=u(_,o.draggable))>=0&&(l(this,T,"update",_,D,T,Y,O),l(this,T,"sort",_,D,T,Y,O)),t.active&&(null!=O&&-1!==O||(O=Y),l(this,T,"end",_,D,T,Y,O),this.save()))),this._nulling()},_nulling:function(){T=_=D=y=C=w=S=E=k=R=A=M=O=N=B=I=X=t.active=null,nt.forEach(function(t){t.checked=!0}),nt.length=0},handleEvent:function(t){switch(t.type){case"drop":case"dragend":this._onDrop(t);break;case"dragover":case"dragenter":_&&(this._onDragOver(t),function(t){t.dataTransfer&&(t.dataTransfer.dropEffect="move"),t.preventDefault()}(t));break;case"mouseover":this._onDrop(t);break;case"selectstart":t.preventDefault()}},toArray:function(){for(var t,e=[],o=this.el.children,i=0,r=o.length,a=this.options;i<r;i++)n(t=o[i],a.draggable,this.el)&&e.push(t.getAttribute(a.dataIdAttr)||function(t){for(var e=t.tagName+t.className+t.src+t.href+t.textContent,n=e.length,o=0;n--;)o+=e.charCodeAt(n);return o.toString(36)}(t));return e},sort:function(t){var e={},o=this.el;this.toArray().forEach(function(t,i){var r=o.children[i];n(r,this.options.draggable,o)&&(e[t]=r)},this),t.forEach(function(t){e[t]&&(o.removeChild(e[t]),o.appendChild(e[t]))})},save:function(){var t=this.options.store;t&&t.set(this)},closest:function(t,e){return n(t,e||this.options.draggable,this.el)},option:function(t,e){var n=this.options;if(void 0===e)return n[t];n[t]=e,"group"===t&&rt(n)},destroy:function(){var t=this.el;t[U]=null,i(t,"mousedown",this._onTapStart),i(t,"touchstart",this._onTapStart),i(t,"pointerdown",this._onTapStart),this.nativeDraggable&&(i(t,"dragover",this),i(t,"dragenter",this)),Array.prototype.forEach.call(t.querySelectorAll("[draggable]"),function(t){t.removeAttribute("draggable")}),ot.splice(ot.indexOf(this._onDragOver),1),this._onDrop(),this.el=t=null}},o(W,"touchmove",function(e){t.active&&e.preventDefault()}),t.utils={on:o,off:i,css:a,find:s,is:function(t,e){return!!n(t,e,t)},extend:g,throttle:p,closest:n,toggleClass:r,clone:v,index:u,nextTick:m,cancelNextTick:b},t.create=function(e,n){return new t(e,n)},t.version="1.7.0",t}),function(t){"use strict";"function"==typeof define&&define.amd?define(["jquery"],t):t(jQuery)}(function(t){"use strict";t.fn.kvsortable=function(e){var n,o=arguments;return this.each(function(){var i=t(this),r=i.data("kvsortable");r||!(e instanceof Object)&&e||(r=new KvSortable(this,e),i.data("kvsortable",r)),r&&("widget"===e?n=r:"destroy"===e?(r.destroy(),i.removeData("kvsortable")):"function"==typeof r[e]?n=r[e].apply(r,[].slice.call(o,1)):e in r.options&&(n=r.option.apply(r,o)))}),void 0===n?this:n}});
diff --git a/src/main/resources/assets/js/theme.js b/src/main/resources/assets/js/theme.js
new file mode 100644
index 0000000..fb8f57d
--- /dev/null
+++ b/src/main/resources/assets/js/theme.js
@@ -0,0 +1,46 @@
+/*!
+ * bootstrap-fileinput v4.4.7
+ * http://plugins.krajee.com/file-input
+ *
+ * Font Awesome icon theme configuration for bootstrap-fileinput. Requires font awesome assets to be loaded.
+ *
+ * Author: Kartik Visweswaran
+ * Copyright: 2014 - 2018, Kartik Visweswaran, Krajee.com
+ *
+ * Licensed under the BSD 3-Clause
+ * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md
+ */
+(function ($) {
+ "use strict";
+
+ $.fn.fileinputThemes.fa = {
+ fileActionSettings: {
+ removeIcon: '<i class="fa fa-trash"></i>',
+ uploadIcon: '<i class="fa fa-upload"></i>',
+ uploadRetryIcon: '<i class="fa fa-repeat"></i>',
+ zoomIcon: '<i class="fa fa-search-plus"></i>',
+ dragIcon: '<i class="fa fa-bars"></i>',
+ indicatorNew: '<i class="fa fa-plus-circle text-warning"></i>',
+ indicatorSuccess: '<i class="fa fa-check-circle text-success"></i>',
+ indicatorError: '<i class="fa fa-exclamation-circle text-danger"></i>',
+ indicatorLoading: '<i class="fa fa-hourglass text-muted"></i>'
+ },
+ layoutTemplates: {
+ fileIcon: '<i class="fa fa-file kv-caption-icon"></i> '
+ },
+ previewZoomButtonIcons: {
+ prev: '<i class="fa fa-caret-left fa-lg"></i>',
+ next: '<i class="fa fa-caret-right fa-lg"></i>',
+ toggleheader: '<i class="fa fa-arrows-v"></i>',
+ fullscreen: '<i class="fa fa-arrows-alt"></i>',
+ borderless: '<i class="fa fa-external-link"></i>',
+ close: '<i class="fa fa-remove"></i>'
+ },
+ previewFileIcon: '<i class="fa fa-file"></i>',
+ browseIcon: '<i class="fa fa-folder-open"></i>',
+ removeIcon: '<i class="fa fa-trash"></i>',
+ cancelIcon: '<i class="fa fa-ban"></i>',
+ uploadIcon: '<i class="fa fa-upload"></i>',
+ msgValidationErrorIcon: '<i class="fa fa-exclamation-circle"></i> '
+ };
+})(window.jQuery);
diff --git a/src/main/resources/assets/js/theme/default/icon-ext.png b/src/main/resources/assets/js/theme/default/icon-ext.png
new file mode 100644
index 0000000..bbbb669
--- /dev/null
+++ b/src/main/resources/assets/js/theme/default/icon-ext.png
Binary files differ
diff --git a/src/main/resources/assets/js/theme/default/icon.png b/src/main/resources/assets/js/theme/default/icon.png
new file mode 100644
index 0000000..3e17da8
--- /dev/null
+++ b/src/main/resources/assets/js/theme/default/icon.png
Binary files differ
diff --git a/src/main/resources/assets/js/theme/default/layer.css b/src/main/resources/assets/js/theme/default/layer.css
new file mode 100644
index 0000000..820b4a9
--- /dev/null
+++ b/src/main/resources/assets/js/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/src/main/resources/assets/js/theme/default/loading-0.gif b/src/main/resources/assets/js/theme/default/loading-0.gif
new file mode 100644
index 0000000..6f3c953
--- /dev/null
+++ b/src/main/resources/assets/js/theme/default/loading-0.gif
Binary files differ
diff --git a/src/main/resources/assets/js/theme/default/loading-1.gif b/src/main/resources/assets/js/theme/default/loading-1.gif
new file mode 100644
index 0000000..db3a483
--- /dev/null
+++ b/src/main/resources/assets/js/theme/default/loading-1.gif
Binary files differ
diff --git a/src/main/resources/assets/js/theme/default/loading-2.gif b/src/main/resources/assets/js/theme/default/loading-2.gif
new file mode 100644
index 0000000..5bb90fd
--- /dev/null
+++ b/src/main/resources/assets/js/theme/default/loading-2.gif
Binary files differ
diff --git a/src/main/resources/assets/js/upload.js b/src/main/resources/assets/js/upload.js
new file mode 100644
index 0000000..cc8051a
--- /dev/null
+++ b/src/main/resources/assets/js/upload.js
@@ -0,0 +1,39 @@
+$("#file-input").fileinput({
+ uploadUrl: "/file",
+ uploadAsync: true,
+ maxFileCount: 100,
+ previewFileType: ['image', 'html', 'text', 'video', 'audio', 'flash'],
+ uploadExtraData: function () {
+ return {
+ categoryId: $("#category-id").val(),
+ tag: $("#tag").val(),
+ description: $("#description").val(),
+ prefix: getQuery("prefix")
+ };
+ },
+ maxFilePreviewSize: 51200
+}).on('fileuploaded', function (event, data, previewId, index) {
+ var json = data.response;
+ if (json.status === "success") {
+ alerts("上传成功");
+ } else {
+ alerts("上传失败,文件不合法");
+ }
+});
+
+$(document).on('ready', function () {
+ $("#file-input").fileinput({
+ maxFilePreviewSize: 10240
+ });
+});
+
+$.get("/category/all", function (data) {
+ var json = JSON.parse(data);
+ var option = "";
+ $.each(json, function (i, category) {
+ option += "<option value='" + category.id + "'>" + category.name + "</option>";
+ });
+ if (!isEmpty(option)) {
+ $("#category-id").html(option);
+ }
+}); \ No newline at end of file
diff --git a/src/main/resources/assets/js/utils.js b/src/main/resources/assets/js/utils.js
new file mode 100644
index 0000000..018d450
--- /dev/null
+++ b/src/main/resources/assets/js/utils.js
@@ -0,0 +1,115 @@
+function boolToChinese(bool) {
+ return bool ? "成功" : "失败";
+}
+
+function setCheckboxesStatus(tableBody, status) {
+ var cbx = $(tableBody).find("input[type='checkbox']");
+ for (var i = 0; i < cbx.length; i++) {
+ cbx[i].checked = status;
+ }
+}
+
+function getSelectedRows(tableBody) {
+ var cbx = $(tableBody).find("input[type='checkbox']");
+ var trs = [];
+ for (var i = 0; i < cbx.length; i++) {
+ if (cbx[i].checked) {
+ trs = trs.concat($(cbx[i]).parents("tr"));
+ }
+ }
+ return trs;
+}
+
+function isMobile() {
+ var userAgent = navigator.userAgent.toLowerCase();
+ var isPad = userAgent.indexOf("ipad") > -1;
+ var isIpone = userAgent.indexOf("iphone") > -1;
+ var isMidp = userAgent.indexOf("midp") > -1;
+ var isUc = userAgent.indexOf("rv:1.2.3.4") > -1 || userAgent.indexOf("ucweb") > -1;
+ var isAndroid = userAgent.indexOf("android") > -1;
+ var isCe = userAgent.indexOf("windows ce") > -1;
+ var isWm = userAgent.indexOf("windows mobile") > -1;
+ return isPad || isIpone || isMidp || isUc || isAndroid || isCe || isWm || userAgent.indexOf("mobile") > -1;
+}
+
+function trimWith(string, trimStr) {
+ return ltrim(rtrim(string, trimStr), trimStr);
+}
+
+function rtrim(string, trimStr) {
+ var idx = string.length - trimStr.length;
+ return string.lastIndexOf(trimStr) === idx ? rtrim(string.substr(0, idx), trimStr) : string;
+}
+
+function ltrim(string, trimStr) {
+ return string.indexOf(trimStr) === 0 ? ltrim(string.substr(trimStr.length), trimStr) : string;
+}
+
+function formatSize(bytes) {
+ if(bytes==0){
+ return "--"
+ }
+ var s = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
+ var e = Math.floor(Math.log(bytes) / Math.log(1024));
+ return (bytes / Math.pow(1024, Math.floor(e))).toFixed(2) + " " + s[e];
+}
+
+function getQuery(key) {
+ var queryString = location.search;
+ if (queryString.indexOf("?") === 0) {
+ queryString = queryString.substr(1);
+ var query = queryString.split("&");
+ for (var i = 0; i < query.length; i++) {
+ if (query[i].indexOf(key + "=") > -1) {
+ return query[i].split("=")[1];
+ }
+ }
+ }
+ return "";
+}
+
+function getCookie(name) {
+ if (document.cookie.length > 0) {
+ var start = document.cookie.indexOf(name + "=");
+ if (start !== -1) {
+ start += name.length + 1;
+ var end = document.cookie.indexOf(";", start);
+ if (end === -1) {
+ end = document.cookie.length;
+ }
+ return document.cookie.substring(start, end);
+ }
+ }
+ return "";
+}
+
+function isEmpty(string) {
+ return typeof string === "undefined" || string.length < 1;
+}
+
+function isEmail(email) {
+ return email.match(/^[0-9a-z\-]+([0-9a-z\-]|(\.[0-9a-z\-]+))*@[0-9a-z\-]+(\.[0-9a-z\-]+)+$/);
+}
+
+function alerts(msg, callback) {
+ layer.alert(msg, {
+ skin: 'layui-layer-molv'
+ , closeBtn: 0
+ }, callback);
+}
+
+Date.prototype.format = function (fmt) { //author: meizz
+ var o = {
+ "M+": this.getMonth() + 1, //月份
+ "d+": this.getDate(), //日
+ "h+": this.getHours(), //小时
+ "m+": this.getMinutes(), //分
+ "s+": this.getSeconds(), //秒
+ "q+": Math.floor((this.getMonth() + 3) / 3), //季度
+ "S": this.getMilliseconds() //毫秒
+ };
+ if (/(y+)/.test(fmt)) fmt = fmt.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length));
+ for (var k in o)
+ if (new RegExp("(" + k + ")").test(fmt)) fmt = fmt.replace(RegExp.$1, (RegExp.$1.length === 1) ? (o[k]) : (("00" + o[k]).substr(("" + o[k]).length)));
+ return fmt;
+}; \ No newline at end of file
diff --git a/src/main/resources/assets/js/vue.js b/src/main/resources/assets/js/vue.js
new file mode 100644
index 0000000..836793b
--- /dev/null
+++ b/src/main/resources/assets/js/vue.js
@@ -0,0 +1,6 @@
+/*!
+ * Vue.js v2.5.13
+ * (c) 2014-2017 Evan You
+ * Released under the MIT License.
+ */
+!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):t.Vue=e()}(this,function(){"use strict";function t(t){return void 0===t||null===t}function e(t){return void 0!==t&&null!==t}function n(t){return!0===t}function r(t){return"string"==typeof t||"number"==typeof t||"symbol"==typeof t||"boolean"==typeof t}function i(t){return null!==t&&"object"==typeof t}function o(t){return"[object Object]"===Nn.call(t)}function a(t){var e=parseFloat(String(t));return e>=0&&Math.floor(e)===e&&isFinite(t)}function s(t){return null==t?"":"object"==typeof t?JSON.stringify(t,null,2):String(t)}function c(t){var e=parseFloat(t);return isNaN(e)?t:e}function u(t,e){for(var n=Object.create(null),r=t.split(","),i=0;i<r.length;i++)n[r[i]]=!0;return e?function(t){return n[t.toLowerCase()]}:function(t){return n[t]}}function l(t,e){if(t.length){var n=t.indexOf(e);if(n>-1)return t.splice(n,1)}}function f(t,e){return Mn.call(t,e)}function p(t){var e=Object.create(null);return function(n){return e[n]||(e[n]=t(n))}}function d(t,e){function n(n){var r=arguments.length;return r?r>1?t.apply(e,arguments):t.call(e,n):t.call(e)}return n._length=t.length,n}function v(t,e){e=e||0;for(var n=t.length-e,r=new Array(n);n--;)r[n]=t[n+e];return r}function h(t,e){for(var n in e)t[n]=e[n];return t}function m(t){for(var e={},n=0;n<t.length;n++)t[n]&&h(e,t[n]);return e}function y(t,e,n){}function g(t,e){if(t===e)return!0;var n=i(t),r=i(e);if(!n||!r)return!n&&!r&&String(t)===String(e);try{var o=Array.isArray(t),a=Array.isArray(e);if(o&&a)return t.length===e.length&&t.every(function(t,n){return g(t,e[n])});if(o||a)return!1;var s=Object.keys(t),c=Object.keys(e);return s.length===c.length&&s.every(function(n){return g(t[n],e[n])})}catch(t){return!1}}function _(t,e){for(var n=0;n<t.length;n++)if(g(t[n],e))return n;return-1}function b(t){var e=!1;return function(){e||(e=!0,t.apply(this,arguments))}}function $(t){var e=(t+"").charCodeAt(0);return 36===e||95===e}function C(t,e,n,r){Object.defineProperty(t,e,{value:n,enumerable:!!r,writable:!0,configurable:!0})}function w(t){return"function"==typeof t&&/native code/.test(t.toString())}function x(t){return new mr(void 0,void 0,void 0,String(t))}function k(t,e){var n=t.componentOptions,r=new mr(t.tag,t.data,t.children,t.text,t.elm,t.context,n,t.asyncFactory);return r.ns=t.ns,r.isStatic=t.isStatic,r.key=t.key,r.isComment=t.isComment,r.fnContext=t.fnContext,r.fnOptions=t.fnOptions,r.fnScopeId=t.fnScopeId,r.isCloned=!0,e&&(t.children&&(r.children=A(t.children,!0)),n&&n.children&&(n.children=A(n.children,!0))),r}function A(t,e){for(var n=t.length,r=new Array(n),i=0;i<n;i++)r[i]=k(t[i],e);return r}function O(t,e,n){t.__proto__=e}function S(t,e,n){for(var r=0,i=n.length;r<i;r++){var o=n[r];C(t,o,e[o])}}function T(t,e){if(i(t)&&!(t instanceof mr)){var n;return f(t,"__ob__")&&t.__ob__ instanceof wr?n=t.__ob__:Cr.shouldConvert&&!ur()&&(Array.isArray(t)||o(t))&&Object.isExtensible(t)&&!t._isVue&&(n=new wr(t)),e&&n&&n.vmCount++,n}}function E(t,e,n,r,i){var o=new vr,a=Object.getOwnPropertyDescriptor(t,e);if(!a||!1!==a.configurable){var s=a&&a.get,c=a&&a.set,u=!i&&T(n);Object.defineProperty(t,e,{enumerable:!0,configurable:!0,get:function(){var e=s?s.call(t):n;return vr.target&&(o.depend(),u&&(u.dep.depend(),Array.isArray(e)&&I(e))),e},set:function(e){var r=s?s.call(t):n;e===r||e!=e&&r!=r||(c?c.call(t,e):n=e,u=!i&&T(e),o.notify())}})}}function j(t,e,n){if(Array.isArray(t)&&a(e))return t.length=Math.max(t.length,e),t.splice(e,1,n),n;if(e in t&&!(e in Object.prototype))return t[e]=n,n;var r=t.__ob__;return t._isVue||r&&r.vmCount?n:r?(E(r.value,e,n),r.dep.notify(),n):(t[e]=n,n)}function N(t,e){if(Array.isArray(t)&&a(e))t.splice(e,1);else{var n=t.__ob__;t._isVue||n&&n.vmCount||f(t,e)&&(delete t[e],n&&n.dep.notify())}}function I(t){for(var e=void 0,n=0,r=t.length;n<r;n++)(e=t[n])&&e.__ob__&&e.__ob__.dep.depend(),Array.isArray(e)&&I(e)}function L(t,e){if(!e)return t;for(var n,r,i,a=Object.keys(e),s=0;s<a.length;s++)r=t[n=a[s]],i=e[n],f(t,n)?o(r)&&o(i)&&L(r,i):j(t,n,i);return t}function M(t,e,n){return n?function(){var r="function"==typeof e?e.call(n,n):e,i="function"==typeof t?t.call(n,n):t;return r?L(r,i):i}:e?t?function(){return L("function"==typeof e?e.call(this,this):e,"function"==typeof t?t.call(this,this):t)}:e:t}function D(t,e){return e?t?t.concat(e):Array.isArray(e)?e:[e]:t}function P(t,e,n,r){var i=Object.create(t||null);return e?h(i,e):i}function F(t,e,n){function r(r){var i=xr[r]||Or;u[r]=i(t[r],e[r],n,r)}"function"==typeof e&&(e=e.options),function(t,e){var n=t.props;if(n){var r,i,a={};if(Array.isArray(n))for(r=n.length;r--;)"string"==typeof(i=n[r])&&(a[Pn(i)]={type:null});else if(o(n))for(var s in n)i=n[s],a[Pn(s)]=o(i)?i:{type:i};t.props=a}}(e),function(t,e){var n=t.inject;if(n){var r=t.inject={};if(Array.isArray(n))for(var i=0;i<n.length;i++)r[n[i]]={from:n[i]};else if(o(n))for(var a in n){var s=n[a];r[a]=o(s)?h({from:a},s):{from:s}}}}(e),function(t){var e=t.directives;if(e)for(var n in e){var r=e[n];"function"==typeof r&&(e[n]={bind:r,update:r})}}(e);var i=e.extends;if(i&&(t=F(t,i,n)),e.mixins)for(var a=0,s=e.mixins.length;a<s;a++)t=F(t,e.mixins[a],n);var c,u={};for(c in t)r(c);for(c in e)f(t,c)||r(c);return u}function R(t,e,n,r){if("string"==typeof n){var i=t[e];if(f(i,n))return i[n];var o=Pn(n);if(f(i,o))return i[o];var a=Fn(o);if(f(i,a))return i[a];return i[n]||i[o]||i[a]}}function H(t,e,n,r){var i=e[t],o=!f(n,t),a=n[t];if(U(Boolean,i.type)&&(o&&!f(i,"default")?a=!1:U(String,i.type)||""!==a&&a!==Hn(t)||(a=!0)),void 0===a){a=function(t,e,n){if(!f(e,"default"))return;var r=e.default;if(t&&t.$options.propsData&&void 0===t.$options.propsData[n]&&void 0!==t._props[n])return t._props[n];return"function"==typeof r&&"Function"!==B(e.type)?r.call(t):r}(r,i,t);var s=Cr.shouldConvert;Cr.shouldConvert=!0,T(a),Cr.shouldConvert=s}return a}function B(t){var e=t&&t.toString().match(/^\s*function (\w+)/);return e?e[1]:""}function U(t,e){if(!Array.isArray(e))return B(e)===B(t);for(var n=0,r=e.length;n<r;n++)if(B(e[n])===B(t))return!0;return!1}function V(t,e,n){if(e)for(var r=e;r=r.$parent;){var i=r.$options.errorCaptured;if(i)for(var o=0;o<i.length;o++)try{if(!1===i[o].call(r,t,e,n))return}catch(t){z(t,r,"errorCaptured hook")}}z(t,e,n)}function z(t,e,n){if(Jn.errorHandler)try{return Jn.errorHandler.call(null,t,e,n)}catch(t){K(t,null,"config.errorHandler")}K(t,e,n)}function K(t,e,n){if(!Gn&&!Zn||"undefined"==typeof console)throw t;console.error(t)}function J(){Tr=!1;var t=Sr.slice(0);Sr.length=0;for(var e=0;e<t.length;e++)t[e]()}function q(t,e){var n;if(Sr.push(function(){if(t)try{t.call(e)}catch(t){V(t,e,"nextTick")}else n&&n(e)}),Tr||(Tr=!0,Er?Ar():kr()),!t&&"undefined"!=typeof Promise)return new Promise(function(t){n=t})}function W(t){G(t,Mr),Mr.clear()}function G(t,e){var n,r,o=Array.isArray(t);if((o||i(t))&&!Object.isFrozen(t)){if(t.__ob__){var a=t.__ob__.dep.id;if(e.has(a))return;e.add(a)}if(o)for(n=t.length;n--;)G(t[n],e);else for(n=(r=Object.keys(t)).length;n--;)G(t[r[n]],e)}}function Z(t){function e(){var t=arguments,n=e.fns;if(!Array.isArray(n))return n.apply(null,arguments);for(var r=n.slice(),i=0;i<r.length;i++)r[i].apply(null,t)}return e.fns=t,e}function X(e,n,r,i,o){var a,s,c,u;for(a in e)s=e[a],c=n[a],u=Dr(a),t(s)||(t(c)?(t(s.fns)&&(s=e[a]=Z(s)),r(u.name,s,u.once,u.capture,u.passive,u.params)):s!==c&&(c.fns=s,e[a]=c));for(a in n)t(e[a])&&i((u=Dr(a)).name,n[a],u.capture)}function Y(r,i,o){function a(){o.apply(this,arguments),l(s.fns,a)}r instanceof mr&&(r=r.data.hook||(r.data.hook={}));var s,c=r[i];t(c)?s=Z([a]):e(c.fns)&&n(c.merged)?(s=c).fns.push(a):s=Z([c,a]),s.merged=!0,r[i]=s}function Q(t,n,r,i,o){if(e(n)){if(f(n,r))return t[r]=n[r],o||delete n[r],!0;if(f(n,i))return t[r]=n[i],o||delete n[i],!0}return!1}function tt(t){return e(t)&&e(t.text)&&function(t){return!1===t}(t.isComment)}function et(i,o){var a,s,c,u,l=[];for(a=0;a<i.length;a++)t(s=i[a])||"boolean"==typeof s||(u=l[c=l.length-1],Array.isArray(s)?s.length>0&&(tt((s=et(s,(o||"")+"_"+a))[0])&&tt(u)&&(l[c]=x(u.text+s[0].text),s.shift()),l.push.apply(l,s)):r(s)?tt(u)?l[c]=x(u.text+s):""!==s&&l.push(x(s)):tt(s)&&tt(u)?l[c]=x(u.text+s.text):(n(i._isVList)&&e(s.tag)&&t(s.key)&&e(o)&&(s.key="__vlist"+o+"_"+a+"__"),l.push(s)));return l}function nt(t,e){return(t.__esModule||fr&&"Module"===t[Symbol.toStringTag])&&(t=t.default),i(t)?e.extend(t):t}function rt(t){return t.isComment&&t.asyncFactory}function it(t){if(Array.isArray(t))for(var n=0;n<t.length;n++){var r=t[n];if(e(r)&&(e(r.componentOptions)||rt(r)))return r}}function ot(t,e,n){n?Lr.$once(t,e):Lr.$on(t,e)}function at(t,e){Lr.$off(t,e)}function st(t,e,n){Lr=t,X(e,n||{},ot,at),Lr=void 0}function ct(t,e){var n={};if(!t)return n;for(var r=0,i=t.length;r<i;r++){var o=t[r],a=o.data;if(a&&a.attrs&&a.attrs.slot&&delete a.attrs.slot,o.context!==e&&o.fnContext!==e||!a||null==a.slot)(n.default||(n.default=[])).push(o);else{var s=a.slot,c=n[s]||(n[s]=[]);"template"===o.tag?c.push.apply(c,o.children||[]):c.push(o)}}for(var u in n)n[u].every(ut)&&delete n[u];return n}function ut(t){return t.isComment&&!t.asyncFactory||" "===t.text}function lt(t,e){e=e||{};for(var n=0;n<t.length;n++)Array.isArray(t[n])?lt(t[n],e):e[t[n].key]=t[n].fn;return e}function ft(t){for(;t&&(t=t.$parent);)if(t._inactive)return!0;return!1}function pt(t,e){if(e){if(t._directInactive=!1,ft(t))return}else if(t._directInactive)return;if(t._inactive||null===t._inactive){t._inactive=!1;for(var n=0;n<t.$children.length;n++)pt(t.$children[n]);vt(t,"activated")}}function dt(t,e){if(!(e&&(t._directInactive=!0,ft(t))||t._inactive)){t._inactive=!0;for(var n=0;n<t.$children.length;n++)dt(t.$children[n]);vt(t,"deactivated")}}function vt(t,e){var n=t.$options[e];if(n)for(var r=0,i=n.length;r<i;r++)try{n[r].call(t)}catch(n){V(n,t,e+" hook")}t._hasHookEvent&&t.$emit("hook:"+e)}function ht(){Ur=!0;var t,e;for(Fr.sort(function(t,e){return t.id-e.id}),Vr=0;Vr<Fr.length;Vr++)e=(t=Fr[Vr]).id,Hr[e]=null,t.run();var n=Rr.slice(),r=Fr.slice();Vr=Fr.length=Rr.length=0,Hr={},Br=Ur=!1,function(t){for(var e=0;e<t.length;e++)t[e]._inactive=!0,pt(t[e],!0)}(n),function(t){var e=t.length;for(;e--;){var n=t[e],r=n.vm;r._watcher===n&&r._isMounted&&vt(r,"updated")}}(r),lr&&Jn.devtools&&lr.emit("flush")}function mt(t,e,n){Jr.get=function(){return this[e][n]},Jr.set=function(t){this[e][n]=t},Object.defineProperty(t,n,Jr)}function yt(t){t._watchers=[];var e=t.$options;e.props&&function(t,e){var n=t.$options.propsData||{},r=t._props={},i=t.$options._propKeys=[],o=!t.$parent;Cr.shouldConvert=o;var a=function(o){i.push(o);var a=H(o,e,n,t);E(r,o,a),o in t||mt(t,"_props",o)};for(var s in e)a(s);Cr.shouldConvert=!0}(t,e.props),e.methods&&function(t,e){t.$options.props;for(var n in e)t[n]=null==e[n]?y:d(e[n],t)}(t,e.methods),e.data?function(t){var e=t.$options.data;e=t._data="function"==typeof e?function(t,e){try{return t.call(e,e)}catch(t){return V(t,e,"data()"),{}}}(e,t):e||{},o(e)||(e={});var n=Object.keys(e),r=t.$options.props,i=(t.$options.methods,n.length);for(;i--;){var a=n[i];r&&f(r,a)||$(a)||mt(t,"_data",a)}T(e,!0)}(t):T(t._data={},!0),e.computed&&function(t,e){var n=t._computedWatchers=Object.create(null),r=ur();for(var i in e){var o=e[i],a="function"==typeof o?o:o.get;r||(n[i]=new Kr(t,a||y,y,qr)),i in t||gt(t,i,o)}}(t,e.computed),e.watch&&e.watch!==ir&&function(t,e){for(var n in e){var r=e[n];if(Array.isArray(r))for(var i=0;i<r.length;i++)bt(t,n,r[i]);else bt(t,n,r)}}(t,e.watch)}function gt(t,e,n){var r=!ur();"function"==typeof n?(Jr.get=r?_t(e):n,Jr.set=y):(Jr.get=n.get?r&&!1!==n.cache?_t(e):n.get:y,Jr.set=n.set?n.set:y),Object.defineProperty(t,e,Jr)}function _t(t){return function(){var e=this._computedWatchers&&this._computedWatchers[t];if(e)return e.dirty&&e.evaluate(),vr.target&&e.depend(),e.value}}function bt(t,e,n,r){return o(n)&&(r=n,n=n.handler),"string"==typeof n&&(n=t[n]),t.$watch(e,n,r)}function $t(t,e){if(t){for(var n=Object.create(null),r=fr?Reflect.ownKeys(t).filter(function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}):Object.keys(t),i=0;i<r.length;i++){for(var o=r[i],a=t[o].from,s=e;s;){if(s._provided&&a in s._provided){n[o]=s._provided[a];break}s=s.$parent}if(!s&&"default"in t[o]){var c=t[o].default;n[o]="function"==typeof c?c.call(e):c}}return n}}function Ct(t,n){var r,o,a,s,c;if(Array.isArray(t)||"string"==typeof t)for(r=new Array(t.length),o=0,a=t.length;o<a;o++)r[o]=n(t[o],o);else if("number"==typeof t)for(r=new Array(t),o=0;o<t;o++)r[o]=n(o+1,o);else if(i(t))for(s=Object.keys(t),r=new Array(s.length),o=0,a=s.length;o<a;o++)c=s[o],r[o]=n(t[c],c,o);return e(r)&&(r._isVList=!0),r}function wt(t,e,n,r){var i,o=this.$scopedSlots[t];if(o)n=n||{},r&&(n=h(h({},r),n)),i=o(n)||e;else{var a=this.$slots[t];a&&(a._rendered=!0),i=a||e}var s=n&&n.slot;return s?this.$createElement("template",{slot:s},i):i}function xt(t){return R(this.$options,"filters",t)||Un}function kt(t,e,n,r){var i=Jn.keyCodes[e]||n;return i?Array.isArray(i)?-1===i.indexOf(t):i!==t:r?Hn(r)!==e:void 0}function At(t,e,n,r,o){if(n)if(i(n)){Array.isArray(n)&&(n=m(n));var a,s=function(i){if("class"===i||"style"===i||Ln(i))a=t;else{var s=t.attrs&&t.attrs.type;a=r||Jn.mustUseProp(e,s,i)?t.domProps||(t.domProps={}):t.attrs||(t.attrs={})}if(!(i in a)&&(a[i]=n[i],o)){(t.on||(t.on={}))["update:"+i]=function(t){n[i]=t}}};for(var c in n)s(c)}else;return t}function Ot(t,e){var n=this._staticTrees||(this._staticTrees=[]),r=n[t];return r&&!e?Array.isArray(r)?A(r):k(r):(r=n[t]=this.$options.staticRenderFns[t].call(this._renderProxy,null,this),Tt(r,"__static__"+t,!1),r)}function St(t,e,n){return Tt(t,"__once__"+e+(n?"_"+n:""),!0),t}function Tt(t,e,n){if(Array.isArray(t))for(var r=0;r<t.length;r++)t[r]&&"string"!=typeof t[r]&&Et(t[r],e+"_"+r,n);else Et(t,e,n)}function Et(t,e,n){t.isStatic=!0,t.key=e,t.isOnce=n}function jt(t,e){if(e)if(o(e)){var n=t.on=t.on?h({},t.on):{};for(var r in e){var i=n[r],a=e[r];n[r]=i?[].concat(i,a):a}}else;return t}function Nt(t){t._o=St,t._n=c,t._s=s,t._l=Ct,t._t=wt,t._q=g,t._i=_,t._m=Ot,t._f=xt,t._k=kt,t._b=At,t._v=x,t._e=gr,t._u=lt,t._g=jt}function It(t,e,r,i,o){var a=o.options;this.data=t,this.props=e,this.children=r,this.parent=i,this.listeners=t.on||jn,this.injections=$t(a.inject,i),this.slots=function(){return ct(r,i)};var s=Object.create(i),c=n(a._compiled),u=!c;c&&(this.$options=a,this.$slots=this.slots(),this.$scopedSlots=t.scopedSlots||jn),a._scopeId?this._c=function(t,e,n,r){var o=Dt(s,t,e,n,r,u);return o&&(o.fnScopeId=a._scopeId,o.fnContext=i),o}:this._c=function(t,e,n,r){return Dt(s,t,e,n,r,u)}}function Lt(t,e){for(var n in e)t[Pn(n)]=e[n]}function Mt(r,o,a,s,c){if(!t(r)){var u=a.$options._base;if(i(r)&&(r=u.extend(r)),"function"==typeof r){var l;if(t(r.cid)&&(l=r,void 0===(r=function(r,o,a){if(n(r.error)&&e(r.errorComp))return r.errorComp;if(e(r.resolved))return r.resolved;if(n(r.loading)&&e(r.loadingComp))return r.loadingComp;if(!e(r.contexts)){var s=r.contexts=[a],c=!0,u=function(){for(var t=0,e=s.length;t<e;t++)s[t].$forceUpdate()},l=b(function(t){r.resolved=nt(t,o),c||u()}),f=b(function(t){e(r.errorComp)&&(r.error=!0,u())}),p=r(l,f);return i(p)&&("function"==typeof p.then?t(r.resolved)&&p.then(l,f):e(p.component)&&"function"==typeof p.component.then&&(p.component.then(l,f),e(p.error)&&(r.errorComp=nt(p.error,o)),e(p.loading)&&(r.loadingComp=nt(p.loading,o),0===p.delay?r.loading=!0:setTimeout(function(){t(r.resolved)&&t(r.error)&&(r.loading=!0,u())},p.delay||200)),e(p.timeout)&&setTimeout(function(){t(r.resolved)&&f(null)},p.timeout))),c=!1,r.loading?r.loadingComp:r.resolved}r.contexts.push(a)}(l,u,a))))return function(t,e,n,r,i){var o=gr();return o.asyncFactory=t,o.asyncMeta={data:e,context:n,children:r,tag:i},o}(l,o,a,s,c);o=o||{},Ft(r),e(o.model)&&function(t,n){var r=t.model&&t.model.prop||"value",i=t.model&&t.model.event||"input";(n.props||(n.props={}))[r]=n.model.value;var o=n.on||(n.on={});e(o[i])?o[i]=[n.model.callback].concat(o[i]):o[i]=n.model.callback}(r.options,o);var f=function(n,r,i){var o=r.options.props;if(!t(o)){var a={},s=n.attrs,c=n.props;if(e(s)||e(c))for(var u in o){var l=Hn(u);Q(a,c,u,l,!0)||Q(a,s,u,l,!1)}return a}}(o,r);if(n(r.options.functional))return function(t,n,r,i,o){var a=t.options,s={},c=a.props;if(e(c))for(var u in c)s[u]=H(u,c,n||jn);else e(r.attrs)&&Lt(s,r.attrs),e(r.props)&&Lt(s,r.props);var l=new It(r,s,o,i,t),f=a.render.call(null,l._c,l);return f instanceof mr&&(f.fnContext=i,f.fnOptions=a,r.slot&&((f.data||(f.data={})).slot=r.slot)),f}(r,f,o,a,s);var p=o.on;if(o.on=o.nativeOn,n(r.options.abstract)){var d=o.slot;o={},d&&(o.slot=d)}!function(t){t.hook||(t.hook={});for(var e=0;e<Gr.length;e++){var n=Gr[e],r=t.hook[n],i=Wr[n];t.hook[n]=r?function(t,e){return function(n,r,i,o){t(n,r,i,o),e(n,r,i,o)}}(i,r):i}}(o);var v=r.options.name||c;return new mr("vue-component-"+r.cid+(v?"-"+v:""),o,void 0,void 0,void 0,a,{Ctor:r,propsData:f,listeners:p,tag:c,children:s},l)}}}function Dt(t,i,o,a,s,c){return(Array.isArray(o)||r(o))&&(s=a,a=o,o=void 0),n(c)&&(s=Xr),function(t,n,i,o,a){if(e(i)&&e(i.__ob__))return gr();e(i)&&e(i.is)&&(n=i.is);if(!n)return gr();Array.isArray(o)&&"function"==typeof o[0]&&((i=i||{}).scopedSlots={default:o[0]},o.length=0);a===Xr?o=function(t){return r(t)?[x(t)]:Array.isArray(t)?et(t):void 0}(o):a===Zr&&(o=function(t){for(var e=0;e<t.length;e++)if(Array.isArray(t[e]))return Array.prototype.concat.apply([],t);return t}(o));var s,c;if("string"==typeof n){var u;c=t.$vnode&&t.$vnode.ns||Jn.getTagNamespace(n),s=Jn.isReservedTag(n)?new mr(Jn.parsePlatformTagName(n),i,o,void 0,void 0,t):e(u=R(t.$options,"components",n))?Mt(u,i,t,o,n):new mr(n,i,o,void 0,void 0,t)}else s=Mt(n,i,t,o);return e(s)?(c&&Pt(s,c),s):gr()}(t,i,o,a,s)}function Pt(r,i,o){if(r.ns=i,"foreignObject"===r.tag&&(i=void 0,o=!0),e(r.children))for(var a=0,s=r.children.length;a<s;a++){var c=r.children[a];e(c.tag)&&(t(c.ns)||n(o))&&Pt(c,i,o)}}function Ft(t){var e=t.options;if(t.super){var n=Ft(t.super);if(n!==t.superOptions){t.superOptions=n;var r=function(t){var e,n=t.options,r=t.extendOptions,i=t.sealedOptions;for(var o in n)n[o]!==i[o]&&(e||(e={}),e[o]=function(t,e,n){{if(Array.isArray(t)){var r=[];n=Array.isArray(n)?n:[n],e=Array.isArray(e)?e:[e];for(var i=0;i<t.length;i++)(e.indexOf(t[i])>=0||n.indexOf(t[i])<0)&&r.push(t[i]);return r}return t}}(n[o],r[o],i[o]));return e}(t);r&&h(t.extendOptions,r),(e=t.options=F(n,t.extendOptions)).name&&(e.components[e.name]=t)}}return e}function Rt(t){this._init(t)}function Ht(t){t.cid=0;var e=1;t.extend=function(t){t=t||{};var n=this,r=n.cid,i=t._Ctor||(t._Ctor={});if(i[r])return i[r];var o=t.name||n.options.name,a=function(t){this._init(t)};return a.prototype=Object.create(n.prototype),a.prototype.constructor=a,a.cid=e++,a.options=F(n.options,t),a.super=n,a.options.props&&function(t){var e=t.options.props;for(var n in e)mt(t.prototype,"_props",n)}(a),a.options.computed&&function(t){var e=t.options.computed;for(var n in e)gt(t.prototype,n,e[n])}(a),a.extend=n.extend,a.mixin=n.mixin,a.use=n.use,zn.forEach(function(t){a[t]=n[t]}),o&&(a.options.components[o]=a),a.superOptions=n.options,a.extendOptions=t,a.sealedOptions=h({},a.options),i[r]=a,a}}function Bt(t){return t&&(t.Ctor.options.name||t.tag)}function Ut(t,e){return Array.isArray(t)?t.indexOf(e)>-1:"string"==typeof t?t.split(",").indexOf(e)>-1:!!function(t){return"[object RegExp]"===Nn.call(t)}(t)&&t.test(e)}function Vt(t,e){var n=t.cache,r=t.keys,i=t._vnode;for(var o in n){var a=n[o];if(a){var s=Bt(a.componentOptions);s&&!e(s)&&zt(n,o,r,i)}}}function zt(t,e,n,r){var i=t[e];!i||r&&i.tag===r.tag||i.componentInstance.$destroy(),t[e]=null,l(n,e)}function Kt(t){for(var n=t.data,r=t,i=t;e(i.componentInstance);)(i=i.componentInstance._vnode)&&i.data&&(n=Jt(i.data,n));for(;e(r=r.parent);)r&&r.data&&(n=Jt(n,r.data));return function(t,n){if(e(t)||e(n))return qt(t,Wt(n));return""}(n.staticClass,n.class)}function Jt(t,n){return{staticClass:qt(t.staticClass,n.staticClass),class:e(t.class)?[t.class,n.class]:n.class}}function qt(t,e){return t?e?t+" "+e:t:e||""}function Wt(t){return Array.isArray(t)?function(t){for(var n,r="",i=0,o=t.length;i<o;i++)e(n=Wt(t[i]))&&""!==n&&(r&&(r+=" "),r+=n);return r}(t):i(t)?function(t){var e="";for(var n in t)t[n]&&(e&&(e+=" "),e+=n);return e}(t):"string"==typeof t?t:""}function Gt(t){return bi(t)?"svg":"math"===t?"math":void 0}function Zt(t){if("string"==typeof t){var e=document.querySelector(t);return e||document.createElement("div")}return t}function Xt(t,e){var n=t.data.ref;if(n){var r=t.context,i=t.componentInstance||t.elm,o=r.$refs;e?Array.isArray(o[n])?l(o[n],i):o[n]===i&&(o[n]=void 0):t.data.refInFor?Array.isArray(o[n])?o[n].indexOf(i)<0&&o[n].push(i):o[n]=[i]:o[n]=i}}function Yt(r,i){return r.key===i.key&&(r.tag===i.tag&&r.isComment===i.isComment&&e(r.data)===e(i.data)&&function(t,n){if("input"!==t.tag)return!0;var r,i=e(r=t.data)&&e(r=r.attrs)&&r.type,o=e(r=n.data)&&e(r=r.attrs)&&r.type;return i===o||wi(i)&&wi(o)}(r,i)||n(r.isAsyncPlaceholder)&&r.asyncFactory===i.asyncFactory&&t(i.asyncFactory.error))}function Qt(t,n,r){var i,o,a={};for(i=n;i<=r;++i)e(o=t[i].key)&&(a[o]=i);return a}function te(t,e){(t.data.directives||e.data.directives)&&function(t,e){var n,r,i,o=t===Ai,a=e===Ai,s=ee(t.data.directives,t.context),c=ee(e.data.directives,e.context),u=[],l=[];for(n in c)r=s[n],i=c[n],r?(i.oldValue=r.value,ne(i,"update",e,t),i.def&&i.def.componentUpdated&&l.push(i)):(ne(i,"bind",e,t),i.def&&i.def.inserted&&u.push(i));if(u.length){var f=function(){for(var n=0;n<u.length;n++)ne(u[n],"inserted",e,t)};o?Y(e,"insert",f):f()}l.length&&Y(e,"postpatch",function(){for(var n=0;n<l.length;n++)ne(l[n],"componentUpdated",e,t)});if(!o)for(n in s)c[n]||ne(s[n],"unbind",t,t,a)}(t,e)}function ee(t,e){var n=Object.create(null);if(!t)return n;var r,i;for(r=0;r<t.length;r++)(i=t[r]).modifiers||(i.modifiers=Ti),n[function(t){return t.rawName||t.name+"."+Object.keys(t.modifiers||{}).join(".")}(i)]=i,i.def=R(e.$options,"directives",i.name);return n}function ne(t,e,n,r,i){var o=t.def&&t.def[e];if(o)try{o(n.elm,t,n,r,i)}catch(r){V(r,n.context,"directive "+t.name+" "+e+" hook")}}function re(n,r){var i=r.componentOptions;if(!(e(i)&&!1===i.Ctor.options.inheritAttrs||t(n.data.attrs)&&t(r.data.attrs))){var o,a,s=r.elm,c=n.data.attrs||{},u=r.data.attrs||{};e(u.__ob__)&&(u=r.data.attrs=h({},u));for(o in u)a=u[o],c[o]!==a&&ie(s,o,a);(Qn||er)&&u.value!==c.value&&ie(s,"value",u.value);for(o in c)t(u[o])&&(hi(o)?s.removeAttributeNS(vi,mi(o)):pi(o)||s.removeAttribute(o))}}function ie(t,e,n){if(di(e))yi(n)?t.removeAttribute(e):(n="allowfullscreen"===e&&"EMBED"===t.tagName?"true":e,t.setAttribute(e,n));else if(pi(e))t.setAttribute(e,yi(n)||"false"===n?"false":"true");else if(hi(e))yi(n)?t.removeAttributeNS(vi,mi(e)):t.setAttributeNS(vi,e,n);else if(yi(n))t.removeAttribute(e);else{if(Qn&&!tr&&"TEXTAREA"===t.tagName&&"placeholder"===e&&!t.__ieph){var r=function(e){e.stopImmediatePropagation(),t.removeEventListener("input",r)};t.addEventListener("input",r),t.__ieph=!0}t.setAttribute(e,n)}}function oe(n,r){var i=r.elm,o=r.data,a=n.data;if(!(t(o.staticClass)&&t(o.class)&&(t(a)||t(a.staticClass)&&t(a.class)))){var s=Kt(r),c=i._transitionClasses;e(c)&&(s=qt(s,Wt(c))),s!==i._prevClass&&(i.setAttribute("class",s),i._prevClass=s)}}function ae(t){function e(){(a||(a=[])).push(t.slice(v,i).trim()),v=i+1}var n,r,i,o,a,s=!1,c=!1,u=!1,l=!1,f=0,p=0,d=0,v=0;for(i=0;i<t.length;i++)if(r=n,n=t.charCodeAt(i),s)39===n&&92!==r&&(s=!1);else if(c)34===n&&92!==r&&(c=!1);else if(u)96===n&&92!==r&&(u=!1);else if(l)47===n&&92!==r&&(l=!1);else if(124!==n||124===t.charCodeAt(i+1)||124===t.charCodeAt(i-1)||f||p||d){switch(n){case 34:c=!0;break;case 39:s=!0;break;case 96:u=!0;break;case 40:d++;break;case 41:d--;break;case 91:p++;break;case 93:p--;break;case 123:f++;break;case 125:f--}if(47===n){for(var h=i-1,m=void 0;h>=0&&" "===(m=t.charAt(h));h--);m&&Ii.test(m)||(l=!0)}}else void 0===o?(v=i+1,o=t.slice(0,i).trim()):e();if(void 0===o?o=t.slice(0,i).trim():0!==v&&e(),a)for(i=0;i<a.length;i++)o=function(t,e){var n=e.indexOf("(");{if(n<0)return'_f("'+e+'")('+t+")";var r=e.slice(0,n),i=e.slice(n+1);return'_f("'+r+'")('+t+","+i}}(o,a[i]);return o}function se(t){console.error("[Vue compiler]: "+t)}function ce(t,e){return t?t.map(function(t){return t[e]}).filter(function(t){return t}):[]}function ue(t,e,n){(t.props||(t.props=[])).push({name:e,value:n}),t.plain=!1}function le(t,e,n){(t.attrs||(t.attrs=[])).push({name:e,value:n}),t.plain=!1}function fe(t,e,n){t.attrsMap[e]=n,t.attrsList.push({name:e,value:n})}function pe(t,e,n,r,i,o){(t.directives||(t.directives=[])).push({name:e,rawName:n,value:r,arg:i,modifiers:o}),t.plain=!1}function de(t,e,n,r,i,o){(r=r||jn).capture&&(delete r.capture,e="!"+e),r.once&&(delete r.once,e="~"+e),r.passive&&(delete r.passive,e="&"+e),"click"===e&&(r.right?(e="contextmenu",delete r.right):r.middle&&(e="mouseup"));var a;r.native?(delete r.native,a=t.nativeEvents||(t.nativeEvents={})):a=t.events||(t.events={});var s={value:n};r!==jn&&(s.modifiers=r);var c=a[e];Array.isArray(c)?i?c.unshift(s):c.push(s):a[e]=c?i?[s,c]:[c,s]:s,t.plain=!1}function ve(t,e,n){var r=he(t,":"+e)||he(t,"v-bind:"+e);if(null!=r)return ae(r);if(!1!==n){var i=he(t,e);if(null!=i)return JSON.stringify(i)}}function he(t,e,n){var r;if(null!=(r=t.attrsMap[e]))for(var i=t.attrsList,o=0,a=i.length;o<a;o++)if(i[o].name===e){i.splice(o,1);break}return n&&delete t.attrsMap[e],r}function me(t,e,n){var r=n||{},i="$$v";r.trim&&(i="(typeof $$v === 'string'? $$v.trim(): $$v)"),r.number&&(i="_n("+i+")");var o=ye(e,i);t.model={value:"("+e+")",expression:'"'+e+'"',callback:"function ($$v) {"+o+"}"}}function ye(t,e){var n=function(t){if(ei=t.length,t.indexOf("[")<0||t.lastIndexOf("]")<ei-1)return(ii=t.lastIndexOf("."))>-1?{exp:t.slice(0,ii),key:'"'+t.slice(ii+1)+'"'}:{exp:t,key:null};ni=t,ii=oi=ai=0;for(;!_e();)be(ri=ge())?$e(ri):91===ri&&function(t){var e=1;oi=ii;for(;!_e();)if(t=ge(),be(t))$e(t);else if(91===t&&e++,93===t&&e--,0===e){ai=ii;break}}(ri);return{exp:t.slice(0,oi),key:t.slice(oi+1,ai)}}(t);return null===n.key?t+"="+e:"$set("+n.exp+", "+n.key+", "+e+")"}function ge(){return ni.charCodeAt(++ii)}function _e(){return ii>=ei}function be(t){return 34===t||39===t}function $e(t){for(var e=t;!_e()&&(t=ge())!==e;);}function Ce(t,e,n,r,i){e=function(t){return t._withTask||(t._withTask=function(){Er=!0;var e=t.apply(null,arguments);return Er=!1,e})}(e),n&&(e=function(t,e,n){var r=si;return function i(){null!==t.apply(null,arguments)&&we(e,i,n,r)}}(e,t,r)),si.addEventListener(t,e,or?{capture:r,passive:i}:r)}function we(t,e,n,r){(r||si).removeEventListener(t,e._withTask||e,n)}function xe(n,r){if(!t(n.data.on)||!t(r.data.on)){var i=r.data.on||{},o=n.data.on||{};si=r.elm,function(t){if(e(t[Li])){var n=Qn?"change":"input";t[n]=[].concat(t[Li],t[n]||[]),delete t[Li]}e(t[Mi])&&(t.change=[].concat(t[Mi],t.change||[]),delete t[Mi])}(i),X(i,o,Ce,we,r.context),si=void 0}}function ke(n,r){if(!t(n.data.domProps)||!t(r.data.domProps)){var i,o,a=r.elm,s=n.data.domProps||{},u=r.data.domProps||{};e(u.__ob__)&&(u=r.data.domProps=h({},u));for(i in s)t(u[i])&&(a[i]="");for(i in u){if(o=u[i],"textContent"===i||"innerHTML"===i){if(r.children&&(r.children.length=0),o===s[i])continue;1===a.childNodes.length&&a.removeChild(a.childNodes[0])}if("value"===i){a._value=o;var l=t(o)?"":String(o);(function(t,n){return!t.composing&&("OPTION"===t.tagName||function(t,e){var n=!0;try{n=document.activeElement!==t}catch(t){}return n&&t.value!==e}(t,n)||function(t,n){var r=t.value,i=t._vModifiers;if(e(i)){if(i.lazy)return!1;if(i.number)return c(r)!==c(n);if(i.trim)return r.trim()!==n.trim()}return r!==n}(t,n))})(a,l)&&(a.value=l)}else a[i]=o}}}function Ae(t){var e=Oe(t.style);return t.staticStyle?h(t.staticStyle,e):e}function Oe(t){return Array.isArray(t)?m(t):"string"==typeof t?Fi(t):t}function Se(n,r){var i=r.data,o=n.data;if(!(t(i.staticStyle)&&t(i.style)&&t(o.staticStyle)&&t(o.style))){var a,s,c=r.elm,u=o.staticStyle,l=o.normalizedStyle||o.style||{},f=u||l,p=Oe(r.data.style)||{};r.data.normalizedStyle=e(p.__ob__)?h({},p):p;var d=function(t,e){var n,r={};if(e)for(var i=t;i.componentInstance;)(i=i.componentInstance._vnode)&&i.data&&(n=Ae(i.data))&&h(r,n);(n=Ae(t.data))&&h(r,n);for(var o=t;o=o.parent;)o.data&&(n=Ae(o.data))&&h(r,n);return r}(r,!0);for(s in f)t(d[s])&&Bi(c,s,"");for(s in d)(a=d[s])!==f[s]&&Bi(c,s,null==a?"":a)}}function Te(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.add(e)}):t.classList.add(e);else{var n=" "+(t.getAttribute("class")||"")+" ";n.indexOf(" "+e+" ")<0&&t.setAttribute("class",(n+e).trim())}}function Ee(t,e){if(e&&(e=e.trim()))if(t.classList)e.indexOf(" ")>-1?e.split(/\s+/).forEach(function(e){return t.classList.remove(e)}):t.classList.remove(e),t.classList.length||t.removeAttribute("class");else{for(var n=" "+(t.getAttribute("class")||"")+" ",r=" "+e+" ";n.indexOf(r)>=0;)n=n.replace(r," ");(n=n.trim())?t.setAttribute("class",n):t.removeAttribute("class")}}function je(t){if(t){if("object"==typeof t){var e={};return!1!==t.css&&h(e,Ki(t.name||"v")),h(e,t),e}return"string"==typeof t?Ki(t):void 0}}function Ne(t){Qi(function(){Qi(t)})}function Ie(t,e){var n=t._transitionClasses||(t._transitionClasses=[]);n.indexOf(e)<0&&(n.push(e),Te(t,e))}function Le(t,e){t._transitionClasses&&l(t._transitionClasses,e),Ee(t,e)}function Me(t,e,n){var r=De(t,e),i=r.type,o=r.timeout,a=r.propCount;if(!i)return n();var s=i===qi?Zi:Yi,c=0,u=function(){t.removeEventListener(s,l),n()},l=function(e){e.target===t&&++c>=a&&u()};setTimeout(function(){c<a&&u()},o+1),t.addEventListener(s,l)}function De(t,e){var n,r=window.getComputedStyle(t),i=r[Gi+"Delay"].split(", "),o=r[Gi+"Duration"].split(", "),a=Pe(i,o),s=r[Xi+"Delay"].split(", "),c=r[Xi+"Duration"].split(", "),u=Pe(s,c),l=0,f=0;e===qi?a>0&&(n=qi,l=a,f=o.length):e===Wi?u>0&&(n=Wi,l=u,f=c.length):f=(n=(l=Math.max(a,u))>0?a>u?qi:Wi:null)?n===qi?o.length:c.length:0;return{type:n,timeout:l,propCount:f,hasTransform:n===qi&&to.test(r[Gi+"Property"])}}function Pe(t,e){for(;t.length<e.length;)t=t.concat(t);return Math.max.apply(null,e.map(function(e,n){return Fe(e)+Fe(t[n])}))}function Fe(t){return 1e3*Number(t.slice(0,-1))}function Re(n,r){var o=n.elm;e(o._leaveCb)&&(o._leaveCb.cancelled=!0,o._leaveCb());var a=je(n.data.transition);if(!t(a)&&!e(o._enterCb)&&1===o.nodeType){for(var s=a.css,u=a.type,l=a.enterClass,f=a.enterToClass,p=a.enterActiveClass,d=a.appearClass,v=a.appearToClass,h=a.appearActiveClass,m=a.beforeEnter,y=a.enter,g=a.afterEnter,_=a.enterCancelled,$=a.beforeAppear,C=a.appear,w=a.afterAppear,x=a.appearCancelled,k=a.duration,A=Pr,O=Pr.$vnode;O&&O.parent;)A=(O=O.parent).context;var S=!A._isMounted||!n.isRootInsert;if(!S||C||""===C){var T=S&&d?d:l,E=S&&h?h:p,j=S&&v?v:f,N=S?$||m:m,I=S&&"function"==typeof C?C:y,L=S?w||g:g,M=S?x||_:_,D=c(i(k)?k.enter:k),P=!1!==s&&!tr,F=Ue(I),R=o._enterCb=b(function(){P&&(Le(o,j),Le(o,E)),R.cancelled?(P&&Le(o,T),M&&M(o)):L&&L(o),o._enterCb=null});n.data.show||Y(n,"insert",function(){var t=o.parentNode,e=t&&t._pending&&t._pending[n.key];e&&e.tag===n.tag&&e.elm._leaveCb&&e.elm._leaveCb(),I&&I(o,R)}),N&&N(o),P&&(Ie(o,T),Ie(o,E),Ne(function(){Ie(o,j),Le(o,T),R.cancelled||F||(Be(D)?setTimeout(R,D):Me(o,u,R))})),n.data.show&&(r&&r(),I&&I(o,R)),P||F||R()}}}function He(n,r){function o(){x.cancelled||(n.data.show||((a.parentNode._pending||(a.parentNode._pending={}))[n.key]=n),v&&v(a),$&&(Ie(a,f),Ie(a,d),Ne(function(){Ie(a,p),Le(a,f),x.cancelled||C||(Be(w)?setTimeout(x,w):Me(a,l,x))})),h&&h(a,x),$||C||x())}var a=n.elm;e(a._enterCb)&&(a._enterCb.cancelled=!0,a._enterCb());var s=je(n.data.transition);if(t(s)||1!==a.nodeType)return r();if(!e(a._leaveCb)){var u=s.css,l=s.type,f=s.leaveClass,p=s.leaveToClass,d=s.leaveActiveClass,v=s.beforeLeave,h=s.leave,m=s.afterLeave,y=s.leaveCancelled,g=s.delayLeave,_=s.duration,$=!1!==u&&!tr,C=Ue(h),w=c(i(_)?_.leave:_),x=a._leaveCb=b(function(){a.parentNode&&a.parentNode._pending&&(a.parentNode._pending[n.key]=null),$&&(Le(a,p),Le(a,d)),x.cancelled?($&&Le(a,f),y&&y(a)):(r(),m&&m(a)),a._leaveCb=null});g?g(o):o()}}function Be(t){return"number"==typeof t&&!isNaN(t)}function Ue(n){if(t(n))return!1;var r=n.fns;return e(r)?Ue(Array.isArray(r)?r[0]:r):(n._length||n.length)>1}function Ve(t,e){!0!==e.data.show&&Re(e)}function ze(t,e,n){Ke(t,e,n),(Qn||er)&&setTimeout(function(){Ke(t,e,n)},0)}function Ke(t,e,n){var r=e.value,i=t.multiple;if(!i||Array.isArray(r)){for(var o,a,s=0,c=t.options.length;s<c;s++)if(a=t.options[s],i)o=_(r,qe(a))>-1,a.selected!==o&&(a.selected=o);else if(g(qe(a),r))return void(t.selectedIndex!==s&&(t.selectedIndex=s));i||(t.selectedIndex=-1)}}function Je(t,e){return e.every(function(e){return!g(e,t)})}function qe(t){return"_value"in t?t._value:t.value}function We(t){t.target.composing=!0}function Ge(t){t.target.composing&&(t.target.composing=!1,Ze(t.target,"input"))}function Ze(t,e){var n=document.createEvent("HTMLEvents");n.initEvent(e,!0,!0),t.dispatchEvent(n)}function Xe(t){return!t.componentInstance||t.data&&t.data.transition?t:Xe(t.componentInstance._vnode)}function Ye(t){var e=t&&t.componentOptions;return e&&e.Ctor.options.abstract?Ye(it(e.children)):t}function Qe(t){var e={},n=t.$options;for(var r in n.propsData)e[r]=t[r];var i=n._parentListeners;for(var o in i)e[Pn(o)]=i[o];return e}function tn(t,e){if(/\d-keep-alive$/.test(e.tag))return t("keep-alive",{props:e.componentOptions.propsData})}function en(t){t.elm._moveCb&&t.elm._moveCb(),t.elm._enterCb&&t.elm._enterCb()}function nn(t){t.data.newPos=t.elm.getBoundingClientRect()}function rn(t){var e=t.data.pos,n=t.data.newPos,r=e.left-n.left,i=e.top-n.top;if(r||i){t.data.moved=!0;var o=t.elm.style;o.transform=o.WebkitTransform="translate("+r+"px,"+i+"px)",o.transitionDuration="0s"}}function on(t,e){var n=e?zo:Vo;return t.replace(n,function(t){return Uo[t]})}function an(t,e,n){return{type:1,tag:t,attrsList:e,attrsMap:function(t){for(var e={},n=0,r=t.length;n<r;n++)e[t[n].name]=t[n].value;return e}(e),parent:n,children:[]}}function sn(t,e){function n(t){t.pre&&(s=!1),Lo(t.tag)&&(c=!1);for(var n=0;n<Io.length;n++)Io[n](t,e)}To=e.warn||se,Lo=e.isPreTag||Bn,Mo=e.mustUseProp||Bn,Do=e.getTagNamespace||Bn,jo=ce(e.modules,"transformNode"),No=ce(e.modules,"preTransformNode"),Io=ce(e.modules,"postTransformNode"),Eo=e.delimiters;var r,i,o=[],a=!1!==e.preserveWhitespace,s=!1,c=!1;return function(t,e){function n(e){l+=e,t=t.substring(e)}function r(t,n,r){var i,s;if(null==n&&(n=l),null==r&&(r=l),t&&(s=t.toLowerCase()),t)for(i=a.length-1;i>=0&&a[i].lowerCasedTag!==s;i--);else i=0;if(i>=0){for(var c=a.length-1;c>=i;c--)e.end&&e.end(a[c].tag,n,r);a.length=i,o=i&&a[i-1].tag}else"br"===s?e.start&&e.start(t,[],!0,n,r):"p"===s&&(e.start&&e.start(t,[],!1,n,r),e.end&&e.end(t,n,r))}for(var i,o,a=[],s=e.expectHTML,c=e.isUnaryTag||Bn,u=e.canBeLeftOpenTag||Bn,l=0;t;){if(i=t,o&&Ho(o)){var f=0,p=o.toLowerCase(),d=Bo[p]||(Bo[p]=new RegExp("([\\s\\S]*?)(</"+p+"[^>]*>)","i")),v=t.replace(d,function(t,n,r){return f=r.length,Ho(p)||"noscript"===p||(n=n.replace(/<!--([\s\S]*?)-->/g,"$1").replace(/<!\[CDATA\[([\s\S]*?)]]>/g,"$1")),Jo(p,n)&&(n=n.slice(1)),e.chars&&e.chars(n),""});l+=t.length-v.length,t=v,r(p,l-f,l)}else{var h=t.indexOf("<");if(0===h){if(Ao.test(t)){var m=t.indexOf("--\x3e");if(m>=0){e.shouldKeepComment&&e.comment(t.substring(4,m)),n(m+3);continue}}if(Oo.test(t)){var y=t.indexOf("]>");if(y>=0){n(y+2);continue}}var g=t.match(ko);if(g){n(g[0].length);continue}var _=t.match(xo);if(_){var b=l;n(_[0].length),r(_[1],b,l);continue}var $=function(){var e=t.match(Co);if(e){var r={tagName:e[1],attrs:[],start:l};n(e[0].length);for(var i,o;!(i=t.match(wo))&&(o=t.match(_o));)n(o[0].length),r.attrs.push(o);if(i)return r.unarySlash=i[1],n(i[0].length),r.end=l,r}}();if($){!function(t){var n=t.tagName,i=t.unarySlash;s&&("p"===o&&go(n)&&r(o),u(n)&&o===n&&r(n));for(var l=c(n)||!!i,f=t.attrs.length,p=new Array(f),d=0;d<f;d++){var v=t.attrs[d];So&&-1===v[0].indexOf('""')&&(""===v[3]&&delete v[3],""===v[4]&&delete v[4],""===v[5]&&delete v[5]);var h=v[3]||v[4]||v[5]||"",m="a"===n&&"href"===v[1]?e.shouldDecodeNewlinesForHref:e.shouldDecodeNewlines;p[d]={name:v[1],value:on(h,m)}}l||(a.push({tag:n,lowerCasedTag:n.toLowerCase(),attrs:p}),o=n),e.start&&e.start(n,p,l,t.start,t.end)}($),Jo(o,t)&&n(1);continue}}var C=void 0,w=void 0,x=void 0;if(h>=0){for(w=t.slice(h);!(xo.test(w)||Co.test(w)||Ao.test(w)||Oo.test(w)||(x=w.indexOf("<",1))<0);)h+=x,w=t.slice(h);C=t.substring(0,h),n(h)}h<0&&(C=t,t=""),e.chars&&C&&e.chars(C)}if(t===i){e.chars&&e.chars(t);break}}r()}(t,{warn:To,expectHTML:e.expectHTML,isUnaryTag:e.isUnaryTag,canBeLeftOpenTag:e.canBeLeftOpenTag,shouldDecodeNewlines:e.shouldDecodeNewlines,shouldDecodeNewlinesForHref:e.shouldDecodeNewlinesForHref,shouldKeepComment:e.comments,start:function(t,a,u){var l=i&&i.ns||Do(t);Qn&&"svg"===l&&(a=function(t){for(var e=[],n=0;n<t.length;n++){var r=t[n];na.test(r.name)||(r.name=r.name.replace(ra,""),e.push(r))}return e}(a));var f=an(t,a,i);l&&(f.ns=l),function(t){return"style"===t.tag||"script"===t.tag&&(!t.attrsMap.type||"text/javascript"===t.attrsMap.type)}(f)&&!ur()&&(f.forbidden=!0);for(var p=0;p<No.length;p++)f=No[p](f,e)||f;if(s||(!function(t){null!=he(t,"v-pre")&&(t.pre=!0)}(f),f.pre&&(s=!0)),Lo(f.tag)&&(c=!0),s?function(t){var e=t.attrsList.length;if(e)for(var n=t.attrs=new Array(e),r=0;r<e;r++)n[r]={name:t.attrsList[r].name,value:JSON.stringify(t.attrsList[r].value)};else t.pre||(t.plain=!0)}(f):f.processed||(un(f),function(t){var e=he(t,"v-if");if(e)t.if=e,ln(t,{exp:e,block:t});else{null!=he(t,"v-else")&&(t.else=!0);var n=he(t,"v-else-if");n&&(t.elseif=n)}}(f),function(t){null!=he(t,"v-once")&&(t.once=!0)}(f),cn(f,e)),r?o.length||r.if&&(f.elseif||f.else)&&ln(r,{exp:f.elseif,block:f}):r=f,i&&!f.forbidden)if(f.elseif||f.else)!function(t,e){var n=function(t){var e=t.length;for(;e--;){if(1===t[e].type)return t[e];t.pop()}}(e.children);n&&n.if&&ln(n,{exp:t.elseif,block:t})}(f,i);else if(f.slotScope){i.plain=!1;var d=f.slotTarget||'"default"';(i.scopedSlots||(i.scopedSlots={}))[d]=f}else i.children.push(f),f.parent=i;u?n(f):(i=f,o.push(f))},end:function(){var t=o[o.length-1],e=t.children[t.children.length-1];e&&3===e.type&&" "===e.text&&!c&&t.children.pop(),o.length-=1,i=o[o.length-1],n(t)},chars:function(t){if(i&&(!Qn||"textarea"!==i.tag||i.attrsMap.placeholder!==t)){var e=i.children;if(t=c||t.trim()?function(t){return"script"===t.tag||"style"===t.tag}(i)?t:ea(t):a&&e.length?" ":""){var n;!s&&" "!==t&&(n=function(t,e){var n=e?fo(e):uo;if(n.test(t)){for(var r,i,o,a=[],s=[],c=n.lastIndex=0;r=n.exec(t);){(i=r.index)>c&&(s.push(o=t.slice(c,i)),a.push(JSON.stringify(o)));var u=ae(r[1].trim());a.push("_s("+u+")"),s.push({"@binding":u}),c=i+r[0].length}return c<t.length&&(s.push(o=t.slice(c)),a.push(JSON.stringify(o))),{expression:a.join("+"),tokens:s}}}(t,Eo))?e.push({type:2,expression:n.expression,tokens:n.tokens,text:t}):" "===t&&e.length&&" "===e[e.length-1].text||e.push({type:3,text:t})}}},comment:function(t){i.children.push({type:3,text:t,isComment:!0})}}),r}function cn(t,e){!function(t){var e=ve(t,"key");e&&(t.key=e)}(t),t.plain=!t.key&&!t.attrsList.length,function(t){var e=ve(t,"ref");e&&(t.ref=e,t.refInFor=function(t){var e=t;for(;e;){if(void 0!==e.for)return!0;e=e.parent}return!1}(t))}(t),function(t){if("slot"===t.tag)t.slotName=ve(t,"name");else{var e;"template"===t.tag?(e=he(t,"scope"),t.slotScope=e||he(t,"slot-scope")):(e=he(t,"slot-scope"))&&(t.slotScope=e);var n=ve(t,"slot");n&&(t.slotTarget='""'===n?'"default"':n,"template"===t.tag||t.slotScope||le(t,"slot",n))}}(t),function(t){var e;(e=ve(t,"is"))&&(t.component=e);null!=he(t,"inline-template")&&(t.inlineTemplate=!0)}(t);for(var n=0;n<jo.length;n++)t=jo[n](t,e)||t;!function(t){var e,n,r,i,o,a,s,c=t.attrsList;for(e=0,n=c.length;e<n;e++)if(r=i=c[e].name,o=c[e].value,Wo.test(r))if(t.hasBindings=!0,(a=function(t){var e=t.match(ta);if(e){var n={};return e.forEach(function(t){n[t.slice(1)]=!0}),n}}(r))&&(r=r.replace(ta,"")),Qo.test(r))r=r.replace(Qo,""),o=ae(o),s=!1,a&&(a.prop&&(s=!0,"innerHtml"===(r=Pn(r))&&(r="innerHTML")),a.camel&&(r=Pn(r)),a.sync&&de(t,"update:"+Pn(r),ye(o,"$event"))),s||!t.component&&Mo(t.tag,t.attrsMap.type,r)?ue(t,r,o):le(t,r,o);else if(qo.test(r))r=r.replace(qo,""),de(t,r,o,a,!1);else{var u=(r=r.replace(Wo,"")).match(Yo),l=u&&u[1];l&&(r=r.slice(0,-(l.length+1))),pe(t,r,i,o,l,a)}else le(t,r,JSON.stringify(o)),!t.component&&"muted"===r&&Mo(t.tag,t.attrsMap.type,r)&&ue(t,r,"true")}(t)}function un(t){var e;if(e=he(t,"v-for")){var n=function(t){var e=t.match(Go);if(!e)return;var n={};n.for=e[2].trim();var r=e[1].trim().replace(Xo,""),i=r.match(Zo);i?(n.alias=r.replace(Zo,""),n.iterator1=i[1].trim(),i[2]&&(n.iterator2=i[2].trim())):n.alias=r;return n}(e);n&&h(t,n)}}function ln(t,e){t.ifConditions||(t.ifConditions=[]),t.ifConditions.push(e)}function fn(t){return an(t.tag,t.attrsList.slice(),t.parent)}function pn(t){if(t.static=function(t){if(2===t.type)return!1;if(3===t.type)return!0;return!(!t.pre&&(t.hasBindings||t.if||t.for||In(t.tag)||!Fo(t.tag)||function(t){for(;t.parent;){if("template"!==(t=t.parent).tag)return!1;if(t.for)return!0}return!1}(t)||!Object.keys(t).every(Po)))}(t),1===t.type){if(!Fo(t.tag)&&"slot"!==t.tag&&null==t.attrsMap["inline-template"])return;for(var e=0,n=t.children.length;e<n;e++){var r=t.children[e];pn(r),r.static||(t.static=!1)}if(t.ifConditions)for(var i=1,o=t.ifConditions.length;i<o;i++){var a=t.ifConditions[i].block;pn(a),a.static||(t.static=!1)}}}function dn(t,e){if(1===t.type){if((t.static||t.once)&&(t.staticInFor=e),t.static&&t.children.length&&(1!==t.children.length||3!==t.children[0].type))return void(t.staticRoot=!0);if(t.staticRoot=!1,t.children)for(var n=0,r=t.children.length;n<r;n++)dn(t.children[n],e||!!t.for);if(t.ifConditions)for(var i=1,o=t.ifConditions.length;i<o;i++)dn(t.ifConditions[i].block,e)}}function vn(t,e,n){var r=e?"nativeOn:{":"on:{";for(var i in t)r+='"'+i+'":'+hn(i,t[i])+",";return r.slice(0,-1)+"}"}function hn(t,e){if(!e)return"function(){}";if(Array.isArray(e))return"["+e.map(function(e){return hn(t,e)}).join(",")+"]";var n=ca.test(e.value),r=sa.test(e.value);if(e.modifiers){var i="",o="",a=[];for(var s in e.modifiers)if(fa[s])o+=fa[s],ua[s]&&a.push(s);else if("exact"===s){var c=e.modifiers;o+=la(["ctrl","shift","alt","meta"].filter(function(t){return!c[t]}).map(function(t){return"$event."+t+"Key"}).join("||"))}else a.push(s);a.length&&(i+=function(t){return"if(!('button' in $event)&&"+t.map(mn).join("&&")+")return null;"}(a)),o&&(i+=o);return"function($event){"+i+(n?e.value+"($event)":r?"("+e.value+")($event)":e.value)+"}"}return n||r?e.value:"function($event){"+e.value+"}"}function mn(t){var e=parseInt(t,10);if(e)return"$event.keyCode!=="+e;var n=ua[t];return"_k($event.keyCode,"+JSON.stringify(t)+","+JSON.stringify(n)+",$event.key)"}function yn(t,e){var n=new da(e);return{render:"with(this){return "+(t?gn(t,n):'_c("div")')+"}",staticRenderFns:n.staticRenderFns}}function gn(t,e){if(t.staticRoot&&!t.staticProcessed)return _n(t,e);if(t.once&&!t.onceProcessed)return bn(t,e);if(t.for&&!t.forProcessed)return function(t,e,n,r){var i=t.for,o=t.alias,a=t.iterator1?","+t.iterator1:"",s=t.iterator2?","+t.iterator2:"";return t.forProcessed=!0,(r||"_l")+"(("+i+"),function("+o+a+s+"){return "+(n||gn)(t,e)+"})"}(t,e);if(t.if&&!t.ifProcessed)return $n(t,e);if("template"!==t.tag||t.slotTarget){if("slot"===t.tag)return function(t,e){var n=t.slotName||'"default"',r=kn(t,e),i="_t("+n+(r?","+r:""),o=t.attrs&&"{"+t.attrs.map(function(t){return Pn(t.name)+":"+t.value}).join(",")+"}",a=t.attrsMap["v-bind"];!o&&!a||r||(i+=",null");o&&(i+=","+o);a&&(i+=(o?"":",null")+","+a);return i+")"}(t,e);var n;if(t.component)n=function(t,e,n){var r=e.inlineTemplate?null:kn(e,n,!0);return"_c("+t+","+wn(e,n)+(r?","+r:"")+")"}(t.component,t,e);else{var r=t.plain?void 0:wn(t,e),i=t.inlineTemplate?null:kn(t,e,!0);n="_c('"+t.tag+"'"+(r?","+r:"")+(i?","+i:"")+")"}for(var o=0;o<e.transforms.length;o++)n=e.transforms[o](t,n);return n}return kn(t,e)||"void 0"}function _n(t,e){return t.staticProcessed=!0,e.staticRenderFns.push("with(this){return "+gn(t,e)+"}"),"_m("+(e.staticRenderFns.length-1)+(t.staticInFor?",true":"")+")"}function bn(t,e){if(t.onceProcessed=!0,t.if&&!t.ifProcessed)return $n(t,e);if(t.staticInFor){for(var n="",r=t.parent;r;){if(r.for){n=r.key;break}r=r.parent}return n?"_o("+gn(t,e)+","+e.onceId+++","+n+")":gn(t,e)}return _n(t,e)}function $n(t,e,n,r){return t.ifProcessed=!0,Cn(t.ifConditions.slice(),e,n,r)}function Cn(t,e,n,r){function i(t){return n?n(t,e):t.once?bn(t,e):gn(t,e)}if(!t.length)return r||"_e()";var o=t.shift();return o.exp?"("+o.exp+")?"+i(o.block)+":"+Cn(t,e,n,r):""+i(o.block)}function wn(t,e){var n="{",r=function(t,e){var n=t.directives;if(!n)return;var r,i,o,a,s="directives:[",c=!1;for(r=0,i=n.length;r<i;r++){o=n[r],a=!0;var u=e.directives[o.name];u&&(a=!!u(t,o,e.warn)),a&&(c=!0,s+='{name:"'+o.name+'",rawName:"'+o.rawName+'"'+(o.value?",value:("+o.value+"),expression:"+JSON.stringify(o.value):"")+(o.arg?',arg:"'+o.arg+'"':"")+(o.modifiers?",modifiers:"+JSON.stringify(o.modifiers):"")+"},")}if(c)return s.slice(0,-1)+"]"}(t,e);r&&(n+=r+","),t.key&&(n+="key:"+t.key+","),t.ref&&(n+="ref:"+t.ref+","),t.refInFor&&(n+="refInFor:true,"),t.pre&&(n+="pre:true,"),t.component&&(n+='tag:"'+t.tag+'",');for(var i=0;i<e.dataGenFns.length;i++)n+=e.dataGenFns[i](t);if(t.attrs&&(n+="attrs:{"+On(t.attrs)+"},"),t.props&&(n+="domProps:{"+On(t.props)+"},"),t.events&&(n+=vn(t.events,!1,e.warn)+","),t.nativeEvents&&(n+=vn(t.nativeEvents,!0,e.warn)+","),t.slotTarget&&!t.slotScope&&(n+="slot:"+t.slotTarget+","),t.scopedSlots&&(n+=function(t,e){return"scopedSlots:_u(["+Object.keys(t).map(function(n){return xn(n,t[n],e)}).join(",")+"])"}(t.scopedSlots,e)+","),t.model&&(n+="model:{value:"+t.model.value+",callback:"+t.model.callback+",expression:"+t.model.expression+"},"),t.inlineTemplate){var o=function(t,e){var n=t.children[0];if(1===n.type){var r=yn(n,e.options);return"inlineTemplate:{render:function(){"+r.render+"},staticRenderFns:["+r.staticRenderFns.map(function(t){return"function(){"+t+"}"}).join(",")+"]}"}}(t,e);o&&(n+=o+",")}return n=n.replace(/,$/,"")+"}",t.wrapData&&(n=t.wrapData(n)),t.wrapListeners&&(n=t.wrapListeners(n)),n}function xn(t,e,n){if(e.for&&!e.forProcessed)return function(t,e,n){var r=e.for,i=e.alias,o=e.iterator1?","+e.iterator1:"",a=e.iterator2?","+e.iterator2:"";return e.forProcessed=!0,"_l(("+r+"),function("+i+o+a+"){return "+xn(t,e,n)+"})"}(t,e,n);return"{key:"+t+",fn:"+("function("+String(e.slotScope)+"){return "+("template"===e.tag?e.if?e.if+"?"+(kn(e,n)||"undefined")+":undefined":kn(e,n)||"undefined":gn(e,n))+"}")+"}"}function kn(t,e,n,r,i){var o=t.children;if(o.length){var a=o[0];if(1===o.length&&a.for&&"template"!==a.tag&&"slot"!==a.tag)return(r||gn)(a,e);var s=n?function(t,e){for(var n=0,r=0;r<t.length;r++){var i=t[r];if(1===i.type){if(An(i)||i.ifConditions&&i.ifConditions.some(function(t){return An(t.block)})){n=2;break}(e(i)||i.ifConditions&&i.ifConditions.some(function(t){return e(t.block)}))&&(n=1)}}return n}(o,e.maybeComponent):0,c=i||function(t,e){if(1===t.type)return gn(t,e);return 3===t.type&&t.isComment?function(t){return"_e("+JSON.stringify(t.text)+")"}(t):function(t){return"_v("+(2===t.type?t.expression:Sn(JSON.stringify(t.text)))+")"}(t)};return"["+o.map(function(t){return c(t,e)}).join(",")+"]"+(s?","+s:"")}}function An(t){return void 0!==t.for||"template"===t.tag||"slot"===t.tag}function On(t){for(var e="",n=0;n<t.length;n++){var r=t[n];e+='"'+r.name+'":'+Sn(r.value)+","}return e.slice(0,-1)}function Sn(t){return t.replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}function Tn(t,e){try{return new Function(t)}catch(n){return e.push({err:n,code:t}),y}}function En(t){return Ro=Ro||document.createElement("div"),Ro.innerHTML=t?'<a href="\n"/>':'<div a="\n"/>',Ro.innerHTML.indexOf("&#10;")>0}var jn=Object.freeze({}),Nn=Object.prototype.toString,In=u("slot,component",!0),Ln=u("key,ref,slot,slot-scope,is"),Mn=Object.prototype.hasOwnProperty,Dn=/-(\w)/g,Pn=p(function(t){return t.replace(Dn,function(t,e){return e?e.toUpperCase():""})}),Fn=p(function(t){return t.charAt(0).toUpperCase()+t.slice(1)}),Rn=/\B([A-Z])/g,Hn=p(function(t){return t.replace(Rn,"-$1").toLowerCase()}),Bn=function(t,e,n){return!1},Un=function(t){return t},Vn="data-server-rendered",zn=["component","directive","filter"],Kn=["beforeCreate","created","beforeMount","mounted","beforeUpdate","updated","beforeDestroy","destroyed","activated","deactivated","errorCaptured"],Jn={optionMergeStrategies:Object.create(null),silent:!1,productionTip:!1,devtools:!1,performance:!1,errorHandler:null,warnHandler:null,ignoredElements:[],keyCodes:Object.create(null),isReservedTag:Bn,isReservedAttr:Bn,isUnknownElement:Bn,getTagNamespace:y,parsePlatformTagName:Un,mustUseProp:Bn,_lifecycleHooks:Kn},qn=/[^\w.$]/,Wn="__proto__"in{},Gn="undefined"!=typeof window,Zn="undefined"!=typeof WXEnvironment&&!!WXEnvironment.platform,Xn=Zn&&WXEnvironment.platform.toLowerCase(),Yn=Gn&&window.navigator.userAgent.toLowerCase(),Qn=Yn&&/msie|trident/.test(Yn),tr=Yn&&Yn.indexOf("msie 9.0")>0,er=Yn&&Yn.indexOf("edge/")>0,nr=Yn&&Yn.indexOf("android")>0||"android"===Xn,rr=Yn&&/iphone|ipad|ipod|ios/.test(Yn)||"ios"===Xn,ir=(Yn&&/chrome\/\d+/.test(Yn),{}.watch),or=!1;if(Gn)try{var ar={};Object.defineProperty(ar,"passive",{get:function(){or=!0}}),window.addEventListener("test-passive",null,ar)}catch(t){}var sr,cr,ur=function(){return void 0===sr&&(sr=!Gn&&"undefined"!=typeof global&&"server"===global.process.env.VUE_ENV),sr},lr=Gn&&window.__VUE_DEVTOOLS_GLOBAL_HOOK__,fr="undefined"!=typeof Symbol&&w(Symbol)&&"undefined"!=typeof Reflect&&w(Reflect.ownKeys);cr="undefined"!=typeof Set&&w(Set)?Set:function(){function t(){this.set=Object.create(null)}return t.prototype.has=function(t){return!0===this.set[t]},t.prototype.add=function(t){this.set[t]=!0},t.prototype.clear=function(){this.set=Object.create(null)},t}();var pr=y,dr=0,vr=function(){this.id=dr++,this.subs=[]};vr.prototype.addSub=function(t){this.subs.push(t)},vr.prototype.removeSub=function(t){l(this.subs,t)},vr.prototype.depend=function(){vr.target&&vr.target.addDep(this)},vr.prototype.notify=function(){for(var t=this.subs.slice(),e=0,n=t.length;e<n;e++)t[e].update()},vr.target=null;var hr=[],mr=function(t,e,n,r,i,o,a,s){this.tag=t,this.data=e,this.children=n,this.text=r,this.elm=i,this.ns=void 0,this.context=o,this.fnContext=void 0,this.fnOptions=void 0,this.fnScopeId=void 0,this.key=e&&e.key,this.componentOptions=a,this.componentInstance=void 0,this.parent=void 0,this.raw=!1,this.isStatic=!1,this.isRootInsert=!0,this.isComment=!1,this.isCloned=!1,this.isOnce=!1,this.asyncFactory=s,this.asyncMeta=void 0,this.isAsyncPlaceholder=!1},yr={child:{configurable:!0}};yr.child.get=function(){return this.componentInstance},Object.defineProperties(mr.prototype,yr);var gr=function(t){void 0===t&&(t="");var e=new mr;return e.text=t,e.isComment=!0,e},_r=Array.prototype,br=Object.create(_r);["push","pop","shift","unshift","splice","sort","reverse"].forEach(function(t){var e=_r[t];C(br,t,function(){for(var n=[],r=arguments.length;r--;)n[r]=arguments[r];var i,o=e.apply(this,n),a=this.__ob__;switch(t){case"push":case"unshift":i=n;break;case"splice":i=n.slice(2)}return i&&a.observeArray(i),a.dep.notify(),o})});var $r=Object.getOwnPropertyNames(br),Cr={shouldConvert:!0},wr=function(t){if(this.value=t,this.dep=new vr,this.vmCount=0,C(t,"__ob__",this),Array.isArray(t)){(Wn?O:S)(t,br,$r),this.observeArray(t)}else this.walk(t)};wr.prototype.walk=function(t){for(var e=Object.keys(t),n=0;n<e.length;n++)E(t,e[n],t[e[n]])},wr.prototype.observeArray=function(t){for(var e=0,n=t.length;e<n;e++)T(t[e])};var xr=Jn.optionMergeStrategies;xr.data=function(t,e,n){return n?M(t,e,n):e&&"function"!=typeof e?t:M(t,e)},Kn.forEach(function(t){xr[t]=D}),zn.forEach(function(t){xr[t+"s"]=P}),xr.watch=function(t,e,n,r){if(t===ir&&(t=void 0),e===ir&&(e=void 0),!e)return Object.create(t||null);if(!t)return e;var i={};h(i,t);for(var o in e){var a=i[o],s=e[o];a&&!Array.isArray(a)&&(a=[a]),i[o]=a?a.concat(s):Array.isArray(s)?s:[s]}return i},xr.props=xr.methods=xr.inject=xr.computed=function(t,e,n,r){if(!t)return e;var i=Object.create(null);return h(i,t),e&&h(i,e),i},xr.provide=M;var kr,Ar,Or=function(t,e){return void 0===e?t:e},Sr=[],Tr=!1,Er=!1;if("undefined"!=typeof setImmediate&&w(setImmediate))Ar=function(){setImmediate(J)};else if("undefined"==typeof MessageChannel||!w(MessageChannel)&&"[object MessageChannelConstructor]"!==MessageChannel.toString())Ar=function(){setTimeout(J,0)};else{var jr=new MessageChannel,Nr=jr.port2;jr.port1.onmessage=J,Ar=function(){Nr.postMessage(1)}}if("undefined"!=typeof Promise&&w(Promise)){var Ir=Promise.resolve();kr=function(){Ir.then(J),rr&&setTimeout(y)}}else kr=Ar;var Lr,Mr=new cr,Dr=p(function(t){var e="&"===t.charAt(0),n="~"===(t=e?t.slice(1):t).charAt(0),r="!"===(t=n?t.slice(1):t).charAt(0);return t=r?t.slice(1):t,{name:t,once:n,capture:r,passive:e}}),Pr=null,Fr=[],Rr=[],Hr={},Br=!1,Ur=!1,Vr=0,zr=0,Kr=function(t,e,n,r,i){this.vm=t,i&&(t._watcher=this),t._watchers.push(this),r?(this.deep=!!r.deep,this.user=!!r.user,this.lazy=!!r.lazy,this.sync=!!r.sync):this.deep=this.user=this.lazy=this.sync=!1,this.cb=n,this.id=++zr,this.active=!0,this.dirty=this.lazy,this.deps=[],this.newDeps=[],this.depIds=new cr,this.newDepIds=new cr,this.expression="","function"==typeof e?this.getter=e:(this.getter=function(t){if(!qn.test(t)){var e=t.split(".");return function(t){for(var n=0;n<e.length;n++){if(!t)return;t=t[e[n]]}return t}}}(e),this.getter||(this.getter=function(){})),this.value=this.lazy?void 0:this.get()};Kr.prototype.get=function(){!function(t){vr.target&&hr.push(vr.target),vr.target=t}(this);var t,e=this.vm;try{t=this.getter.call(e,e)}catch(t){if(!this.user)throw t;V(t,e,'getter for watcher "'+this.expression+'"')}finally{this.deep&&W(t),vr.target=hr.pop(),this.cleanupDeps()}return t},Kr.prototype.addDep=function(t){var e=t.id;this.newDepIds.has(e)||(this.newDepIds.add(e),this.newDeps.push(t),this.depIds.has(e)||t.addSub(this))},Kr.prototype.cleanupDeps=function(){for(var t=this.deps.length;t--;){var e=this.deps[t];this.newDepIds.has(e.id)||e.removeSub(this)}var n=this.depIds;this.depIds=this.newDepIds,this.newDepIds=n,this.newDepIds.clear(),n=this.deps,this.deps=this.newDeps,this.newDeps=n,this.newDeps.length=0},Kr.prototype.update=function(){this.lazy?this.dirty=!0:this.sync?this.run():function(t){var e=t.id;if(null==Hr[e]){if(Hr[e]=!0,Ur){for(var n=Fr.length-1;n>Vr&&Fr[n].id>t.id;)n--;Fr.splice(n+1,0,t)}else Fr.push(t);Br||(Br=!0,q(ht))}}(this)},Kr.prototype.run=function(){if(this.active){var t=this.get();if(t!==this.value||i(t)||this.deep){var e=this.value;if(this.value=t,this.user)try{this.cb.call(this.vm,t,e)}catch(t){V(t,this.vm,'callback for watcher "'+this.expression+'"')}else this.cb.call(this.vm,t,e)}}},Kr.prototype.evaluate=function(){this.value=this.get(),this.dirty=!1},Kr.prototype.depend=function(){for(var t=this.deps.length;t--;)this.deps[t].depend()},Kr.prototype.teardown=function(){if(this.active){this.vm._isBeingDestroyed||l(this.vm._watchers,this);for(var t=this.deps.length;t--;)this.deps[t].removeSub(this);this.active=!1}};var Jr={enumerable:!0,configurable:!0,get:y,set:y},qr={lazy:!0};Nt(It.prototype);var Wr={init:function(t,n,r,i){if(!t.componentInstance||t.componentInstance._isDestroyed){(t.componentInstance=function(t,n,r,i){var o={_isComponent:!0,parent:n,_parentVnode:t,_parentElm:r||null,_refElm:i||null},a=t.data.inlineTemplate;return e(a)&&(o.render=a.render,o.staticRenderFns=a.staticRenderFns),new t.componentOptions.Ctor(o)}(t,Pr,r,i)).$mount(n?t.elm:void 0,n)}else if(t.data.keepAlive){var o=t;Wr.prepatch(o,o)}},prepatch:function(t,e){var n=e.componentOptions;!function(t,e,n,r,i){var o=!!(i||t.$options._renderChildren||r.data.scopedSlots||t.$scopedSlots!==jn);if(t.$options._parentVnode=r,t.$vnode=r,t._vnode&&(t._vnode.parent=r),t.$options._renderChildren=i,t.$attrs=r.data&&r.data.attrs||jn,t.$listeners=n||jn,e&&t.$options.props){Cr.shouldConvert=!1;for(var a=t._props,s=t.$options._propKeys||[],c=0;c<s.length;c++){var u=s[c];a[u]=H(u,t.$options.props,e,t)}Cr.shouldConvert=!0,t.$options.propsData=e}if(n){var l=t.$options._parentListeners;t.$options._parentListeners=n,st(t,n,l)}o&&(t.$slots=ct(i,r.context),t.$forceUpdate())}(e.componentInstance=t.componentInstance,n.propsData,n.listeners,e,n.children)},insert:function(t){var e=t.context,n=t.componentInstance;n._isMounted||(n._isMounted=!0,vt(n,"mounted")),t.data.keepAlive&&(e._isMounted?function(t){t._inactive=!1,Rr.push(t)}(n):pt(n,!0))},destroy:function(t){var e=t.componentInstance;e._isDestroyed||(t.data.keepAlive?dt(e,!0):e.$destroy())}},Gr=Object.keys(Wr),Zr=1,Xr=2,Yr=0;!function(t){t.prototype._init=function(t){this._uid=Yr++,this._isVue=!0,t&&t._isComponent?function(t,e){var n=t.$options=Object.create(t.constructor.options),r=e._parentVnode;n.parent=e.parent,n._parentVnode=r,n._parentElm=e._parentElm,n._refElm=e._refElm;var i=r.componentOptions;n.propsData=i.propsData,n._parentListeners=i.listeners,n._renderChildren=i.children,n._componentTag=i.tag,e.render&&(n.render=e.render,n.staticRenderFns=e.staticRenderFns)}(this,t):this.$options=F(Ft(this.constructor),t||{},this),this._renderProxy=this,this._self=this,function(t){var e=t.$options,n=e.parent;if(n&&!e.abstract){for(;n.$options.abstract&&n.$parent;)n=n.$parent;n.$children.push(t)}t.$parent=n,t.$root=n?n.$root:t,t.$children=[],t.$refs={},t._watcher=null,t._inactive=null,t._directInactive=!1,t._isMounted=!1,t._isDestroyed=!1,t._isBeingDestroyed=!1}(this),function(t){t._events=Object.create(null),t._hasHookEvent=!1;var e=t.$options._parentListeners;e&&st(t,e)}(this),function(t){t._vnode=null,t._staticTrees=null;var e=t.$options,n=t.$vnode=e._parentVnode,r=n&&n.context;t.$slots=ct(e._renderChildren,r),t.$scopedSlots=jn,t._c=function(e,n,r,i){return Dt(t,e,n,r,i,!1)},t.$createElement=function(e,n,r,i){return Dt(t,e,n,r,i,!0)};var i=n&&n.data;E(t,"$attrs",i&&i.attrs||jn,0,!0),E(t,"$listeners",e._parentListeners||jn,0,!0)}(this),vt(this,"beforeCreate"),function(t){var e=$t(t.$options.inject,t);e&&(Cr.shouldConvert=!1,Object.keys(e).forEach(function(n){E(t,n,e[n])}),Cr.shouldConvert=!0)}(this),yt(this),function(t){var e=t.$options.provide;e&&(t._provided="function"==typeof e?e.call(t):e)}(this),vt(this,"created"),this.$options.el&&this.$mount(this.$options.el)}}(Rt),function(t){var e={};e.get=function(){return this._data};var n={};n.get=function(){return this._props},Object.defineProperty(t.prototype,"$data",e),Object.defineProperty(t.prototype,"$props",n),t.prototype.$set=j,t.prototype.$delete=N,t.prototype.$watch=function(t,e,n){if(o(e))return bt(this,t,e,n);(n=n||{}).user=!0;var r=new Kr(this,t,e,n);return n.immediate&&e.call(this,r.value),function(){r.teardown()}}}(Rt),function(t){var e=/^hook:/;t.prototype.$on=function(t,n){if(Array.isArray(t))for(var r=0,i=t.length;r<i;r++)this.$on(t[r],n);else(this._events[t]||(this._events[t]=[])).push(n),e.test(t)&&(this._hasHookEvent=!0);return this},t.prototype.$once=function(t,e){function n(){r.$off(t,n),e.apply(r,arguments)}var r=this;return n.fn=e,r.$on(t,n),r},t.prototype.$off=function(t,e){if(!arguments.length)return this._events=Object.create(null),this;if(Array.isArray(t)){for(var n=0,r=t.length;n<r;n++)this.$off(t[n],e);return this}var i=this._events[t];if(!i)return this;if(!e)return this._events[t]=null,this;if(e)for(var o,a=i.length;a--;)if((o=i[a])===e||o.fn===e){i.splice(a,1);break}return this},t.prototype.$emit=function(t){var e=this,n=e._events[t];if(n){n=n.length>1?v(n):n;for(var r=v(arguments,1),i=0,o=n.length;i<o;i++)try{n[i].apply(e,r)}catch(n){V(n,e,'event handler for "'+t+'"')}}return e}}(Rt),function(t){t.prototype._update=function(t,e){this._isMounted&&vt(this,"beforeUpdate");var n=this.$el,r=this._vnode,i=Pr;Pr=this,this._vnode=t,r?this.$el=this.__patch__(r,t):(this.$el=this.__patch__(this.$el,t,e,!1,this.$options._parentElm,this.$options._refElm),this.$options._parentElm=this.$options._refElm=null),Pr=i,n&&(n.__vue__=null),this.$el&&(this.$el.__vue__=this),this.$vnode&&this.$parent&&this.$vnode===this.$parent._vnode&&(this.$parent.$el=this.$el)},t.prototype.$forceUpdate=function(){this._watcher&&this._watcher.update()},t.prototype.$destroy=function(){if(!this._isBeingDestroyed){vt(this,"beforeDestroy"),this._isBeingDestroyed=!0;var t=this.$parent;!t||t._isBeingDestroyed||this.$options.abstract||l(t.$children,this),this._watcher&&this._watcher.teardown();for(var e=this._watchers.length;e--;)this._watchers[e].teardown();this._data.__ob__&&this._data.__ob__.vmCount--,this._isDestroyed=!0,this.__patch__(this._vnode,null),vt(this,"destroyed"),this.$off(),this.$el&&(this.$el.__vue__=null),this.$vnode&&(this.$vnode.parent=null)}}}(Rt),function(t){Nt(t.prototype),t.prototype.$nextTick=function(t){return q(t,this)},t.prototype._render=function(){var t=this,e=t.$options,n=e.render,r=e._parentVnode;if(t._isMounted)for(var i in t.$slots){var o=t.$slots[i];(o._rendered||o[0]&&o[0].elm)&&(t.$slots[i]=A(o,!0))}t.$scopedSlots=r&&r.data.scopedSlots||jn,t.$vnode=r;var a;try{a=n.call(t._renderProxy,t.$createElement)}catch(e){V(e,t,"render"),a=t._vnode}return a instanceof mr||(a=gr()),a.parent=r,a}}(Rt);var Qr=[String,RegExp,Array],ti={KeepAlive:{name:"keep-alive",abstract:!0,props:{include:Qr,exclude:Qr,max:[String,Number]},created:function(){this.cache=Object.create(null),this.keys=[]},destroyed:function(){for(var t in this.cache)zt(this.cache,t,this.keys)},watch:{include:function(t){Vt(this,function(e){return Ut(t,e)})},exclude:function(t){Vt(this,function(e){return!Ut(t,e)})}},render:function(){var t=this.$slots.default,e=it(t),n=e&&e.componentOptions;if(n){var r=Bt(n),i=this.include,o=this.exclude;if(i&&(!r||!Ut(i,r))||o&&r&&Ut(o,r))return e;var a=this.cache,s=this.keys,c=null==e.key?n.Ctor.cid+(n.tag?"::"+n.tag:""):e.key;a[c]?(e.componentInstance=a[c].componentInstance,l(s,c),s.push(c)):(a[c]=e,s.push(c),this.max&&s.length>parseInt(this.max)&&zt(a,s[0],s,this._vnode)),e.data.keepAlive=!0}return e||t&&t[0]}}};!function(t){var e={};e.get=function(){return Jn},Object.defineProperty(t,"config",e),t.util={warn:pr,extend:h,mergeOptions:F,defineReactive:E},t.set=j,t.delete=N,t.nextTick=q,t.options=Object.create(null),zn.forEach(function(e){t.options[e+"s"]=Object.create(null)}),t.options._base=t,h(t.options.components,ti),function(t){t.use=function(t){var e=this._installedPlugins||(this._installedPlugins=[]);if(e.indexOf(t)>-1)return this;var n=v(arguments,1);return n.unshift(this),"function"==typeof t.install?t.install.apply(t,n):"function"==typeof t&&t.apply(null,n),e.push(t),this}}(t),function(t){t.mixin=function(t){return this.options=F(this.options,t),this}}(t),Ht(t),function(t){zn.forEach(function(e){t[e]=function(t,n){return n?("component"===e&&o(n)&&(n.name=n.name||t,n=this.options._base.extend(n)),"directive"===e&&"function"==typeof n&&(n={bind:n,update:n}),this.options[e+"s"][t]=n,n):this.options[e+"s"][t]}})}(t)}(Rt),Object.defineProperty(Rt.prototype,"$isServer",{get:ur}),Object.defineProperty(Rt.prototype,"$ssrContext",{get:function(){return this.$vnode&&this.$vnode.ssrContext}}),Rt.version="2.5.13";var ei,ni,ri,ii,oi,ai,si,ci,ui=u("style,class"),li=u("input,textarea,option,select,progress"),fi=function(t,e,n){return"value"===n&&li(t)&&"button"!==e||"selected"===n&&"option"===t||"checked"===n&&"input"===t||"muted"===n&&"video"===t},pi=u("contenteditable,draggable,spellcheck"),di=u("allowfullscreen,async,autofocus,autoplay,checked,compact,controls,declare,default,defaultchecked,defaultmuted,defaultselected,defer,disabled,enabled,formnovalidate,hidden,indeterminate,inert,ismap,itemscope,loop,multiple,muted,nohref,noresize,noshade,novalidate,nowrap,open,pauseonexit,readonly,required,reversed,scoped,seamless,selected,sortable,translate,truespeed,typemustmatch,visible"),vi="http://www.w3.org/1999/xlink",hi=function(t){return":"===t.charAt(5)&&"xlink"===t.slice(0,5)},mi=function(t){return hi(t)?t.slice(6,t.length):""},yi=function(t){return null==t||!1===t},gi={svg:"http://www.w3.org/2000/svg",math:"http://www.w3.org/1998/Math/MathML"},_i=u("html,body,base,head,link,meta,style,title,address,article,aside,footer,header,h1,h2,h3,h4,h5,h6,hgroup,nav,section,div,dd,dl,dt,figcaption,figure,picture,hr,img,li,main,ol,p,pre,ul,a,b,abbr,bdi,bdo,br,cite,code,data,dfn,em,i,kbd,mark,q,rp,rt,rtc,ruby,s,samp,small,span,strong,sub,sup,time,u,var,wbr,area,audio,map,track,video,embed,object,param,source,canvas,script,noscript,del,ins,caption,col,colgroup,table,thead,tbody,td,th,tr,button,datalist,fieldset,form,input,label,legend,meter,optgroup,option,output,progress,select,textarea,details,dialog,menu,menuitem,summary,content,element,shadow,template,blockquote,iframe,tfoot"),bi=u("svg,animate,circle,clippath,cursor,defs,desc,ellipse,filter,font-face,foreignObject,g,glyph,image,line,marker,mask,missing-glyph,path,pattern,polygon,polyline,rect,switch,symbol,text,textpath,tspan,use,view",!0),$i=function(t){return _i(t)||bi(t)},Ci=Object.create(null),wi=u("text,number,password,search,email,tel,url"),xi=Object.freeze({createElement:function(t,e){var n=document.createElement(t);return"select"!==t?n:(e.data&&e.data.attrs&&void 0!==e.data.attrs.multiple&&n.setAttribute("multiple","multiple"),n)},createElementNS:function(t,e){return document.createElementNS(gi[t],e)},createTextNode:function(t){return document.createTextNode(t)},createComment:function(t){return document.createComment(t)},insertBefore:function(t,e,n){t.insertBefore(e,n)},removeChild:function(t,e){t.removeChild(e)},appendChild:function(t,e){t.appendChild(e)},parentNode:function(t){return t.parentNode},nextSibling:function(t){return t.nextSibling},tagName:function(t){return t.tagName},setTextContent:function(t,e){t.textContent=e},setAttribute:function(t,e,n){t.setAttribute(e,n)}}),ki={create:function(t,e){Xt(e)},update:function(t,e){t.data.ref!==e.data.ref&&(Xt(t,!0),Xt(e))},destroy:function(t){Xt(t,!0)}},Ai=new mr("",{},[]),Oi=["create","activate","update","remove","destroy"],Si={create:te,update:te,destroy:function(t){te(t,Ai)}},Ti=Object.create(null),Ei=[ki,Si],ji={create:re,update:re},Ni={create:oe,update:oe},Ii=/[\w).+\-_$\]]/,Li="__r",Mi="__c",Di={create:xe,update:xe},Pi={create:ke,update:ke},Fi=p(function(t){var e={},n=/:(.+)/;return t.split(/;(?![^(]*\))/g).forEach(function(t){if(t){var r=t.split(n);r.length>1&&(e[r[0].trim()]=r[1].trim())}}),e}),Ri=/^--/,Hi=/\s*!important$/,Bi=function(t,e,n){if(Ri.test(e))t.style.setProperty(e,n);else if(Hi.test(n))t.style.setProperty(e,n.replace(Hi,""),"important");else{var r=Vi(e);if(Array.isArray(n))for(var i=0,o=n.length;i<o;i++)t.style[r]=n[i];else t.style[r]=n}},Ui=["Webkit","Moz","ms"],Vi=p(function(t){if(ci=ci||document.createElement("div").style,"filter"!==(t=Pn(t))&&t in ci)return t;for(var e=t.charAt(0).toUpperCase()+t.slice(1),n=0;n<Ui.length;n++){var r=Ui[n]+e;if(r in ci)return r}}),zi={create:Se,update:Se},Ki=p(function(t){return{enterClass:t+"-enter",enterToClass:t+"-enter-to",enterActiveClass:t+"-enter-active",leaveClass:t+"-leave",leaveToClass:t+"-leave-to",leaveActiveClass:t+"-leave-active"}}),Ji=Gn&&!tr,qi="transition",Wi="animation",Gi="transition",Zi="transitionend",Xi="animation",Yi="animationend";Ji&&(void 0===window.ontransitionend&&void 0!==window.onwebkittransitionend&&(Gi="WebkitTransition",Zi="webkitTransitionEnd"),void 0===window.onanimationend&&void 0!==window.onwebkitanimationend&&(Xi="WebkitAnimation",Yi="webkitAnimationEnd"));var Qi=Gn?window.requestAnimationFrame?window.requestAnimationFrame.bind(window):setTimeout:function(t){return t()},to=/\b(transform|all)(,|$)/,eo=function(i){function o(t){var n=A.parentNode(t);e(n)&&A.removeChild(n,t)}function a(t,r,i,o,a){if(t.isRootInsert=!a,!function(t,r,i,o){var a=t.data;if(e(a)){var u=e(t.componentInstance)&&a.keepAlive;if(e(a=a.hook)&&e(a=a.init)&&a(t,!1,i,o),e(t.componentInstance))return s(t,r),n(u)&&function(t,n,r,i){for(var o,a=t;a.componentInstance;)if(a=a.componentInstance._vnode,e(o=a.data)&&e(o=o.transition)){for(o=0;o<x.activate.length;++o)x.activate[o](Ai,a);n.push(a);break}c(r,t.elm,i)}(t,r,i,o),!0}}(t,r,i,o)){var u=t.data,f=t.children,v=t.tag;e(v)?(t.elm=t.ns?A.createElementNS(t.ns,v):A.createElement(v,t),d(t),l(t,f,r),e(u)&&p(t,r),c(i,t.elm,o)):n(t.isComment)?(t.elm=A.createComment(t.text),c(i,t.elm,o)):(t.elm=A.createTextNode(t.text),c(i,t.elm,o))}}function s(t,n){e(t.data.pendingInsert)&&(n.push.apply(n,t.data.pendingInsert),t.data.pendingInsert=null),t.elm=t.componentInstance.$el,f(t)?(p(t,n),d(t)):(Xt(t),n.push(t))}function c(t,n,r){e(t)&&(e(r)?r.parentNode===t&&A.insertBefore(t,n,r):A.appendChild(t,n))}function l(t,e,n){if(Array.isArray(e))for(var i=0;i<e.length;++i)a(e[i],n,t.elm,null,!0);else r(t.text)&&A.appendChild(t.elm,A.createTextNode(String(t.text)))}function f(t){for(;t.componentInstance;)t=t.componentInstance._vnode;return e(t.tag)}function p(t,n){for(var r=0;r<x.create.length;++r)x.create[r](Ai,t);e(C=t.data.hook)&&(e(C.create)&&C.create(Ai,t),e(C.insert)&&n.push(t))}function d(t){var n;if(e(n=t.fnScopeId))A.setAttribute(t.elm,n,"");else for(var r=t;r;)e(n=r.context)&&e(n=n.$options._scopeId)&&A.setAttribute(t.elm,n,""),r=r.parent;e(n=Pr)&&n!==t.context&&n!==t.fnContext&&e(n=n.$options._scopeId)&&A.setAttribute(t.elm,n,"")}function v(t,e,n,r,i,o){for(;r<=i;++r)a(n[r],o,t,e)}function h(t){var n,r,i=t.data;if(e(i))for(e(n=i.hook)&&e(n=n.destroy)&&n(t),n=0;n<x.destroy.length;++n)x.destroy[n](t);if(e(n=t.children))for(r=0;r<t.children.length;++r)h(t.children[r])}function m(t,n,r,i){for(;r<=i;++r){var a=n[r];e(a)&&(e(a.tag)?(y(a),h(a)):o(a.elm))}}function y(t,n){if(e(n)||e(t.data)){var r,i=x.remove.length+1;for(e(n)?n.listeners+=i:n=function(t,e){function n(){0==--n.listeners&&o(t)}return n.listeners=e,n}(t.elm,i),e(r=t.componentInstance)&&e(r=r._vnode)&&e(r.data)&&y(r,n),r=0;r<x.remove.length;++r)x.remove[r](t,n);e(r=t.data.hook)&&e(r=r.remove)?r(t,n):n()}else o(t.elm)}function g(n,r,i,o,s){for(var c,u,l,f=0,p=0,d=r.length-1,h=r[0],y=r[d],g=i.length-1,b=i[0],$=i[g],C=!s;f<=d&&p<=g;)t(h)?h=r[++f]:t(y)?y=r[--d]:Yt(h,b)?(_(h,b,o),h=r[++f],b=i[++p]):Yt(y,$)?(_(y,$,o),y=r[--d],$=i[--g]):Yt(h,$)?(_(h,$,o),C&&A.insertBefore(n,h.elm,A.nextSibling(y.elm)),h=r[++f],$=i[--g]):Yt(y,b)?(_(y,b,o),C&&A.insertBefore(n,y.elm,h.elm),y=r[--d],b=i[++p]):(t(c)&&(c=Qt(r,f,d)),t(u=e(b.key)?c[b.key]:function(t,n,r,i){for(var o=r;o<i;o++){var a=n[o];if(e(a)&&Yt(t,a))return o}}(b,r,f,d))?a(b,o,n,h.elm):Yt(l=r[u],b)?(_(l,b,o),r[u]=void 0,C&&A.insertBefore(n,l.elm,h.elm)):a(b,o,n,h.elm),b=i[++p]);f>d?v(n,t(i[g+1])?null:i[g+1].elm,i,p,g,o):p>g&&m(0,r,f,d)}function _(r,i,o,a){if(r!==i){var s=i.elm=r.elm;if(n(r.isAsyncPlaceholder))e(i.asyncFactory.resolved)?$(r.elm,i,o):i.isAsyncPlaceholder=!0;else if(n(i.isStatic)&&n(r.isStatic)&&i.key===r.key&&(n(i.isCloned)||n(i.isOnce)))i.componentInstance=r.componentInstance;else{var c,u=i.data;e(u)&&e(c=u.hook)&&e(c=c.prepatch)&&c(r,i);var l=r.children,p=i.children;if(e(u)&&f(i)){for(c=0;c<x.update.length;++c)x.update[c](r,i);e(c=u.hook)&&e(c=c.update)&&c(r,i)}t(i.text)?e(l)&&e(p)?l!==p&&g(s,l,p,o,a):e(p)?(e(r.text)&&A.setTextContent(s,""),v(s,null,p,0,p.length-1,o)):e(l)?m(0,l,0,l.length-1):e(r.text)&&A.setTextContent(s,""):r.text!==i.text&&A.setTextContent(s,i.text),e(u)&&e(c=u.hook)&&e(c=c.postpatch)&&c(r,i)}}}function b(t,r,i){if(n(i)&&e(t.parent))t.parent.data.pendingInsert=r;else for(var o=0;o<r.length;++o)r[o].data.hook.insert(r[o])}function $(t,r,i,o){var a,c=r.tag,u=r.data,f=r.children;if(o=o||u&&u.pre,r.elm=t,n(r.isComment)&&e(r.asyncFactory))return r.isAsyncPlaceholder=!0,!0;if(e(u)&&(e(a=u.hook)&&e(a=a.init)&&a(r,!0),e(a=r.componentInstance)))return s(r,i),!0;if(e(c)){if(e(f))if(t.hasChildNodes())if(e(a=u)&&e(a=a.domProps)&&e(a=a.innerHTML)){if(a!==t.innerHTML)return!1}else{for(var d=!0,v=t.firstChild,h=0;h<f.length;h++){if(!v||!$(v,f[h],i,o)){d=!1;break}v=v.nextSibling}if(!d||v)return!1}else l(r,f,i);if(e(u)){var m=!1;for(var y in u)if(!O(y)){m=!0,p(r,i);break}!m&&u.class&&W(u.class)}}else t.data!==r.text&&(t.data=r.text);return!0}var C,w,x={},k=i.modules,A=i.nodeOps;for(C=0;C<Oi.length;++C)for(x[Oi[C]]=[],w=0;w<k.length;++w)e(k[w][Oi[C]])&&x[Oi[C]].push(k[w][Oi[C]]);var O=u("attrs,class,staticClass,staticStyle,key");return function(r,i,o,s,c,u){if(!t(i)){var l=!1,p=[];if(t(r))l=!0,a(i,p,c,u);else{var d=e(r.nodeType);if(!d&&Yt(r,i))_(r,i,p,s);else{if(d){if(1===r.nodeType&&r.hasAttribute(Vn)&&(r.removeAttribute(Vn),o=!0),n(o)&&$(r,i,p))return b(i,p,!0),r;r=function(t){return new mr(A.tagName(t).toLowerCase(),{},[],void 0,t)}(r)}var v=r.elm,y=A.parentNode(v);if(a(i,p,v._leaveCb?null:y,A.nextSibling(v)),e(i.parent))for(var g=i.parent,C=f(i);g;){for(var w=0;w<x.destroy.length;++w)x.destroy[w](g);if(g.elm=i.elm,C){for(var k=0;k<x.create.length;++k)x.create[k](Ai,g);var O=g.data.hook.insert;if(O.merged)for(var S=1;S<O.fns.length;S++)O.fns[S]()}else Xt(g);g=g.parent}e(y)?m(0,[r],0,0):e(r.tag)&&h(r)}}return b(i,p,l),i.elm}e(r)&&h(r)}}({nodeOps:xi,modules:[ji,Ni,Di,Pi,zi,Gn?{create:Ve,activate:Ve,remove:function(t,e){!0!==t.data.show?He(t,e):e()}}:{}].concat(Ei)});tr&&document.addEventListener("selectionchange",function(){var t=document.activeElement;t&&t.vmodel&&Ze(t,"input")});var no={inserted:function(t,e,n,r){"select"===n.tag?(r.elm&&!r.elm._vOptions?Y(n,"postpatch",function(){no.componentUpdated(t,e,n)}):ze(t,e,n.context),t._vOptions=[].map.call(t.options,qe)):("textarea"===n.tag||wi(t.type))&&(t._vModifiers=e.modifiers,e.modifiers.lazy||(t.addEventListener("change",Ge),nr||(t.addEventListener("compositionstart",We),t.addEventListener("compositionend",Ge)),tr&&(t.vmodel=!0)))},componentUpdated:function(t,e,n){if("select"===n.tag){ze(t,e,n.context);var r=t._vOptions,i=t._vOptions=[].map.call(t.options,qe);if(i.some(function(t,e){return!g(t,r[e])})){(t.multiple?e.value.some(function(t){return Je(t,i)}):e.value!==e.oldValue&&Je(e.value,i))&&Ze(t,"change")}}}},ro={model:no,show:{bind:function(t,e,n){var r=e.value,i=(n=Xe(n)).data&&n.data.transition,o=t.__vOriginalDisplay="none"===t.style.display?"":t.style.display;r&&i?(n.data.show=!0,Re(n,function(){t.style.display=o})):t.style.display=r?o:"none"},update:function(t,e,n){var r=e.value;if(r!==e.oldValue){(n=Xe(n)).data&&n.data.transition?(n.data.show=!0,r?Re(n,function(){t.style.display=t.__vOriginalDisplay}):He(n,function(){t.style.display="none"})):t.style.display=r?t.__vOriginalDisplay:"none"}},unbind:function(t,e,n,r,i){i||(t.style.display=t.__vOriginalDisplay)}}},io={name:String,appear:Boolean,css:Boolean,mode:String,type:String,enterClass:String,leaveClass:String,enterToClass:String,leaveToClass:String,enterActiveClass:String,leaveActiveClass:String,appearClass:String,appearActiveClass:String,appearToClass:String,duration:[Number,String,Object]},oo={name:"transition",props:io,abstract:!0,render:function(t){var e=this,n=this.$slots.default;if(n&&(n=n.filter(function(t){return t.tag||rt(t)})).length){var i=this.mode,o=n[0];if(function(t){for(;t=t.parent;)if(t.data.transition)return!0}(this.$vnode))return o;var a=Ye(o);if(!a)return o;if(this._leaving)return tn(t,o);var s="__transition-"+this._uid+"-";a.key=null==a.key?a.isComment?s+"comment":s+a.tag:r(a.key)?0===String(a.key).indexOf(s)?a.key:s+a.key:a.key;var c=(a.data||(a.data={})).transition=Qe(this),u=this._vnode,l=Ye(u);if(a.data.directives&&a.data.directives.some(function(t){return"show"===t.name})&&(a.data.show=!0),l&&l.data&&!function(t,e){return e.key===t.key&&e.tag===t.tag}(a,l)&&!rt(l)&&(!l.componentInstance||!l.componentInstance._vnode.isComment)){var f=l.data.transition=h({},c);if("out-in"===i)return this._leaving=!0,Y(f,"afterLeave",function(){e._leaving=!1,e.$forceUpdate()}),tn(t,o);if("in-out"===i){if(rt(a))return u;var p,d=function(){p()};Y(c,"afterEnter",d),Y(c,"enterCancelled",d),Y(f,"delayLeave",function(t){p=t})}}return o}}},ao=h({tag:String,moveClass:String},io);delete ao.mode;var so={Transition:oo,TransitionGroup:{props:ao,render:function(t){for(var e=this.tag||this.$vnode.data.tag||"span",n=Object.create(null),r=this.prevChildren=this.children,i=this.$slots.default||[],o=this.children=[],a=Qe(this),s=0;s<i.length;s++){var c=i[s];c.tag&&null!=c.key&&0!==String(c.key).indexOf("__vlist")&&(o.push(c),n[c.key]=c,(c.data||(c.data={})).transition=a)}if(r){for(var u=[],l=[],f=0;f<r.length;f++){var p=r[f];p.data.transition=a,p.data.pos=p.elm.getBoundingClientRect(),n[p.key]?u.push(p):l.push(p)}this.kept=t(e,null,u),this.removed=l}return t(e,null,o)},beforeUpdate:function(){this.__patch__(this._vnode,this.kept,!1,!0),this._vnode=this.kept},updated:function(){var t=this.prevChildren,e=this.moveClass||(this.name||"v")+"-move";t.length&&this.hasMove(t[0].elm,e)&&(t.forEach(en),t.forEach(nn),t.forEach(rn),this._reflow=document.body.offsetHeight,t.forEach(function(t){if(t.data.moved){var n=t.elm,r=n.style;Ie(n,e),r.transform=r.WebkitTransform=r.transitionDuration="",n.addEventListener(Zi,n._moveCb=function t(r){r&&!/transform$/.test(r.propertyName)||(n.removeEventListener(Zi,t),n._moveCb=null,Le(n,e))})}}))},methods:{hasMove:function(t,e){if(!Ji)return!1;if(this._hasMove)return this._hasMove;var n=t.cloneNode();t._transitionClasses&&t._transitionClasses.forEach(function(t){Ee(n,t)}),Te(n,e),n.style.display="none",this.$el.appendChild(n);var r=De(n);return this.$el.removeChild(n),this._hasMove=r.hasTransform}}}};Rt.config.mustUseProp=fi,Rt.config.isReservedTag=$i,Rt.config.isReservedAttr=ui,Rt.config.getTagNamespace=Gt,Rt.config.isUnknownElement=function(t){if(!Gn)return!0;if($i(t))return!1;if(t=t.toLowerCase(),null!=Ci[t])return Ci[t];var e=document.createElement(t);return t.indexOf("-")>-1?Ci[t]=e.constructor===window.HTMLUnknownElement||e.constructor===window.HTMLElement:Ci[t]=/HTMLUnknownElement/.test(e.toString())},h(Rt.options.directives,ro),h(Rt.options.components,so),Rt.prototype.__patch__=Gn?eo:y,Rt.prototype.$mount=function(t,e){return t=t&&Gn?Zt(t):void 0,function(t,e,n){t.$el=e,t.$options.render||(t.$options.render=gr),vt(t,"beforeMount");var r;return r=function(){t._update(t._render(),n)},new Kr(t,r,y,null,!0),n=!1,null==t.$vnode&&(t._isMounted=!0,vt(t,"mounted")),t}(this,t,e)},Rt.nextTick(function(){Jn.devtools&&lr&&lr.emit("init",Rt)},0);var co,uo=/\{\{((?:.|\n)+?)\}\}/g,lo=/[-.*+?^${}()|[\]\/\\]/g,fo=p(function(t){var e=t[0].replace(lo,"\\$&"),n=t[1].replace(lo,"\\$&");return new RegExp(e+"((?:.|\\n)+?)"+n,"g")}),po={staticKeys:["staticClass"],transformNode:function(t,e){e.warn;var n=he(t,"class");n&&(t.staticClass=JSON.stringify(n));var r=ve(t,"class",!1);r&&(t.classBinding=r)},genData:function(t){var e="";return t.staticClass&&(e+="staticClass:"+t.staticClass+","),t.classBinding&&(e+="class:"+t.classBinding+","),e}},vo={staticKeys:["staticStyle"],transformNode:function(t,e){e.warn;var n=he(t,"style");n&&(t.staticStyle=JSON.stringify(Fi(n)));var r=ve(t,"style",!1);r&&(t.styleBinding=r)},genData:function(t){var e="";return t.staticStyle&&(e+="staticStyle:"+t.staticStyle+","),t.styleBinding&&(e+="style:("+t.styleBinding+"),"),e}},ho=function(t){return co=co||document.createElement("div"),co.innerHTML=t,co.textContent},mo=u("area,base,br,col,embed,frame,hr,img,input,isindex,keygen,link,meta,param,source,track,wbr"),yo=u("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr,source"),go=u("address,article,aside,base,blockquote,body,caption,col,colgroup,dd,details,dialog,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,head,header,hgroup,hr,html,legend,li,menuitem,meta,optgroup,option,param,rp,rt,source,style,summary,tbody,td,tfoot,th,thead,title,tr,track"),_o=/^\s*([^\s"'<>\/=]+)(?:\s*(=)\s*(?:"([^"]*)"+|'([^']*)'+|([^\s"'=<>`]+)))?/,bo="[a-zA-Z_][\\w\\-\\.]*",$o="((?:"+bo+"\\:)?"+bo+")",Co=new RegExp("^<"+$o),wo=/^\s*(\/?)>/,xo=new RegExp("^<\\/"+$o+"[^>]*>"),ko=/^<!DOCTYPE [^>]+>/i,Ao=/^<!--/,Oo=/^<!\[/,So=!1;"x".replace(/x(.)?/g,function(t,e){So=""===e});var To,Eo,jo,No,Io,Lo,Mo,Do,Po,Fo,Ro,Ho=u("script,style,textarea",!0),Bo={},Uo={"&lt;":"<","&gt;":">","&quot;":'"',"&amp;":"&","&#10;":"\n","&#9;":"\t"},Vo=/&(?:lt|gt|quot|amp);/g,zo=/&(?:lt|gt|quot|amp|#10|#9);/g,Ko=u("pre,textarea",!0),Jo=function(t,e){return t&&Ko(t)&&"\n"===e[0]},qo=/^@|^v-on:/,Wo=/^v-|^@|^:/,Go=/(.*?)\s+(?:in|of)\s+(.*)/,Zo=/,([^,\}\]]*)(?:,([^,\}\]]*))?$/,Xo=/^\(|\)$/g,Yo=/:(.*)$/,Qo=/^:|^v-bind:/,ta=/\.[^.]+/g,ea=p(ho),na=/^xmlns:NS\d+/,ra=/^NS\d+:/,ia=[po,vo,{preTransformNode:function(t,e){if("input"===t.tag){var n=t.attrsMap;if(n["v-model"]&&(n["v-bind:type"]||n[":type"])){var r=ve(t,"type"),i=he(t,"v-if",!0),o=i?"&&("+i+")":"",a=null!=he(t,"v-else",!0),s=he(t,"v-else-if",!0),c=fn(t);un(c),fe(c,"type","checkbox"),cn(c,e),c.processed=!0,c.if="("+r+")==='checkbox'"+o,ln(c,{exp:c.if,block:c});var u=fn(t);he(u,"v-for",!0),fe(u,"type","radio"),cn(u,e),ln(c,{exp:"("+r+")==='radio'"+o,block:u});var l=fn(t);return he(l,"v-for",!0),fe(l,":type",r),cn(l,e),ln(c,{exp:i,block:l}),a?c.else=!0:s&&(c.elseif=s),c}}}}],oa={expectHTML:!0,modules:ia,directives:{model:function(t,e,n){var r=e.value,i=e.modifiers,o=t.tag,a=t.attrsMap.type;if(t.component)return me(t,r,i),!1;if("select"===o)!function(t,e,n){var r='var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = "_value" in o ? o._value : o.value;return '+(n&&n.number?"_n(val)":"val")+"});";r=r+" "+ye(e,"$event.target.multiple ? $$selectedVal : $$selectedVal[0]"),de(t,"change",r,null,!0)}(t,r,i);else if("input"===o&&"checkbox"===a)!function(t,e,n){var r=n&&n.number,i=ve(t,"value")||"null",o=ve(t,"true-value")||"true",a=ve(t,"false-value")||"false";ue(t,"checked","Array.isArray("+e+")?_i("+e+","+i+")>-1"+("true"===o?":("+e+")":":_q("+e+","+o+")")),de(t,"change","var $$a="+e+",$$el=$event.target,$$c=$$el.checked?("+o+"):("+a+");if(Array.isArray($$a)){var $$v="+(r?"_n("+i+")":i)+",$$i=_i($$a,$$v);if($$el.checked){$$i<0&&("+e+"=$$a.concat([$$v]))}else{$$i>-1&&("+e+"=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{"+ye(e,"$$c")+"}",null,!0)}(t,r,i);else if("input"===o&&"radio"===a)!function(t,e,n){var r=n&&n.number,i=ve(t,"value")||"null";ue(t,"checked","_q("+e+","+(i=r?"_n("+i+")":i)+")"),de(t,"change",ye(e,i),null,!0)}(t,r,i);else if("input"===o||"textarea"===o)!function(t,e,n){var r=t.attrsMap.type,i=n||{},o=i.lazy,a=i.number,s=i.trim,c=!o&&"range"!==r,u=o?"change":"range"===r?Li:"input",l="$event.target.value";s&&(l="$event.target.value.trim()"),a&&(l="_n("+l+")");var f=ye(e,l);c&&(f="if($event.target.composing)return;"+f),ue(t,"value","("+e+")"),de(t,u,f,null,!0),(s||a)&&de(t,"blur","$forceUpdate()")}(t,r,i);else if(!Jn.isReservedTag(o))return me(t,r,i),!1;return!0},text:function(t,e){e.value&&ue(t,"textContent","_s("+e.value+")")},html:function(t,e){e.value&&ue(t,"innerHTML","_s("+e.value+")")}},isPreTag:function(t){return"pre"===t},isUnaryTag:mo,mustUseProp:fi,canBeLeftOpenTag:yo,isReservedTag:$i,getTagNamespace:Gt,staticKeys:function(t){return t.reduce(function(t,e){return t.concat(e.staticKeys||[])},[]).join(",")}(ia)},aa=p(function(t){return u("type,tag,attrsList,attrsMap,plain,parent,children,attrs"+(t?","+t:""))}),sa=/^\s*([\w$_]+|\([^)]*?\))\s*=>|^function\s*\(/,ca=/^\s*[A-Za-z_$][\w$]*(?:\.[A-Za-z_$][\w$]*|\['.*?']|\[".*?"]|\[\d+]|\[[A-Za-z_$][\w$]*])*\s*$/,ua={esc:27,tab:9,enter:13,space:32,up:38,left:37,right:39,down:40,delete:[8,46]},la=function(t){return"if("+t+")return null;"},fa={stop:"$event.stopPropagation();",prevent:"$event.preventDefault();",self:la("$event.target !== $event.currentTarget"),ctrl:la("!$event.ctrlKey"),shift:la("!$event.shiftKey"),alt:la("!$event.altKey"),meta:la("!$event.metaKey"),left:la("'button' in $event && $event.button !== 0"),middle:la("'button' in $event && $event.button !== 1"),right:la("'button' in $event && $event.button !== 2")},pa={on:function(t,e){t.wrapListeners=function(t){return"_g("+t+","+e.value+")"}},bind:function(t,e){t.wrapData=function(n){return"_b("+n+",'"+t.tag+"',"+e.value+","+(e.modifiers&&e.modifiers.prop?"true":"false")+(e.modifiers&&e.modifiers.sync?",true":"")+")"}},cloak:y},da=function(t){this.options=t,this.warn=t.warn||se,this.transforms=ce(t.modules,"transformCode"),this.dataGenFns=ce(t.modules,"genData"),this.directives=h(h({},pa),t.directives);var e=t.isReservedTag||Bn;this.maybeComponent=function(t){return!e(t.tag)},this.onceId=0,this.staticRenderFns=[]},va=(new RegExp("\\b"+"do,if,for,let,new,try,var,case,else,with,await,break,catch,class,const,super,throw,while,yield,delete,export,import,return,switch,default,extends,finally,continue,debugger,function,arguments".split(",").join("\\b|\\b")+"\\b"),new RegExp("\\b"+"delete,typeof,void".split(",").join("\\s*\\([^\\)]*\\)|\\b")+"\\s*\\([^\\)]*\\)"),function(t){return function(e){function n(n,r){var i=Object.create(e),o=[],a=[];if(i.warn=function(t,e){(e?a:o).push(t)},r){r.modules&&(i.modules=(e.modules||[]).concat(r.modules)),r.directives&&(i.directives=h(Object.create(e.directives||null),r.directives));for(var s in r)"modules"!==s&&"directives"!==s&&(i[s]=r[s])}var c=t(n,i);return c.errors=o,c.tips=a,c}return{compile:n,compileToFunctions:function(t){var e=Object.create(null);return function(n,r,i){(r=h({},r)).warn,delete r.warn;var o=r.delimiters?String(r.delimiters)+n:n;if(e[o])return e[o];var a=t(n,r),s={},c=[];return s.render=Tn(a.render,c),s.staticRenderFns=a.staticRenderFns.map(function(t){return Tn(t,c)}),e[o]=s}}(n)}}}(function(t,e){var n=sn(t.trim(),e);!1!==e.optimize&&function(t,e){t&&(Po=aa(e.staticKeys||""),Fo=e.isReservedTag||Bn,pn(t),dn(t,!1))}(n,e);var r=yn(n,e);return{ast:n,render:r.render,staticRenderFns:r.staticRenderFns}})(oa).compileToFunctions),ha=!!Gn&&En(!1),ma=!!Gn&&En(!0),ya=p(function(t){var e=Zt(t);return e&&e.innerHTML}),ga=Rt.prototype.$mount;return Rt.prototype.$mount=function(t,e){if((t=t&&Zt(t))===document.body||t===document.documentElement)return this;var n=this.$options;if(!n.render){var r=n.template;if(r)if("string"==typeof r)"#"===r.charAt(0)&&(r=ya(r));else{if(!r.nodeType)return this;r=r.innerHTML}else t&&(r=function(t){if(t.outerHTML)return t.outerHTML;var e=document.createElement("div");return e.appendChild(t.cloneNode(!0)),e.innerHTML}(t));if(r){var i=va(r,{shouldDecodeNewlines:ha,shouldDecodeNewlinesForHref:ma,delimiters:n.delimiters,comments:n.comments},this),o=i.render,a=i.staticRenderFns;n.render=o,n.staticRenderFns=a}}return ga.call(this,t,e)},Rt.compile=va,Rt}); \ No newline at end of file