From 93e3a72d3052255588725f05583b097b3817be89 Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Sun, 8 Jan 2017 00:18:30 -0600 Subject: [PATCH 1/5] offline mode --- .../app/frontend/controllers/_base.js | 11 +- .../app/frontend/controllers/editor.js | 10 +- .../app/frontend/controllers/header.js | 5 +- .../app/frontend/controllers/home.js | 39 +-- .../app/frontend/controllers/notes.js | 3 +- .../app/frontend/controllers/tags.js | 1 - .../frontend/controllers/username_modal.js | 5 +- .../app/frontend/models/app/user.js | 5 - .../javascripts/app/services/apiController.js | 215 +++++++------ app/assets/templates/frontend/home.html.haml | 2 +- vendor/assets/javascripts/transpiled.js | 294 ++++++++---------- vendor/assets/javascripts/transpiled.js.map | 2 +- 12 files changed, 269 insertions(+), 323 deletions(-) delete mode 100644 app/assets/javascripts/app/frontend/models/app/user.js diff --git a/app/assets/javascripts/app/frontend/controllers/_base.js b/app/assets/javascripts/app/frontend/controllers/_base.js index f111871b2..adf3dd555 100644 --- a/app/assets/javascripts/app/frontend/controllers/_base.js +++ b/app/assets/javascripts/app/frontend/controllers/_base.js @@ -1,13 +1,6 @@ class BaseCtrl { - constructor($rootScope, modelManager) { - // $rootScope.resetPasswordSubmit = function() { - // var new_keys = Neeto.crypto.generateEncryptionKeysForUser($rootScope.resetData.password, $rootScope.resetData.email); - // var data = _.clone($rootScope.resetData); - // data.password = new_keys.pw; - // data.password_confirmation = new_keys.pw; - // $auth.updatePassword(data); - // apiController.setMk(new_keys.mk); - // } + constructor($rootScope, modelManager, apiController) { + apiController.getCurrentUser(function(){}); } } diff --git a/app/assets/javascripts/app/frontend/controllers/editor.js b/app/assets/javascripts/app/frontend/controllers/editor.js index 6ca5f06f6..a3718bac7 100644 --- a/app/assets/javascripts/app/frontend/controllers/editor.js +++ b/app/assets/javascripts/app/frontend/controllers/editor.js @@ -5,8 +5,7 @@ angular.module('app.frontend') scope: { save: "&", remove: "&", - note: "=", - user: "=" + note: "=" }, templateUrl: 'frontend/editor.html', replace: true, @@ -124,6 +123,11 @@ angular.module('app.frontend') statusTimeout = $timeout(function(){ this.noteStatus = "All changes saved" }.bind(this), 200) + } else { + if(statusTimeout) $timeout.cancel(statusTimeout); + statusTimeout = $timeout(function(){ + this.noteStatus = "(Offline) — All changes saved" + }.bind(this), 200) } }.bind(this)); } @@ -138,7 +142,7 @@ angular.module('app.frontend') this.changesMade = function() { this.note.hasChanges = true; this.note.dummy = false; - if(this.user.uuid) { + if(apiController.isUserSignedIn()) { // signed out users have local autosave, dont need draft saving apiController.saveDraftToDisk(this.note); } diff --git a/app/assets/javascripts/app/frontend/controllers/header.js b/app/assets/javascripts/app/frontend/controllers/header.js index 76d9d11ba..8ecd61a21 100644 --- a/app/assets/javascripts/app/frontend/controllers/header.js +++ b/app/assets/javascripts/app/frontend/controllers/header.js @@ -3,7 +3,6 @@ angular.module('app.frontend') return { restrict: 'E', scope: { - user: "=", logout: "&" }, templateUrl: 'frontend/header.html', @@ -21,6 +20,7 @@ angular.module('app.frontend') }) .controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) { + this.user = apiController.user; this.extensionManager = extensionManager; this.changePasswordPressed = function() { @@ -104,7 +104,7 @@ angular.module('app.frontend') return; } - apiController.changePassword(this.user, this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){ + apiController.changePassword(this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){ }) @@ -210,7 +210,6 @@ angular.module('app.frontend') } this.onAuthSuccess = function(user) { - this.user.uuid = user.uuid; // if(this.user.shouldMerge && this.hasLocalData()) { // apiController.mergeLocalDataRemotely(this.user, function(){ diff --git a/app/assets/javascripts/app/frontend/controllers/home.js b/app/assets/javascripts/app/frontend/controllers/home.js index 226f3ab6b..fb137ae60 100644 --- a/app/assets/javascripts/app/frontend/controllers/home.js +++ b/app/assets/javascripts/app/frontend/controllers/home.js @@ -2,30 +2,17 @@ angular.module('app.frontend') .controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) { $rootScope.bodyClass = "app-body-class"; - var onUserSet = function() { - apiController.setUser($scope.defaultUser); - $scope.allTag = new Tag({all: true}); - $scope.allTag.title = "All"; - $scope.tags = modelManager.tags; - $scope.allTag.notes = modelManager.notes; + apiController.loadLocalItems(); + $scope.allTag = new Tag({all: true}); + $scope.allTag.title = "All"; + $scope.tags = modelManager.tags; + $scope.allTag.notes = modelManager.notes; + apiController.sync(null); + // refresh every 30s + setInterval(function () { apiController.sync(null); - // refresh every 30s - setInterval(function () { - apiController.sync(null); - }, 30000); - } - - apiController.getCurrentUser(function(user){ - if(user) { - $scope.defaultUser = user; - $rootScope.title = "Notes — Standard Notes"; - onUserSet(); - } else { - $scope.defaultUser = new User(apiController.loadLocalItemsAndUser()); - onUserSet(); - } - }); + }, 30000); /* Tags Ctrl Callbacks @@ -115,7 +102,10 @@ angular.module('app.frontend') apiController.sync(function(response){ if(response && response.error) { - alert("There was an error saving your note. Please try again."); + if(!$scope.didShowErrorAlert) { + $scope.didShowErrorAlert = true; + alert("There was an error saving your note. Please try again."); + } callback(false); } else { note.hasChanges = false; @@ -147,8 +137,7 @@ angular.module('app.frontend') */ $scope.headerLogout = function() { - $scope.defaultUser = apiController.loadLocalItemsAndUser(); - $scope.tags = $scope.defaultUser.tags; + apiController.clearLocalStorage(); } diff --git a/app/assets/javascripts/app/frontend/controllers/notes.js b/app/assets/javascripts/app/frontend/controllers/notes.js index c8755d150..32532c1d5 100644 --- a/app/assets/javascripts/app/frontend/controllers/notes.js +++ b/app/assets/javascripts/app/frontend/controllers/notes.js @@ -6,7 +6,6 @@ angular.module('app.frontend') selectionMade: "&", remove: "&", tag: "=", - user: "=", removeTag: "&" }, @@ -71,7 +70,7 @@ angular.module('app.frontend') this.selectedTagShare = function() { this.showMenu = false; - if(!this.user.uuid) { + if(!apiController.isUserSignedIn()) { alert("You must be signed in to share a tag."); return; } diff --git a/app/assets/javascripts/app/frontend/controllers/tags.js b/app/assets/javascripts/app/frontend/controllers/tags.js index b3fde4fff..ef94b595d 100644 --- a/app/assets/javascripts/app/frontend/controllers/tags.js +++ b/app/assets/javascripts/app/frontend/controllers/tags.js @@ -9,7 +9,6 @@ angular.module('app.frontend') save: "&", tags: "=", allTag: "=", - user: "=", updateNoteTag: "&" }, templateUrl: 'frontend/tags.html', diff --git a/app/assets/javascripts/app/frontend/controllers/username_modal.js b/app/assets/javascripts/app/frontend/controllers/username_modal.js index 88663bc71..6fd05a3a4 100644 --- a/app/assets/javascripts/app/frontend/controllers/username_modal.js +++ b/app/assets/javascripts/app/frontend/controllers/username_modal.js @@ -1,11 +1,10 @@ angular.module('app.frontend') -.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, user, callback, $timeout) { +.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, callback, $timeout) { $scope.formData = {}; $scope.saveUsername = function() { - apiController.setUsername(user, $scope.formData.username, function(response){ + apiController.setUsername($scope.formData.username, function(response){ var username = response.username; - user.username = username; callback(username); $scope.closeThisDialog(); }) diff --git a/app/assets/javascripts/app/frontend/models/app/user.js b/app/assets/javascripts/app/frontend/models/app/user.js deleted file mode 100644 index d4ed88eae..000000000 --- a/app/assets/javascripts/app/frontend/models/app/user.js +++ /dev/null @@ -1,5 +0,0 @@ -class User { - constructor(json_obj) { - _.merge(this, json_obj); - } -} diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index 2b2493bb0..79e2e8e85 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -26,9 +26,8 @@ angular.module('app.frontend') function ApiController($rootScope, Restangular, modelManager, ngDialog) { - this.setUser = function(user) { - this.user = user; - } + this.user = {}; + this.syncToken = localStorage.getItem("syncToken"); /* Config @@ -58,7 +57,11 @@ angular.module('app.frontend') */ this.isUserSignedIn = function() { - return this.user.email && this.retrieveMk(); + return localStorage.getItem("jwt"); + } + + this.userId = function() { + return localStorage.getItem("uuid"); } this.getAuthParamsForEmail = function(email, callback) { @@ -79,7 +82,8 @@ angular.module('app.frontend') } Restangular.one("users/current").get().then(function(response){ var user = response.plain(); - callback(user); + _.merge(this.user, user); + callback(); }.bind(this)) .catch(function(response){ console.log("Error getting current user", response); @@ -100,6 +104,7 @@ angular.module('app.frontend') _.merge(request, params); request.post().then(function(response){ localStorage.setItem("jwt", response.token); + localStorage.setItem("uuid", response.uuid); callback(response); }) .catch(function(response){ @@ -118,6 +123,7 @@ angular.module('app.frontend') _.merge(request, params); request.post().then(function(response){ localStorage.setItem("jwt", response.token); + localStorage.setItem("uuid", response.uuid); callback(response); }) .catch(function(response){ @@ -126,46 +132,46 @@ angular.module('app.frontend') }.bind(this)); } - this.changePassword = function(user, current_password, new_password) { - this.getAuthParamsForEmail(email, function(authParams){ - if(!authParams) { - callback(null); - return; - } - Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) { - Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){ - var data = {}; - data.current_password = currentKeys.pw; - data.password = newKeys.pw; - data.password_confirmation = newKeys.pw; - - var user = this.user; - - this._performPasswordChange(currentKeys, newKeys, function(response){ - if(response && !response.error) { - // this.showNewPasswordForm = false; - // reencrypt data with new mk - this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){ - if(success) { - this.setMk(newKeys.mk); - alert("Your password has been changed and your data re-encrypted."); - } else { - // rollback password - this._performPasswordChange(newKeys, currentKeys, function(response){ - alert("There was an error changing your password. Your password has been rolled back."); - window.location.reload(); - }) - } - }.bind(this)); - } else { - // this.showNewPasswordForm = false; - alert("There was an error changing your password. Please try again."); - } - }.bind(this)) - }.bind(this)); - }.bind(this)); - }.bind(this)); - } + // this.changePassword = function(current_password, new_password) { + // this.getAuthParamsForEmail(email, function(authParams){ + // if(!authParams) { + // callback(null); + // return; + // } + // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) { + // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){ + // var data = {}; + // data.current_password = currentKeys.pw; + // data.password = newKeys.pw; + // data.password_confirmation = newKeys.pw; + // + // var user = this.user; + // + // this._performPasswordChange(currentKeys, newKeys, function(response){ + // if(response && !response.error) { + // // this.showNewPasswordForm = false; + // // reencrypt data with new mk + // this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){ + // if(success) { + // this.setMk(newKeys.mk); + // alert("Your password has been changed and your data re-encrypted."); + // } else { + // // rollback password + // this._performPasswordChange(newKeys, currentKeys, function(response){ + // alert("There was an error changing your password. Your password has been rolled back."); + // window.location.reload(); + // }) + // } + // }.bind(this)); + // } else { + // // this.showNewPasswordForm = false; + // alert("There was an error changing your password. Please try again."); + // } + // }.bind(this)) + // }.bind(this)); + // }.bind(this)); + // }.bind(this)); + // } this._performPasswordChange = function(email, current_keys, new_keys, callback) { var request = Restangular.one("auth"); @@ -181,53 +187,37 @@ angular.module('app.frontend') User */ - this.setUsername = function(user, username, callback) { - var request = Restangular.one("users", user.uuid); + this.setUsername = function(username, callback) { + var request = Restangular.one("users", this.userId()); request.username = username; request.patch().then(function(response){ + this.user.username = response.username; callback(response.plain()); - }) - } - - /* - Ensures that if encryption is disabled, all local items are uncrypted, - and that if it's enabled, that all local items are encrypted - */ - this.verifyEncryptionStatusOfAllItems = function(user, callback) { - var allItems = user.filteredItems(); - var itemsNeedingUpdate = []; - allItems.forEach(function(item){ - if(!item.isPublic()) { - if(item.encryptionEnabled() && !item.isEncrypted()) { - itemsNeedingUpdate.push(item); - } - } else { - if(item.isEncrypted()) { - itemsNeedingUpdate.push(item); - } - } }.bind(this)) - - if(itemsNeedingUpdate.length > 0) { - console.log("verifying encryption, items need updating", itemsNeedingUpdate); - this.saveBatchItems(user, itemsNeedingUpdate, callback) - } } - /* Items */ + this.setSyncToken = function(syncToken) { + this.syncToken = syncToken; + localStorage.setItem("syncToken", this.syncToken); + } + this.syncWithOptions = function(callback, options = {}) { - if(!this.user.uuid) { - this.writeItemsToLocalStorage(function(responseItems){ + this.writeAllItemsToLocalStorage(function(responseItems){ + if(!this.isUserSignedIn()) { + // is not signed in modelManager.clearDirtyItems(); if(callback) { callback(); } - }.bind(this)) + } + }.bind(this)) + + if(!this.isUserSignedIn()) { return; } @@ -245,7 +235,7 @@ angular.module('app.frontend') request.post().then(function(response) { modelManager.clearDirtyItems(); - this.syncToken = response.sync_token; + this.setSyncToken(response.sync_token); $rootScope.$broadcast("sync:updated_token", this.syncToken); this.handleItemsResponse(response.retrieved_items, null); @@ -253,13 +243,17 @@ angular.module('app.frontend') var omitFields = ["content", "enc_item_key", "auth_hash"]; this.handleItemsResponse(response.saved_items, omitFields); + this.writeAllItemsToLocalStorage(); + if(callback) { callback(response); } }.bind(this)) .catch(function(response){ console.log("Sync error: ", response); - callback({error: "Sync error"}); + if(callback) { + callback({error: "Sync error"}); + } }) } @@ -314,7 +308,7 @@ angular.module('app.frontend') } this.shareItem = function(item, callback) { - if(!this.user.uuid) { + if(!this.isUserSignedIn()) { alert("You must be signed in to share."); return; } @@ -333,7 +327,6 @@ angular.module('app.frontend') template: 'frontend/modals/username.html', controller: 'UsernameModalCtrl', resolve: { - user: function() {return this.user}.bind(this), callback: function() { return shareFn; } @@ -407,52 +400,56 @@ angular.module('app.frontend') /* Merging */ - this.mergeLocalDataRemotely = function(user, callback) { - var request = Restangular.one("users", user.uuid).one("merge"); - var tags = user.tags; - request.items = user.items; - request.items.forEach(function(item){ - if(item.tag_id) { - var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0]; - item.tag_name = tag.title; - } - }) - request.post().then(function(response){ - callback(); - localStorage.removeItem('user'); - }) + // this.mergeLocalDataRemotely = function(user, callback) { + // var request = Restangular.one("users", this.userId()).one("merge"); + // var tags = user.tags; + // request.items = user.items; + // request.items.forEach(function(item){ + // if(item.tag_id) { + // var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0]; + // item.tag_name = tag.title; + // } + // }) + // request.post().then(function(response){ + // callback(); + // localStorage.removeItem('user'); + // }) + // } + + + + + this.clearLocalStorage = function() { + localStorage.removeItem("items"); + localStorage.removeItem("mk"); + localStorage.removeItem("jwt"); + localStorage.removeItem("uuid"); + localStorage.removeItem("syncToken"); } - - - - - this.staticifyObject = function(object) { return JSON.parse(JSON.stringify(object)); } - this.writeItemsToLocalStorage = function(callback) { + this.writeAllItemsToLocalStorage = function(callback) { var items = _.map(modelManager.allItems, function(item){ - return this.paramsForItem(item, false, ["created_at", "updated_at"], false) + return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at"], false) }.bind(this)); - console.log("Writing items to local", items); + // console.log("Writing items to local", items); this.writeToLocalStorage('items', items); - callback(items); + if(callback) { + callback(items); + } } this.writeToLocalStorage = function(key, value) { localStorage.setItem(key, angular.toJson(value)); } - this.loadLocalItemsAndUser = function() { - var user = {}; + this.loadLocalItems = function() { var items = JSON.parse(localStorage.getItem('items')) || []; items = this.handleItemsResponse(items, null); Item.sortItemsByDate(items); - user.items = items; - user.shouldMerge = true; - return user; } /* @@ -551,7 +548,7 @@ angular.module('app.frontend') } this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) { - var items = user.filteredItems(); + var items = modelManager.allItems(); items.forEach(function(item){ if(item.content.substring(0, 3) == "001" && item.enc_item_key) { // first decrypt item_key with old key diff --git a/app/assets/templates/frontend/home.html.haml b/app/assets/templates/frontend/home.html.haml index 59445363d..a708df93b 100644 --- a/app/assets/templates/frontend/home.html.haml +++ b/app/assets/templates/frontend/home.html.haml @@ -5,7 +5,7 @@ "tags" => "tags", "user" => "defaultUser", "update-note-tag" => "tagsUpdateNoteTag"} %notes-section{"remove-tag" => "notesRemoveTag", "user" => "defaultUser", "add-new" => "notesAddNew", "selection-made" => "notesSelectionMade", - "tag" => "selectedTag", "user-id" => "defaultUser.uuid", "remove" => "deleteNote"} + "tag" => "selectedTag", "remove" => "deleteNote"} %editor-section{"ng-if" => "selectedNote", "note" => "selectedNote", "remove" => "deleteNote", "user" => "defaultUser", "save" => "saveNote"} diff --git a/vendor/assets/javascripts/transpiled.js b/vendor/assets/javascripts/transpiled.js index 376c56d95..23d891163 100644 --- a/vendor/assets/javascripts/transpiled.js +++ b/vendor/assets/javascripts/transpiled.js @@ -438,17 +438,10 @@ angular.module('app.frontend', ['ui.router', 'restangular', 'ngDialog']).config( $locationProvider.html5Mode(true); }); ; -var BaseCtrl = function BaseCtrl($rootScope, modelManager) { - // $rootScope.resetPasswordSubmit = function() { - // var new_keys = Neeto.crypto.generateEncryptionKeysForUser($rootScope.resetData.password, $rootScope.resetData.email); - // var data = _.clone($rootScope.resetData); - // data.password = new_keys.pw; - // data.password_confirmation = new_keys.pw; - // $auth.updatePassword(data); - // apiController.setMk(new_keys.mk); - // } - +var BaseCtrl = function BaseCtrl($rootScope, modelManager, apiController) { _classCallCheck(this, BaseCtrl); + + apiController.getCurrentUser(function () {}); }; angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); @@ -458,8 +451,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); scope: { save: "&", remove: "&", - note: "=", - user: "=" + note: "=" }, templateUrl: 'frontend/editor.html', replace: true, @@ -576,6 +568,11 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); statusTimeout = $timeout(function () { this.noteStatus = "All changes saved"; }.bind(this), 200); + } else { + if (statusTimeout) $timeout.cancel(statusTimeout); + statusTimeout = $timeout(function () { + this.noteStatus = "(Offline) — All changes saved"; + }.bind(this), 200); } }.bind(this)); }; @@ -590,7 +587,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); this.changesMade = function () { this.note.hasChanges = true; this.note.dummy = false; - if (this.user.uuid) { + if (apiController.isUserSignedIn()) { // signed out users have local autosave, dont need draft saving apiController.saveDraftToDisk(this.note); } @@ -720,7 +717,6 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); return { restrict: 'E', scope: { - user: "=", logout: "&" }, templateUrl: 'frontend/header.html', @@ -737,6 +733,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); }; }).controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) { + this.user = apiController.user; this.extensionManager = extensionManager; this.changePasswordPressed = function () { @@ -820,7 +817,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); return; } - apiController.changePassword(this.user, this.passwordChangeData.current_password, this.passwordChangeData.new_password, function (response) {}); + apiController.changePassword(this.passwordChangeData.current_password, this.passwordChangeData.new_password, function (response) {}); }.bind(this)); }; @@ -923,7 +920,6 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); }; this.onAuthSuccess = function (user) { - this.user.uuid = user.uuid; // if(this.user.shouldMerge && this.hasLocalData()) { // apiController.mergeLocalDataRemotely(this.user, function(){ @@ -940,30 +936,17 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); ;angular.module('app.frontend').controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) { $rootScope.bodyClass = "app-body-class"; - var onUserSet = function onUserSet() { - apiController.setUser($scope.defaultUser); - $scope.allTag = new Tag({ all: true }); - $scope.allTag.title = "All"; - $scope.tags = modelManager.tags; - $scope.allTag.notes = modelManager.notes; + apiController.loadLocalItems(); + $scope.allTag = new Tag({ all: true }); + $scope.allTag.title = "All"; + $scope.tags = modelManager.tags; + $scope.allTag.notes = modelManager.notes; + apiController.sync(null); + // refresh every 30s + setInterval(function () { apiController.sync(null); - // refresh every 30s - setInterval(function () { - apiController.sync(null); - }, 30000); - }; - - apiController.getCurrentUser(function (user) { - if (user) { - $scope.defaultUser = user; - $rootScope.title = "Notes — Standard Notes"; - onUserSet(); - } else { - $scope.defaultUser = new User(apiController.loadLocalItemsAndUser()); - onUserSet(); - } - }); + }, 30000); /* Tags Ctrl Callbacks @@ -1053,7 +1036,10 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); apiController.sync(function (response) { if (response && response.error) { - alert("There was an error saving your note. Please try again."); + if (!$scope.didShowErrorAlert) { + $scope.didShowErrorAlert = true; + alert("There was an error saving your note. Please try again."); + } callback(false); } else { note.hasChanges = false; @@ -1085,8 +1071,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); */ $scope.headerLogout = function () { - $scope.defaultUser = apiController.loadLocalItemsAndUser(); - $scope.tags = $scope.defaultUser.tags; + apiController.clearLocalStorage(); }; }); ;angular.module('app.frontend').directive("notesSection", function () { @@ -1096,7 +1081,6 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); selectionMade: "&", remove: "&", tag: "=", - user: "=", removeTag: "&" }, @@ -1160,7 +1144,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); this.selectedTagShare = function () { this.showMenu = false; - if (!this.user.uuid) { + if (!apiController.isUserSignedIn()) { alert("You must be signed in to share a tag."); return; } @@ -1232,7 +1216,6 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); save: "&", tags: "=", allTag: "=", - user: "=", updateNoteTag: "&" }, templateUrl: 'frontend/tags.html', @@ -1329,13 +1312,12 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); this.updateNoteTag()(note, newTag, this.selectedTag); }.bind(this); }); -;angular.module('app.frontend').controller('UsernameModalCtrl', function ($scope, apiController, Restangular, user, callback, $timeout) { +;angular.module('app.frontend').controller('UsernameModalCtrl', function ($scope, apiController, Restangular, callback, $timeout) { $scope.formData = {}; $scope.saveUsername = function () { - apiController.setUsername(user, $scope.formData.username, function (response) { + apiController.setUsername($scope.formData.username, function (response) { var username = response.username; - user.username = username; callback(username); $scope.closeThisDialog(); }); @@ -1889,13 +1871,6 @@ var Tag = function (_Item3) { return Tag; }(Item); -; -var User = function User(json_obj) { - _classCallCheck(this, User); - - _.merge(this, json_obj); -}; - ;angular.module('app.frontend').provider('apiController', function () { function domainName() { @@ -1922,9 +1897,8 @@ var User = function User(json_obj) { function ApiController($rootScope, Restangular, modelManager, ngDialog) { - this.setUser = function (user) { - this.user = user; - }; + this.user = {}; + this.syncToken = localStorage.getItem("syncToken"); /* Config @@ -1953,7 +1927,11 @@ var User = function User(json_obj) { */ this.isUserSignedIn = function () { - return this.user.email && this.retrieveMk(); + return localStorage.getItem("jwt"); + }; + + this.userId = function () { + return localStorage.getItem("uuid"); }; this.getAuthParamsForEmail = function (email, callback) { @@ -1973,7 +1951,8 @@ var User = function User(json_obj) { } Restangular.one("users/current").get().then(function (response) { var user = response.plain(); - callback(user); + _.merge(this.user, user); + callback(); }.bind(this)).catch(function (response) { console.log("Error getting current user", response); callback(response.data); @@ -1993,6 +1972,7 @@ var User = function User(json_obj) { _.merge(request, params); request.post().then(function (response) { localStorage.setItem("jwt", response.token); + localStorage.setItem("uuid", response.uuid); callback(response); }).catch(function (response) { callback(response.data); @@ -2010,6 +1990,7 @@ var User = function User(json_obj) { _.merge(request, params); request.post().then(function (response) { localStorage.setItem("jwt", response.token); + localStorage.setItem("uuid", response.uuid); callback(response); }).catch(function (response) { callback(response.data); @@ -2017,46 +1998,46 @@ var User = function User(json_obj) { }.bind(this)); }; - this.changePassword = function (user, current_password, new_password) { - this.getAuthParamsForEmail(email, function (authParams) { - if (!authParams) { - callback(null); - return; - } - Neeto.crypto.computeEncryptionKeysForUser(_.merge({ password: current_password, email: user.email }, authParams), function (currentKeys) { - Neeto.crypto.computeEncryptionKeysForUser(_.merge({ password: new_password, email: user.email }, authParams), function (newKeys) { - var data = {}; - data.current_password = currentKeys.pw; - data.password = newKeys.pw; - data.password_confirmation = newKeys.pw; - - var user = this.user; - - this._performPasswordChange(currentKeys, newKeys, function (response) { - if (response && !response.error) { - // this.showNewPasswordForm = false; - // reencrypt data with new mk - this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function (success) { - if (success) { - this.setMk(newKeys.mk); - alert("Your password has been changed and your data re-encrypted."); - } else { - // rollback password - this._performPasswordChange(newKeys, currentKeys, function (response) { - alert("There was an error changing your password. Your password has been rolled back."); - window.location.reload(); - }); - } - }.bind(this)); - } else { - // this.showNewPasswordForm = false; - alert("There was an error changing your password. Please try again."); - } - }.bind(this)); - }.bind(this)); - }.bind(this)); - }.bind(this)); - }; + // this.changePassword = function(current_password, new_password) { + // this.getAuthParamsForEmail(email, function(authParams){ + // if(!authParams) { + // callback(null); + // return; + // } + // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) { + // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){ + // var data = {}; + // data.current_password = currentKeys.pw; + // data.password = newKeys.pw; + // data.password_confirmation = newKeys.pw; + // + // var user = this.user; + // + // this._performPasswordChange(currentKeys, newKeys, function(response){ + // if(response && !response.error) { + // // this.showNewPasswordForm = false; + // // reencrypt data with new mk + // this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){ + // if(success) { + // this.setMk(newKeys.mk); + // alert("Your password has been changed and your data re-encrypted."); + // } else { + // // rollback password + // this._performPasswordChange(newKeys, currentKeys, function(response){ + // alert("There was an error changing your password. Your password has been rolled back."); + // window.location.reload(); + // }) + // } + // }.bind(this)); + // } else { + // // this.showNewPasswordForm = false; + // alert("There was an error changing your password. Please try again."); + // } + // }.bind(this)) + // }.bind(this)); + // }.bind(this)); + // }.bind(this)); + // } this._performPasswordChange = function (email, current_keys, new_keys, callback) { var request = Restangular.one("auth"); @@ -2071,53 +2052,38 @@ var User = function User(json_obj) { User */ - this.setUsername = function (user, username, callback) { - var request = Restangular.one("users", user.uuid); + this.setUsername = function (username, callback) { + var request = Restangular.one("users", this.userId()); request.username = username; request.patch().then(function (response) { + this.user.username = response.username; callback(response.plain()); - }); - }; - - /* - Ensures that if encryption is disabled, all local items are uncrypted, - and that if it's enabled, that all local items are encrypted - */ - this.verifyEncryptionStatusOfAllItems = function (user, callback) { - var allItems = user.filteredItems(); - var itemsNeedingUpdate = []; - allItems.forEach(function (item) { - if (!item.isPublic()) { - if (item.encryptionEnabled() && !item.isEncrypted()) { - itemsNeedingUpdate.push(item); - } - } else { - if (item.isEncrypted()) { - itemsNeedingUpdate.push(item); - } - } }.bind(this)); - - if (itemsNeedingUpdate.length > 0) { - console.log("verifying encryption, items need updating", itemsNeedingUpdate); - this.saveBatchItems(user, itemsNeedingUpdate, callback); - } }; /* Items */ + this.setSyncToken = function (syncToken) { + this.syncToken = syncToken; + localStorage.setItem("syncToken", this.syncToken); + }; + this.syncWithOptions = function (callback) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - if (!this.user.uuid) { - this.writeItemsToLocalStorage(function (responseItems) { + this.writeAllItemsToLocalStorage(function (responseItems) { + if (!this.isUserSignedIn()) { + // is not signed in modelManager.clearDirtyItems(); if (callback) { callback(); } - }.bind(this)); + } + }.bind(this)); + + if (!this.isUserSignedIn()) { return; } @@ -2135,7 +2101,7 @@ var User = function User(json_obj) { request.post().then(function (response) { modelManager.clearDirtyItems(); - this.syncToken = response.sync_token; + this.setSyncToken(response.sync_token); $rootScope.$broadcast("sync:updated_token", this.syncToken); this.handleItemsResponse(response.retrieved_items, null); @@ -2143,12 +2109,16 @@ var User = function User(json_obj) { var omitFields = ["content", "enc_item_key", "auth_hash"]; this.handleItemsResponse(response.saved_items, omitFields); + this.writeAllItemsToLocalStorage(); + if (callback) { callback(response); } }.bind(this)).catch(function (response) { console.log("Sync error: ", response); - callback({ error: "Sync error" }); + if (callback) { + callback({ error: "Sync error" }); + } }); }; @@ -2202,7 +2172,7 @@ var User = function User(json_obj) { }; this.shareItem = function (item, callback) { - if (!this.user.uuid) { + if (!this.isUserSignedIn()) { alert("You must be signed in to share."); return; } @@ -2221,9 +2191,6 @@ var User = function User(json_obj) { template: 'frontend/modals/username.html', controller: 'UsernameModalCtrl', resolve: { - user: function () { - return this.user; - }.bind(this), callback: function callback() { return shareFn; } @@ -2295,49 +2262,54 @@ var User = function User(json_obj) { /* Merging */ - this.mergeLocalDataRemotely = function (user, callback) { - var request = Restangular.one("users", user.uuid).one("merge"); - var tags = user.tags; - request.items = user.items; - request.items.forEach(function (item) { - if (item.tag_id) { - var tag = tags.filter(function (tag) { - return tag.uuid == item.tag_id; - })[0]; - item.tag_name = tag.title; - } - }); - request.post().then(function (response) { - callback(); - localStorage.removeItem('user'); - }); + // this.mergeLocalDataRemotely = function(user, callback) { + // var request = Restangular.one("users", this.userId()).one("merge"); + // var tags = user.tags; + // request.items = user.items; + // request.items.forEach(function(item){ + // if(item.tag_id) { + // var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0]; + // item.tag_name = tag.title; + // } + // }) + // request.post().then(function(response){ + // callback(); + // localStorage.removeItem('user'); + // }) + // } + + + this.clearLocalStorage = function () { + localStorage.removeItem("items"); + localStorage.removeItem("mk"); + localStorage.removeItem("jwt"); + localStorage.removeItem("uuid"); + localStorage.removeItem("syncToken"); }; this.staticifyObject = function (object) { return JSON.parse(JSON.stringify(object)); }; - this.writeItemsToLocalStorage = function (callback) { + this.writeAllItemsToLocalStorage = function (callback) { var items = _.map(modelManager.allItems, function (item) { - return this.paramsForItem(item, false, ["created_at", "updated_at"], false); + return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at"], false); }.bind(this)); - console.log("Writing items to local", items); + // console.log("Writing items to local", items); this.writeToLocalStorage('items', items); - callback(items); + if (callback) { + callback(items); + } }; this.writeToLocalStorage = function (key, value) { localStorage.setItem(key, angular.toJson(value)); }; - this.loadLocalItemsAndUser = function () { - var user = {}; + this.loadLocalItems = function () { var items = JSON.parse(localStorage.getItem('items')) || []; items = this.handleItemsResponse(items, null); Item.sortItemsByDate(items); - user.items = items; - user.shouldMerge = true; - return user; }; /* @@ -2456,7 +2428,7 @@ var User = function User(json_obj) { }; this.reencryptAllItemsAndSave = function (user, newMasterKey, oldMasterKey, callback) { - var items = user.filteredItems(); + var items = modelManager.allItems(); items.forEach(function (item) { if (item.content.substring(0, 3) == "001" && item.enc_item_key) { // first decrypt item_key with old key diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index 8f8f10c5d..971374668 100644 --- a/vendor/assets/javascripts/transpiled.js.map +++ b/vendor/assets/javascripts/transpiled.js.map @@ -1 +1 @@ -{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","email","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","directive","$timeout","restrict","scope","save","remove","note","user","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","apiController","markdownRenderer","extensionManager","editorMode","safeText","dummy","focusTitle","hasChanges","hasAvailableExtensions","extensionsInContextOfItem","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","setDirty","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","syncUpdated","$state","serverSideValidation","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","showExtensionsMenu","toggleExtensions","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","running","executeAction","deleteExtension","confirm","reloadExtensionsPressed","refreshExtensionsFromServer","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","archiveEncryptionFormat","downloadDataArchive","setAttribute","itemsDataFile","importFileSelected","files","file","reader","FileReader","onload","e","importJSONData","result","readAsText","showLogin","showRegistration","$scope","bodyClass","onUserSet","setUser","defaultUser","allTag","Tag","all","title","tags","notes","setInterval","getCurrentUser","User","loadLocalItemsAndUser","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","selectedNote","removeItemLocally","tagsAddNew","addItem","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","createRelationshipBetweenItems","notesRemoveTag","validNotes","Note","filterDummyNotes","setItemToBeDeleted","notesSelectionMade","notesAddNew","headerLogout","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","updateFromJSON","observers","generateUUID","json","created_at","updated_at","content","mapContentToLocalProperties","contentObject","dirty","notifyObserversOfChange","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","JSON","items","sort","b","Action","lastExecuted","permissions","permission","charAt","content_types","contentType","verb","encryptionMode","accepts_encrypted","accepts_decrypted","Extension","actions","context","map","externalResponseItem","pull","hasOnePublicTag","isPublic","filtered","unshift","provider","domainName","domain_comps","hostname","split","domain","$get","ngDialog","ApiController","refresh","setItem","isUserSignedIn","retrieveMk","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","generateInitialEncryptionKeysForUser","currentKeys","newKeys","_performPasswordChange","reencryptAllItemsAndSave","current_keys","new_keys","patch","verifyEncryptionStatusOfAllItems","allItems","filteredItems","itemsNeedingUpdate","isEncrypted","saveBatchItems","syncWithOptions","options","writeItemsToLocalStorage","responseItems","clearDirtyItems","dirtyItems","getDirtyItems","createRequestParamsForItem","additionalFields","syncToken","sync_token","handleItemsResponse","retrieved_items","omitFields","saved_items","undefined","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","paramsForExportFile","paramsForExtension","forExportFile","itemCopy","cloneDeep","assert","deleted","encryptSingleItem","auth_hash","createContentJSONFromProperties","base64","stringify","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","needingUpdate","open","template","resolve","className","disableAnimation","jsonString","mapResponseItemsToLocalModels","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","mergeLocalDataRemotely","tag_id","tag_name","removeItem","staticifyObject","object","writeToLocalStorage","value","toJson","sortItemsByDate","draftString","jsonObj","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","newMasterKey","oldMasterKey","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","enabledRepeatActionUrls","decryptedExtensions","addItemSyncObserver","ext","enableRepeatAction","actionsWithContextForItem","retrieveExtensionFromServer","repeat_mode","isRepeatActionEnabled","disableRepeatAction","oneUrl","handleExtensionLoadExternalResponseItem","updateFromExternalResponseItem","actionWithURL","win","outgoingParamsForItem","performPost","removeItemChangeObserver","addItemChangeObserver","changedItems","triggerWatchAction","actionQueue","repeat_timeout","diffInSeconds","queueAction","service","$filter","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","itemSyncObservers","itemChangeObservers","_extensions","contentTypes","itemId","models","findItem","resolveReferencesForItem","notifySyncObserversOfModels","sortItems","relevantItems","addObserver","changedItem","notifyItemChangeObserversOfModels","uniq","addItems","reference","referencedItem","addItemAsRelationship","id","removeAllRelationships","itemOne","itemTwo","removeItemAsRelationship","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":";;;;;;;;;;;;;;;;;;IAAMA,Q;;;;;;;wCAEgB;AAClB,aAAOC,SAASC,GAAT,CAAaC,SAAb,CAAuBC,MAAvB,CAA8B,MAAI,CAAlC,EAAqCC,QAArC,EAAP;AACD;;;mCAEc;AACb,UAAIC,SAASC,OAAOD,MAAP,IAAiBC,OAAOC,QAArC;AACA,UAAGF,MAAH,EAAW;AACT,YAAIG,MAAM,IAAIC,WAAJ,CAAgB,CAAhB,CAAV;AACAJ,eAAOK,eAAP,CAAuBF,GAAvB;AACA,YAAIG,MAAM,CAAC,CAAX;AACA,eAAO,uCAAuCC,OAAvC,CAA+C,OAA/C,EAAwD,UAASC,CAAT,EAAY;AACvEF;AACA,cAAIG,IAAKN,IAAIG,OAAK,CAAT,KAAiBA,MAAI,CAAL,GAAQ,CAAzB,GAA6B,EAArC;AACA,cAAII,IAAIF,KAAK,GAAL,GAAWC,CAAX,GAAgBA,IAAE,GAAF,GAAM,GAA9B;AACA,iBAAOC,EAAEX,QAAF,CAAW,EAAX,CAAP;AACH,SALM,CAAP;AAMD,OAVD,MAUO;AACL,YAAIY,IAAI,IAAIC,IAAJ,GAAWC,OAAX,EAAR;AACA,YAAGZ,OAAOa,WAAP,IAAsB,OAAOb,OAAOa,WAAP,CAAmBC,GAA1B,KAAkC,UAA3D,EAAsE;AACpEJ,eAAKG,YAAYC,GAAZ,EAAL,CADoE,CAC5C;AACzB;AACD,YAAIC,OAAO,uCAAuCT,OAAvC,CAA+C,OAA/C,EAAwD,UAASC,CAAT,EAAY;AAC7E,cAAIC,IAAI,CAACE,IAAIM,KAAKnB,MAAL,KAAc,EAAnB,IAAuB,EAAvB,GAA4B,CAApC;AACAa,cAAIM,KAAKC,KAAL,CAAWP,IAAE,EAAb,CAAJ;AACA,iBAAO,CAACH,KAAG,GAAH,GAASC,CAAT,GAAcA,IAAE,GAAF,GAAM,GAArB,EAA2BV,QAA3B,CAAoC,EAApC,CAAP;AACD,SAJU,CAAX;AAKA,eAAOiB,IAAP;AACD;AACF;;;gCAEWG,iB,EAAmBC,G,EAAK;AAClC,UAAIC,UAAU1B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuBJ,GAAvB,CAAd;AACA,UAAIK,SAAU9B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuB,EAAvB,CAAd;AACA,UAAIE,YAAY/B,SAASgC,GAAT,CAAaC,OAAb,CAAqBT,iBAArB,EAAwCE,OAAxC,EAAiD,EAAEQ,IAAIJ,MAAN,EAAeK,MAAMnC,SAASmC,IAAT,CAAcC,GAAnC,EAAwCC,SAASrC,SAASsC,GAAT,CAAaC,KAA9D,EAAjD,CAAhB;AACA,aAAOR,UAAU3B,QAAV,CAAmBJ,SAAS2B,GAAT,CAAaa,IAAhC,CAAP;AACD;;;gCAEWC,I,EAAMhB,G,EAAK;AACrB,UAAIC,UAAU1B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuBJ,GAAvB,CAAd;AACA,UAAIK,SAAU9B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuB,EAAvB,CAAd;AACA,UAAIa,YAAY1C,SAASgC,GAAT,CAAaW,OAAb,CAAqBF,IAArB,EAA2Bf,OAA3B,EAAoC,EAAEQ,IAAIJ,MAAN,EAAeK,MAAMnC,SAASmC,IAAT,CAAcC,GAAnC,EAAwCC,SAASrC,SAASsC,GAAT,CAAaC,KAA9D,EAApC,CAAhB;AACA,aAAOG,UAAUtC,QAAV,EAAP;AACD;;;kDAE6B;AAC5B,UAAIwC,OAAOC,MAAMxC,MAAN,CAAayC,iBAAb,EAAX;AACA,UAAIC,aAAaF,MAAMxC,MAAN,CAAayC,iBAAb,EAAjB;AACA,aAAO9C,SAASgD,MAAT,CAAgBD,UAAhB,EAA4BH,IAA5B,EAAkC,EAAEK,SAAS,MAAI,EAAf,EAAlC,EAAuD7C,QAAvD,EAAP;AACD;;;mCAEcqB,G,EAAK;AAClB,aAAOA,IAAIyB,SAAJ,CAAc,CAAd,EAAiBzB,IAAI0B,MAAJ,GAAW,CAA5B,CAAP;AACD;;;oCAEe1B,G,EAAK;AACnB,aAAOA,IAAIyB,SAAJ,CAAczB,IAAI0B,MAAJ,GAAW,CAAzB,EAA4B1B,IAAI0B,MAAhC,CAAP;AACD;;;2BAEMV,I,EAAM;AACX,aAAOzC,SAAS2B,GAAT,CAAaa,IAAb,CAAkBX,KAAlB,CAAwBY,IAAxB,EAA8BrC,QAA9B,CAAuCJ,SAAS2B,GAAT,CAAayB,MAApD,CAAP;AACD;;;iCAEYC,Y,EAAc;AACzB,aAAOrD,SAAS2B,GAAT,CAAayB,MAAb,CAAoBvB,KAApB,CAA0BwB,YAA1B,EAAwCjD,QAAxC,CAAiDJ,SAAS2B,GAAT,CAAaa,IAA9D,CAAP;AACD;;;2BAEMC,I,EAAM;AACX,aAAOzC,SAASsD,MAAT,CAAgBb,IAAhB,EAAsBrC,QAAtB,EAAP;AACD;;;yBAEIqC,I,EAAM;AACT,aAAOzC,SAASuD,IAAT,CAAcd,IAAd,EAAoBrC,QAApB,EAAP;AACD;;;4BAEOoD,O,EAAS/B,G,EAAK;AACpB,UAAIC,UAAU1B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuBJ,GAAvB,CAAd;AACA,UAAIgC,cAAczD,SAAS2B,GAAT,CAAaa,IAAb,CAAkBX,KAAlB,CAAwB2B,OAAxB,CAAlB;AACA,aAAOxD,SAAS0D,UAAT,CAAoBD,WAApB,EAAiC/B,OAAjC,EAA0CtB,QAA1C,EAAP;AACD;;;mDAE8G;AAAA,qFAAd,EAAc;AAAA,UAAjFuD,KAAiF,QAAjFA,KAAiF;AAAA,UAA1EC,QAA0E,QAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,QAAhEA,OAAgE;AAAA,UAAvDC,OAAuD,QAAvDA,OAAuD;AAAA,UAA9CC,MAA8C,QAA9CA,MAA8C;AAAA,UAAtCC,OAAsC,QAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,QAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AAC5G,WAAKC,wBAAL,CAA8B,EAACP,UAAUA,QAAX,EAAqBC,SAASA,OAA9B;AAC5BC,iBAASA,OADmB,EACVC,QAAQA,MADE,EACMC,SAASA,OADf,EACwBC,aAAaA,WADrC,EAA9B,EACiF,UAASG,IAAT,EAAc;AAC3F,YAAIC,KAAKD,KAAK,CAAL,CAAT;AACA,YAAIE,KAAKF,KAAK,CAAL,CAAT;;AAEAF,iBAAS,EAACG,IAAIA,EAAL,EAASC,IAAIA,EAAb,EAAT;AACD,OANH;AAOD;;;2DAEsE;AAAA,sFAAd,EAAc;AAAA,UAAjCX,KAAiC,SAAjCA,KAAiC;AAAA,UAA1BC,QAA0B,SAA1BA,QAA0B;;AAAA,UAAVM,QAAU;;AACrE,UAAIK,WAAW,KAAKC,+BAAL,EAAf;AADqE,UAEhEV,OAFgE,GAEvBS,QAFuB,CAEhET,OAFgE;AAAA,UAEvDC,MAFuD,GAEvBQ,QAFuB,CAEvDR,MAFuD;AAAA,UAE/CE,WAF+C,GAEvBM,QAFuB,CAE/CN,WAF+C;AAAA,UAElCD,OAFkC,GAEvBO,QAFuB,CAElCP,OAFkC;;AAGrE,UAAIS,WAAW,KAAK3B,iBAAL,EAAf;AACA,UAAIe,UAAU,KAAKa,IAAL,CAAUf,QAAQ,IAAR,GAAec,QAAzB,CAAd;AACA,WAAKN,wBAAL,CAA8BQ,EAAEC,KAAF,CAAQ,EAACjB,OAAOA,KAAR,EAAeC,UAAUA,QAAzB,EAAmCC,SAASA,OAA5C,EAAR,EAA8DU,QAA9D,CAA9B,EAAuG,UAASH,IAAT,EAAc;AACnH,YAAIC,KAAKD,KAAK,CAAL,CAAT;AACA,YAAIE,KAAKF,KAAK,CAAL,CAAT;;AAEAF,iBAASS,EAAEC,KAAF,CAAQ,EAACP,IAAIA,EAAL,EAASC,IAAIA,EAAb,EAAiBG,UAAUA,QAA3B,EAAR,EAA8CF,QAA9C,CAAT;AACD,OALD;AAMD;;;;;;QAGKxE,Q,GAAAA,Q;;IACF8E,U;;;;;;;;;;;;;AAEJ;+CACoG;AAAA,sFAAd,EAAc;AAAA,UAA1EjB,QAA0E,SAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDC,OAAuD,SAAvDA,OAAuD;AAAA,UAA9CC,MAA8C,SAA9CA,MAA8C;AAAA,UAAtCC,OAAsC,SAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AAClG,UAAIY,aAAa;AACf,kBAAW9E,SAAS+E,IAAT,CAAczB,MADV;AAEf,kBAAWtD,SAAS+E,IAAT,CAAcC;AAFV,OAAjB;AAIA,UAAIC,YAAY;AACd,kBAAWjF,SAASgD;AADN,OAAhB;;AAIA,UAAIkC,MAAMJ,WAAWf,MAAX,CAAV;AACA,UAAIoB,MAAMF,UAAUnB,OAAV,CAAV;AACA,UAAIsB,SAASD,IAAIvB,QAAJ,EAAcC,OAAd,EAAuB,EAAEZ,SAASgB,cAAY,EAAvB,EAA2BoB,QAAQH,GAAnC,EAAwCI,YAAYtB,OAApD,EAAvB,EAAsF5D,QAAtF,EAAb;;AAEA,UAAImF,eAAeH,OAAOjC,MAA1B;AACA,UAAIqC,YAAYJ,OAAOK,KAAP,CAAa,CAAb,EAAgBF,eAAa,CAA7B,CAAhB;AACA,UAAIG,aAAaN,OAAOK,KAAP,CAAaF,eAAa,CAA1B,EAA6BA,YAA7B,CAAjB;AACArB,eAAS,CAACsB,SAAD,EAAYE,UAAZ,CAAT;AACD;;;sDAEiC;AAChC,aAAO,EAAC5B,SAAS,QAAV,EAAoBC,QAAQ,QAA5B,EAAsCE,aAAa,GAAnD,EAAwDD,SAAS,IAAjE,EAAP;AACD;;;;EAxBsBjE,Q;;QA4BjB8E,U,GAAAA,U;AACR,IAAIc,eAAerF,OAAOD,MAAP,CAAcuF,MAAjC;;IAEKC,W;;;;;;;;;;;;;AAEJ;;;sDAGkC;AAChC,aAAO,EAAC/B,SAAS,QAAV,EAAoBC,QAAQ,QAA5B,EAAsCE,aAAa,GAAnD,EAAwDD,SAAS,IAAjE,EAAP;AACD;;AAED;;;;+CACoG;AAAA,sFAAd,EAAc;AAAA,UAA1EJ,QAA0E,SAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDC,OAAuD,SAAvDA,OAAuD;AAAA,UAA9CC,MAA8C,SAA9CA,MAA8C;AAAA,UAAtCC,OAAsC,SAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AACnG,WAAK4B,eAAL,CAAqB,EAAClC,UAAUA,QAAX,EAAqBE,SAASA,OAA9B,EAAuCC,QAAQA,MAA/C,EAAuDF,SAASA,OAAhE,EAAyEG,SAASA,OAAlF,EAA2FC,aAAaA,WAAxG,EAArB,EAA2I,UAASmB,MAAT,EAAgB;AACzJ,YAAIG,eAAeH,OAAOjC,MAA1B;AACA,YAAIqC,YAAYJ,OAAOK,KAAP,CAAa,CAAb,EAAgBF,eAAa,CAA7B,CAAhB;AACA,YAAIG,aAAaN,OAAOK,KAAP,CAAaF,eAAa,CAA1B,EAA6BA,YAA7B,CAAjB;AACArB,iBAAS,CAACsB,SAAD,EAAYE,UAAZ,CAAT;AACD,OALD;AAMA;;AAED;;;;;;sCAI2F;AAAA,sFAAd,EAAc;AAAA,UAA1E9B,QAA0E,SAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDG,OAAuD,SAAvDA,OAAuD;AAAA,UAA9CF,OAA8C,SAA9CA,OAA8C;AAAA,UAArCC,MAAqC,SAArCA,MAAqC;AAAA,UAA7BE,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;;AAE1F,WAAK6B,kBAAL,CAAwBnC,QAAxB,EAAkCE,OAAlC,EAA2C,UAASrC,GAAT,EAAa;;AAEtD,YAAG,CAACA,GAAJ,EAAS;AACPuE,kBAAQC,GAAR,CAAY,iCAAZ;AACA/B,mBAAS,IAAT;AACA;AACD;;AAED,aAAKgC,mBAAL,CAAyB,EAACzE,KAAKA,GAAN,EAAWqC,SAASA,OAApB,EAA6BC,QAAQA,MAArC,EAA6CF,SAASA,OAAtD,EAA+DG,SAASA,OAAxE,EAAiFC,aAAaA,WAA9F,EAAzB,EAAqI,UAASxC,GAAT,EAAa;AAChJ,cAAG,CAACA,GAAJ,EAAS;AACPyC,qBAAS,IAAT;AACA;AACD;;AAEDA,mBAASzC,GAAT;AAED,SARoI,CAQnI0E,IARmI,CAQ9H,IAR8H,CAArI;AASD,OAjB0C,CAiBzCA,IAjByC,CAiBpC,IAjBoC,CAA3C;AAkBA;;;uCAEkBC,K,EAAOtC,O,EAASI,Q,EAAU;AAC1CyB,mBAAaU,SAAb,CACC,KADD,EAEC,KAAKC,mBAAL,CAAyBF,KAAzB,CAFD,EAGC,EAACG,MAAMzC,QAAQ0C,WAAR,EAAP,EAHD,EAIC,KAJD,EAKC,CAAC,YAAD,CALD,EAOAC,IAPA,CAOK,UAAShF,GAAT,EAAa;AACjByC,iBAASzC,GAAT;AACD,OATA,EAUAiF,KAVA,CAUM,UAASC,GAAT,EAAa;AAClBX,gBAAQY,KAAR,CAAcD,GAAd;AACAzC,iBAAS,IAAT;AACD,OAbA;AAcF;;;0CAEyF;AAAA,sFAAd,EAAc;AAAA,UAArEzC,GAAqE,SAArEA,GAAqE;AAAA,UAAhEqC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDC,MAAuD,SAAvDA,MAAuD;AAAA,UAA/CF,OAA+C,SAA/CA,OAA+C;AAAA,UAAtCG,OAAsC,SAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AACvF,UAAIY,aAAa;AACf,kBAAW,SADI;AAEf,kBAAW;AAFI,OAAjB;AAIA,UAAII,MAAMJ,WAAWf,MAAX,CAAV;AACA4B,mBAAakB,UAAb,CACC;AACE,gBAAQ/C,QAAQ0C,WAAR,EADV;AAEE5D,cAAM,KAAK0D,mBAAL,CAAyBzC,OAAzB,CAFR;AAGEyB,oBAAYtB,OAHd;AAIE8C,cAAM,EAACP,MAAMrB,GAAP;AAJR,OADD,EAOCzD,GAPD,EAQCwC,WARD,EAUAwC,IAVA,CAUK,UAASM,IAAT,EAAc;AAClB,YAAItF,MAAM,KAAKuF,sBAAL,CAA4B,IAAIC,UAAJ,CAAeF,IAAf,CAA5B,CAAV;AACA7C,iBAASzC,GAAT;AACD,OAHK,CAGJ0E,IAHI,CAGC,IAHD,CAVL,EAcAO,KAdA,CAcM,UAASC,GAAT,EAAa;AAClBX,gBAAQY,KAAR,CAAcD,GAAd;AACAzC,iBAAS,IAAT;AACD,OAjBA;AAkBF;;;wCAEmBgD,M,EAAQ;AACzB,UAAIC,UAAU,IAAIC,WAAJ,CAAgB,OAAhB,CAAd;AACA,aAAOD,QAAQE,MAAR,CAAeH,MAAf,CAAP;AACD;;;2CAEqBI,W,EAAa;AAChC,UAAIC,YAAY,IAAIN,UAAJ,CAAeK,WAAf,CAAhB;AACA,UAAIE,YAAY,EAAhB;AACA,UAAIC,WAAJ;;AAEA,WAAK,IAAIC,IAAE,CAAX,EAAcA,IAAEH,UAAUI,UAA1B,EAAsCD,GAAtC,EAA2C;AACvCD,sBAAcF,UAAUG,CAAV,EAAatH,QAAb,CAAsB,EAAtB,CAAd;AACA,YAAIqH,YAAYtE,MAAZ,GAAqB,CAAzB,EAA4B;AACxBsE,wBAAc,MAAMA,WAApB;AACH;AACDD,qBAAaC,WAAb;AACH;AACD,aAAOD,SAAP;AACH;;;;EA1GuBzH,Q;;QA6GjB8F,W,GAAAA,W;AACR;;AAED,IAAIhD,QAAQA,SAAS,EAArB;;AAEA,IAAGvC,OAAOD,MAAP,CAAcuF,MAAjB,EAAyB;AACvB/C,QAAMxC,MAAN,GAAe,IAAIwF,WAAJ,EAAf;AACD,CAFD,MAEO;AACLhD,QAAMxC,MAAN,GAAe,IAAIwE,UAAJ,EAAf;AACD;;AAED+C,QAAQC,MAAR,CAAe,cAAf,EAA+B,CAC7B,WAD6B,EAE7B,aAF6B,EAG7B,UAH6B,CAA/B,EAMCC,MAND,CAMQ,UAAUC,mBAAV,EAA+BC,qBAA/B,EAAsD;AAC5DD,sBAAoBE,iBAApB,CAAsC,EAAC,gBAAgB,kBAAjB,EAAtC;;AAEA,MAAIC,MAAMF,sBAAsBG,gBAAtB,EAAV;AACAJ,sBAAoBK,UAApB,CAA+BF,MAAM,MAArC;;AAEAH,sBAAoBM,yBAApB,CAA8C,UAASC,OAAT,EAAkBC,SAAlB,EAA6BC,KAA7B,EAAoCN,GAApC,EAAyCO,OAAzC,EAAkDC,MAAlD,EAA0DC,UAA1D,EAAsE;AAClH,QAAIC,QAAQC,aAAaC,OAAb,CAAqB,KAArB,CAAZ;AACA,QAAGF,KAAH,EAAU;AACRH,gBAAU9D,EAAEoE,MAAF,CAASN,OAAT,EAAkB,EAACO,eAAe,YAAYH,aAAaC,OAAb,CAAqB,KAArB,CAA5B,EAAlB,CAAV;AACD;;AAED,WAAO;AACLR,eAASA,OADJ;AAELI,cAAQA,MAFH;AAGLD,eAASA,OAHJ;AAILE,kBAAYA;AAJP,KAAP;AAMD,GAZD;AAaD,CAzBD,EA0BCb,MA1BD,CA0BQ,CAAC,YAAD,EAAe,UAAUmB,UAAV,EAAsB;AACzC;AACH,CAFO,CA1BR;AA6BA,CAACrB,QAAQC,MAAR,CAAe,cAAf,EACEC,MADF,CACS,UAAUoB,cAAV,EAA0BC,kBAA1B,EAA8CC,iBAA9C,EAAiE;;AAEvEF,iBACGG,KADH,CACS,MADT,EACiB;AACbC,cAAU;AADG,GADjB,EAKGD,KALH,CAKS,MALT,EAKiB;AACbnB,SAAK,GADQ;AAEbqB,YAAQ,MAFK;AAGbC,WAAO;AACL,kBAAa;AACXC,qBAAa,oBADF;AAEXC,oBAAY;AAFD;AADR;AAHM,GALjB;;AAgBE;AAhBF,GAiBGL,KAjBH,CAiBS,KAjBT,EAiBgB;AACZE,YAAQ,MADI;AAEZC,WAAO;AACL,kBAAa;AACXC,qBAAa;AADF;AADR;AAFK,GAjBhB;;AA0BE;AACAN,qBAAmBQ,SAAnB,CAA6B,UAASC,SAAT,EAAoBC,SAApB,EAA8B;AACxD,QAAIR,QAAQO,UAAUE,GAAV,CAAc,QAAd,CAAZ;AACAT,UAAMU,EAAN,CAAS,KAAT;AACA,WAAOF,UAAUG,IAAV,EAAP;AACF,GAJD;;AAMA;AACAZ,oBAAkBa,SAAlB,CAA4B,IAA5B;AAEH,CAvCF;AAwCD;IAAOC,Q,GACL,kBAAYC,UAAZ,EAAwBC,YAAxB,EAAsC;AACpC;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AARoC;AASrC,C;;AAGHxC,QAAQC,MAAR,CAAe,cAAf,EAA+B6B,UAA/B,CAA0C,UAA1C,EAAsDQ,QAAtD;AACA,CAACtC,QAAQC,MAAR,CAAe,cAAf,EACEwC,SADF,CACY,eADZ,EAC6B,UAASC,QAAT,EAAkB;AAC5C,SAAO;AACLC,cAAU,GADL;AAELC,WAAO;AACLC,YAAM,GADD;AAELC,cAAQ,GAFH;AAGLC,YAAM,GAHD;AAILC,YAAM;AAJD,KAFF;AAQLnB,iBAAa,sBARR;AASL7I,aAAS,IATJ;AAUL8I,gBAAY,YAVP;AAWLmB,kBAAc,MAXT;AAYLC,sBAAkB,IAZb;;AAcLC,UAAK,cAASP,KAAT,EAAgBQ,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;;AAEtC,UAAIC,UAAU,SAAVA,OAAU,CAASC,KAAT,EAAgB;AAC5B,YAAIA,MAAMC,OAAN,IAAiBD,MAAME,OAA3B,EAAoC;AAChC,kBAAQC,OAAOC,YAAP,CAAoBJ,MAAMK,KAA1B,EAAiCC,WAAjC,EAAR;AACA,iBAAK,GAAL;AACIN,oBAAMO,cAAN;AACArB,uBAAS,YAAU;AACjBY,qBAAKU,QAAL,CAAcR,KAAd;AACD,eAFD;AAGA;AACJ,iBAAK,GAAL;AACIA,oBAAMO,cAAN;AACArB,uBAAS,YAAU;AACjBY,qBAAKW,eAAL;AACD,eAFD;AAGA;AACJ,iBAAK,GAAL;AACIT,oBAAMO,cAAN;AACArB,uBAAS,YAAU;AACjBY,qBAAKY,cAAL;AACD,eAFD;AAGA;AACJ,iBAAK,GAAL;AACIV,oBAAMO,cAAN;AACArB,uBAAS,YAAU;AACjBY,qBAAKa,gBAAL;AACD,eAFD;AAGA;AAxBJ;AA0BH;AACF,OA7BD;;AA+BAzL,aAAO0L,gBAAP,CAAwB,SAAxB,EAAmCb,OAAnC;;AAEAX,YAAMyB,GAAN,CAAU,UAAV,EAAsB,YAAU;AAC9B3L,eAAO4L,mBAAP,CAA2B,SAA3B,EAAsCf,OAAtC;AACD,OAFD;;AAIAX,YAAM2B,MAAN,CAAa,WAAb,EAA0B,UAASxB,IAAT,EAAeyB,OAAf,EAAuB;AAC/C,YAAGzB,IAAH,EAAS;AACPO,eAAKmB,OAAL,CAAa1B,IAAb,EAAmByB,OAAnB;AACD,SAFD,MAEO;AACLlB,eAAKP,IAAL,GAAY,EAAZ;AACD;AACF,OAND;AAOD;AA5DI,GAAP;AA8DD,CAhEF,EAiEEjB,UAjEF,CAiEa,YAjEb,EAiE2B,UAAU4C,IAAV,EAAgBhC,QAAhB,EAA0BiC,aAA1B,EAAyCC,gBAAzC,EAA2DrC,UAA3D,EAAuEsC,gBAAvE,EAAyF;;AAEjH,OAAKJ,OAAL,GAAe,UAAS1B,IAAT,EAAeyB,OAAf,EAAwB;AACrC,SAAKM,UAAL,GAAkB,MAAlB;;AAEA,QAAG/B,KAAKgC,QAAL,GAAgBxJ,MAAhB,IAA0B,CAA1B,IAA+BwH,KAAKiC,KAAvC,EAA8C;AAC5C,WAAKC,UAAL,CAAgB,GAAhB;AACD;;AAED,QAAGT,WAAWA,WAAWzB,IAAzB,EAA+B;AAC7B,UAAGyB,QAAQU,UAAX,EAAuB;AACrB,aAAKrC,IAAL,GAAY2B,OAAZ,EAAqB,IAArB;AACD,OAFD,MAEO,IAAGA,QAAQQ,KAAX,EAAkB;AACvB,aAAKlC,MAAL,GAAc0B,OAAd;AACD;AACF;AACF,GAdD;;AAgBA,OAAKW,sBAAL,GAA8B,YAAW;AACvC,WAAON,iBAAiBO,yBAAjB,CAA2C,KAAKrC,IAAhD,EAAsDxH,MAAtD,GAA+D,CAAtE;AACD,GAFD;;AAIA,OAAK8J,oBAAL,GAA4B,YAAW;AACrC,SAAKP,UAAL,GAAkB,MAAlB;AACA,SAAKQ,WAAL,CAAiB,GAAjB;AACD,GAHD;;AAKA,OAAKA,WAAL,GAAmB,UAASC,KAAT,EAAgB;AACjCC,eAAW,YAAU;AACnB,UAAI9E,UAAU+E,SAASC,cAAT,CAAwB,kBAAxB,CAAd;AACAhF,cAAQiF,KAAR;AACD,KAHD,EAGGJ,KAHH;AAID,GALD;;AAOA,OAAKN,UAAL,GAAkB,UAASM,KAAT,EAAgB;AAChCC,eAAW,YAAU;AACnBC,eAASC,cAAT,CAAwB,mBAAxB,EAA6CC,KAA7C;AACD,KAFD,EAEGJ,KAFH;AAGD,GAJD;;AAMA,OAAKK,eAAL,GAAuB,YAAW;AAChC,SAAKC,QAAL,GAAgB,KAAhB;AACD,GAFD;;AAIA,OAAKC,eAAL,GAAuB,YAAW;AAChC,WAAOlB,iBAAiBmB,UAAjB,CAA4BnB,iBAAiBoB,sBAAjB,CAAwC,KAAKjD,IAAL,CAAUgC,QAAV,EAAxC,CAA5B,CAAP;AACD,GAFD;;AAIA,MAAIkB,aAAJ;;AAEA,OAAKjC,QAAL,GAAgB,UAASkC,MAAT,EAAiB;AAC/B,QAAInD,OAAO,KAAKA,IAAhB;AACAA,SAAKiC,KAAL,GAAa,KAAb;AACA,SAAKnC,IAAL,GAAYE,IAAZ,EAAkB,UAASoD,OAAT,EAAiB;AACjC,UAAGA,OAAH,EAAY;AACVxB,sBAAcyB,UAAd;;AAEA,YAAGH,aAAH,EAAkBvD,SAAS2D,MAAT,CAAgBJ,aAAhB;AAClBA,wBAAgBvD,SAAS,YAAU;AACjC,eAAK4D,UAAL,GAAkB,mBAAlB;AACD,SAFwB,CAEvB/H,IAFuB,CAElB,IAFkB,CAAT,EAEF,GAFE,CAAhB;AAGD;AACF,KATiB,CAShBA,IATgB,CASX,IATW,CAAlB;AAUD,GAbD;;AAeA,OAAKgI,SAAL,GAAiB,UAASL,MAAT,EAAiB;AAChCA,WAAOM,MAAP,CAAcC,IAAd;AACA,SAAKzC,QAAL,CAAckC,MAAd;AACA,SAAKZ,WAAL;AACD,GAJD;;AAMA,MAAIoB,WAAJ;AACA,OAAKC,WAAL,GAAmB,YAAW;AAC5B,SAAK5D,IAAL,CAAUmC,UAAV,GAAuB,IAAvB;AACA,SAAKnC,IAAL,CAAUiC,KAAV,GAAkB,KAAlB;AACA,QAAG,KAAKhC,IAAL,CAAUvJ,IAAb,EAAmB;AACjB;AACAkL,oBAAciC,eAAd,CAA8B,KAAK7D,IAAnC;AACD;;AAED,QAAG2D,WAAH,EAAgBhE,SAAS2D,MAAT,CAAgBK,WAAhB;AAChB,QAAGT,aAAH,EAAkBvD,SAAS2D,MAAT,CAAgBJ,aAAhB;AAClBS,kBAAchE,SAAS,YAAU;AAC/B,WAAK4D,UAAL,GAAkB,WAAlB;AACA,WAAKtC,QAAL;AACD,KAHsB,CAGrBzF,IAHqB,CAGhB,IAHgB,CAAT,EAGA,GAHA,CAAd;AAID,GAdD;;AAiBA,OAAKsI,cAAL,GAAsB,YAAW;AAC/B,SAAKF,WAAL;AACD,GAFD;;AAIA,OAAKG,WAAL,GAAmB,YAAW;AAC5B,SAAKH,WAAL;AACD,GAFD;;AAIA,OAAKI,WAAL,GAAmB,YAAW;AAC5B,SAAKC,WAAL,GAAmB,IAAnB;AACD,GAFD;;AAIA,OAAKC,cAAL,GAAsB,YAAW;AAC/B,SAAKC,WAAL,GAAmB,KAAnB;AACA3E,eAAW4E,UAAX,CAAsB,eAAtB;AACA,SAAKC,UAAL,GAAkB,KAAlB;AACD,GAJD;;AAMA,OAAKC,UAAL,GAAkB,YAAW;AAC3B,SAAKL,WAAL,GAAmB,KAAnB;AACD,GAFD;;AAIA,OAAK7C,gBAAL,GAAwB,YAAW;AACjC,SAAKmD,UAAL,GAAkB,CAAC,KAAKA,UAAxB;AACA,QAAG,KAAKA,UAAR,EAAoB;AAClB,UAAG,KAAKxC,UAAL,IAAmB,MAAtB,EAA8B;AAC5B;AACA,aAAKQ,WAAL,CAAiB,CAAjB;AACD;AACF,KALD,MAKO,CAEN;AACF,GAVD;;AAYA,OAAKiC,gBAAL,GAAwB,YAAW;AACjC,SAAK1B,QAAL,GAAgB,KAAhB;AACD,GAFD;;AAIA,OAAK3B,cAAL,GAAsB,YAAW;AAC/B,QAAG,KAAKY,UAAL,IAAmB,SAAtB,EAAiC;AAC/B,WAAKA,UAAL,GAAkB,MAAlB;AACD,KAFD,MAEO;AACL,WAAKA,UAAL,GAAkB,SAAlB;AACD;AACF,GAND;;AAQA,OAAK0C,cAAL,GAAsB,YAAW;AAC/B,SAAK3B,QAAL,GAAgB,KAAhB;AACA,QAAIvF,MAAM,KAAKmH,gBAAL,CAAsB,KAAK1E,IAA3B,CAAV;AACAzC,UAAMA,IAAItH,OAAJ,CAAY,KAAK+J,IAAL,CAAU2E,iBAAtB,EAAyC,EAAzC,CAAN;AACA,SAAKpH,GAAL,GAAW,EAACqH,MAAMrH,GAAP,EAAYU,OAAQ,KAAK+B,IAAL,CAAU2E,iBAA9B,EAAX;AACA,SAAKN,UAAL,GAAkB,IAAlB;AACD,GAND;;AAQA,OAAKQ,OAAL,GAAe,UAAS1B,MAAT,EAAiB;AAC9BA,WAAOM,MAAP,CAAcC,IAAd;;AAEA,QAAIoB,WAAW,KAAK9E,IAAL,CAAU2E,iBAAzB;AACA,SAAK3E,IAAL,CAAU2E,iBAAV,GAA8B,KAAKpH,GAAL,CAASU,KAAvC;AACA,SAAK+B,IAAL,CAAU+E,QAAV,CAAmB,IAAnB;;AAEAnD,kBAAcoD,IAAd,CAAmB,UAASC,QAAT,EAAkB;AACnC,UAAGA,YAAYA,SAAShJ,KAAxB,EAA+B;AAC7B,aAAK+D,IAAL,CAAU2E,iBAAV,GAA8BG,QAA9B;AACA,aAAKvH,GAAL,CAASU,KAAT,GAAiB6G,QAAjB;AACAI,cAAM,4BAAN;AACD,OAJD,MAIO;AACL,aAAKb,UAAL,GAAkB,KAAlB;AACD;AACF,KARkB,CAQjB7I,IARiB,CAQZ,IARY,CAAnB;AASD,GAhBD;;AAkBA,OAAK2J,SAAL,GAAiB,YAAW;;AAE1B,aAASC,YAAT,CAAsB7H,GAAtB,EAA2B;AACzB,UAAI8H,IAAI3C,SAAS4C,aAAT,CAAuB,GAAvB,CAAR;AACAD,QAAE5B,MAAF,GAAW,QAAX;AACA4B,QAAEE,IAAF,GAAShI,GAAT;AACA8H,QAAEG,KAAF;AACH;;AAEC5D,kBAAc6D,SAAd,CAAwB,KAAKzF,IAA7B,EAAmC,UAASA,IAAT,EAAc;AAC/CoF,mBAAa,KAAKV,gBAAL,CAAsB1E,IAAtB,CAAb;AACD,KAFkC,CAEjCxE,IAFiC,CAE5B,IAF4B,CAAnC;AAGA,SAAKsH,QAAL,GAAgB,KAAhB;AACD,GAbD;;AAeA,OAAK4C,WAAL,GAAmB,YAAW;AAC5B9D,kBAAc+D,WAAd,CAA0B,KAAK3F,IAA/B,EAAqC,UAASA,IAAT,EAAc,CAElD,CAFD;AAGA,SAAK8C,QAAL,GAAgB,KAAhB;AACD,GALD;;AAOA,OAAK4B,gBAAL,GAAwB,YAAW;AACjC,WAAO,KAAK1E,IAAL,CAAU4F,eAAV,EAAP;AACD,GAFD;;AAIA,OAAKC,WAAL,GAAmB,YAAW;AAC5B,QAAG,KAAK7F,IAAL,CAAU8F,MAAb,EAAqB;AACnBZ,YAAM,iFAAN;AACD,KAFD,MAEO;AACL,WAAKpC,QAAL,GAAgB,CAAC,KAAKA,QAAtB;AACD;AACF,GAND;;AAQA,OAAKiD,UAAL,GAAkB,YAAW;AAC3BnE,kBAAcyB,UAAd;AACA,SAAKtD,MAAL,GAAc,KAAKC,IAAnB;AACA,SAAK8C,QAAL,GAAgB,KAAhB;AACD,GAJD;;AAMA,OAAK5B,eAAL,GAAuB,YAAW;AAChC,SAAKa,UAAL,GAAkB,MAAlB;AACA,SAAKQ,WAAL,CAAiB,GAAjB;AACD,GAHD;AAKD,CA/QF;AAgRD,CAACtF,QAAQC,MAAR,CAAe,cAAf,EACEwC,SADF,CACY,QADZ,EACsB,UAASkC,aAAT,EAAwBE,gBAAxB,EAAyC;AAC5D,SAAO;AACLlC,cAAU,GADL;AAELC,WAAO;AACLI,YAAM,GADD;AAEL+F,cAAQ;AAFH,KAFF;AAMLlH,iBAAa,sBANR;AAOL7I,aAAS,IAPJ;AAQL8I,gBAAY,YARP;AASLmB,kBAAc,MATT;AAULC,sBAAkB,IAVb;;AAYLC,UAAK,cAASP,KAAT,EAAgBQ,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;AACtCV,YAAMyB,GAAN,CAAU,oBAAV,EAAgC,YAAU;AACxCf,aAAK0F,WAAL;AACD,OAFD;AAGD;AAhBI,GAAP;AAkBD,CApBF,EAqBElH,UArBF,CAqBa,YArBb,EAqB2B,UAAUmH,MAAV,EAAkBtE,aAAlB,EAAiCnC,YAAjC,EAA+C0G,oBAA/C,EAAqExG,QAArE,EAA+EmC,gBAA/E,EAAiG;;AAEzH,OAAKA,gBAAL,GAAwBA,gBAAxB;;AAEA,OAAKsE,qBAAL,GAA6B,YAAW;AACtC,SAAKC,mBAAL,GAA2B,CAAC,KAAKA,mBAAjC;AACD,GAFD;;AAIA,OAAKC,kBAAL,GAA0B,YAAW;AACnC,SAAKC,UAAL,GAAkB,EAAChJ,KAAKqE,cAAc4E,SAAd,EAAN,EAAlB;AACA,SAAKC,eAAL,GAAuB,CAAC,KAAKA,eAA7B;AACA,SAAKC,OAAL,GAAe,KAAf;AACA,SAAKL,mBAAL,GAA2B,KAA3B;AACA,SAAKM,kBAAL,GAA0B,KAA1B;AACD,GAND;;AAQA,OAAKC,gBAAL,GAAwB,YAAW;AACjC,SAAKH,eAAL,GAAuB,KAAvB;AACA,SAAKE,kBAAL,GAA0B,CAAC,KAAKA,kBAAhC;AACD,GAHD;;AAKA,OAAKE,mBAAL,GAA2B,YAAW;AACpC,SAAKC,gBAAL,GAAwB,EAAxB;AACA,SAAKC,oBAAL,GAA4B,CAAC,KAAKA,oBAAlC;AACD,GAHD;;AAKA,OAAKC,sBAAL,GAA8B,YAAW;AACvC,QAAG,KAAKF,gBAAL,CAAsBvJ,GAAzB,EAA8B;AAC5BuE,uBAAiBmF,YAAjB,CAA8B,KAAKH,gBAAL,CAAsBvJ,GAApD,EAAyD,UAAS0H,QAAT,EAAkB;AACzE,YAAG,CAACA,QAAJ,EAAc;AACZC,gBAAM,+EAAN;AACD,SAFD,MAEO;AACL,eAAK4B,gBAAL,CAAsBvJ,GAAtB,GAA4B,EAA5B;AACA,eAAKwJ,oBAAL,GAA4B,KAA5B;AACD;AACF,OAPwD,CAOvDvL,IAPuD,CAOlD,IAPkD,CAAzD;AAQD;AACF,GAXD;;AAaA,OAAK0L,cAAL,GAAsB,UAASC,MAAT,EAAiBC,SAAjB,EAA4B;AAChDD,WAAOE,OAAP,GAAiB,IAAjB;AACAvF,qBAAiBwF,aAAjB,CAA+BH,MAA/B,EAAuCC,SAAvC,EAAkD,IAAlD,EAAwD,UAASnC,QAAT,EAAkB;AACxEkC,aAAOE,OAAP,GAAiB,KAAjB;AACA,UAAGpC,YAAYA,SAAShJ,KAAxB,EAA+B;AAC7BkL,eAAOlL,KAAP,GAAe,IAAf;AACAiJ,cAAM,8DAAN;AACD,OAHD,MAGO;AACLiC,eAAOlL,KAAP,GAAe,KAAf;AACA2F,sBAAcoD,IAAd,CAAmB,IAAnB;AACD;AACF,KATD;AAUD,GAZD;;AAcA,OAAKuC,eAAL,GAAuB,UAASH,SAAT,EAAoB;AACzC,QAAGI,QAAQ,iDAAR,CAAH,EAA+D;AAC7D1F,uBAAiByF,eAAjB,CAAiCH,SAAjC;AACD;AACF,GAJD;;AAMA,OAAKK,uBAAL,GAA+B,YAAW;AACxC,QAAGD,QAAQ,4FAAR,CAAH,EAA0G;AACxG1F,uBAAiB4F,2BAAjB;AACD;AACF,GAJD;;AAMA,OAAKC,YAAL,GAAoB,YAAW;AAC7B/F,kBAAcgG,SAAd,CAAwB,KAAKrB,UAAL,CAAgBhJ,GAAxC,EAA6C,IAA7C;AACD,GAFD;;AAIA,OAAKsK,cAAL,GAAsB,YAAW;AAC/B,SAAKpB,eAAL,GAAuB,KAAvB;AACA,SAAKT,MAAL;AACApE,kBAAckG,OAAd;AACAnS,WAAOoS,QAAP,CAAgBC,MAAhB;AACD,GALD;;AAOA,OAAKC,oBAAL,GAA4B,YAAW;AACrC,SAAKC,kBAAL,CAAwBC,MAAxB,GAAiC,wBAAjC;;AAEAxI,aAAS,YAAU;AACjB,UAAGyI,KAAKnP,QAAL,IAAiBmP,KAAKC,qBAAzB,EAAgD;AAC9CnD,cAAM,oDAAN;AACA;AACD;;AAEDtD,oBAAc0G,cAAd,CAA6B,KAAKrI,IAAlC,EAAwC,KAAKiI,kBAAL,CAAwBK,gBAAhE,EAAkF,KAAKL,kBAAL,CAAwBM,YAA1G,EAAwH,UAASvD,QAAT,EAAkB,CAEzI,CAFD;AAID,KAVQ,CAUPzJ,IAVO,CAUF,IAVE,CAAT;AAWD,GAdD;;AAgBA,OAAKiN,YAAL,GAAoB,YAAW;AAC7B,WAAOhJ,aAAaiJ,aAAb,CAA2BlQ,MAA3B,GAAoC,CAA3C;AACD,GAFD;;AAIA,OAAKmQ,iBAAL,GAAyB,YAAW;AAClC,QAAG,CAAC,KAAK1I,IAAL,CAAU2I,WAAd,EAA2B;AACzB,UAAG,CAACpB,QAAQ,iIAAR,CAAJ,EAAgJ;AAC9I,aAAKvH,IAAL,CAAU2I,WAAV,GAAwB,IAAxB;AACD;AACF;AACF,GAND;;AAQA,OAAKC,WAAL,GAAmB,YAAW;AAC5B,SAAKC,YAAL,GAAoB,IAApB;AACAlH,kBAAcoD,IAAd,CAAmB,UAASC,QAAT,EAAkB;AACnCtF,eAAS,YAAU;AACjB,aAAKmJ,YAAL,GAAoB,KAApB;AACD,OAFQ,CAEPtN,IAFO,CAEF,IAFE,CAAT,EAEc,GAFd;AAGA,UAAGyJ,YAAYA,SAAShJ,KAAxB,EAA+B;AAC7BiJ,cAAM,2FAAN;AACD,OAFD,MAEO;AACL,aAAKe,WAAL;AACD;AACF,KATkB,CASjBzK,IATiB,CASZ,IATY,CAAnB;AAUD,GAZD;;AAcA,OAAKyK,WAAL,GAAmB,YAAW;AAC5B,SAAK8C,YAAL,GAAoB,IAAIzS,IAAJ,EAApB;AACD,GAFD;;AAIA,OAAK0S,kBAAL,GAA0B,YAAW;AACnC,SAAKC,SAAL,CAAed,MAAf,GAAwB,0BAAxB;AACAxI,aAAS,YAAU;AACjBiC,oBAAcsH,KAAd,CAAoB,KAAKD,SAAL,CAAejQ,KAAnC,EAA0C,KAAKiQ,SAAL,CAAeE,aAAzD,EAAwE,UAASlE,QAAT,EAAkB;AACxF,YAAG,CAACA,QAAD,IAAaA,SAAShJ,KAAzB,EAAgC;AAC9B,cAAIA,QAAQgJ,WAAWA,SAAShJ,KAApB,GAA4B,EAACpD,SAAS,2BAAV,EAAxC;AACA,eAAKoQ,SAAL,CAAed,MAAf,GAAwB,IAAxB;AACAjD,gBAAMjJ,MAAMpD,OAAZ;AACD,SAJD,MAIO;AACL,eAAKuQ,aAAL,CAAmBnE,SAAShF,IAA5B;AACD;AACF,OARuE,CAQtEzE,IARsE,CAQjE,IARiE,CAAxE;AASD,KAVQ,CAUPA,IAVO,CAUF,IAVE,CAAT;AAWD,GAbD;;AAeA,OAAK6N,sBAAL,GAA8B,YAAW;AACvC,SAAKJ,SAAL,CAAed,MAAf,GAAwB,4BAAxB;;AAEAxI,aAAS,YAAU;AACjBiC,oBAAc0H,QAAd,CAAuB,KAAKL,SAAL,CAAejQ,KAAtC,EAA6C,KAAKiQ,SAAL,CAAeE,aAA5D,EAA2E,UAASlE,QAAT,EAAkB;AAC3F,YAAG,CAACA,QAAD,IAAaA,SAAShJ,KAAzB,EAAgC;AAC9B,cAAIA,QAAQgJ,WAAWA,SAAShJ,KAApB,GAA4B,EAACpD,SAAS,2BAAV,EAAxC;AACA,eAAKoQ,SAAL,CAAed,MAAf,GAAwB,IAAxB;AACAjD,gBAAMjJ,MAAMpD,OAAZ;AACD,SAJD,MAIO;AACL,eAAKuQ,aAAL,CAAmBnE,SAAShF,IAA5B;AACD;AACF,OAR0E,CAQzEzE,IARyE,CAQpE,IARoE,CAA3E;AASD,KAVQ,CAUPA,IAVO,CAUF,IAVE,CAAT;AAWD,GAdD;;AAgBA,OAAK+N,wBAAL,GAAgC,YAAW;AACzC,QAAIC,WAAW/J,aAAaiJ,aAA5B;AACA,QAAIe,iBAAiB,CAArB;AACAD,aAASE,OAAT,CAAiB,UAAS1J,IAAT,EAAc;AAC7B,UAAGA,KAAK2J,iBAAL,EAAH,EAA6B;AAC3BF;AACD;AACF,KAJgB,CAIfjO,IAJe,CAIV,IAJU,CAAjB;;AAMA,WAAOiO,iBAAiB,GAAjB,GAAuBD,SAAShR,MAAhC,GAAyC,kBAAhD;AACD,GAVD;;AAYA,OAAKoR,uBAAL,GAA+B,EAAC7R,WAAW,IAAZ,EAA/B;;AAEA,OAAK8R,mBAAL,GAA2B,YAAW;AACpC,QAAIzJ,OAAOsC,SAAS4C,aAAT,CAAuB,GAAvB,CAAX;AACAlF,SAAK0J,YAAL,CAAkB,UAAlB,EAA8B,YAA9B;AACA1J,SAAKmF,IAAL,GAAY3D,cAAcmI,aAAd,CAA4B,KAAKH,uBAAL,CAA6B7R,SAAzD,CAAZ;AACAqI,SAAKoF,KAAL;AACD,GALD;;AAOA,OAAKwE,kBAAL,GAA0B,UAASC,KAAT,EAAgB;AACxC,QAAIC,OAAOD,MAAM,CAAN,CAAX;AACA,QAAIE,SAAS,IAAIC,UAAJ,EAAb;AACAD,WAAOE,MAAP,GAAgB,UAASC,CAAT,EAAY;AAC1B1I,oBAAc2I,cAAd,CAA6BD,EAAE7G,MAAF,CAAS+G,MAAtC,EAA8C,UAASpH,OAAT,EAAkB6B,QAAlB,EAA2B;AACvE5J,gBAAQC,GAAR,CAAY,iBAAZ,EAA+B8H,OAA/B,EAAwC6B,QAAxC;AACA,YAAG7B,OAAH,EAAY;AACV;AACD,SAFD,MAEO;AACL8B,gBAAM,2DAAN;AACD;AACF,OAPD;AAQD,KATD;AAUAiF,WAAOM,UAAP,CAAkBP,IAAlB;AACD,GAdD;;AAgBA,OAAKd,aAAL,GAAqB,UAASnJ,IAAT,EAAe;AAClC,SAAKA,IAAL,CAAUvJ,IAAV,GAAiBuJ,KAAKvJ,IAAtB;;AAEA;AACE;AACA;AACA;AACF;AACEf,WAAOoS,QAAP,CAAgBC,MAAhB;AACF;;AAEA,SAAK0C,SAAL,GAAiB,KAAjB;AACA,SAAKC,gBAAL,GAAwB,KAAxB;AACD,GAbD;AAeD,CAlOF;AAmOD,CAAC1N,QAAQC,MAAR,CAAe,cAAf,EACA6B,UADA,CACW,UADX,EACuB,UAAU6L,MAAV,EAAkBpL,UAAlB,EAA8BG,QAA9B,EAAwCiC,aAAxC,EAAuDnC,YAAvD,EAAqE;AACzFD,aAAWqL,SAAX,GAAuB,gBAAvB;;AAEA,MAAIC,YAAY,SAAZA,SAAY,GAAW;AACzBlJ,kBAAcmJ,OAAd,CAAsBH,OAAOI,WAA7B;AACAJ,WAAOK,MAAP,GAAgB,IAAIC,GAAJ,CAAQ,EAACC,KAAK,IAAN,EAAR,CAAhB;AACAP,WAAOK,MAAP,CAAcG,KAAd,GAAsB,KAAtB;AACAR,WAAOS,IAAP,GAAc5L,aAAa4L,IAA3B;AACAT,WAAOK,MAAP,CAAcK,KAAd,GAAsB7L,aAAa6L,KAAnC;;AAEA1J,kBAAcoD,IAAd,CAAmB,IAAnB;AACA;AACAuG,gBAAY,YAAY;AACtB3J,oBAAcoD,IAAd,CAAmB,IAAnB;AACD,KAFD,EAEG,KAFH;AAGD,GAZD;;AAcApD,gBAAc4J,cAAd,CAA6B,UAASvL,IAAT,EAAc;AACzC,QAAGA,IAAH,EAAS;AACP2K,aAAOI,WAAP,GAAqB/K,IAArB;AACAT,iBAAW4L,KAAX,GAAmB,wBAAnB;AACAN;AACD,KAJD,MAIO;AACLF,aAAOI,WAAP,GAAqB,IAAIS,IAAJ,CAAS7J,cAAc8J,qBAAd,EAAT,CAArB;AACAZ;AACD;AACF,GATD;;AAWA;;;;AAIAF,SAAOe,YAAP,GAAsB,YAAW;AAC/B;AACD,GAFD;;AAIAf,SAAOgB,qBAAP,GAA+B,UAASC,GAAT,EAAc;AAC3C,QAAGA,IAAIV,GAAP,EAAY;AACVP,aAAOe,YAAP;AACD;AACF,GAJD;;AAMAf,SAAOkB,iBAAP,GAA2B,UAASD,GAAT,EAAc;AACvCjB,WAAOmB,WAAP,GAAqBF,GAArB;;AAEA,QAAGjB,OAAOoB,YAAP,IAAuBpB,OAAOoB,YAAP,CAAoB/J,KAA9C,EAAqD;AACnDxC,mBAAawM,iBAAb,CAA+BrB,OAAOoB,YAAtC;AACD;AACF,GAND;;AAQApB,SAAOsB,UAAP,GAAoB,UAASL,GAAT,EAAc;AAChCpM,iBAAa0M,OAAb,CAAqBN,GAArB;AACD,GAFD;;AAIAjB,SAAOwB,QAAP,GAAkB,UAASP,GAAT,EAActS,QAAd,EAAwB;AACxCsS,QAAI9G,QAAJ,CAAa,IAAb;AACAnD,kBAAcoD,IAAd,CAAmBzL,QAAnB;AACD,GAHD;;AAKA;;;;AAIAqR,SAAOyB,iBAAP,GAA2B,UAASC,QAAT,EAAmBC,MAAnB,EAA2BC,MAA3B,EAAmC;;AAE5D,QAAIC,eAAezS,EAAE0S,IAAF,CAAOjN,aAAa6L,KAApB,EAA2B,EAAC5U,MAAM4V,SAAS5V,IAAhB,EAA3B,CAAnB;AACA,QAAG,CAAC6V,OAAOpB,GAAX,EAAgB;AACd1L,mBAAakN,8BAAb,CAA4CJ,MAA5C,EAAoDE,YAApD;AACD;;AAED7K,kBAAcoD,IAAd,CAAmB,YAAU,CAAE,CAA/B;AACD,GARD;;AAUA;;;;AAIA4F,SAAOgC,cAAP,GAAwB,UAASf,GAAT,EAAc;AACpC,QAAIgB,aAAaC,KAAKC,gBAAL,CAAsBlB,IAAIP,KAA1B,CAAjB;AACA,QAAGuB,cAAc,CAAjB,EAAoB;AAClBpN,mBAAauN,kBAAb,CAAgCnB,GAAhC;AACA;AACAjK,oBAAcoD,IAAd,CAAmB,YAAU;AAC3B;AACA4F,eAAOS,IAAP,GAAc,EAAd;AACA1L,iBAAS,YAAU;AACjBiL,iBAAOS,IAAP,GAAc5L,aAAa4L,IAA3B;AACD,SAFD;AAGD,OAND;AAOD,KAVD,MAUO;AACLnG,YAAM,iDAAN;AACD;AACF,GAfD;;AAiBA0F,SAAOqC,kBAAP,GAA4B,UAASjN,IAAT,EAAe;AACzC4K,WAAOoB,YAAP,GAAsBhM,IAAtB;AACD,GAFD;;AAIA4K,SAAOsC,WAAP,GAAqB,UAASlN,IAAT,EAAe;AAClCP,iBAAa0M,OAAb,CAAqBnM,IAArB;;AAEA,QAAG,CAAC4K,OAAOmB,WAAP,CAAmBZ,GAAvB,EAA4B;AAC1B1L,mBAAakN,8BAAb,CAA4C/B,OAAOmB,WAAnD,EAAgE/L,IAAhE;AACA4K,aAAOe,YAAP;AACD;AACF,GAPD;;AASA;;;;AAIAf,SAAO3J,QAAP,GAAkB,UAASjB,IAAT,EAAezG,QAAf,EAAyB;AACzCyG,SAAK+E,QAAL,CAAc,IAAd;;AAEAnD,kBAAcoD,IAAd,CAAmB,UAASC,QAAT,EAAkB;AACnC,UAAGA,YAAYA,SAAShJ,KAAxB,EAA+B;AAC7BiJ,cAAM,wDAAN;AACA3L,iBAAS,KAAT;AACD,OAHD,MAGO;AACLyG,aAAKmC,UAAL,GAAkB,KAAlB;AACA,YAAG5I,QAAH,EAAa;AACXA,mBAAS,IAAT;AACD;AACF;AACF,KAVD;AAWD,GAdD;;AAgBAqR,SAAO7E,UAAP,GAAoB,UAAS/F,IAAT,EAAe;;AAEjCP,iBAAauN,kBAAb,CAAgChN,IAAhC;;AAEA,QAAGA,QAAQ4K,OAAOoB,YAAlB,EAAgC;AAC9BpB,aAAOoB,YAAP,GAAsB,IAAtB;AACD;;AAED,QAAGhM,KAAKiC,KAAR,EAAe;AACbxC,mBAAawM,iBAAb,CAA+BjM,IAA/B;AACA;AACD;;AAED4B,kBAAcoD,IAAd,CAAmB,IAAnB;AACD,GAdD;;AAgBA;;;;AAIA4F,SAAOuC,YAAP,GAAsB,YAAW;AAC/BvC,WAAOI,WAAP,GAAqBpJ,cAAc8J,qBAAd,EAArB;AACAd,WAAOS,IAAP,GAAcT,OAAOI,WAAP,CAAmBK,IAAjC;AACD,GAHD;AAMH,CA1JA;AA2JD,CAACpO,QAAQC,MAAR,CAAe,cAAf,EACEwC,SADF,CACY,cADZ,EAC4B,YAAU;AACnC,SAAO;AACLG,WAAO;AACLuN,cAAQ,GADH;AAELC,qBAAe,GAFV;AAGLtN,cAAQ,GAHH;AAIL8L,WAAK,GAJA;AAKL5L,YAAM,GALD;AAMLqN,iBAAW;AANN,KADF;;AAULxO,iBAAa,qBAVR;AAWL7I,aAAS,IAXJ;AAYL8I,gBAAY,WAZP;AAaLmB,kBAAc,MAbT;AAcLC,sBAAkB,IAdb;;AAgBLC,UAAK,cAASP,KAAT,EAAgBQ,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;AACtCV,YAAM2B,MAAN,CAAa,UAAb,EAAyB,UAASqK,GAAT,EAAcW,MAAd,EAAqB;AAC5C,YAAGX,GAAH,EAAQ;AACNtL,eAAKgN,YAAL,CAAkB1B,GAAlB,EAAuBW,MAAvB;AACD;AACF,OAJD;AAKD;AAtBI,GAAP;AAwBD,CA1BF,EA2BEzN,UA3BF,CA2Ba,WA3Bb,EA2B0B,UAAU6C,aAAV,EAAyBjC,QAAzB,EAAmCH,UAAnC,EAA+CC,YAA/C,EAA6D;;AAEpFD,aAAW8B,GAAX,CAAe,eAAf,EAAgC,YAAU;AACxC,SAAKwB,QAAL,GAAgB,KAAhB;AACD,GAF+B,CAE9BtH,IAF8B,CAEzB,IAFyB,CAAhC;;AAIA,MAAIgS,cAAc,IAAlB;;AAEA,OAAKD,YAAL,GAAoB,UAAS1B,GAAT,EAAcW,MAAd,EAAsB;AACxC,SAAK1J,QAAL,GAAgB,KAAhB;;AAEA,QAAG,KAAKkJ,YAAL,IAAqB,KAAKA,YAAL,CAAkB/J,KAA1C,EAAiD;AAC/CjI,QAAE+F,MAAF,CAASyM,OAAOlB,KAAhB,EAAuB,KAAKU,YAA5B;AACD;;AAED,SAAKyB,UAAL,CAAgB3V,IAAhB,GAAuB,EAAvB;;AAEA+T,QAAIP,KAAJ,CAAU5B,OAAV,CAAkB,UAAS1J,IAAT,EAAc;AAC9BA,WAAK0N,OAAL,GAAe,IAAf;AACD,KAFD;AAGA,SAAKC,eAAL,CAAqB,KAArB;;AAEA,QAAGH,WAAH,EAAgB;AACd7N,eAAS,YAAU;AACjB,YAAIiO,QAAQhM,cAAciM,QAAd,EAAZ;AACA,YAAGD,KAAH,EAAU;AACR,cAAI5N,OAAO4N,KAAX;AACA,eAAKE,UAAL,CAAgB9N,IAAhB;AACD,SAHD,MAGO;AACL,eAAK+N,aAAL;AACAP,wBAAc,KAAd;AACD;AACF,OATQ,CASPhS,IATO,CASF,IATE,CAAT;AAUD,KAXD,MAWO,IAAGqQ,IAAIP,KAAJ,CAAU9S,MAAV,IAAoB,CAAvB,EAA0B;AAC7B,WAAKuV,aAAL;AACH;AACF,GA5BD;;AA8BA,OAAKC,iBAAL,GAAyB,YAAW;AAClC,SAAKlL,QAAL,GAAgB,KAAhB;AACA,SAAKwK,SAAL,GAAiB,KAAKzB,GAAtB;AACD,GAHD;;AAKA,OAAKoC,gBAAL,GAAwB,YAAW;AACjC,SAAKnL,QAAL,GAAgB,KAAhB;;AAEA,QAAG,CAAC,KAAK7C,IAAL,CAAUvJ,IAAd,EAAoB;AAClBwO,YAAM,uCAAN;AACA;AACD;;AAED,QAAG,KAAK2G,GAAL,CAASV,GAAZ,EAAiB;AACfjG,YAAM,iCAAN;AACA;AACD;;AAEDtD,kBAAc6D,SAAd,CAAwB,KAAKoG,GAA7B,EAAkC,UAAS5G,QAAT,EAAkB,CAAE,CAAtD;AACD,GAdD;;AAgBA,OAAKiJ,kBAAL,GAA0B,YAAW;AACnC,SAAKpL,QAAL,GAAgB,KAAhB;AACAlB,kBAAc+D,WAAd,CAA0B,KAAKkG,GAA/B,EAAoC,UAAS5G,QAAT,EAAkB,CAErD,CAFD;AAGD,GALD;;AAOA,OAAK0I,eAAL,GAAuB,UAASQ,SAAT,EAAoB;AACzC,QAAIC,eAAe,KAAKvC,GAAL,CAASP,KAAT,CAAe+C,MAAf,CAAsB,UAASrO,IAAT,EAAc;AACrD,aAAOA,KAAK0N,OAAZ;AACD,KAFkB,CAAnB;;AAIA,QAAGU,aAAa5V,MAAb,GAAsB,CAAzB,EAA4B;AAC1B,WAAKsV,UAAL,CAAgBM,aAAa,CAAb,CAAhB;AACD,KAFD,MAEO,IAAGD,SAAH,EAAc;AACnB,WAAKJ,aAAL;AACD;AACF,GAVD;;AAYA,OAAKD,UAAL,GAAkB,UAAS9N,IAAT,EAAe;AAC/B,SAAKgM,YAAL,GAAoBhM,IAApB;AACA,SAAKqN,aAAL,GAAqBrN,IAArB;AACD,GAHD;;AAKA,OAAK+N,aAAL,GAAqB,YAAW;AAC9B,QAAI3C,QAAQ,cAAc,KAAKS,GAAL,CAASP,KAAT,GAAkB,OAAO,KAAKO,GAAL,CAASP,KAAT,CAAe9S,MAAf,GAAwB,CAA/B,CAAlB,GAAuD,EAArE,CAAZ;AACA,SAAK8V,OAAL,GAAe7O,aAAa8O,UAAb,CAAwB,EAACC,cAAc,MAAf,EAAuBvM,OAAO,IAA9B,EAAoCnK,MAAM,EAA1C,EAAxB,CAAf;AACA,SAAKwW,OAAL,CAAalD,KAAb,GAAqBA,KAArB;AACA,SAAK0C,UAAL,CAAgB,KAAKQ,OAArB;AACA,SAAKlB,MAAL,GAAc,KAAKkB,OAAnB;AACD,GAND;;AAQA,OAAKb,UAAL,GAAkB,EAAC3V,MAAO,EAAR,EAAlB;;AAEA,OAAK2W,WAAL,GAAmB,UAASzO,IAAT,EAAe;AAChC,QAAG,KAAKyN,UAAL,CAAgB3V,IAAhB,CAAqBU,MAArB,IAA+B,CAAlC,EAAqC;AACnCwH,WAAK0N,OAAL,GAAe,IAAf;AACD,KAFD,MAEO;AACL1N,WAAK0N,OAAL,GAAe1N,KAAKoL,KAAL,CAAWrK,WAAX,GAAyB2N,QAAzB,CAAkC,KAAKjB,UAAL,CAAgB3V,IAAlD,KAA2DkI,KAAKlI,IAAL,CAAUiJ,WAAV,GAAwB2N,QAAxB,CAAiC,KAAKjB,UAAL,CAAgB3V,IAAjD,CAA1E;AACD;AACD,WAAOkI,KAAK0N,OAAZ;AACD,GAPkB,CAOjBlS,IAPiB,CAOZ,IAPY,CAAnB;;AASA,OAAKmT,iBAAL,GAAyB,YAAW;AAClChP,aAAS,YAAU;AACjB,UAAG,CAAC,KAAKqM,YAAL,CAAkB0B,OAAtB,EAA+B;AAC7B,aAAKC,eAAL,CAAqB,KAArB;AACD;AACF,KAJQ,CAIPnS,IAJO,CAIF,IAJE,CAAT,EAIc,GAJd;AAKD,GAND;AAOD,CAxIF;AAyID,CAACyB,QAAQC,MAAR,CAAe,cAAf,EACEwC,SADF,CACY,aADZ,EAC2B,YAAU;AAClC,SAAO;AACLE,cAAU,GADL;AAELC,WAAO;AACLuN,cAAQ,GADH;AAELC,qBAAe,GAFV;AAGLuB,kBAAY,GAHP;AAIL9O,YAAM,GAJD;AAKLuL,YAAM,GALD;AAMLJ,cAAQ,GANH;AAOLhL,YAAM,GAPD;AAQL4O,qBAAe;AARV,KAFF;AAYL/P,iBAAa,oBAZR;AAaL7I,aAAS,IAbJ;AAcL8I,gBAAY,UAdP;AAeLmB,kBAAc,MAfT;AAgBLC,sBAAkB,IAhBb;;AAkBLC,UAAK,cAASP,KAAT,EAAgBQ,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;AACtCV,YAAM2B,MAAN,CAAa,WAAb,EAA0B,UAASsN,OAAT,EAAiB;AACzC,YAAGA,OAAH,EAAY;AACVvO,eAAKwO,OAAL,CAAaD,OAAb;AACD;AACF,OAJD;;AAMAjP,YAAM2B,MAAN,CAAa,aAAb,EAA4B,UAASyJ,MAAT,EAAgB;AAC1C,YAAGA,MAAH,EAAW;AACT1K,eAAKyO,SAAL,CAAe/D,MAAf;AACD;AACF,OAJD;AAKD;AA9BI,GAAP;AAgCD,CAlCF,EAmCElM,UAnCF,CAmCa,UAnCb,EAmCyB,UAAUU,YAAV,EAAwB;;AAE9C,MAAIwP,cAAc,IAAlB;;AAEA,OAAKD,SAAL,GAAiB,UAAS/D,MAAT,EAAiB;AAChC,SAAKiE,SAAL,CAAe,KAAKjE,MAApB;AACD,GAFD;;AAIA,OAAK8D,OAAL,GAAe,UAAS1D,IAAT,EAAe;AAC5B,QAAG4D,WAAH,EAAgB;AACZA,oBAAc,KAAd;AACA,WAAKC,SAAL,CAAe,KAAKjE,MAApB;AACH,KAHD,MAGO;AACL,UAAGI,QAAQA,KAAK7S,MAAL,GAAc,CAAzB,EAA4B;AAC1B,aAAK0W,SAAL,CAAe7D,KAAK,CAAL,CAAf;AACD;AACF;AACF,GATD;;AAWA,OAAK6D,SAAL,GAAiB,UAASrD,GAAT,EAAc;AAC7B,SAAK+C,UAAL,GAAkB/C,GAAlB;AACA,SAAKE,WAAL,GAAmBF,GAAnB;AACA,SAAKwB,aAAL,GAAqBxB,GAArB;AACD,GAJD;;AAMA,OAAKsD,gBAAL,GAAwB,YAAW;AACjC,QAAG,KAAKC,UAAR,EAAoB;AAClB;AACD;;AAED,SAAK7C,MAAL,GAAc9M,aAAa8O,UAAb,CAAwB,EAACC,cAAc,KAAf,EAAxB,CAAd;AACA,SAAKzC,WAAL,GAAmB,KAAKQ,MAAxB;AACA,SAAK6C,UAAL,GAAkB,KAAK7C,MAAvB;AACA,SAAKa,MAAL,GAAc,KAAKb,MAAnB;AACD,GATD;;AAWA,MAAI8C,kBAAkB,EAAtB;AACA,OAAKC,eAAL,GAAuB,UAASzD,GAAT,EAAc;AACnCwD,sBAAkBxD,IAAIT,KAAtB;AACD,GAFD;;AAIA,OAAKmE,iBAAL,GAAyB,UAAS1D,GAAT,EAAc;AACrC,SAAKuD,UAAL,GAAkBvD,GAAlB;AACD,GAFD;;AAIA,OAAK2D,OAAL,GAAe,UAASrM,MAAT,EAAiB0I,GAAjB,EAAsB;AACnC,SAAKuD,UAAL,GAAkB,IAAlB;AACA,QAAGvD,IAAIT,KAAJ,CAAU5S,MAAV,IAAoB,CAAvB,EAA0B;AACxBqT,UAAIT,KAAJ,GAAYiE,eAAZ;AACAA,wBAAkB,EAAlB;AACA;AACD;;AAEDlM,WAAOM,MAAP,CAAcC,IAAd;AACA,QAAG,CAACmI,IAAIT,KAAL,IAAcS,IAAIT,KAAJ,CAAU5S,MAAV,IAAoB,CAArC,EAAwC;AACpC;AACH;;AAED,SAAKsH,IAAL,GAAY+L,GAAZ,EAAiB,UAAS4D,QAAT,EAAkB;AACjC;AACA,WAAKP,SAAL,CAAerD,GAAf;AACA,WAAKU,MAAL,GAAc,IAAd;AACD,KAJgB,CAIf/Q,IAJe,CAIV,IAJU,CAAjB;AAKD,GAlBD;;AAoBA,OAAKkU,SAAL,GAAiB,UAAS7D,GAAT,EAAc;AAC7B,QAAIgB,aAAaC,KAAKC,gBAAL,CAAsBlB,IAAIP,KAA1B,CAAjB;AACA,WAAOuB,WAAWrU,MAAlB;AACD,GAHD;;AAKA,OAAKmX,UAAL,GAAkB,UAASrF,CAAT,EAAYiC,MAAZ,EAAoBvM,IAApB,EAA0B;AAC1C,SAAK6O,aAAL,GAAqB7O,IAArB,EAA2BuM,MAA3B,EAAmC,KAAKR,WAAxC;AACD,GAFiB,CAEhBvQ,IAFgB,CAEX,IAFW,CAAlB;AAKD,CA9GF;AA+GD,CAACyB,QAAQC,MAAR,CAAe,cAAf,EACA6B,UADA,CACW,mBADX,EACgC,UAAU6L,MAAV,EAAkBhJ,aAAlB,EAAiCgO,WAAjC,EAA8C3P,IAA9C,EAAoD1G,QAApD,EAA8DoG,QAA9D,EAAwE;AACvGiL,SAAOiF,QAAP,GAAkB,EAAlB;;AAEAjF,SAAOkF,YAAP,GAAsB,YAAW;AAC/BlO,kBAAcmO,WAAd,CAA0B9P,IAA1B,EAAgC2K,OAAOiF,QAAP,CAAgBG,QAAhD,EAA0D,UAAS/K,QAAT,EAAkB;AAC1E,UAAI+K,WAAW/K,SAAS+K,QAAxB;AACA/P,WAAK+P,QAAL,GAAgBA,QAAhB;AACAzW,eAASyW,QAAT;AACApF,aAAOqF,eAAP;AACD,KALD;AAMD,GAPD;AAQD,CAZA;AAaD;IAAOC,I;AAEL,gBAAYC,QAAZ,EAAsB;AAAA;;AAEpB,SAAKC,cAAL,CAAoBD,QAApB;;AAEA,SAAKE,SAAL,GAAiB,EAAjB;;AAEA,QAAG,CAAC,KAAK3Z,IAAT,EAAe;AACb,WAAKA,IAAL,GAAYwB,MAAMxC,MAAN,CAAa4a,YAAb,EAAZ;AACD;AACF;;;;mCAqBcC,I,EAAM;AACnBvW,QAAEC,KAAF,CAAQ,IAAR,EAAcsW,IAAd;AACA,UAAG,KAAKC,UAAR,EAAoB;AAClB,aAAKA,UAAL,GAAkB,IAAIla,IAAJ,CAAS,KAAKka,UAAd,CAAlB;AACA,aAAKC,UAAL,GAAkB,IAAIna,IAAJ,CAAS,KAAKma,UAAd,CAAlB;AACD,OAHD,MAGO;AACL,aAAKD,UAAL,GAAkB,IAAIla,IAAJ,EAAlB;AACA,aAAKma,UAAL,GAAkB,IAAIna,IAAJ,EAAlB;AACD;;AAED,UAAGia,KAAKG,OAAR,EAAiB;AACf,aAAKC,2BAAL,CAAiC,KAAKC,aAAtC;AACD;AACF;;;6BAEQC,K,EAAO;AACd,WAAKA,KAAL,GAAaA,KAAb;;AAEA,UAAGA,KAAH,EAAU;AACR,aAAKC,uBAAL;AACD;AACF;;;gCAEWC,Q,EAAUxX,Q,EAAU;AAC9B,UAAG,CAACS,EAAE0S,IAAF,CAAO,KAAK2D,SAAZ,EAAuBU,QAAvB,CAAJ,EAAsC;AACpC,aAAKV,SAAL,CAAeW,IAAf,CAAoB,EAACD,UAAUA,QAAX,EAAqBxX,UAAUA,QAA/B,EAApB;AACD;AACF;;;mCAEcwX,Q,EAAU;AACvB/W,QAAE+F,MAAF,CAAS,KAAKsQ,SAAd,EAAyB,EAACU,UAAUA,QAAX,EAAzB;AACD;;;8CAEyB;AAAA;AAAA;AAAA;;AAAA;AACxB,6BAAoB,KAAKV,SAAzB,8HAAoC;AAAA,cAA5BU,QAA4B;;AAClCA,mBAASxX,QAAT,CAAkB,IAAlB;AACD;AAHuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIzB;;;gDAE2B0X,U,EAAY,CAEvC;;;sDAEiC;AAChC,aAAO,KAAKC,eAAL,EAAP;AACD;;;sCAEiB;AAChB;AACD;;;sCAEiB;AAChB,aAAO,EAACC,YAAY,KAAKC,eAAL,EAAb,EAAP;AACD;;;0CAEqBC,I,EAAM;AAC1B;AACD;;;6CAEwBA,I,EAAM;AAC7B;AACD;;;6CAEwB;AACvB;AACD;;;0CAEqBA,I,EAAM;AAC1BrX,QAAEC,KAAF,CAAQ,IAAR,EAAcD,EAAEsX,IAAF,CAAOD,IAAP,EAAa,CAAC,SAAD,CAAb,CAAd;AACD;;;wDAEmC;AAClC;AACA,aAAO,IAAP;AACD;;;+BAEU;AACT,aAAO,KAAK1M,iBAAZ;AACD;;;kCAEa;AACZ,aAAO,KAAKgF,iBAAL,MAA4B,KAAK+G,OAAL,CAAanY,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,MAAiC,KAA7D,GAAqE,IAArE,GAA4E,KAAnF;AACD;;;wCAEmB;AAClB,aAAO,KAAKgZ,YAAZ;AACD;;;sCAEiB;AAChB,aAAO,KAAKC,gBAAZ;AACD;;;wBAvGmB;AAClB,UAAG,CAAC,KAAKd,OAAT,EAAkB;AAChB,eAAO,EAAP;AACD;;AAED,UAAG,KAAKA,OAAL,KAAiB,IAAjB,IAAyB,QAAO,KAAKA,OAAZ,MAAwB,QAApD,EAA8D;AAC5D;AACA,eAAO,KAAKA,OAAZ;AACD;;AAED,aAAOe,KAAKva,KAAL,CAAW,KAAKwZ,OAAhB,CAAP;AACD;;;oCAjBsBgB,K,EAAO;AAC5BA,YAAMC,IAAN,CAAW,UAAStM,CAAT,EAAWuM,CAAX,EAAa;AACtB,eAAO,IAAItb,IAAJ,CAASsb,EAAEpB,UAAX,IAAyB,IAAIla,IAAJ,CAAS+O,EAAEmL,UAAX,CAAhC;AACD,OAFD;AAGD;;;;;;AA4GH;IAAOqB,M;AACL,kBAAYtB,IAAZ,EAAkB;AAAA;;AACdvW,MAAEC,KAAF,CAAQ,IAAR,EAAcsW,IAAd;AACA,SAAKlJ,OAAL,GAAe,KAAf,CAFc,CAEQ;AACtB,SAAKpL,KAAL,GAAa,KAAb;AACA,QAAG,KAAK6V,YAAR,EAAsB;AACpB;AACA,WAAKA,YAAL,GAAoB,IAAIxb,IAAJ,CAAS,KAAKwb,YAAd,CAApB;AACD;AACJ;;;;wBAEuB;AACtB,UAAG,CAAC,KAAKC,WAAT,EAAsB;AACpB,eAAO,EAAP;AACD;AACD,UAAIC,aAAa,KAAKD,WAAL,CAAiBE,MAAjB,CAAwB,CAAxB,EAA2BpW,WAA3B,KAA2C,KAAKkW,WAAL,CAAiBjX,KAAjB,CAAuB,CAAvB,CAA5D,CAJsB,CAIiE;AACvFkX,oBAAc,IAAd;AALsB;AAAA;AAAA;;AAAA;AAMtB,8BAAuB,KAAKE,aAA5B,mIAA2C;AAAA,cAAnCC,WAAmC;;AACzC,cAAGA,eAAe,GAAlB,EAAuB;AACrBH,0BAAc,WAAd;AACD,WAFD,MAEO;AACLA,0BAAcG,WAAd;AACD;;AAEDH,wBAAc,GAAd;AACD;AAdqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAgBtB,aAAOA,UAAP;AACD;;;wBAE0B;AACzB,UAAG,KAAKI,IAAL,IAAa,MAAhB,EAAwB;AACtB,eAAO,IAAP;AACD;AACD,UAAIC,iBAAiB,2BAArB;AACA,UAAG,KAAKC,iBAAL,IAA0B,KAAKC,iBAAlC,EAAqD;AACnDF,0BAAkB,yBAAlB;AACD,OAFD,MAEO;AACL,YAAG,KAAKC,iBAAR,EAA2B;AACzBD,4BAAkB,YAAlB;AACD,SAFD,MAEO;AACLA,4BAAkB,YAAlB;AACD;AACF;AACD,aAAOA,cAAP;AACD;;;;;;IAIGG,S;;;AACJ,qBAAYjC,IAAZ,EAAkB;AAAA;;AAAA,uHACRA,IADQ;;AAEdvW,MAAEC,KAAF,SAAcsW,IAAd;;AAEA,WAAKxY,SAAL,GAAiB,IAAjB;AACA,WAAKyW,YAAL,GAAoB,WAApB;AALc;AAMjB;;;;6CAEwB;AACvB,aAAO,KAAKiE,OAAL,CAAapE,MAAb,CAAoB,UAASlH,MAAT,EAAgB;AACzC,eAAOA,OAAOuL,OAAP,IAAkB,QAAzB;AACD,OAFM,CAAP;AAGD;;;8CAEyBrB,I,EAAM;AAC9B,aAAO,KAAKoB,OAAL,CAAapE,MAAb,CAAoB,UAASlH,MAAT,EAAgB;AACzC,eAAOA,OAAOuL,OAAP,IAAkBrB,KAAK7C,YAAvB,IAAuCrH,OAAOuL,OAAP,IAAkB,MAAhE;AACD,OAFM,CAAP;AAGD;;;gDAE2B9B,a,EAAe;AACzC,wIAAkCA,aAAlC;AACA,WAAKhV,IAAL,GAAYgV,cAAchV,IAA1B;AACA,WAAK2B,GAAL,GAAWqT,cAAcrT,GAAzB;AACA,WAAKkV,OAAL,GAAe7B,cAAc6B,OAAd,CAAsBE,GAAtB,CAA0B,UAASxL,MAAT,EAAgB;AACvD,eAAO,IAAI0K,MAAJ,CAAW1K,MAAX,CAAP;AACD,OAFc,CAAf;AAGD;;;mDAE8ByL,oB,EAAsB;AACnD5Y,QAAEC,KAAF,CAAQ,IAAR,EAAc2Y,oBAAd;AACA,WAAKH,OAAL,GAAeG,qBAAqBH,OAArB,CAA6BE,GAA7B,CAAiC,UAASxL,MAAT,EAAgB;AAC9D,eAAO,IAAI0K,MAAJ,CAAW1K,MAAX,CAAP;AACD,OAFc,CAAf;AAGD;;;sCAEiB;AAChB,aAAO,IAAP;AACD;;;sCAEiB;AAChB,UAAIpJ,SAAS;AACXnC,cAAM,KAAKA,IADA;AAEX2B,aAAK,KAAKA,GAFC;AAGXkV,iBAAS,KAAKA;AAHH,OAAb;;AAMAzY,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;;EAlDqBmS,I;;AAqDxB;IAAOpD,I;;;AAEL,gBAAYqD,QAAZ,EAAsB;AAAA;;AAAA,6GACdA,QADc;;AAGpB,QAAG,CAAC,OAAK9E,IAAT,EAAe;AACb,aAAKA,IAAL,GAAY,EAAZ;AACD;AALmB;AAMrB;;;;gDAE2BuF,a,EAAe;AACzC,8HAAkCA,aAAlC;AACA,WAAKxF,KAAL,GAAawF,cAAcxF,KAA3B;AACA,WAAKtT,IAAL,GAAY8Y,cAAc9Y,IAA1B;AACD;;;sCAEiB;AAChB,UAAIqZ,aAAanX,EAAE2Y,GAAF,CAAM,KAAKtH,IAAX,EAAiB,UAASQ,GAAT,EAAa;AAC7C,eAAO,EAACnV,MAAMmV,IAAInV,IAAX,EAAiB8X,cAAc3C,IAAI2C,YAAnC,EAAP;AACD,OAFgB,CAAjB;;AAIA,aAAO2C,UAAP;AACD;;;sCAEiB;AAChB,UAAIpT,SAAS;AACXqN,eAAO,KAAKA,KADD;AAEXtT,cAAM,KAAKA;AAFA,OAAb;;AAKAkC,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;0CAEqBsT,I,EAAM;AAC1B,UAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7B,YAAG,CAACxU,EAAE0S,IAAF,CAAO,KAAKrB,IAAZ,EAAkBgG,IAAlB,CAAJ,EAA6B;AAC3B,eAAKhG,IAAL,CAAU2F,IAAV,CAAeK,IAAf;AACD;AACF;AACD,wHAA4BA,IAA5B;AACD;;;6CAEwBA,I,EAAM;AAC7B,UAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7BxU,UAAE6Y,IAAF,CAAO,KAAKxH,IAAZ,EAAkBgG,IAAlB;AACD;AACD,2HAA+BA,IAA/B;AACD;;;6CAEwB;AACvB,WAAKhG,IAAL,CAAU3B,OAAV,CAAkB,UAASmC,GAAT,EAAa;AAC7B7R,UAAE6Y,IAAF,CAAOhH,IAAIP,KAAX,EAAkB,IAAlB;AACAO,YAAI9G,QAAJ,CAAa,IAAb;AACD,OAHiB,CAGhBvJ,IAHgB,CAGX,IAHW,CAAlB;AAIA,WAAK6P,IAAL,GAAY,EAAZ;AACD;;;wDAOmC;AAClC;AACD;;;+BAWU;AACT,aAAO,KAAKvT,IAAL,IAAa,EAApB;AACD;;;gCAEW;AACV,aAAO,KAAKsT,KAAL,IAAc,EAArB;AACD;;;6BAEQ;AACP,aAAO,EAAC1U,MAAM,KAAKA,IAAZ,EAAP;AACD;;;2CAEsB;AACrB,aAAO,KAAKiO,iBAAZ;AACD;;;+BAEU;AACT,aAAO,wGAAoB,KAAKmO,eAAhC;AACD;;;wBA3BqB;AAAA;AAAA;AAAA;;AAAA;AACpB,8BAAgB,KAAKzH,IAArB,mIAA2B;AAAA,cAAlBQ,GAAkB;;AACzB,cAAGA,IAAIkH,QAAJ,EAAH,EAAmB;AACjB,mBAAO,IAAP;AACD;AACF;AALmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAMpB,aAAO,KAAP;AACD;;;wBAsBkB;AACjB,aAAO,MAAP;AACD;;;qCAxCuBzH,K,EAAO;AAC7B,UAAI0H,WAAW1H,MAAM+C,MAAN,CAAa,UAASrO,IAAT,EAAc;AAAC,eAAOA,KAAKiC,KAAL,IAAc,KAAd,IAAuBjC,KAAKiC,KAAL,IAAc,IAA5C;AAAiD,OAA7E,CAAf;AACA,aAAO+Q,QAAP;AACD;;;;EA7DiB9C,I;;AAoGpB;IAAOhF,G;;;AAEL,eAAYiF,QAAZ,EAAsB;AAAA;;AAAA,2GACdA,QADc;;AAGpB,QAAG,CAAC,OAAK7E,KAAT,EAAgB;AACd,aAAKA,KAAL,GAAa,EAAb;AACD;AALmB;AAMrB;;;;gDAE2BsF,a,EAAe;AACzC,4HAAkCA,aAAlC;AACA,WAAKxF,KAAL,GAAawF,cAAcxF,KAA3B;AACD;;;sCAEiB;AAChB,UAAI+F,aAAanX,EAAE2Y,GAAF,CAAM,KAAKrH,KAAX,EAAkB,UAAStL,IAAT,EAAc;AAC/C,eAAO,EAACtJ,MAAMsJ,KAAKtJ,IAAZ,EAAkB8X,cAAcxO,KAAKwO,YAArC,EAAP;AACD,OAFgB,CAAjB;;AAIA,aAAO2C,UAAP;AACD;;;sCAEiB;AAChB,UAAIpT,SAAS;AACXqN,eAAO,KAAKA;AADD,OAAb;;AAIApR,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;0CAEqBsT,I,EAAM;AAC1B,UAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AAC9B,YAAG,CAACxU,EAAE0S,IAAF,CAAO,KAAKpB,KAAZ,EAAmB+F,IAAnB,CAAJ,EAA8B;AAC5B,eAAK/F,KAAL,CAAW2H,OAAX,CAAmB5B,IAAnB;AACD;AACF;AACD,sHAA4BA,IAA5B;AACD;;;6CAEwBA,I,EAAM;AAC7B,UAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AAC9BxU,UAAE6Y,IAAF,CAAO,KAAKvH,KAAZ,EAAmB+F,IAAnB;AACD;AACD,yHAA+BA,IAA/B;AACD;;;6CAEwB;AACvB,WAAK/F,KAAL,CAAW5B,OAAX,CAAmB,UAAS1J,IAAT,EAAc;AAC/BhG,UAAE6Y,IAAF,CAAO7S,KAAKqL,IAAZ,EAAkB,IAAlB;AACArL,aAAK+E,QAAL,CAAc,IAAd;AACD,OAHkB,CAGjBvJ,IAHiB,CAGZ,IAHY,CAAnB;;AAKA,WAAK8P,KAAL,GAAa,EAAb;AACD;;;wDAMmC;AAClC,aAAO,KAAKA,KAAZ;AACD;;;wBANkB;AACjB,aAAO,KAAP;AACD;;;;EA3DgB4E,I;;AAiEnB;IAAOzE,I,GACL,cAAY0E,QAAZ,EAAsB;AAAA;;AACpBnW,IAAEC,KAAF,CAAQ,IAAR,EAAckW,QAAd;AACD,C;;AAEH,CAAClT,QAAQC,MAAR,CAAe,cAAf,EACEgW,QADF,CACW,eADX,EAC4B,YAAY;;AAErC,WAASC,UAAT,GAAuB;AACrB,QAAIC,eAAerL,SAASsL,QAAT,CAAkBC,KAAlB,CAAwB,GAAxB,CAAnB;AACA,QAAIC,SAASH,aAAaA,aAAa5a,MAAb,GAAsB,CAAnC,IAAwC,GAAxC,GAA8C4a,aAAaA,aAAa5a,MAAb,GAAsB,CAAnC,CAA3D;AACA,WAAO+a,MAAP;AACD;;AAED,MAAIhW,GAAJ;;AAEA,OAAKC,gBAAL,GAAwB,YAAW;AACjC,QAAG,CAACD,GAAJ,EAAS;AACPA,YAAMW,aAAaC,OAAb,CAAqB,QAArB,CAAN;AACA,UAAG,CAACZ,GAAJ,EAAS;AACPA,cAAM,8BAAN;AACD;AACF;AACD,WAAOA,GAAP;AACD,GARD;;AAWA,OAAKiW,IAAL,GAAY,UAAShU,UAAT,EAAqBoQ,WAArB,EAAkCnQ,YAAlC,EAAgDgU,QAAhD,EAA0D;AAClE,WAAO,IAAIC,aAAJ,CAAkBlU,UAAlB,EAA8BoQ,WAA9B,EAA2CnQ,YAA3C,EAAyDgU,QAAzD,CAAP;AACH,GAFD;;AAIA,WAASC,aAAT,CAAuBlU,UAAvB,EAAmCoQ,WAAnC,EAAgDnQ,YAAhD,EAA8DgU,QAA9D,EAAwE;;AAEtE,SAAK1I,OAAL,GAAe,UAAS9K,IAAT,EAAe;AAC5B,WAAKA,IAAL,GAAYA,IAAZ;AACD,KAFD;;AAIA;;;;AAIA,SAAKuG,SAAL,GAAiB,YAAW;AAC1B,UAAG,CAACjJ,GAAJ,EAAS;AACPA,cAAMW,aAAaC,OAAb,CAAqB,QAArB,CAAN;AACA,YAAG,CAACZ,GAAJ,EAAS;AACPA,gBAAM,8BAAN;AACA,eAAKqK,SAAL,CAAerK,GAAf;AACD;AACF;AACD,aAAOA,GAAP;AACD,KATD;;AAWA,SAAKqK,SAAL,GAAiB,UAASrK,GAAT,EAAcoW,OAAd,EAAuB;AACtCzV,mBAAa0V,OAAb,CAAqB,QAArB,EAA+BrW,GAA/B;AACA,UAAGoW,OAAH,EAAY;AACVhe,eAAOoS,QAAP,CAAgBC,MAAhB;AACD;AACF,KALD;;AAQA;;;;AAIA,SAAK6L,cAAL,GAAsB,YAAW;AAC/B,aAAO,KAAK5T,IAAL,CAAUjH,KAAV,IAAmB,KAAK8a,UAAL,EAA1B;AACD,KAFD;;AAIA,SAAKC,qBAAL,GAA6B,UAAS/a,KAAT,EAAgBO,QAAhB,EAA0B;AACrD,UAAIya,UAAUpE,YAAYqE,GAAZ,CAAgB,MAAhB,EAAwB,QAAxB,CAAd;AACAD,cAAQ7U,GAAR,CAAY,EAACnG,OAAOA,KAAR,EAAZ,EAA4B8C,IAA5B,CAAiC,UAASmJ,QAAT,EAAkB;AACjD1L,iBAAS0L,SAASiP,KAAT,EAAT;AACD,OAFD,EAGCnY,KAHD,CAGO,UAASkJ,QAAT,EAAkB;AACvB5J,gBAAQC,GAAR,CAAY,4BAAZ,EAA0C2J,QAA1C;AACA1L,iBAAS0L,SAASmD,IAAlB;AACD,OAND;AAOD,KATD;;AAWA,SAAKoD,cAAL,GAAsB,UAASjS,QAAT,EAAmB;AACvC,UAAG,CAAC2E,aAAaC,OAAb,CAAqB,KAArB,CAAJ,EAAiC;AAC/B5E,iBAAS,IAAT;AACA;AACD;AACDqW,kBAAYqE,GAAZ,CAAgB,eAAhB,EAAiC9U,GAAjC,GAAuCrD,IAAvC,CAA4C,UAASmJ,QAAT,EAAkB;AAC5D,YAAIhF,OAAOgF,SAASiP,KAAT,EAAX;AACA3a,iBAAS0G,IAAT;AACD,OAH2C,CAG1CzE,IAH0C,CAGrC,IAHqC,CAA5C,EAICO,KAJD,CAIO,UAASkJ,QAAT,EAAkB;AACvB5J,gBAAQC,GAAR,CAAY,4BAAZ,EAA0C2J,QAA1C;AACA1L,iBAAS0L,SAASmD,IAAlB;AACD,OAPD;AAQD,KAbD;;AAeA,SAAKc,KAAL,GAAa,UAASlQ,KAAT,EAAgBC,QAAhB,EAA0BM,QAA1B,EAAoC;AAC/C,WAAKwa,qBAAL,CAA2B/a,KAA3B,EAAkC,UAASmb,UAAT,EAAoB;AACpD,YAAG,CAACA,UAAJ,EAAgB;AACd5a,mBAAS,IAAT;AACA;AACD;AACDrB,cAAMxC,MAAN,CAAa0e,4BAAb,CAA0Cpa,EAAEC,KAAF,CAAQ,EAACjB,OAAOA,KAAR,EAAeC,UAAUA,QAAzB,EAAR,EAA4Ckb,UAA5C,CAA1C,EAAmG,UAAS1a,IAAT,EAAc;AAC/G,eAAK4a,KAAL,CAAW5a,KAAKE,EAAhB;AACA,cAAIqa,UAAUpE,YAAYqE,GAAZ,CAAgB,cAAhB,CAAd;AACA,cAAIlW,SAAS,EAAC9E,UAAUQ,KAAKC,EAAhB,EAAoBV,OAAOA,KAA3B,EAAb;AACAgB,YAAEC,KAAF,CAAQ+Z,OAAR,EAAiBjW,MAAjB;AACAiW,kBAAQM,IAAR,GAAexY,IAAf,CAAoB,UAASmJ,QAAT,EAAkB;AACpC/G,yBAAa0V,OAAb,CAAqB,KAArB,EAA4B3O,SAAShH,KAArC;AACA1E,qBAAS0L,QAAT;AACD,WAHD,EAIClJ,KAJD,CAIO,UAASkJ,QAAT,EAAkB;AACvB1L,qBAAS0L,SAASmD,IAAlB;AACD,WAND;AAOD,SAZkG,CAYjG5M,IAZiG,CAY5F,IAZ4F,CAAnG;AAaD,OAlBiC,CAkBhCA,IAlBgC,CAkB3B,IAlB2B,CAAlC;AAmBD,KApBD;;AAsBA,SAAK8N,QAAL,GAAgB,UAAStQ,KAAT,EAAgBC,QAAhB,EAA0BM,QAA1B,EAAoC;AAClDrB,YAAMxC,MAAN,CAAa6e,oCAAb,CAAkD,EAACtb,UAAUA,QAAX,EAAqBD,OAAOA,KAA5B,EAAlD,EAAsF,UAASS,IAAT,EAAc;AAClG,aAAK4a,KAAL,CAAW5a,KAAKE,EAAhB;AACAF,aAAKE,EAAL,GAAU,IAAV;AACA,YAAIqa,UAAUpE,YAAYqE,GAAZ,CAAgB,MAAhB,CAAd;AACA,YAAIlW,SAAS/D,EAAEC,KAAF,CAAQ,EAAChB,UAAUQ,KAAKC,EAAhB,EAAoBV,OAAOA,KAA3B,EAAR,EAA2CS,IAA3C,CAAb;AACAO,UAAEC,KAAF,CAAQ+Z,OAAR,EAAiBjW,MAAjB;AACAiW,gBAAQM,IAAR,GAAexY,IAAf,CAAoB,UAASmJ,QAAT,EAAkB;AACpC/G,uBAAa0V,OAAb,CAAqB,KAArB,EAA4B3O,SAAShH,KAArC;AACA1E,mBAAS0L,QAAT;AACD,SAHD,EAIClJ,KAJD,CAIO,UAASkJ,QAAT,EAAkB;AACvB1L,mBAAS0L,SAASmD,IAAlB;AACD,SAND;AAOD,OAbqF,CAapF5M,IAboF,CAa/E,IAb+E,CAAtF;AAcD,KAfD;;AAiBA,SAAK8M,cAAL,GAAsB,UAASrI,IAAT,EAAesI,gBAAf,EAAiCC,YAAjC,EAA+C;AACjE,WAAKuL,qBAAL,CAA2B/a,KAA3B,EAAkC,UAASmb,UAAT,EAAoB;AACpD,YAAG,CAACA,UAAJ,EAAgB;AACd5a,mBAAS,IAAT;AACA;AACD;AACDrB,cAAMxC,MAAN,CAAa0e,4BAAb,CAA0Cpa,EAAEC,KAAF,CAAQ,EAAChB,UAAUsP,gBAAX,EAA6BvP,OAAOiH,KAAKjH,KAAzC,EAAR,EAAyDmb,UAAzD,CAA1C,EAAgH,UAASK,WAAT,EAAsB;AACpItc,gBAAMxC,MAAN,CAAa0e,4BAAb,CAA0Cpa,EAAEC,KAAF,CAAQ,EAAChB,UAAUuP,YAAX,EAAyBxP,OAAOiH,KAAKjH,KAArC,EAAR,EAAqDmb,UAArD,CAA1C,EAA4G,UAASM,OAAT,EAAiB;AAC3H,gBAAIrM,OAAO,EAAX;AACAA,iBAAKG,gBAAL,GAAwBiM,YAAY9a,EAApC;AACA0O,iBAAKnP,QAAL,GAAgBwb,QAAQ/a,EAAxB;AACA0O,iBAAKC,qBAAL,GAA6BoM,QAAQ/a,EAArC;;AAEA,gBAAIuG,OAAO,KAAKA,IAAhB;;AAEA,iBAAKyU,sBAAL,CAA4BF,WAA5B,EAAyCC,OAAzC,EAAkD,UAASxP,QAAT,EAAkB;AAClE,kBAAGA,YAAY,CAACA,SAAShJ,KAAzB,EAAgC;AAC9B;AACA;AACA,qBAAK0Y,wBAAL,CAA8B1U,IAA9B,EAAoCwU,QAAQ9a,EAA5C,EAAgD6a,YAAY7a,EAA5D,EAAgE,UAASyJ,OAAT,EAAiB;AAC/E,sBAAGA,OAAH,EAAY;AACV,yBAAKiR,KAAL,CAAWI,QAAQ9a,EAAnB;AACAuL,0BAAM,4DAAN;AACD,mBAHD,MAGO;AACL;AACA,yBAAKwP,sBAAL,CAA4BD,OAA5B,EAAqCD,WAArC,EAAkD,UAASvP,QAAT,EAAkB;AAClEC,4BAAM,gFAAN;AACAvP,6BAAOoS,QAAP,CAAgBC,MAAhB;AACD,qBAHD;AAID;AACF,iBAX+D,CAW9DxM,IAX8D,CAWzD,IAXyD,CAAhE;AAYD,eAfD,MAeO;AACL;AACA0J,sBAAM,8DAAN;AACD;AACF,aApBiD,CAoBhD1J,IApBgD,CAoB3C,IApB2C,CAAlD;AAqBD,WA7B2G,CA6B1GA,IA7B0G,CA6BrG,IA7BqG,CAA5G;AA8BD,SA/B+G,CA+B9GA,IA/B8G,CA+BzG,IA/ByG,CAAhH;AAgCD,OArCiC,CAqChCA,IArCgC,CAqC3B,IArC2B,CAAlC;AAsCH,KAvCD;;AAyCA,SAAKkZ,sBAAL,GAA8B,UAAS1b,KAAT,EAAgB4b,YAAhB,EAA8BC,QAA9B,EAAwCtb,QAAxC,EAAkD;AAC9E,UAAIya,UAAUpE,YAAYqE,GAAZ,CAAgB,MAAhB,CAAd;AACA,UAAIlW,SAAS,EAAC9E,UAAU4b,SAASnb,EAApB,EAAwB2O,uBAAuBwM,SAASnb,EAAxD,EAA4D6O,kBAAkBqM,aAAalb,EAA3F,EAA+FV,OAAOA,KAAtG,EAAb;AACAgB,QAAEC,KAAF,CAAQ+Z,OAAR,EAAiBjW,MAAjB;AACAiW,cAAQc,KAAR,GAAgBhZ,IAAhB,CAAqB,UAASmJ,QAAT,EAAkB;AACrC1L,iBAAS0L,QAAT;AACD,OAFD;AAGD,KAPD;;AAUA;;;;AAIA,SAAK8K,WAAL,GAAmB,UAAS9P,IAAT,EAAe+P,QAAf,EAAyBzW,QAAzB,EAAmC;AACpD,UAAIya,UAAUpE,YAAYqE,GAAZ,CAAgB,OAAhB,EAAyBhU,KAAKvJ,IAA9B,CAAd;AACAsd,cAAQhE,QAAR,GAAmBA,QAAnB;AACAgE,cAAQc,KAAR,GAAgBhZ,IAAhB,CAAqB,UAASmJ,QAAT,EAAkB;AACrC1L,iBAAS0L,SAASiP,KAAT,EAAT;AACD,OAFD;AAGD,KAND;;AAQA;;;;AAIA,SAAKa,gCAAL,GAAwC,UAAS9U,IAAT,EAAe1G,QAAf,EAAyB;AAC/D,UAAIyb,WAAW/U,KAAKgV,aAAL,EAAf;AACA,UAAIC,qBAAqB,EAAzB;AACAF,eAAStL,OAAT,CAAiB,UAAS2H,IAAT,EAAc;AAC7B,YAAG,CAACA,KAAK0B,QAAL,EAAJ,EAAqB;AACnB,cAAG1B,KAAK1H,iBAAL,MAA4B,CAAC0H,KAAK8D,WAAL,EAAhC,EAAoD;AAClDD,+BAAmBlE,IAAnB,CAAwBK,IAAxB;AACD;AACF,SAJD,MAIO;AACL,cAAGA,KAAK8D,WAAL,EAAH,EAAuB;AACrBD,+BAAmBlE,IAAnB,CAAwBK,IAAxB;AACD;AACF;AACF,OAVgB,CAUf7V,IAVe,CAUV,IAVU,CAAjB;;AAYA,UAAG0Z,mBAAmB1c,MAAnB,GAA4B,CAA/B,EAAkC;AAChC6C,gBAAQC,GAAR,CAAY,2CAAZ,EAAyD4Z,kBAAzD;AACA,aAAKE,cAAL,CAAoBnV,IAApB,EAA0BiV,kBAA1B,EAA8C3b,QAA9C;AACD;AACF,KAnBD;;AAuBA;;;;AAIA,SAAK8b,eAAL,GAAuB,UAAS9b,QAAT,EAAiC;AAAA,UAAd+b,OAAc,uEAAJ,EAAI;;AACtD,UAAG,CAAC,KAAKrV,IAAL,CAAUvJ,IAAd,EAAoB;AAClB,aAAK6e,wBAAL,CAA8B,UAASC,aAAT,EAAuB;AACnD/V,uBAAagW,eAAb;AACA,cAAGlc,QAAH,EAAa;AACXA;AACD;AACF,SAL6B,CAK5BiC,IAL4B,CAKvB,IALuB,CAA9B;AAMA;AACD;;AAED,UAAIka,aAAajW,aAAakW,aAAb,EAAjB;AACA,UAAI3B,UAAUpE,YAAYqE,GAAZ,CAAgB,YAAhB,CAAd;AACAD,cAAQtC,KAAR,GAAgB1X,EAAE2Y,GAAF,CAAM+C,UAAN,EAAkB,UAASrE,IAAT,EAAc;AAC9C,eAAO,KAAKuE,0BAAL,CAAgCvE,IAAhC,EAAsCiE,QAAQO,gBAA9C,CAAP;AACD,OAFiC,CAEhCra,IAFgC,CAE3B,IAF2B,CAAlB,CAAhB;;AAIA;;AAEA,UAAG,KAAKsa,SAAR,EAAmB;AACjB9B,gBAAQ+B,UAAR,GAAqB,KAAKD,SAA1B;AACD;;AAED9B,cAAQM,IAAR,GAAexY,IAAf,CAAoB,UAASmJ,QAAT,EAAmB;AACrCxF,qBAAagW,eAAb;AACA,aAAKK,SAAL,GAAiB7Q,SAAS8Q,UAA1B;AACAvW,mBAAW4E,UAAX,CAAsB,oBAAtB,EAA4C,KAAK0R,SAAjD;;AAEA,aAAKE,mBAAL,CAAyB/Q,SAASgR,eAAlC,EAAmD,IAAnD;AACA;AACA,YAAIC,aAAa,CAAC,SAAD,EAAY,cAAZ,EAA4B,WAA5B,CAAjB;AACA,aAAKF,mBAAL,CAAyB/Q,SAASkR,WAAlC,EAA+CD,UAA/C;;AAEA,YAAG3c,QAAH,EAAa;AACXA,mBAAS0L,QAAT;AACD;AACF,OAbmB,CAalBzJ,IAbkB,CAab,IAba,CAApB,EAcCO,KAdD,CAcO,UAASkJ,QAAT,EAAkB;AACvB5J,gBAAQC,GAAR,CAAY,cAAZ,EAA4B2J,QAA5B;AACA1L,iBAAS,EAAC0C,OAAO,YAAR,EAAT;AACD,OAjBD;AAkBD,KAzCD;;AA2CA,SAAK+I,IAAL,GAAY,UAASzL,QAAT,EAAmB;AAC7B,WAAK8b,eAAL,CAAqB9b,QAArB,EAA+B6c,SAA/B;AACD,KAFD;;AAIA,SAAKJ,mBAAL,GAA2B,UAASR,aAAT,EAAwBU,UAAxB,EAAoC;AAC7D,WAAKG,YAAL,CAAkBb,aAAlB;AACA,aAAO/V,aAAa6W,2CAAb,CAAyDd,aAAzD,EAAwEU,UAAxE,CAAP;AACD,KAHD;;AAKA,SAAKN,0BAAL,GAAkC,UAASvE,IAAT,EAAewE,gBAAf,EAAiC;AACjE,aAAO,KAAKU,aAAL,CAAmBlF,IAAnB,EAAyB,CAACA,KAAK0B,QAAL,EAA1B,EAA2C8C,gBAA3C,EAA6D,KAA7D,CAAP;AACD,KAFD;;AAIA,SAAKW,mBAAL,GAA2B,UAASnF,IAAT,EAAetZ,SAAf,EAA0B;AACnD,aAAOiC,EAAEsX,IAAF,CAAO,KAAKiF,aAAL,CAAmBlF,IAAnB,EAAyBtZ,SAAzB,EAAoC,CAAC,YAAD,EAAe,YAAf,CAApC,EAAkE,IAAlE,CAAP,EAAgF,CAAC,SAAD,CAAhF,CAAP;AACD,KAFD;;AAIA,SAAK0e,kBAAL,GAA0B,UAASpF,IAAT,EAAetZ,SAAf,EAA0B;AAClD,aAAOiC,EAAEsX,IAAF,CAAO,KAAKiF,aAAL,CAAmBlF,IAAnB,EAAyBtZ,SAAzB,EAAoC,CAAC,YAAD,EAAe,YAAf,CAApC,EAAkE,IAAlE,CAAP,EAAgF,CAAC,SAAD,CAAhF,CAAP;AACD,KAFD;;AAIA,SAAKwe,aAAL,GAAqB,UAASlF,IAAT,EAAetZ,SAAf,EAA0B8d,gBAA1B,EAA4Ca,aAA5C,EAA2D;AAC9E,UAAIC,WAAW3c,EAAE4c,SAAF,CAAYvF,IAAZ,CAAf;;AAEAhW,cAAQwb,MAAR,CAAe,CAACxF,KAAKpP,KAArB,EAA4B,6CAA5B,EAA2EoP,KAAKpP,KAAhF;;AAEA,UAAIlE,SAAS,EAACrH,MAAM2a,KAAK3a,IAAZ,EAAkB8X,cAAc6C,KAAK7C,YAArC;AACX7J,2BAAmB0M,KAAK1M,iBADb,EACgCmS,SAASzF,KAAKyF,OAD9C,EAAb;;AAGA,UAAG/e,SAAH,EAAc;AACZ,aAAKgf,iBAAL,CAAuBJ,QAAvB,EAAiC,KAAK7C,UAAL,EAAjC;AACA/V,eAAO2S,OAAP,GAAiBiG,SAASjG,OAA1B;AACA3S,eAAOwT,YAAP,GAAsBoF,SAASpF,YAA/B;AACAxT,eAAOiZ,SAAP,GAAmBL,SAASK,SAA5B;AACD,OALD,MAMK;AACHjZ,eAAO2S,OAAP,GAAiBgG,gBAAgBC,SAASM,+BAAT,EAAhB,GAA6D,QAAQ/e,MAAMxC,MAAN,CAAawhB,MAAb,CAAoBzF,KAAK0F,SAAL,CAAeR,SAASM,+BAAT,EAAf,CAApB,CAAtF;AACA,YAAG,CAACP,aAAJ,EAAmB;AACjB3Y,iBAAOwT,YAAP,GAAsB,IAAtB;AACAxT,iBAAOiZ,SAAP,GAAmB,IAAnB;AACD;AACF;;AAED,UAAGnB,gBAAH,EAAqB;AACnB7b,UAAEC,KAAF,CAAQ8D,MAAR,EAAgB/D,EAAEod,IAAF,CAAO/F,IAAP,EAAawE,gBAAb,CAAhB;AACD;;AAED,aAAO9X,MAAP;AACD,KA3BD;;AA6BA,SAAK0H,SAAL,GAAiB,UAAS4L,IAAT,EAAe9X,QAAf,EAAyB;AACxC,UAAG,CAAC,KAAK0G,IAAL,CAAUvJ,IAAd,EAAoB;AAClBwO,cAAM,iCAAN;AACA;AACD;;AAED,UAAImS,UAAU,YAAW;AACvBhG,aAAK1M,iBAAL,GAAyB,QAAzB;AACA,YAAI2S,cAAc,CAACjG,IAAD,EAAOkG,MAAP,CAAclG,KAAKmG,iCAAL,MAA4C,EAA1D,CAAlB;AACAF,oBAAY5N,OAAZ,CAAoB,UAAS+N,aAAT,EAAuB;AACzCA,wBAAc1S,QAAd,CAAuB,IAAvB;AACD,SAFD;AAGA,aAAKC,IAAL;AACD,OAPa,CAOZxJ,IAPY,CAOP,IAPO,CAAd;;AASA,UAAG,CAAC,KAAKyE,IAAL,CAAU+P,QAAd,EAAwB;AACtByD,iBAASiE,IAAT,CAAc;AACZC,oBAAU,+BADE;AAEZ5Y,sBAAY,mBAFA;AAGZ6Y,mBAAS;AACP3X,kBAAM,YAAW;AAAC,qBAAO,KAAKA,IAAZ;AAAiB,aAA7B,CAA8BzE,IAA9B,CAAmC,IAAnC,CADC;AAEPjC,sBAAU,oBAAW;AACnB,qBAAO8d,OAAP;AACD;AAJM,WAHG;AASZQ,qBAAW,wBATC;AAUZC,4BAAkB;AAVN,SAAd;AAYD,OAbD,MAaO;AACLT;AACD;AACF,KA/BD;;AAiCA,SAAK1R,WAAL,GAAmB,UAAS0L,IAAT,EAAe9X,QAAf,EAAyB;AAC1C8X,WAAK1M,iBAAL,GAAyB,IAAzB;AACA,UAAI2S,cAAc,CAACjG,IAAD,EAAOkG,MAAP,CAAclG,KAAKmG,iCAAL,MAA4C,EAA1D,CAAlB;AACAF,kBAAY5N,OAAZ,CAAoB,UAAS+N,aAAT,EAAuB;AACzCA,sBAAc1S,QAAd,CAAuB,IAAvB;AACD,OAFD;AAGA,WAAKC,IAAL,CAAU,IAAV;AACD,KAPD;;AASA;;;;AAIA,SAAKuF,cAAL,GAAsB,UAASwN,UAAT,EAAqBxe,QAArB,EAA+B;AACnD,UAAI6O,OAAOqJ,KAAKva,KAAL,CAAW6gB,UAAX,CAAX;AACA1c,cAAQC,GAAR,CAAY,gBAAZ,EAA8B8M,IAA9B;AACA,WAAKiO,YAAL,CAAkBjO,KAAKsJ,KAAvB;AACAjS,mBAAauY,6BAAb,CAA2C5P,KAAKsJ,KAAhD;AACAjS,mBAAauV,QAAb,CAAsBtL,OAAtB,CAA8B,UAAS2H,IAAT,EAAc;AAC1CA,aAAKtM,QAAL,CAAc,IAAd;AACD,OAFD;AAGA,WAAKsQ,eAAL,CAAqB9b,QAArB,EAA+B,EAACsc,kBAAkB,CAAC,YAAD,EAAe,YAAf,CAAnB,EAA/B;AACD,KATD;;AAWA;;;;AAIA,SAAK9L,aAAL,GAAqB,UAAShS,SAAT,EAAoB;AACvC,UAAIkgB,WAAW,IAAf;AACA,UAAIC,eAAe,UAAUpgB,IAAV,EAAgB;AACjC,YAAIsQ,OAAO,IAAI+P,IAAJ,CAAS,CAACrgB,IAAD,CAAT,EAAiB,EAACsgB,MAAM,WAAP,EAAjB,CAAX;;AAEA;AACA;AACA,YAAIH,aAAa,IAAjB,EAAuB;AACrBtiB,iBAAO0iB,GAAP,CAAWC,eAAX,CAA2BL,QAA3B;AACD;;AAEDA,mBAAWtiB,OAAO0iB,GAAP,CAAWE,eAAX,CAA2BnQ,IAA3B,CAAX;;AAEA;AACA,eAAO6P,QAAP;AACD,OAbkB,CAajBzc,IAbiB,CAaZ,IAbY,CAAnB;;AAeA,UAAIkW,QAAQ1X,EAAE2Y,GAAF,CAAMlT,aAAa+Y,qBAAb,CAAmC,CAAC,KAAD,EAAQ,MAAR,CAAnC,CAAN,EAA2D,UAASnH,IAAT,EAAc;AACnF,eAAO,KAAKmF,mBAAL,CAAyBnF,IAAzB,EAA+BtZ,SAA/B,CAAP;AACD,OAFsE,CAErEyD,IAFqE,CAEhE,IAFgE,CAA3D,CAAZ;;AAIA,UAAI4M,OAAO;AACTsJ,eAAOA;AADE,OAAX;;AAIA,aAAOwG,aAAazG,KAAK0F,SAAL,CAAe/O,IAAf,EAAqB,IAArB,EAA2B,CAA3B,CAA6B,kBAA7B,CAAb,CAAP;AACD,KA1BD;;AA8BA;;;AAGA,SAAKqQ,sBAAL,GAA8B,UAASxY,IAAT,EAAe1G,QAAf,EAAyB;AACrD,UAAIya,UAAUpE,YAAYqE,GAAZ,CAAgB,OAAhB,EAAyBhU,KAAKvJ,IAA9B,EAAoCud,GAApC,CAAwC,OAAxC,CAAd;AACA,UAAI5I,OAAOpL,KAAKoL,IAAhB;AACA2I,cAAQtC,KAAR,GAAgBzR,KAAKyR,KAArB;AACAsC,cAAQtC,KAAR,CAAchI,OAAd,CAAsB,UAAS2H,IAAT,EAAc;AAClC,YAAGA,KAAKqH,MAAR,EAAgB;AACd,cAAI7M,MAAMR,KAAKgD,MAAL,CAAY,UAASxC,GAAT,EAAa;AAAC,mBAAOA,IAAInV,IAAJ,IAAY2a,KAAKqH,MAAxB;AAA+B,WAAzD,EAA2D,CAA3D,CAAV;AACArH,eAAKsH,QAAL,GAAgB9M,IAAIT,KAApB;AACD;AACF,OALD;AAMA4I,cAAQM,IAAR,GAAexY,IAAf,CAAoB,UAASmJ,QAAT,EAAkB;AACpC1L;AACA2E,qBAAa0a,UAAb,CAAwB,MAAxB;AACD,OAHD;AAID,KAdD;;AAqBA,SAAKC,eAAL,GAAuB,UAASC,MAAT,EAAiB;AACtC,aAAOrH,KAAKva,KAAL,CAAWua,KAAK0F,SAAL,CAAe2B,MAAf,CAAX,CAAP;AACD,KAFD;;AAIA,SAAKvD,wBAAL,GAAgC,UAAShc,QAAT,EAAmB;AACjD,UAAImY,QAAQ1X,EAAE2Y,GAAF,CAAMlT,aAAauV,QAAnB,EAA6B,UAAS3D,IAAT,EAAc;AACrD,eAAO,KAAKkF,aAAL,CAAmBlF,IAAnB,EAAyB,KAAzB,EAAgC,CAAC,YAAD,EAAe,YAAf,CAAhC,EAA8D,KAA9D,CAAP;AACD,OAFwC,CAEvC7V,IAFuC,CAElC,IAFkC,CAA7B,CAAZ;AAGAH,cAAQC,GAAR,CAAY,wBAAZ,EAAsCoW,KAAtC;AACA,WAAKqH,mBAAL,CAAyB,OAAzB,EAAkCrH,KAAlC;AACAnY,eAASmY,KAAT;AACD,KAPD;;AASA,SAAKqH,mBAAL,GAA2B,UAASjiB,GAAT,EAAckiB,KAAd,EAAqB;AAC9C9a,mBAAa0V,OAAb,CAAqB9c,GAArB,EAA0BmG,QAAQgc,MAAR,CAAeD,KAAf,CAA1B;AACD,KAFD;;AAIA,SAAKtN,qBAAL,GAA6B,YAAW;AACtC,UAAIzL,OAAO,EAAX;AACA,UAAIyR,QAAQD,KAAKva,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,OAArB,CAAX,KAA6C,EAAzD;AACAuT,cAAQ,KAAKsE,mBAAL,CAAyBtE,KAAzB,EAAgC,IAAhC,CAAR;AACAxB,WAAKgJ,eAAL,CAAqBxH,KAArB;AACAzR,WAAKyR,KAAL,GAAaA,KAAb;AACAzR,WAAK2I,WAAL,GAAmB,IAAnB;AACA,aAAO3I,IAAP;AACD,KARD;;AAUA;;;;AAIA,SAAK4D,eAAL,GAAuB,UAAS+J,KAAT,EAAgB;AACrC1P,mBAAa0V,OAAb,CAAqB,OAArB,EAA8BnC,KAAK0F,SAAL,CAAevJ,KAAf,CAA9B;AACD,KAFD;;AAIA,SAAKvK,UAAL,GAAkB,YAAW;AAC3BnF,mBAAa0a,UAAb,CAAwB,OAAxB;AACD,KAFD;;AAIA,SAAK/K,QAAL,GAAgB,YAAW;AACzB,UAAIsL,cAAcjb,aAAaC,OAAb,CAAqB,OAArB,CAAlB;AACA,UAAG,CAACgb,WAAD,IAAgBA,eAAe,WAAlC,EAA+C;AAC7C,eAAO,IAAP;AACD;AACD,UAAIC,UAAUpf,EAAEC,KAAF,CAAQ,EAACuU,cAAc,MAAf,EAAR,EAAgCiD,KAAKva,KAAL,CAAWiiB,WAAX,CAAhC,CAAd;AACA,aAAO1Z,aAAa8O,UAAb,CAAwB6K,OAAxB,CAAP;AACD,KAPD;;AAUA;;;;AAIA,SAAKtF,UAAL,GAAkB,YAAW;AAC3B,UAAG,CAAC,KAAKna,EAAT,EAAa;AACX,aAAKA,EAAL,GAAUuE,aAAaC,OAAb,CAAqB,IAArB,CAAV;AACD;AACD,aAAO,KAAKxE,EAAZ;AACD,KALD;;AAOA,SAAK0a,KAAL,GAAa,UAAS1a,EAAT,EAAa;AACxBuE,mBAAa0V,OAAb,CAAqB,IAArB,EAA2Bja,EAA3B;AACD,KAFD;;AAIA,SAAKmO,OAAL,GAAe,YAAW;AACxB5J,mBAAa0a,UAAb,CAAwB,KAAxB;AACA1a,mBAAa0a,UAAb,CAAwB,IAAxB;AACD,KAHD;;AAKA,SAAK7B,iBAAL,GAAyB,UAAS1F,IAAT,EAAegI,SAAf,EAA0B;AACjD,UAAIC,WAAW,IAAf;AACA,UAAGjI,KAAKE,YAAR,EAAsB;AACpB+H,mBAAWphB,MAAMxC,MAAN,CAAa6jB,WAAb,CAAyBlI,KAAKE,YAA9B,EAA4C8H,SAA5C,CAAX;AACD,OAFD,MAEO;AACLC,mBAAWphB,MAAMxC,MAAN,CAAa8jB,2BAAb,EAAX;AACAnI,aAAKE,YAAL,GAAoBrZ,MAAMxC,MAAN,CAAa+jB,WAAb,CAAyBH,QAAzB,EAAmCD,SAAnC,CAApB;AACD;;AAED,UAAIK,KAAKxhB,MAAMxC,MAAN,CAAaikB,cAAb,CAA4BL,QAA5B,CAAT;AACA,UAAIM,KAAK1hB,MAAMxC,MAAN,CAAamkB,eAAb,CAA6BP,QAA7B,CAAT;AACA,UAAIQ,mBAAmB,QAAQ5hB,MAAMxC,MAAN,CAAa+jB,WAAb,CAAyBhI,KAAK0F,SAAL,CAAe9F,KAAK4F,+BAAL,EAAf,CAAzB,EAAiFyC,EAAjF,CAA/B;AACA,UAAIK,WAAW7hB,MAAMxC,MAAN,CAAaskB,OAAb,CAAqBF,gBAArB,EAAuCF,EAAvC,CAAf;;AAEAvI,WAAKX,OAAL,GAAeoJ,gBAAf;AACAzI,WAAK2F,SAAL,GAAiB+C,QAAjB;AACA1I,WAAK4I,uBAAL,GAA+B,KAA/B;AACD,KAjBD;;AAmBC,SAAKC,iBAAL,GAAyB,UAAS7I,IAAT,EAAegI,SAAf,EAA0B;AACjD,UAAIC,WAAWphB,MAAMxC,MAAN,CAAa6jB,WAAb,CAAyBlI,KAAKE,YAA9B,EAA4C8H,SAA5C,CAAf;;AAEA,UAAIK,KAAKxhB,MAAMxC,MAAN,CAAaikB,cAAb,CAA4BL,QAA5B,CAAT;AACA,UAAIM,KAAK1hB,MAAMxC,MAAN,CAAamkB,eAAb,CAA6BP,QAA7B,CAAT;AACA,UAAIS,WAAW7hB,MAAMxC,MAAN,CAAaskB,OAAb,CAAqB3I,KAAKX,OAA1B,EAAmCkJ,EAAnC,CAAf;AACA,UAAGG,aAAa1I,KAAK2F,SAAlB,IAA+B,CAAC3F,KAAK2F,SAAxC,EAAmD;AACjD3b,gBAAQC,GAAR,CAAY,qCAAZ;AACA;AACD;;AAED,UAAIoV,UAAUxY,MAAMxC,MAAN,CAAa6jB,WAAb,CAAyBlI,KAAKX,OAAL,CAAanY,SAAb,CAAuB,CAAvB,EAA0B8Y,KAAKX,OAAL,CAAalY,MAAvC,CAAzB,EAAyEkhB,EAAzE,CAAd;AACArI,WAAKX,OAAL,GAAeA,OAAf;AACD,KAbD;;AAeA,SAAK2F,YAAL,GAAoB,UAAS3E,KAAT,EAAgB;AAClC,UAAI2H,YAAY,KAAKvF,UAAL,EAAhB;AADkC;AAAA;AAAA;;AAAA;AAElC,8BAAiBpC,KAAjB,mIAAwB;AAAA,cAAfL,IAAe;;AACtB,cAAGA,KAAKyF,OAAL,IAAgB,IAAnB,EAAyB;AACvB;AACD;AACD,cAAIqD,WAAW,OAAO9I,KAAKX,OAAZ,KAAwB,QAAxB,IAAoCW,KAAKX,OAAL,YAAwB9P,MAA3E;AACA,cAAGuZ,QAAH,EAAa;AACX,gBAAG9I,KAAKX,OAAL,CAAanY,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,KAAgC,KAAhC,IAAyC8Y,KAAKE,YAAjD,EAA+D;AAC7D;AACA,mBAAK2I,iBAAL,CAAuB7I,IAAvB,EAA6BgI,SAA7B;AACD,aAHD,MAGO;AACL;AACAhI,mBAAKX,OAAL,GAAexY,MAAMxC,MAAN,CAAa0kB,YAAb,CAA0B/I,KAAKX,OAAL,CAAanY,SAAb,CAAuB,CAAvB,EAA0B8Y,KAAKX,OAAL,CAAalY,MAAvC,CAA1B,CAAf;AACD;AACF;AACF;AAhBiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBnC,KAjBD;;AAmBA,SAAKmc,wBAAL,GAAgC,UAAS1U,IAAT,EAAeoa,YAAf,EAA6BC,YAA7B,EAA2C/gB,QAA3C,EAAqD;AACnF,UAAImY,QAAQzR,KAAKgV,aAAL,EAAZ;AACAvD,YAAMhI,OAAN,CAAc,UAAS2H,IAAT,EAAc;AAC1B,YAAGA,KAAKX,OAAL,CAAanY,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,KAAgC,KAAhC,IAAyC8Y,KAAKE,YAAjD,EAA+D;AAC7D;AACA,cAAI+H,WAAWphB,MAAMxC,MAAN,CAAa6jB,WAAb,CAAyBlI,KAAKE,YAA9B,EAA4C+I,YAA5C,CAAf;AACA;AACAjJ,eAAKE,YAAL,GAAoBrZ,MAAMxC,MAAN,CAAa+jB,WAAb,CAAyBH,QAAzB,EAAmCe,YAAnC,CAApB;AACD;AACF,OAPD;;AASA,WAAKjF,cAAL,CAAoBnV,IAApB,EAA0ByR,KAA1B,EAAiC,UAAStO,OAAT,EAAkB;AACjD7J,iBAAS6J,OAAT;AACD,OAFgC,CAE/B5H,IAF+B,CAE1B,IAF0B,CAAjC;AAGD,KAdD;AAeD;AACL,CAxjBA;AAyjBD,CAACyB,QACEC,MADF,CACS,cADT,EAEEwC,SAFF,CAEY,aAFZ,EAE2B,CAAC,UAAD,EAAa,UAASC,QAAT,EAAmB;AACxD,SAAO;AACLC,cAAU,GADL;AAELC,WAAO;AACL0a,mBAAa;AADR,KAFF;AAKLna,UAAO,cAASwK,MAAT,EAAiB4P,QAAjB,EAA2B;AAChC7a,eAAS,YAAW;AAClB,YAAGiL,OAAO2P,WAAV,EAAuB;AACrBC,mBAAS,CAAT,EAAY5X,KAAZ;AACD;AACF,OAJD;AAKD;AAXI,GAAP;AAaD,CAdyB,CAF3B;AAiBD;IAAO6X,wB;AAEL,sCAAc;AAAA;;AACZ,SAAK7a,QAAL,GAAgB,GAAhB;AACA,SAAKd,WAAL,GAAmB,0CAAnB;AACA,SAAKe,KAAL,GAAa;AACXwR,YAAM;AADK,KAAb;AAGD;;;;+BAEUzG,M,EAAQnL,Y,EAAcqC,gB,EAAkB;AACjD8I,aAAO8P,UAAP,GAAoB5Y,iBAAiBO,yBAAjB,CAA2CuI,OAAOyG,IAAlD,CAApB;;AAEAzG,aAAOtD,aAAP,GAAuB,UAASH,MAAT,EAAiBC,SAAjB,EAA4B;AACjDD,eAAOE,OAAP,GAAiB,IAAjB;AACAvF,yBAAiBwF,aAAjB,CAA+BH,MAA/B,EAAuCC,SAAvC,EAAkDwD,OAAOyG,IAAzD,EAA+D,UAASpM,QAAT,EAAkB;AAC/EkC,iBAAOE,OAAP,GAAiB,KAAjB;AACD,SAFD;AAGD,OALD;;AAOAuD,aAAO+P,sBAAP,GAAgC,UAASvT,SAAT,EAAoB;AAClD,eAAOtF,iBAAiB8Y,0BAAjB,CAA4CxT,SAA5C,IAAyD,WAAzD,GAAuE,WAA9E;AACD,OAFD;AAID;;;;;;AAKHnK,QAAQC,MAAR,CAAe,cAAf,EAA+BwC,SAA/B,CAAyC,0BAAzC,EAAqE;AAAA,SAAM,IAAI+a,wBAAJ,EAAN;AAAA,CAArE;AACA,CAACxd,QACEC,MADF,CACS,cADT,EAEEwC,SAFF,CAEY,WAFZ,EAEyB,YAAW;AACnC,SAAQ;AACNG,WAAO;AACLG,YAAM;AADD,KADD;AAINI,UAAM,cAASP,KAAT,EAAgBlC,OAAhB,EAAyB;AAC7B;AACA,UAAIkd,KAAKld,QAAQ,CAAR,CAAT;;AAEAkd,SAAGC,SAAH,GAAe,IAAf;;AAEAD,SAAGxZ,gBAAH,CACE,WADF,EAEE,UAASiJ,CAAT,EAAY;AACVA,UAAEyQ,YAAF,CAAeC,aAAf,GAA+B,MAA/B;AACA1Q,UAAEyQ,YAAF,CAAeE,OAAf,CAAuB,MAAvB,EAA+BxJ,KAAK0F,SAAL,CAAetX,MAAMG,IAArB,CAA/B;AACA,aAAKkb,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OAPH,EAQE,KARF;;AAWAN,SAAGxZ,gBAAH,CACE,SADF,EAEE,UAASiJ,CAAT,EAAY;AACV,aAAK4Q,SAAL,CAAenb,MAAf,CAAsB,MAAtB;AACA,eAAO,KAAP;AACD,OALH,EAME,KANF;AAQD;AA7BK,GAAR;AA+BD,CAlCA;;AAoCD9C,QACGC,MADH,CACU,cADV,EAEGwC,SAFH,CAEa,WAFb,EAE0B,YAAW;AACnC,SAAO;AACLG,WAAO;AACLub,YAAM,GADD;AAELC,WAAK,GAFA;AAGLxP,WAAK;AAHA,KADF;AAMLzL,UAAM,cAASP,KAAT,EAAgBlC,OAAhB,EAAyB;AAC7B;AACA,UAAIkd,KAAKld,QAAQ,CAAR,CAAT;;AAEAkd,SAAGxZ,gBAAH,CACE,UADF,EAEE,UAASiJ,CAAT,EAAY;AACVA,UAAEyQ,YAAF,CAAeO,UAAf,GAA4B,MAA5B;AACA;AACA,YAAIhR,EAAEtJ,cAAN,EAAsBsJ,EAAEtJ,cAAF;AACtB,aAAKka,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OARH,EASE,KATF;;AAYA,UAAII,UAAU,CAAd;;AAEAV,SAAGxZ,gBAAH,CACE,WADF,EAEE,UAASiJ,CAAT,EAAY;AACViR;AACA,aAAKL,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OANH,EAOE,KAPF;;AAUAN,SAAGxZ,gBAAH,CACE,WADF,EAEE,UAASiJ,CAAT,EAAY;AACViR;AACC,YAAIA,YAAY,CAAhB,EAAmB;AACjB,eAAKL,SAAL,CAAenb,MAAf,CAAsB,MAAtB;AACD;AACF,eAAO,KAAP;AACD,OARH,EASE,KATF;;AAYA8a,SAAGxZ,gBAAH,CACE,MADF,EAEE,UAASiJ,CAAT,EAAY;AACV;AACA,YAAIA,EAAEkR,eAAN,EAAuBlR,EAAEkR,eAAF;;AAEvB,aAAKN,SAAL,CAAenb,MAAf,CAAsB,MAAtB;;AAEA,YAAI0b,QAAQ,KAAK/kB,IAAjB;AACA,YAAIsJ,OAAO,IAAI8M,IAAJ,CAAS2E,KAAKva,KAAL,CAAWoT,EAAEyQ,YAAF,CAAeW,OAAf,CAAuB,MAAvB,CAAX,CAAT,CAAX;AACA7b,cAAM8b,MAAN,CAAa,UAAS9b,KAAT,EAAgB;AAC3B,cAAI+b,KAAK/b,MAAMub,IAAN,EAAT;AACA,cAAI,gBAAgB,OAAOQ,EAA3B,EAA+B;AAC7BA,eAAGtR,CAAH,EAAMzK,MAAMgM,GAAZ,EAAiB7L,IAAjB;AACD;AACF,SALD;;AAOA,eAAO,KAAP;AACD,OAlBH,EAmBE,KAnBF;AAqBD;AAnEI,GAAP;AAqED,CAxED;AAyEA,CAAC/C,QACEC,MADF,CACS,cADT,EAEEwC,SAFF,CAEY,YAFZ,EAE0B,YAAW;AAClC,SAAO;AACNE,cAAU,GADJ;AAENC,WAAO;AACLW,eAAS;AADJ,KAFD;AAKNJ,UAAM,cAAUP,KAAV,EAAiBlC,OAAjB,EAA0B;AAC/BA,cAAQke,EAAR,CAAW,QAAX,EAAqB,UAAUpb,KAAV,EAAiB;AACpCZ,cAAM8b,MAAN,CAAa,YAAU;AACrB9b,gBAAMW,OAAN,CAAc,EAACyJ,OAAOxJ,MAAMgD,MAAN,CAAawG,KAArB,EAAd;AACD,SAFD;AAGD,OAJD;AAKA;AAXK,GAAP;AAaH,CAhBA;AAiBD,CAAChN,QACEC,MADF,CACS,cADT,EAEEwC,SAFF,CAEY,WAFZ,EAEyB,YAAW;AACjC,SAAO;AACLoc,aAAS,SADJ;AAEL1b,UAAM,cAASP,KAAT,EAAgBlC,OAAhB,EAAyB2C,KAAzB,EAAgCyb,SAAhC,EAA2C;AAC/C,UAAIC,YAAY,SAAZA,SAAY,CAASC,UAAT,EAAqB;AACnC,YAAIA,cAAc7F,SAAlB,EAA6B6F,aAAa,EAAb;AAC7B,YAAIC,aAAaD,WAAWlb,WAAX,EAAjB;AACA,YAAImb,eAAeD,UAAnB,EAA+B;AAC7BF,oBAAUI,aAAV,CAAwBD,UAAxB;AACAH,oBAAUK,OAAV;AACD;AACD,eAAOF,UAAP;AACD,OARD;AASAH,gBAAUM,QAAV,CAAmBrL,IAAnB,CAAwBgL,SAAxB;AACAA,gBAAUnc,MAAMS,MAAMgc,OAAZ,CAAV;AACD;AAdI,GAAP;AAgBD,CAnBF;AAoBD,CAACrf,QACEC,MADF,CACS,cADT,EAEEwC,SAFF,CAEY,eAFZ,EAE6B,CAAC,SAAD,EAAY,UAAU6c,OAAV,EAAmB;AACzD,SAAO;AACH3c,cAAU,GADP;AAEHQ,UAAM,cAAUP,KAAV,EAAiBlC,OAAjB,EAA0B2C,KAA1B,EAAiC;AACnC3C,cAAQke,EAAR,CAAW,OAAX,EAAoB,YAAY;AAC5B,YAAI,CAACU,QAAQC,YAAR,GAAuB/mB,QAAvB,EAAL,EAAwC;AACpC;AACA,eAAKgnB,iBAAL,CAAuB,CAAvB,EAA0B,KAAKzD,KAAL,CAAWxgB,MAArC;AACH;AACJ,OALD;AAMH;AATE,GAAP;AAWH,CAZ6B,CAF7B;AAeD,CAACyE,QACEC,MADF,CACS,cADT,EAEEwC,SAFF,CAEY,MAFZ,EAEoB,UAASC,QAAT,EAAmB;AACpC,SAAO;AACLC,cAAU,GADL;AAELb,gBAAY,gBAFP;AAGLD,iBAAa,+BAHR;AAILe,WAAO;AACLG,YAAM;AADD;AAJF,GAAP;AAQD,CAXF,EAYEjB,UAZF,CAYa,gBAZb,EAY+B,UAAUS,UAAV,EAAsBoL,MAAtB,EAA8B1E,MAA9B,EAAsCrE,gBAAtC,EAAwD;AACpF+I,SAAO7H,eAAP,GAAyB,YAAW;AAClC,WAAOlB,iBAAiBmB,UAAjB,CAA4BnB,iBAAiBoB,sBAAjB,CAAwC2H,OAAO5K,IAAP,CAAYlI,IAApD,CAA5B,CAAP;AACD,GAFD;AAGD,CAhBF;AAiBD,C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BDmF,QACKC,MADL,CACY,cADZ,EAC4BwC,SAD5B,CACsC,WADtC,EACmD,CAAC,UAAD,EAAa,UAAUC,QAAV,EAAoB;AAC5E,WAAS+c,YAAT,CAAsB9R,MAAtB,EAA8B4P,QAA9B,EAAwCmC,MAAxC,EAAgD;AAC5C,QAAIC,QAAQ,IAAZ;AAAA,QACIC,eAAeF,OAAOE,YAAP,GAAsBC,aAAaH,OAAOE,YAApB,CAAtB,GAA0D,GAD7E;AAAA,QAEIE,YAAYJ,OAAOI,SAAP,IAAoB,GAFpC;AAAA,QAGIC,aAAaL,OAAOK,UAAP,IAAqBD,YAAY,CAHlD;AAAA,QAIIE,aAAaN,OAAOM,UAAP,GAAoBC,kBAAkBP,OAAOM,UAAzB,CAApB,GAA2D,KAJ5E;AAAA,QAKIE,SAASR,OAAOQ,MAAP,IAAiB,GAL9B;AAAA,QAMIC,cAAc,OAAOT,OAAOS,WAAd,KAA8B,WAA9B,GAA4CT,OAAOS,WAAP,KAAuB,MAAnE,GAA4E,IAN9F;AAAA,QAOIC,WAPJ;AAAA,QAQIC,SARJ;AAAA,QASIjW,OATJ;AAAA,QAUIkW,QAVJ;;AAcA,QAAI3S,OAAO9S,IAAX,EAAiB;AACb,UAAI8S,OAAO9S,IAAP,YAAuB0lB,KAA3B,EAAkC;AAC9BF,oBAAY1S,OAAO9S,IAAnB;AACAulB,sBAAcC,UAAU,CAAV,CAAd;AACH,OAHD,MAGO;AACHD,sBAAczS,OAAO9S,IAArB;AACH;AACJ;AACD,QAAI,OAAO8S,OAAO6S,KAAd,KAAwB,WAAxB,IAAuC7S,OAAO6S,KAAlD,EAAyD;AACrDC;AACH;;AAED,aAASA,SAAT,GAAqB;AACjBd,cAAQjd,SAAS,YAAY;AACzBge,iBAASnD,QAAT,EAAmB,CAAnB,EAAsB,CAAtB,EAAyB6C,WAAzB;AACH,OAFO,EAELR,YAFK,CAAR;AAGH;;AAED,aAASc,QAAT,CAAkBhgB,OAAlB,EAA2BigB,SAA3B,EAAsCC,QAAtC,EAAgD/lB,IAAhD,EAAsD;AAClD,UAAI8lB,aAAa9lB,KAAKU,MAAtB,EAA8B;AAC1BslB,oBAAYngB,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkBqlB,SAAlB,IAA+BT,MAApD;AACAS;AACAhB,gBAAQjd,SAAS,YAAY;AACzBge,mBAAShgB,OAAT,EAAkBigB,SAAlB,EAA6BC,QAA7B,EAAuC/lB,IAAvC;AACH,SAFO,EAELilB,SAFK,CAAR;AAGA;AACH,OAPD,MAOO;AACHa;;AAEA,YAAGhT,OAAOmT,iBAAV,EAA6B;AAC3BnT,iBAAOmT,iBAAP,GAA2BF,QAA3B;AACD;;AAED;AACA,YAAIP,aAAaO,WAAWP,UAAU9kB,MAAV,GAAmB,CAA/C,EAAkD;AAC9CokB,kBAAQjd,SAAS,YAAY;AACzBqe,4BAAgBrgB,OAAhB,EAAyBigB,SAAzB,EAAoCC,QAApC,EAA8CP,UAAUO,QAAV,CAA9C;AACH,WAFO,EAELjT,OAAOqT,cAFF,CAAR;AAGH,SAJD,MAIO;AACH,cAAIrT,OAAOsT,UAAX,EAAuB;AACnBtT,mBAAOsT,UAAP;AACH;AACDC,kBAAQxgB,OAAR,EAAiBigB,SAAjB,EAA4BP,WAA5B;AACH;AACJ;AACJ;;AAED,aAASc,OAAT,CAAiBxgB,OAAjB,EAA0BigB,SAA1B,EAAqC;AACjC,UAAI9lB,OAAO6F,QAAQ7F,IAAR,GAAeS,SAAf,CAAyB,CAAzB,EAA4BoF,QAAQ7F,IAAR,GAAeU,MAAf,GAAwB,CAApD,CAAX;AACA,UAAI4kB,WAAJ,EAAiB;AACb,YAAIH,UAAJ,EAAgB;AACZM,qBAAW,yCAAyCN,UAAzC,GAAsD,6CAAtD,GAAsGA,UAAtG,GAAmH,YAAnH,GACP,kCADO,GAC8BA,UAD9B,GAC2C,2CAD3C,GACyFA,UADzF,GACsG,aADtG,GAEP,8BAFO,GAE0BA,UAF1B,GAEuC,YAFlD;AAGAa,sBAAYngB,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkBqlB,SAAlB,IAA+B,6BAA/B,GAA+DL,QAA/D,GAA0E,IAA1E,GAAiFJ,MAAjF,GAA0F,SAA/G;AACH,SALD,MAKO;AACHW,sBAAYngB,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkBqlB,SAAlB,IAA+B,sBAA/B,GAAwDT,MAAxD,GAAiE,SAAtF;AACH;AACJ,OATD,MASO;AACHW,oBAAYngB,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkBqlB,SAAlB,CAArB;AACH;AACJ;;AAED,aAASI,eAAT,CAAyBrgB,OAAzB,EAAkCigB,SAAlC,EAA6CC,QAA7C,EAAuDR,WAAvD,EAAoE;AAClE,UAAGO,aAAa,CAAhB,EAAmB;AACjB,YAAGhT,OAAOwT,UAAV,EAAsB;AACpBxT,iBAAOwT,UAAP;AACD;AACF;AACC,UAAIR,YAAY,CAAhB,EAAmB;AACfP,sBAAcA,YAAYviB,KAAZ,CAAkB,CAAlB,EAAqB,CAAC,CAAtB,CAAd;AACA;AACAgjB,oBAAYngB,OAAZ,EAAqB0f,cAAcF,MAAnC;AACAS;AACAhB,gBAAQjd,SAAS,YAAY;AACzBqe,0BAAgBrgB,OAAhB,EAAyBigB,SAAzB,EAAoCC,QAApC,EAA8CR,WAA9C;AACH,SAFO,EAELL,UAFK,CAAR;AAGA;AACH,OATD,MASO;AACHa;AACAR,sBAAcC,UAAUO,QAAV,CAAd;AACAjB,gBAAQjd,SAAS,YAAY;AACzBge,mBAAShgB,OAAT,EAAkB,CAAlB,EAAqBkgB,QAArB,EAA+BR,WAA/B;AACH,SAFO,EAELN,SAFK,CAAR;AAGH;AACJ;;AAED,aAASD,YAAT,CAAsBta,KAAtB,EAA6B;AACzB,UAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;AAC3B,eAAOA,MAAMyP,MAAN,CAAazP,MAAMhK,MAAN,GAAe,CAA5B,MAAmC,GAAnC,GAAyC6lB,SAAS7b,MAAMjK,SAAN,CAAgB,CAAhB,EAAmBiK,MAAMhK,MAAN,GAAe,CAAlC,CAAT,EAA+C,EAA/C,IAAqD,IAA9F,GAAqG,CAACgK,KAA7G;AACH,OAFD,MAEO;AACH,eAAO,KAAP;AACH;AACJ;;AAED,aAAS0a,iBAAT,CAA2B1a,KAA3B,EAAkC;AAC9B,UAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;AAC3B,eAAOA,MAAMyP,MAAN,CAAazP,MAAMhK,MAAN,GAAe,CAA5B,MAAmC,GAAnC,GAAyCgK,KAAzC,GAAiD6b,SAAS7b,MAAMjK,SAAN,CAAgB,CAAhB,EAAmBiK,MAAMhK,MAAN,GAAe,CAAlC,CAAT,EAA+C,EAA/C,IAAqD,IAA7G;AACH;AACJ;;AAED,aAASslB,WAAT,CAAqBngB,OAArB,EAA8Bqb,KAA9B,EAAqC;AACjC,UAAIrb,QAAQ2gB,IAAR,CAAa,UAAb,EAAyBziB,WAAzB,OAA2C,OAA/C,EAAwD;AACpD,eAAO8B,QAAQ4gB,GAAR,CAAYvF,KAAZ,CAAP;AACH;AACD,aAAOrb,QAAQ6gB,IAAR,CAAaxF,KAAb,CAAP;AACH;;AAEDpO,WAAOtJ,GAAP,CAAW,UAAX,EAAuB,YAAY;AAC/B,UAAIsb,KAAJ,EAAW;AACPjd,iBAAS2D,MAAT,CAAgBsZ,KAAhB;AACH;AACJ,KAJD;;AAMAhS,WAAOpJ,MAAP,CAAc,OAAd,EAAuB,UAAUid,MAAV,EAAkB;AACrC,UAAI,CAACpX,OAAD,IAAYoX,MAAhB,EAAwB;AACpBpX,kBAAU,CAACA,OAAX;AACAqW;AACH;AACJ,KALD;;AAOA9S,WAAOpJ,MAAP,CAAc,MAAd,EAAsB,UAAUid,MAAV,EAAkBC,MAAlB,EAA0B;AAC9C,UAAG,EAAED,kBAAkBjB,KAApB,CAAH,EAA+B;AAC7BH,sBAAcoB,MAAd;AACAf;AACD;AACF,KALD;AAMH;;AAED,SAAO;AACH9d,cAAU,GADP;AAEHQ,UAAMsc,YAFH;AAGHzmB,aAAS,IAHN;AAIH4J,WAAO;AACH/H,YAAM,GADH;AAEHomB,kBAAY,GAFT;AAGHH,yBAAmB,GAHhB;AAIHE,sBAAgB,GAJb;AAKHG,kBAAY,GALT;AAMHX,aAAO;AANJ;AAJJ,GAAP;AAcH,CA/J8C,CADnD;AAiKA;IAAOkB,gB;AAEL,4BAAY/O,WAAZ,EAAyBnQ,YAAzB,EAAuCmC,aAAvC,EAAsD;AAAA;;AAClD,SAAKgO,WAAL,GAAmBA,WAAnB;AACA,SAAKnQ,YAAL,GAAoBA,YAApB;AACA,SAAKmC,aAAL,GAAqBA,aAArB;AACA,SAAKgd,uBAAL,GAA+BnN,KAAKva,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,yBAArB,CAAX,KAA+D,EAA9F;AACA,SAAK0gB,mBAAL,GAA2BpN,KAAKva,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,qBAArB,CAAX,KAA2D,EAAtF;;AAEAsB,iBAAaqf,mBAAb,CAAiC,kBAAjC,EAAqD,WAArD,EAAkE,UAASpN,KAAT,EAAe;AAAA;AAAA;AAAA;;AAAA;AAC/E,8BAAgBA,KAAhB,mIAAuB;AAAA,cAAdqN,GAAc;;;AAErBA,cAAIhnB,SAAJ,GAAgB,KAAK6iB,0BAAL,CAAgCmE,GAAhC,CAAhB;;AAFqB;AAAA;AAAA;;AAAA;AAIrB,kCAAmBA,IAAItM,OAAvB,mIAAgC;AAAA,kBAAvBtL,MAAuB;;AAC9B,kBAAG,KAAKyX,uBAAL,CAA6BlQ,QAA7B,CAAsCvH,OAAO5J,GAA7C,CAAH,EAAsD;AACpD,qBAAKyhB,kBAAL,CAAwB7X,MAAxB,EAAgC4X,GAAhC;AACD;AACF;AARoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAStB;AAV8E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWhF,KAXiE,CAWhEvjB,IAXgE,CAW3D,IAX2D,CAAlE;AAYH;;;;8CAMyB6V,I,EAAM;AAC9B,aAAO,KAAKqJ,UAAL,CAAgBrM,MAAhB,CAAuB,UAAS0Q,GAAT,EAAa;AACzC,eAAOA,IAAIE,yBAAJ,CAA8B5N,IAA9B,EAAoC7Y,MAApC,GAA6C,CAApD;AACD,OAFM,CAAP;AAGD;;;kCAEa+E,G,EAAK;AAAA;AAAA;AAAA;;AAAA;AACjB,8BAAsB,KAAKmd,UAA3B,mIAAuC;AAAA,cAA9BtT,SAA8B;;AACrC,iBAAOpN,EAAE0S,IAAF,CAAOtF,UAAUqL,OAAjB,EAA0B,EAAClV,KAAKA,GAAN,EAA1B,CAAP;AACD;AAHgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIlB;;;+CAE0B6J,S,EAAW;AACpC,aAAO,CAAC,KAAKyX,mBAAL,CAAyBnQ,QAAzB,CAAkCtH,UAAU7J,GAA5C,CAAR;AACD;;;oDAE+BxF,S,EAAWqP,S,EAAW;AACpD,UAAGrP,SAAH,EAAc;AACZiC,UAAE6Y,IAAF,CAAO,KAAKgM,mBAAZ,EAAiCzX,UAAU7J,GAA3C;AACD,OAFD,MAEO;AACL,aAAKshB,mBAAL,CAAyB7N,IAAzB,CAA8B5J,UAAU7J,GAAxC;AACD;;AAEDW,mBAAa0V,OAAb,CAAqB,qBAArB,EAA4CnC,KAAK0F,SAAL,CAAe,KAAK0H,mBAApB,CAA5C;;AAEAzX,gBAAUrP,SAAV,GAAsB,KAAK6iB,0BAAL,CAAgCxT,SAAhC,CAAtB;AACD;;;iCAEY7J,G,EAAKhE,Q,EAAU;AAC1B,WAAK2lB,2BAAL,CAAiC3hB,GAAjC,EAAsChE,QAAtC;AACD;;;oCAEe6N,S,EAAW;AAAA;AAAA;AAAA;;AAAA;AACzB,8BAAkBA,UAAUqL,OAA5B,mIAAqC;AAAA,cAA7BtL,MAA6B;;AACnCnN,YAAE6Y,IAAF,CAAO,KAAKgM,mBAAZ,EAAiCzX,SAAjC;AACA,cAAGD,OAAOgY,WAAV,EAAuB;AACrB,gBAAG,KAAKC,qBAAL,CAA2BjY,MAA3B,CAAH,EAAuC;AACrC,mBAAKkY,mBAAL,CAAyBlY,MAAzB;AACD;AACF;AACF;AARwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAUzB,WAAK1H,YAAL,CAAkBuN,kBAAlB,CAAqC5F,SAArC;AACA,WAAKxF,aAAL,CAAmBoD,IAAnB,CAAwB,IAAxB;AACD;;;gDAE2BzH,G,EAAKhE,Q,EAAU;AACzC,WAAKqW,WAAL,CAAiB0P,MAAjB,CAAwB/hB,GAAxB,EAA6BA,GAA7B,EAAkC4B,GAAlC,GAAwCrD,IAAxC,CAA6C,UAASmJ,QAAT,EAAkB;AAC7D,YAAI8Z,MAAM,KAAKQ,uCAAL,CAA6ChiB,GAA7C,EAAkD0H,SAASiP,KAAT,EAAlD,CAAV;AACA,YAAG3a,QAAH,EAAa;AACXA,mBAASwlB,GAAT;AACD;AACF,OAL4C,CAK3CvjB,IAL2C,CAKtC,IALsC,CAA7C,EAMCO,KAND,CAMO,UAASkJ,QAAT,EAAkB;AACvB5J,gBAAQC,GAAR,CAAY,6BAAZ,EAA2C2J,QAA3C;AACA1L,iBAAS,IAAT;AACD,OATD;AAUD;;;4DAEuCgE,G,EAAKqV,oB,EAAsB;AACjE,UAAIxL,YAAYpN,EAAE0S,IAAF,CAAO,KAAKgO,UAAZ,EAAwB,EAACnd,KAAKA,GAAN,EAAxB,CAAhB;AACA,UAAG6J,SAAH,EAAc;AACZA,kBAAUoY,8BAAV,CAAyC5M,oBAAzC;AACD,OAFD,MAEO;AACLxL,oBAAY,IAAIoL,SAAJ,CAAcI,oBAAd,CAAZ;AACAxL,kBAAU7J,GAAV,GAAgBA,GAAhB;AACA6J,kBAAUrC,QAAV,CAAmB,IAAnB;AACA,aAAKtF,YAAL,CAAkB0M,OAAlB,CAA0B/E,SAA1B;AACA,aAAKxF,aAAL,CAAmBoD,IAAnB,CAAwB,IAAxB;AACD;;AAED,aAAOoC,SAAP;AACD;;;kDAE6B;AAAA;AAAA;AAAA;;AAAA;AAC5B,8BAAgB,KAAKwX,uBAArB,mIAA8C;AAAA,cAArCrhB,GAAqC;;AAC5C,cAAI4J,SAAS,KAAKsY,aAAL,CAAmBliB,GAAnB,CAAb;AACA,cAAG4J,MAAH,EAAW;AACT,iBAAKkY,mBAAL,CAAyBlY,MAAzB;AACD;AACF;AAN2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAQ5B,+BAAe,KAAKuT,UAApB,wIAAgC;AAAA,cAAxBqE,GAAwB;;AAC9B,eAAKG,2BAAL,CAAiCH,IAAIxhB,GAArC,EAA0C,UAAS6J,SAAT,EAAmB;AAC3DA,sBAAUrC,QAAV,CAAmB,IAAnB;AACD,WAFD;AAGD;AAZ2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAa7B;;;kCAEaoC,M,EAAQC,S,EAAWiK,I,EAAM9X,Q,EAAU;;AAE/C,UAAG,KAAKqhB,0BAAL,CAAgCxT,SAAhC,KAA8C,CAAC,KAAKxF,aAAL,CAAmBiS,cAAnB,EAAlD,EAAuF;AACrF3O,cAAM,2FAAN;AACA3L,iBAAS,IAAT;AACA;AACD;;AAED,cAAQ4N,OAAOiL,IAAf;AACE,aAAK,KAAL;AAAY;AACV,iBAAKxC,WAAL,CAAiB0P,MAAjB,CAAwBnY,OAAO5J,GAA/B,EAAoC4J,OAAO5J,GAA3C,EAAgD4B,GAAhD,GAAsDrD,IAAtD,CAA2D,UAASmJ,QAAT,EAAkB;AAC3EkC,qBAAOlL,KAAP,GAAe,KAAf;AACA,kBAAIyV,QAAQzM,SAASyM,KAArB;AACA,mBAAKjS,YAAL,CAAkBuY,6BAAlB,CAAgDtG,KAAhD;AACAnY,uBAASmY,KAAT;AACD,aAL0D,CAKzDlW,IALyD,CAKpD,IALoD,CAA3D,EAMCO,KAND,CAMO,UAASkJ,QAAT,EAAkB;AACvBkC,qBAAOlL,KAAP,GAAe,IAAf;AACD,aARD;;AAUA;AACD;;AAED,aAAK,MAAL;AAAa;AACX,gBAAIyjB,MAAM/pB,OAAO+hB,IAAP,CAAYvQ,OAAO5J,GAAnB,EAAwB,QAAxB,CAAV;AACAmiB,gBAAI9c,KAAJ;AACArJ;AACA;AACD;;AAED,aAAK,MAAL;AAAa;AACX,gBAAIwE,SAAS,EAAb;;AAEA,gBAAGoJ,OAAOgE,GAAV,EAAe;AACb,kBAAIuG,QAAQ,KAAKjS,YAAL,CAAkB+Y,qBAAlB,CAAwCrR,OAAO+K,aAA/C,CAAZ;AACAnU,qBAAO2T,KAAP,GAAeA,MAAMiB,GAAN,CAAU,UAAStB,IAAT,EAAc;AACrC,oBAAItT,SAAS,KAAK4hB,qBAAL,CAA2BtO,IAA3B,EAAiCjK,SAAjC,CAAb;AACA,uBAAOrJ,MAAP;AACD,eAHwB,CAGvBvC,IAHuB,CAGlB,IAHkB,CAAV,CAAf;AAKD,aAPD,MAOO;AACLuC,qBAAOsT,IAAP,GAAc,KAAKsO,qBAAL,CAA2BtO,IAA3B,EAAiCjK,SAAjC,CAAd;AACD;;AAED,iBAAKwY,WAAL,CAAiBzY,MAAjB,EAAyBC,SAAzB,EAAoCrJ,MAApC,EAA4C,UAASkH,QAAT,EAAkB;AAC5D1L,uBAAS0L,QAAT;AACD,aAFD;;AAIA;AACD;;AAED;AAAS,WAER;AA7CH;;AAgDAkC,aAAO2K,YAAP,GAAsB,IAAIxb,IAAJ,EAAtB;AACD;;;0CAEqB6Q,M,EAAQ;AAC5B,aAAO,KAAKyX,uBAAL,CAA6BlQ,QAA7B,CAAsCvH,OAAO5J,GAA7C,CAAP;AACD;;;wCAEmB4J,M,EAAQC,S,EAAW;AACrCpN,QAAE6Y,IAAF,CAAO,KAAK+L,uBAAZ,EAAqCzX,OAAO5J,GAA5C;AACAW,mBAAa0V,OAAb,CAAqB,yBAArB,EAAgDnC,KAAK0F,SAAL,CAAe,KAAKyH,uBAApB,CAAhD;AACA,WAAKnf,YAAL,CAAkBogB,wBAAlB,CAA2C1Y,OAAO5J,GAAlD;;AAEAlC,cAAQwb,MAAR,CAAe,KAAKuI,qBAAL,CAA2BjY,MAA3B,KAAsC,KAArD;AACD;;;uCAEkBA,M,EAAQC,S,EAAW;AACpC,UAAG,CAACpN,EAAE0S,IAAF,CAAO,KAAKkS,uBAAZ,EAAqCzX,OAAO5J,GAA5C,CAAJ,EAAsD;AACpD,aAAKqhB,uBAAL,CAA6B5N,IAA7B,CAAkC7J,OAAO5J,GAAzC;AACAW,qBAAa0V,OAAb,CAAqB,yBAArB,EAAgDnC,KAAK0F,SAAL,CAAe,KAAKyH,uBAApB,CAAhD;AACD;;AAED,UAAGzX,OAAOgY,WAAV,EAAuB;;AAErB,YAAGhY,OAAOgY,WAAP,IAAsB,OAAzB,EAAkC;AAChC,eAAK1f,YAAL,CAAkBqgB,qBAAlB,CAAwC3Y,OAAO5J,GAA/C,EAAoD4J,OAAO+K,aAA3D,EAA0E,UAAS6N,YAAT,EAAsB;AAC9F,iBAAKC,kBAAL,CAAwB7Y,MAAxB,EAAgCC,SAAhC,EAA2C2Y,YAA3C;AACD,WAFyE,CAExEvkB,IAFwE,CAEnE,IAFmE,CAA1E;AAGD;;AAED,YAAG2L,OAAOgY,WAAP,IAAsB,MAAzB,EAAiC;AAC/B;AACD;AAEF;AACF;;;gCAEWhY,M,EAAQC,S,EAAW5E,K,EAAOud,Y,EAAc;AAClD,WAAKE,WAAL,GAAmB,KAAKA,WAAL,IAAoB,EAAvC;AACA,UAAGjmB,EAAE0S,IAAF,CAAO,KAAKuT,WAAZ,EAAyB,EAAC1iB,KAAK4J,OAAO5J,GAAb,EAAzB,CAAH,EAAgD;AAC9C;AACD;;AAED;AACA,WAAK0iB,WAAL,CAAiBjP,IAAjB,CAAsB7J,MAAtB;;AAEA1E,iBAAW,YAAY;AACrB;AACA,aAAKud,kBAAL,CAAwB7Y,MAAxB,EAAgCC,SAAhC,EAA2C2Y,YAA3C;AACA/lB,UAAE6Y,IAAF,CAAO,KAAKoN,WAAZ,EAAyB9Y,MAAzB;AACD,OAJU,CAIT3L,IAJS,CAIJ,IAJI,CAAX,EAIcgH,QAAQ,IAJtB;AAKD;;;uCAEkB2E,M,EAAQC,S,EAAW2Y,Y,EAAc;AAClD,UAAG5Y,OAAO+Y,cAAP,GAAwB,CAA3B,EAA8B;AAC5B,YAAIpO,eAAe3K,OAAO2K,YAA1B;AACA,YAAIqO,gBAAgB,CAAC,IAAI7pB,IAAJ,KAAawb,YAAd,IAA4B,IAAhD;AACA,YAAGqO,gBAAgBhZ,OAAO+Y,cAA1B,EAA0C;AACxC,cAAI1d,QAAQ2E,OAAO+Y,cAAP,GAAwBC,aAApC;AACA,eAAKC,WAAL,CAAiBjZ,MAAjB,EAAyBC,SAAzB,EAAoC5E,KAApC,EAA2Cud,YAA3C;AACA;AACD;AACF;;AAED5Y,aAAO2K,YAAP,GAAsB,IAAIxb,IAAJ,EAAtB;;AAEA+E,cAAQC,GAAR,CAAY,oBAAZ;;AAEA,UAAG6L,OAAOiL,IAAP,IAAe,MAAlB,EAA0B;AACxB,YAAIrU,SAAS,EAAb;AACAA,eAAO2T,KAAP,GAAeqO,aAAapN,GAAb,CAAiB,UAAStB,IAAT,EAAc;AAC5C,cAAItT,SAAS,KAAK4hB,qBAAL,CAA2BtO,IAA3B,EAAiCjK,SAAjC,CAAb;AACA,iBAAOrJ,MAAP;AACD,SAH+B,CAG9BvC,IAH8B,CAGzB,IAHyB,CAAjB,CAAf;AAIA,aAAKokB,WAAL,CAAiBzY,MAAjB,EAAyBC,SAAzB,EAAoCrJ,MAApC,EAA4C,IAA5C;AACD,OAPD,MAOO;AACL;AACD;AACF;;;0CAEqBsT,I,EAAMjK,S,EAAW;AACrC,aAAO,KAAKxF,aAAL,CAAmB6U,kBAAnB,CAAsCpF,IAAtC,EAA4C,KAAKuJ,0BAAL,CAAgCxT,SAAhC,CAA5C,CAAP;AACD;;;gCAEWD,M,EAAQC,S,EAAWrJ,M,EAAQxE,Q,EAAU;AAC/C,UAAIya,UAAU,KAAKpE,WAAL,CAAiB0P,MAAjB,CAAwBnY,OAAO5J,GAA/B,EAAoC4J,OAAO5J,GAA3C,CAAd;AACAvD,QAAEC,KAAF,CAAQ+Z,OAAR,EAAiBjW,MAAjB;;AAEAiW,cAAQM,IAAR,GAAexY,IAAf,CAAoB,UAASmJ,QAAT,EAAkB;AACpCkC,eAAOlL,KAAP,GAAe,KAAf;AACA,YAAG1C,QAAH,EAAa;AACXA,mBAAS0L,SAASiP,KAAT,EAAT;AACD;AACF,OALD,EAMCnY,KAND,CAMO,UAASkJ,QAAT,EAAkB;AACvBkC,eAAOlL,KAAP,GAAe,IAAf;AACAZ,gBAAQC,GAAR,CAAY,wBAAZ,EAAsC2J,QAAtC;AACA,YAAG1L,QAAH,EAAa;AACXA,mBAAS,EAAC0C,OAAO,eAAR,EAAT;AACD;AACF,OAZD;AAaD;;;wBAzPgB;AACf,aAAO,KAAKwD,YAAL,CAAkBib,UAAzB;AACD;;;;;;AA2PHzd,QAAQC,MAAR,CAAe,cAAf,EAA+BmjB,OAA/B,CAAuC,kBAAvC,EAA2D1B,gBAA3D;AACA,CAAC1hB,QAAQC,MAAR,CAAe,cAAf,EACEmR,MADF,CACS,SADT,EACoB,UAAUiS,OAAV,EAAmB;AAClC,SAAO,UAAU7kB,KAAV,EAAiB;AACpB,WAAOA,QAAQ6kB,QAAQ,MAAR,EAAgB,IAAIhqB,IAAJ,CAASmF,KAAT,CAAhB,EAAiC,YAAjC,EAA+C,KAA/C,CAAR,GAAgE,EAAvE;AACH,GAFD;AAGH,CALF,EAME4S,MANF,CAMS,aANT,EAMwB,UAAUiS,OAAV,EAAmB;AACtC,SAAO,UAAU7kB,KAAV,EAAiB;AACpB,WAAOA,QAAQ6kB,QAAQ,MAAR,EAAgB,IAAIhqB,IAAJ,CAASmF,KAAT,CAAhB,EAAiC,mBAAjC,CAAR,GAAgE,EAAvE;AACH,GAFD;AAGH,CAVF;AAWD,CAACwB,QAAQC,MAAR,CAAe,cAAf,EACEmjB,OADF,CACU,kBADV,EAC8B,UAAU1e,IAAV,EAAgB;;AAE3C4e,SAAOC,UAAP,CAAkB;AAChBC,YAAQ,IADQ;AAEhBC,cAAU;AAFM,GAAlB;;AAKA,OAAKzd,sBAAL,GAA8B,UAASnL,IAAT,EAAe;AAC3C,QAAG,CAACA,IAAD,IAASA,KAAKU,MAAL,IAAe,CAA3B,EAA8B;AAC5B,aAAO,EAAP;AACD;AACD,WAAO+nB,OAAOzoB,IAAP,CAAP;AACD,GALD;;AAOA,OAAKkL,UAAL,GAAkB,UAAS2d,SAAT,EAAoB;AACpC,WAAOhf,KAAKif,WAAL,CAAiBD,SAAjB,CAAP;AACD,GAFD;AAKD,CApBF;AAqBD;IAAOE,Y;AAEL,0BAAc;AAAA;;AACZ,SAAKvV,KAAL,GAAa,EAAb;AACA,SAAKD,IAAL,GAAY,EAAZ;AACA,SAAKyV,iBAAL,GAAyB,EAAzB;AACA,SAAKC,mBAAL,GAA2B,EAA3B;AACA,SAAKrP,KAAL,GAAa,EAAb;AACA,SAAKsP,WAAL,GAAmB,EAAnB;AACD;;;;0CAcqBC,Y,EAAc;AAClC,aAAO,KAAKvP,KAAL,CAAWrD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AACrC,eAAO,CAAC4P,aAAavS,QAAb,CAAsB2C,KAAK7C,YAA3B,KAA4CyS,aAAavS,QAAb,CAAsB,GAAtB,CAA7C,KAA4E,CAAC2C,KAAKpP,KAAzF;AACD,OAFM,CAAP;AAGD;;;6BAEQif,M,EAAQ;AACf,aAAOlnB,EAAE0S,IAAF,CAAO,KAAKgF,KAAZ,EAAmB,EAAChb,MAAMwqB,MAAP,EAAnB,CAAP;AACD;;;kDAE6BxP,K,EAAO;AACnC,aAAO,KAAK4E,2CAAL,CAAiD5E,KAAjD,EAAwD,IAAxD,CAAP;AACD;;;gEAE2CA,K,EAAOwE,U,EAAY;AAC7D,UAAIiL,SAAS,EAAb;AAD6D;AAAA;AAAA;;AAAA;AAE7D,+BAAqBzP,KAArB,wIAA4B;AAAA,cAAnBvB,QAAmB;;AAC1BA,qBAAWnW,EAAEsX,IAAF,CAAOnB,QAAP,EAAiB+F,cAAc,EAA/B,CAAX;AACA,cAAI7E,OAAO,KAAK+P,QAAL,CAAcjR,SAAS,MAAT,CAAd,CAAX;AACA,cAAGA,SAAS,SAAT,KAAuB,IAA1B,EAAgC;AAC5B,gBAAGkB,IAAH,EAAS;AACP,mBAAKpF,iBAAL,CAAuBoF,IAAvB;AACD;AACD;AACH;;AAEDrX,YAAEsX,IAAF,CAAOnB,QAAP,EAAiB+F,UAAjB;;AAEA,cAAG,CAAC7E,IAAJ,EAAU;AACRA,mBAAO,KAAK9C,UAAL,CAAgB4B,QAAhB,CAAP;AACD,WAFD,MAEO;AACLkB,iBAAKjB,cAAL,CAAoBD,QAApB;AACD;;AAED,eAAKhE,OAAL,CAAakF,IAAb;;AAEA,cAAGlB,SAASO,OAAZ,EAAqB;AACnB,iBAAK2Q,wBAAL,CAA8BhQ,IAA9B;AACD;;AAED8P,iBAAOnQ,IAAP,CAAYK,IAAZ;AACD;AA3B4D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AA6B7D,WAAKiQ,2BAAL,CAAiCH,MAAjC;;AAEA,WAAKI,SAAL;AACA,aAAOJ,MAAP;AACD;;;gDAE2BA,M,EAAQ;AAAA;AAAA;AAAA;;AAAA;AAClC,+BAAoB,KAAKL,iBAAzB,wIAA4C;AAAA,cAApC/P,QAAoC;;AAC1C,cAAIyQ,gBAAgBL,OAAO9S,MAAP,CAAc,UAASgD,IAAT,EAAc;AAAC,mBAAOA,KAAK7C,YAAL,IAAqBuC,SAASqH,IAArC;AAA0C,WAAvE,CAApB;AACA,cAAGoJ,cAAchpB,MAAd,GAAuB,CAA1B,EAA6B;AAC3BuY,qBAASxX,QAAT,CAAkBioB,aAAlB;AACD;AACF;AANiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOnC;;;sDAEiCL,M,EAAQ;AAAA;AAAA;AAAA;;AAAA;AACxC,+BAAoB,KAAKJ,mBAAzB,wIAA8C;AAAA,cAAtChQ,QAAsC;;AAC5C,cAAIyQ,gBAAgBL,OAAO9S,MAAP,CAAc,UAASgD,IAAT,EAAc;AAC9C,mBAAON,SAASmB,aAAT,CAAuBxD,QAAvB,CAAgC2C,KAAK7C,YAArC,KAAsDuC,SAASmB,aAAT,CAAuBxD,QAAvB,CAAgC,GAAhC,CAA7D;AACD,WAFmB,CAApB;;AAIA,cAAG8S,cAAchpB,MAAd,GAAuB,CAA1B,EAA6B;AAC3BuY,qBAASxX,QAAT,CAAkBioB,aAAlB;AACD;AACF;AATuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUzC;;;+BAEUrR,Q,EAAU;AACnB,UAAIkB,IAAJ;AACA,UAAGlB,SAAS3B,YAAT,IAAyB,MAA5B,EAAoC;AAClC6C,eAAO,IAAIvE,IAAJ,CAASqD,QAAT,CAAP;AACD,OAFD,MAEO,IAAGA,SAAS3B,YAAT,IAAyB,KAA5B,EAAmC;AACxC6C,eAAO,IAAInG,GAAJ,CAAQiF,QAAR,CAAP;AACD,OAFM,MAEA,IAAGA,SAAS3B,YAAT,IAAyB,WAA5B,EAAyC;AAC9C6C,eAAO,IAAImB,SAAJ,CAAcrC,QAAd,CAAP;AACD,OAFM,MAEA;AACLkB,eAAO,IAAInB,IAAJ,CAASC,QAAT,CAAP;AACD;;AAEDkB,WAAKoQ,WAAL,CAAiB,IAAjB,EAAuB,UAASC,WAAT,EAAqB;AAC1C,aAAKC,iCAAL,CAAuC,CAACD,WAAD,CAAvC;AACD,OAFsB,CAErBlmB,IAFqB,CAEhB,IAFgB,CAAvB;;AAIA,aAAO6V,IAAP;AACD;;;6BAEQK,K,EAAO;AACd,WAAKA,KAAL,GAAa1X,EAAE4nB,IAAF,CAAO,KAAKlQ,KAAL,CAAW6F,MAAX,CAAkB7F,KAAlB,CAAP,CAAb;;AAEAA,YAAMhI,OAAN,CAAc,UAAS2H,IAAT,EAAc;AAC1B,YAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7B,cAAG,CAACxU,EAAE0S,IAAF,CAAO,KAAKrB,IAAZ,EAAkB,EAAC3U,MAAM2a,KAAK3a,IAAZ,EAAlB,CAAJ,EAA0C;AACxC,iBAAK2U,IAAL,CAAU4H,OAAV,CAAkB5B,IAAlB;AACD;AACF,SAJD,MAIO,IAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AACrC,cAAG,CAACxU,EAAE0S,IAAF,CAAO,KAAKpB,KAAZ,EAAmB,EAAC5U,MAAM2a,KAAK3a,IAAZ,EAAnB,CAAJ,EAA2C;AACzC,iBAAK4U,KAAL,CAAW2H,OAAX,CAAmB5B,IAAnB;AACD;AACF,SAJM,MAIA,IAAGA,KAAK7C,YAAL,IAAqB,WAAxB,EAAqC;AAC1C,cAAG,CAACxU,EAAE0S,IAAF,CAAO,KAAKsU,WAAZ,EAAyB,EAACtqB,MAAM2a,KAAK3a,IAAZ,EAAzB,CAAJ,EAAiD;AAC/C,iBAAKsqB,WAAL,CAAiB/N,OAAjB,CAAyB5B,IAAzB;AACD;AACF;AACF,OAda,CAcZ7V,IAdY,CAcP,IAdO,CAAd;AAeD;;;4BAEO6V,I,EAAM;AACZ,WAAKwQ,QAAL,CAAc,CAACxQ,IAAD,CAAd;AACD;;;wCAEmBc,W,EAAa;AAC/B,aAAO,KAAKT,KAAL,CAAWrD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AACrC,eAAOA,KAAK7C,YAAL,IAAqB2D,WAA5B;AACD,OAFM,CAAP;AAGD;;;6CAEwBd,I,EAAM;AAC7B,UAAIT,gBAAgBS,KAAKT,aAAzB;AACA,UAAG,CAACA,cAAcO,UAAlB,EAA8B;AAC5B;AACD;;AAJ4B;AAAA;AAAA;;AAAA;AAM7B,+BAAqBP,cAAcO,UAAnC,wIAA+C;AAAA,cAAvC2Q,SAAuC;;AAC7C,cAAIC,iBAAiB,KAAKX,QAAL,CAAcU,UAAUprB,IAAxB,CAArB;AACA,cAAGqrB,cAAH,EAAmB;AACjB1Q,iBAAK2Q,qBAAL,CAA2BD,cAA3B;AACAA,2BAAeC,qBAAf,CAAqC3Q,IAArC;AACD,WAHD,MAGO;AACL;AACD;AACF;AAd4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe9B;;;gCAEW;AACVnB,WAAKgJ,eAAL,CAAqB,KAAK5N,KAA1B;;AAEA,WAAKD,IAAL,CAAU3B,OAAV,CAAkB,UAASmC,GAAT,EAAa;AAC7BqE,aAAKgJ,eAAL,CAAqBrN,IAAIP,KAAzB;AACD,OAFD;AAGD;;;wCAEmB2W,E,EAAI7J,I,EAAM7e,Q,EAAU;AACtC,WAAKunB,iBAAL,CAAuB9P,IAAvB,CAA4B,EAACiR,IAAIA,EAAL,EAAS7J,MAAMA,IAAf,EAAqB7e,UAAUA,QAA/B,EAA5B;AACD;;;2CAEsB0oB,E,EAAI;AACzBjoB,QAAE+F,MAAF,CAAS,KAAK+gB,iBAAd,EAAiC9mB,EAAE0S,IAAF,CAAO,KAAKoU,iBAAZ,EAA+B,EAACmB,IAAIA,EAAL,EAA/B,CAAjC;AACD;;;0CAEqBA,E,EAAI/P,a,EAAe3Y,Q,EAAU;AACjD,WAAKwnB,mBAAL,CAAyB/P,IAAzB,CAA8B,EAACiR,IAAIA,EAAL,EAAS/P,eAAeA,aAAxB,EAAuC3Y,UAAUA,QAAjD,EAA9B;AACD;;;6CAEwB0oB,E,EAAI;AAC3BjoB,QAAE+F,MAAF,CAAS,KAAKghB,mBAAd,EAAmC/mB,EAAE0S,IAAF,CAAO,KAAKqU,mBAAZ,EAAiC,EAACkB,IAAIA,EAAL,EAAjC,CAAnC;AACD;;;oCAMe;AACd,aAAO,KAAKvQ,KAAL,CAAWrD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AAAC,eAAOA,KAAKR,KAAL,IAAc,IAAd,IAAsB,CAACQ,KAAKpP,KAAnC;AAAyC,OAA1E,CAAP;AACD;;;sCAEiB;AAChB,WAAK0T,aAAL,GAAqBjM,OAArB,CAA6B,UAAS2H,IAAT,EAAc;AACzCA,aAAKtM,QAAL,CAAc,KAAd;AACD,OAFD;AAGD;;;uCAEkBsM,I,EAAM;AACvBA,WAAKyF,OAAL,GAAe,IAAf;AACA,UAAG,CAACzF,KAAKpP,KAAT,EAAgB;AACdoP,aAAKtM,QAAL,CAAc,IAAd;AACD;AACDsM,WAAK6Q,sBAAL;AACD;;;sCAEiB7Q,I,EAAM;AACtBrX,QAAE6Y,IAAF,CAAO,KAAKnB,KAAZ,EAAmBL,IAAnB;;AAEA,UAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7BxU,UAAE6Y,IAAF,CAAO,KAAKxH,IAAZ,EAAkBgG,IAAlB;AACD,OAFD,MAEO,IAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AACrCxU,UAAE6Y,IAAF,CAAO,KAAKvH,KAAZ,EAAmB+F,IAAnB;AACD,OAFM,MAEA,IAAGA,KAAK7C,YAAL,IAAqB,WAAxB,EAAqC;AAC1CxU,UAAE6Y,IAAF,CAAO,KAAKmO,WAAZ,EAAyB3P,IAAzB;AACD;AACF;;AAED;;;;;;mDAI+B8Q,O,EAASC,O,EAAS;AAC/CD,cAAQH,qBAAR,CAA8BI,OAA9B;AACAA,cAAQJ,qBAAR,CAA8BG,OAA9B;;AAEAA,cAAQpd,QAAR,CAAiB,IAAjB;AACAqd,cAAQrd,QAAR,CAAiB,IAAjB;AACD;;;mDAE8Bod,O,EAASC,O,EAAS;AAC/CD,cAAQE,wBAAR,CAAiCD,OAAjC;AACAA,cAAQC,wBAAR,CAAiCF,OAAjC;;AAEAA,cAAQpd,QAAR,CAAiB,IAAjB;AACAqd,cAAQrd,QAAR,CAAiB,IAAjB;AACD;;;wBAhOc;AACb,aAAO,KAAK2M,KAAL,CAAWrD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AACrC,eAAO,CAACA,KAAKpP,KAAb;AACD,OAFM,CAAP;AAGD;;;wBAEgB;AACf,aAAO,KAAK+e,WAAL,CAAiB3S,MAAjB,CAAwB,UAAS0Q,GAAT,EAAa;AAC1C,eAAO,CAACA,IAAIjI,OAAZ;AACD,OAFM,CAAP;AAGD;;;wBAkKmB;AAClB,aAAOhK,KAAKC,gBAAL,CAAsB,KAAKzB,KAA3B,CAAP;AACD;;;;;;AAqDHrO,QAAQC,MAAR,CAAe,cAAf,EAA+BmjB,OAA/B,CAAuC,cAAvC,EAAuDQ,YAAvD;AACA,CAAC5jB,QAAQC,MAAR,CAAe,cAAf,EACEmjB,OADF,CACU,sBADV,EACkC,UAAU1e,IAAV,EAAgB;AAC/C;AACA,OAAK2gB,UAAL,GAAkB,UAAUC,UAAV,EAAsBC,IAAtB,EAA4B;AAC5CvlB,YAAQyM,OAAR,CAAgB6Y,UAAhB,EAA4B,UAAUE,MAAV,EAAkB3rB,GAAlB,EAAuB;AACjD,UAAI,OAAO0rB,KAAK1rB,GAAL,CAAP,KAAqB,WAAzB,EAAsC;AACpC0rB,aAAK1rB,GAAL,EAAU4rB,SAAV;AACAF,aAAK1rB,GAAL,EAAU6rB,YAAV,CAAuB,QAAvB,EAAiC,KAAjC;AACAH,aAAK1rB,GAAL,EAAU8rB,MAAV,CAAiBC,MAAjB,GAA0BlhB,KAAKif,WAAL,CAAiB6B,OAAOK,IAAP,CAAY,IAAZ,CAAjB,CAA1B;AACD;AACF,KAND;AAOD,GARD;;AAUA;AACA,OAAKC,WAAL,GAAmB,UAAU9d,QAAV,EAAoBud,IAApB,EAA0B;AAC3C,QAAIvd,SAASkD,MAAT,KAAoB,GAAxB,EAA6B;AAC3B,WAAKma,UAAL,CAAgBrd,SAASmD,IAAzB,EAA+Boa,IAA/B;AACD;AACF,GAJD;AAKH,CAnBA","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({email, password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback(_.merge({pw: pw, mk: mk, pw_nonce: pw_nonce}, defaults));\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText()));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n if(this.user.uuid) {\n // signed out users have local autosave, dont need draft saving\n apiController.saveDraftToDisk(this.note);\n }\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n this.note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(apiController, extensionManager){\n return {\n restrict: 'E',\n scope: {\n user: \"=\",\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$on(\"sync:updated_token\", function(){\n ctrl.syncUpdated();\n })\n }\n }\n })\n .controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) {\n\n this.extensionManager = extensionManager;\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n this.showExtensionsMenu = false;\n }\n\n this.toggleExtensions = function() {\n this.showAccountMenu = false;\n this.showExtensionsMenu = !this.showExtensionsMenu;\n }\n\n this.toggleExtensionForm = function() {\n this.newExtensionData = {};\n this.showNewExtensionForm = !this.showNewExtensionForm;\n }\n\n this.submitNewExtensionForm = function() {\n if(this.newExtensionData.url) {\n extensionManager.addExtension(this.newExtensionData.url, function(response){\n if(!response) {\n alert(\"Unable to register this extension. Make sure the link is valid and try again.\");\n } else {\n this.newExtensionData.url = \"\";\n this.showNewExtensionForm = false;\n }\n }.bind(this))\n }\n }\n\n this.selectedAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, null, function(response){\n action.running = false;\n if(response && response.error) {\n action.error = true;\n alert(\"There was an error performing this action. Please try again.\");\n } else {\n action.error = false;\n apiController.sync(null);\n }\n })\n }\n\n this.deleteExtension = function(extension) {\n if(confirm(\"Are you sure you want to delete this extension?\")) {\n extensionManager.deleteExtension(extension);\n }\n }\n\n this.reloadExtensionsPressed = function() {\n if(confirm(\"For your security, reloading extensions will disable any currently enabled repeat actions.\")) {\n extensionManager.refreshExtensionsFromServer();\n }\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.user, this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(response && response.error) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.archiveEncryptionFormat = {encrypted: true};\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile(this.archiveEncryptionFormat.encrypted);\n link.click();\n }\n\n this.importFileSelected = function(files) {\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n apiController.importJSONData(e.target.result, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n // window.location.reload();\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n })\n }\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n this.user.uuid = user.uuid;\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n var onUserSet = function() {\n apiController.setUser($scope.defaultUser);\n $scope.allTag = new Tag({all: true});\n $scope.allTag.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n }\n\n apiController.getCurrentUser(function(user){\n if(user) {\n $scope.defaultUser = user;\n $rootScope.title = \"Notes — Standard Notes\";\n onUserSet();\n } else {\n $scope.defaultUser = new User(apiController.loadLocalItemsAndUser());\n onUserSet();\n }\n });\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n\n if($scope.selectedNote && $scope.selectedNote.dummy) {\n modelManager.removeItemLocally($scope.selectedNote);\n }\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addItem(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n tag.setDirty(true);\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.createRelationshipBetweenItems(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.setItemToBeDeleted(tag);\n // if no more notes, delete tag\n apiController.sync(function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addItem(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.createRelationshipBetweenItems($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n alert(\"There was an error saving your note. Please try again.\");\n callback(false);\n } else {\n note.hasChanges = false;\n if(callback) {\n callback(true);\n }\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.setItemToBeDeleted(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n modelManager.removeItemLocally(note);\n return;\n }\n\n apiController.sync(null);\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n $scope.defaultUser = apiController.loadLocalItemsAndUser();\n $scope.tags = $scope.defaultUser.tags;\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n user: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!this.user.uuid) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = modelManager.createItem({content_type: \"Note\", dummy: true, text: \"\"});\n this.newNote.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n user: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function (modelManager) {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = modelManager.createItem({content_type: \"Tag\"});\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.title.length == 0) {\n tag.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.title || tag.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, user, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername(user, $scope.formData.username, function(response){\n var username = response.username;\n user.username = username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n\n constructor(json_obj) {\n\n this.updateFromJSON(json_obj);\n\n this.observers = [];\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n get contentObject() {\n if(!this.content) {\n return {};\n }\n\n if(this.content !== null && typeof this.content === 'object') {\n // this is the case when mapping localStorage content, in which case the content is already parsed\n return this.content;\n }\n\n return JSON.parse(this.content);\n }\n\n updateFromJSON(json) {\n _.merge(this, json);\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(json.content) {\n this.mapContentToLocalProperties(this.contentObject);\n }\n }\n\n setDirty(dirty) {\n this.dirty = dirty;\n\n if(dirty) {\n this.notifyObserversOfChange();\n }\n }\n\n addObserver(observer, callback) {\n if(!_.find(this.observers, observer)) {\n this.observers.push({observer: observer, callback: callback});\n }\n }\n\n removeObserver(observer) {\n _.remove(this.observers, {observer: observer})\n }\n\n notifyObserversOfChange() {\n for(var observer of this.observers) {\n observer.callback(this);\n }\n }\n\n mapContentToLocalProperties(contentObj) {\n\n }\n\n createContentJSONFromProperties() {\n return this.structureParams();\n }\n\n referenceParams() {\n // must override\n }\n\n structureParams() {\n return {references: this.referenceParams()}\n }\n\n addItemAsRelationship(item) {\n // must override\n }\n\n removeItemAsRelationship(item) {\n // must override\n }\n\n removeAllRelationships() {\n // must override\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return null;\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Action {\n constructor(json) {\n _.merge(this, json);\n this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory\n this.error = false;\n if(this.lastExecuted) {\n // is string\n this.lastExecuted = new Date(this.lastExecuted);\n }\n }\n\n get permissionsString() {\n if(!this.permissions) {\n return \"\";\n }\n var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter\n permission += \": \";\n for(var contentType of this.content_types) {\n if(contentType == \"*\") {\n permission += \"All items\";\n } else {\n permission += contentType;\n }\n\n permission += \" \";\n }\n\n return permission;\n }\n\n get encryptionModeString() {\n if(this.verb != \"post\") {\n return null;\n }\n var encryptionMode = \"This action accepts data \";\n if(this.accepts_encrypted && this.accepts_decrypted) {\n encryptionMode += \"encrypted or decrypted.\";\n } else {\n if(this.accepts_encrypted) {\n encryptionMode += \"encrypted.\";\n } else {\n encryptionMode += \"decrypted.\";\n }\n }\n return encryptionMode;\n }\n\n}\n\nclass Extension extends Item {\n constructor(json) {\n super(json);\n _.merge(this, json);\n\n this.encrypted = true;\n this.content_type = \"Extension\";\n }\n\n actionsInGlobalContext() {\n return this.actions.filter(function(action){\n return action.context == \"global\";\n })\n }\n\n actionsWithContextForItem(item) {\n return this.actions.filter(function(action){\n return action.context == item.content_type || action.context == \"Item\";\n })\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.name = contentObject.name;\n this.url = contentObject.url;\n this.actions = contentObject.actions.map(function(action){\n return new Action(action);\n })\n }\n\n updateFromExternalResponseItem(externalResponseItem) {\n _.merge(this, externalResponseItem);\n this.actions = externalResponseItem.actions.map(function(action){\n return new Action(action);\n })\n }\n\n referenceParams() {\n return null;\n }\n\n structureParams() {\n var params = {\n name: this.name,\n url: this.url,\n actions: this.actions\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n this.text = contentObject.text;\n }\n\n referenceParams() {\n var references = _.map(this.tags, function(tag){\n return {uuid: tag.uuid, content_type: tag.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title,\n text: this.text\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, item)) {\n this.tags.push(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.tags.forEach(function(tag){\n _.pull(tag.notes, this);\n tag.setDirty(true);\n }.bind(this))\n this.tags = [];\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n safeText() {\n return this.text || \"\";\n }\n\n safeTitle() {\n return this.title || \"\";\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n }\n\n referenceParams() {\n var references = _.map(this.notes, function(note){\n return {uuid: note.uuid, content_type: note.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n if(!_.find(this.notes, item)) {\n this.notes.unshift(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.notes.forEach(function(note){\n _.pull(note.tags, this);\n note.setDirty(true);\n }.bind(this))\n\n this.notes = [];\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n referencesAffectedBySharingChange() {\n return this.notes;\n }\n}\n;class User {\n constructor(json_obj) {\n _.merge(this, json_obj);\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.setUser = function(user) {\n this.user = user;\n }\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.isUserSignedIn = function() {\n return this.user.email && this.retrieveMk();\n }\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n callback(user);\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, keys);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n this.changePassword = function(user, current_password, new_password) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n var data = {};\n data.current_password = currentKeys.pw;\n data.password = newKeys.pw;\n data.password_confirmation = newKeys.pw;\n\n var user = this.user;\n\n this._performPasswordChange(currentKeys, newKeys, function(response){\n if(response && !response.error) {\n // this.showNewPasswordForm = false;\n // reencrypt data with new mk\n this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n if(success) {\n this.setMk(newKeys.mk);\n alert(\"Your password has been changed and your data re-encrypted.\");\n } else {\n // rollback password\n this._performPasswordChange(newKeys, currentKeys, function(response){\n alert(\"There was an error changing your password. Your password has been rolled back.\");\n window.location.reload();\n })\n }\n }.bind(this));\n } else {\n // this.showNewPasswordForm = false;\n alert(\"There was an error changing your password. Please try again.\");\n }\n }.bind(this))\n }.bind(this));\n }.bind(this));\n }.bind(this));\n }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(user, username, callback) {\n var request = Restangular.one(\"users\", user.uuid);\n request.username = username;\n request.patch().then(function(response){\n callback(response.plain());\n })\n }\n\n /*\n Ensures that if encryption is disabled, all local items are uncrypted,\n and that if it's enabled, that all local items are encrypted\n */\n this.verifyEncryptionStatusOfAllItems = function(user, callback) {\n var allItems = user.filteredItems();\n var itemsNeedingUpdate = [];\n allItems.forEach(function(item){\n if(!item.isPublic()) {\n if(item.encryptionEnabled() && !item.isEncrypted()) {\n itemsNeedingUpdate.push(item);\n }\n } else {\n if(item.isEncrypted()) {\n itemsNeedingUpdate.push(item);\n }\n }\n }.bind(this))\n\n if(itemsNeedingUpdate.length > 0) {\n console.log(\"verifying encryption, items need updating\", itemsNeedingUpdate);\n this.saveBatchItems(user, itemsNeedingUpdate, callback)\n }\n }\n\n\n\n /*\n Items\n */\n\n this.syncWithOptions = function(callback, options = {}) {\n if(!this.user.uuid) {\n this.writeItemsToLocalStorage(function(responseItems){\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n }.bind(this))\n return;\n }\n\n var dirtyItems = modelManager.getDirtyItems();\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n // console.log(\"syncing items\", request.items);\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.syncToken = response.sync_token;\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n callback({error: \"Sync error\"});\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForExportFile = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForExtension = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n console.assert(!item.dummy, \"Item is dummy, should not have gotten here.\", item.dummy)\n\n var params = {uuid: item.uuid, content_type: item.content_type,\n presentation_name: item.presentation_name, deleted: item.deleted};\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.createContentJSONFromProperties() : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties()));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n this.shareItem = function(item, callback) {\n if(!this.user.uuid) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n user: function() {return this.user}.bind(this),\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(jsonString, callback) {\n var data = JSON.parse(jsonString);\n console.log(\"importing data\", data);\n this.decryptItems(data.items);\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.allItems.forEach(function(item){\n item.setDirty(true);\n })\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(encrypted) {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.allItemsMatchingTypes([\"Tag\", \"Note\"]), function(item){\n return this.paramsForExportFile(item, encrypted);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n this.mergeLocalDataRemotely = function(user, callback) {\n var request = Restangular.one(\"users\", user.uuid).one(\"merge\");\n var tags = user.tags;\n request.items = user.items;\n request.items.forEach(function(item){\n if(item.tag_id) {\n var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n item.tag_name = tag.title;\n }\n })\n request.post().then(function(response){\n callback();\n localStorage.removeItem('user');\n })\n }\n\n\n\n\n\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeItemsToLocalStorage = function(callback) {\n var items = _.map(modelManager.allItems, function(item){\n return this.paramsForItem(item, false, [\"created_at\", \"updated_at\"], false)\n }.bind(this));\n console.log(\"Writing items to local\", items);\n this.writeToLocalStorage('items', items);\n callback(items);\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItemsAndUser = function() {\n var user = {};\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n user.items = items;\n user.shouldMerge = true;\n return user;\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n var jsonObj = _.merge({content_type: \"Note\"}, JSON.parse(draftString));\n return modelManager.createItem(jsonObj);\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n var isString = typeof item.content === 'string' || item.content instanceof String;\n if(isString) {\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, masterKey);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = user.filteredItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;class ContextualExtensionsMenu {\n\n constructor() {\n this.restrict = \"E\";\n this.templateUrl = \"frontend/directives/contextual-menu.html\";\n this.scope = {\n item: \"=\"\n };\n }\n\n controller($scope, modelManager, extensionManager) {\n $scope.extensions = extensionManager.extensionsInContextOfItem($scope.item);\n\n $scope.executeAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, $scope.item, function(response){\n action.running = false;\n })\n }\n\n $scope.accessTypeForExtension = function(extension) {\n return extensionManager.extensionUsesEncryptedData(extension) ? \"encrypted\" : \"decrypted\";\n }\n\n }\n\n\n}\n\nangular.module('app.frontend').directive('contextualExtensionsMenu', () => new ContextualExtensionsMenu);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager, apiController) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.apiController = apiController;\n this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem(\"enabledRepeatActionUrls\")) || [];\n this.decryptedExtensions = JSON.parse(localStorage.getItem(\"decryptedExtensions\")) || [];\n\n modelManager.addItemSyncObserver(\"extensionManager\", \"Extension\", function(items){\n for (var ext of items) {\n\n ext.encrypted = this.extensionUsesEncryptedData(ext);\n\n for (var action of ext.actions) {\n if(this.enabledRepeatActionUrls.includes(action.url)) {\n this.enableRepeatAction(action, ext);\n }\n }\n }\n }.bind(this))\n }\n\n get extensions() {\n return this.modelManager.extensions;\n }\n\n extensionsInContextOfItem(item) {\n return this.extensions.filter(function(ext){\n return ext.actionsWithContextForItem(item).length > 0;\n })\n }\n\n actionWithURL(url) {\n for (var extension of this.extensions) {\n return _.find(extension.actions, {url: url})\n }\n }\n\n extensionUsesEncryptedData(extension) {\n return !this.decryptedExtensions.includes(extension.url);\n }\n\n changeExtensionEncryptionFormat(encrypted, extension) {\n if(encrypted) {\n _.pull(this.decryptedExtensions, extension.url);\n } else {\n this.decryptedExtensions.push(extension.url);\n }\n\n localStorage.setItem(\"decryptedExtensions\", JSON.stringify(this.decryptedExtensions))\n\n extension.encrypted = this.extensionUsesEncryptedData(extension);\n }\n\n addExtension(url, callback) {\n this.retrieveExtensionFromServer(url, callback);\n }\n\n deleteExtension(extension) {\n for(var action of extension.actions) {\n _.pull(this.decryptedExtensions, extension);\n if(action.repeat_mode) {\n if(this.isRepeatActionEnabled(action)) {\n this.disableRepeatAction(action);\n }\n }\n }\n\n this.modelManager.setItemToBeDeleted(extension);\n this.apiController.sync(null);\n }\n\n retrieveExtensionFromServer(url, callback) {\n this.Restangular.oneUrl(url, url).get().then(function(response){\n var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());\n if(callback) {\n callback(ext);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n callback(null);\n })\n }\n\n handleExtensionLoadExternalResponseItem(url, externalResponseItem) {\n var extension = _.find(this.extensions, {url: url});\n if(extension) {\n extension.updateFromExternalResponseItem(externalResponseItem);\n } else {\n extension = new Extension(externalResponseItem);\n extension.url = url;\n extension.setDirty(true);\n this.modelManager.addItem(extension);\n this.apiController.sync(null);\n }\n\n return extension;\n }\n\n refreshExtensionsFromServer() {\n for (var url of this.enabledRepeatActionUrls) {\n var action = this.actionWithURL(url);\n if(action) {\n this.disableRepeatAction(action);\n }\n }\n\n for(var ext of this.extensions) {\n this.retrieveExtensionFromServer(ext.url, function(extension){\n extension.setDirty(true);\n });\n }\n }\n\n executeAction(action, extension, item, callback) {\n\n if(this.extensionUsesEncryptedData(extension) && !this.apiController.isUserSignedIn()) {\n alert(\"To send data encrypted, you must have an encryption key, and must therefore be signed in.\");\n callback(null);\n return;\n }\n\n switch (action.verb) {\n case \"get\": {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n action.error = false;\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n .catch(function(response){\n action.error = true;\n })\n\n break;\n }\n\n case \"show\": {\n var win = window.open(action.url, '_blank');\n win.focus();\n callback();\n break;\n }\n\n case \"post\": {\n var params = {};\n\n if(action.all) {\n var items = this.modelManager.allItemsMatchingTypes(action.content_types);\n params.items = items.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n\n } else {\n params.item = this.outgoingParamsForItem(item, extension);\n }\n\n this.performPost(action, extension, params, function(response){\n callback(response);\n });\n\n break;\n }\n\n default: {\n\n }\n }\n\n action.lastExecuted = new Date();\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n _.pull(this.enabledRepeatActionUrls, action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n this.modelManager.removeItemChangeObserver(action.url);\n\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n if(!_.find(this.enabledRepeatActionUrls, action.url)) {\n this.enabledRepeatActionUrls.push(action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n }\n\n if(action.repeat_mode) {\n\n if(action.repeat_mode == \"watch\") {\n this.modelManager.addItemChangeObserver(action.url, action.content_types, function(changedItems){\n this.triggerWatchAction(action, extension, changedItems);\n }.bind(this))\n }\n\n if(action.repeat_mode == \"loop\") {\n // todo\n }\n\n }\n }\n\n queueAction(action, extension, delay, changedItems) {\n this.actionQueue = this.actionQueue || [];\n if(_.find(this.actionQueue, {url: action.url})) {\n return;\n }\n\n // console.log(\"Successfully queued\", action, this.actionQueue.length);\n this.actionQueue.push(action);\n\n setTimeout(function () {\n // console.log(\"Performing queued action\", action);\n this.triggerWatchAction(action, extension, changedItems);\n _.pull(this.actionQueue, action);\n }.bind(this), delay * 1000);\n }\n\n triggerWatchAction(action, extension, changedItems) {\n if(action.repeat_timeout > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeat_timeout) {\n var delay = action.repeat_timeout - diffInSeconds;\n this.queueAction(action, extension, delay, changedItems);\n return;\n }\n }\n\n action.lastExecuted = new Date();\n\n console.log(\"Performing action.\");\n\n if(action.verb == \"post\") {\n var params = {};\n params.items = changedItems.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n this.performPost(action, extension, params, null);\n } else {\n // todo\n }\n }\n\n outgoingParamsForItem(item, extension) {\n return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));\n }\n\n performPost(action, extension, params, callback) {\n var request = this.Restangular.oneUrl(action.url, action.url);\n _.merge(request, params);\n\n request.post().then(function(response){\n action.error = false;\n if(callback) {\n callback(response.plain());\n }\n })\n .catch(function(response){\n action.error = true;\n console.log(\"Action error response:\", response);\n if(callback) {\n callback({error: \"Request error\"});\n }\n })\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager {\n\n constructor() {\n this.notes = [];\n this.tags = [];\n this.itemSyncObservers = [];\n this.itemChangeObservers = [];\n this.items = [];\n this._extensions = [];\n }\n\n get allItems() {\n return this.items.filter(function(item){\n return !item.dummy;\n })\n }\n\n get extensions() {\n return this._extensions.filter(function(ext){\n return !ext.deleted;\n })\n }\n\n allItemsMatchingTypes(contentTypes) {\n return this.items.filter(function(item){\n return (contentTypes.includes(item.content_type) || contentTypes.includes(\"*\")) && !item.dummy;\n })\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null);\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.removeItemLocally(item)\n }\n continue;\n }\n\n _.omit(json_obj, omitFields);\n\n if(!item) {\n item = this.createItem(json_obj);\n } else {\n item.updateFromJSON(json_obj);\n }\n\n this.addItem(item);\n\n if(json_obj.content) {\n this.resolveReferencesForItem(item)\n }\n\n models.push(item)\n }\n\n this.notifySyncObserversOfModels(models);\n\n this.sortItems();\n return models;\n }\n\n notifySyncObserversOfModels(models) {\n for(var observer of this.itemSyncObservers) {\n var relevantItems = models.filter(function(item){return item.content_type == observer.type});\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n notifyItemChangeObserversOfModels(models) {\n for(var observer of this.itemChangeObservers) {\n var relevantItems = models.filter(function(item){\n return observer.content_types.includes(item.content_type) || observer.content_types.includes(\"*\");\n });\n\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n createItem(json_obj) {\n var item;\n if(json_obj.content_type == \"Note\") {\n item = new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n item = new Tag(json_obj);\n } else if(json_obj.content_type == \"Extension\") {\n item = new Extension(json_obj);\n } else {\n item = new Item(json_obj);\n }\n\n item.addObserver(this, function(changedItem){\n this.notifyItemChangeObserversOfModels([changedItem]);\n }.bind(this));\n\n return item;\n }\n\n addItems(items) {\n this.items = _.uniq(this.items.concat(items));\n\n items.forEach(function(item){\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, {uuid: item.uuid})) {\n this.tags.unshift(item);\n }\n } else if(item.content_type == \"Note\") {\n if(!_.find(this.notes, {uuid: item.uuid})) {\n this.notes.unshift(item);\n }\n } else if(item.content_type == \"Extension\") {\n if(!_.find(this._extensions, {uuid: item.uuid})) {\n this._extensions.unshift(item);\n }\n }\n }.bind(this))\n }\n\n addItem(item) {\n this.addItems([item])\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n resolveReferencesForItem(item) {\n var contentObject = item.contentObject;\n if(!contentObject.references) {\n return;\n }\n\n for(var reference of contentObject.references) {\n var referencedItem = this.findItem(reference.uuid);\n if(referencedItem) {\n item.addItemAsRelationship(referencedItem);\n referencedItem.addItemAsRelationship(item);\n } else {\n // console.log(\"Unable to find item:\", reference.uuid);\n }\n }\n }\n\n sortItems() {\n Item.sortItemsByDate(this.notes);\n\n this.tags.forEach(function(tag){\n Item.sortItemsByDate(tag.notes);\n })\n }\n\n addItemSyncObserver(id, type, callback) {\n this.itemSyncObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemSyncObserver(id) {\n _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));\n }\n\n addItemChangeObserver(id, content_types, callback) {\n this.itemChangeObservers.push({id: id, content_types: content_types, callback: callback});\n }\n\n removeItemChangeObserver(id) {\n _.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, {id: id}));\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n getDirtyItems() {\n return this.items.filter(function(item){return item.dirty == true && !item.dummy})\n }\n\n clearDirtyItems() {\n this.getDirtyItems().forEach(function(item){\n item.setDirty(false);\n })\n }\n\n setItemToBeDeleted(item) {\n item.deleted = true;\n if(!item.dummy) {\n item.setDirty(true);\n }\n item.removeAllRelationships();\n }\n\n removeItemLocally(item) {\n _.pull(this.items, item);\n\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n } else if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n } else if(item.content_type == \"Extension\") {\n _.pull(this._extensions, item);\n }\n }\n\n /*\n Relationships\n */\n\n createRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.addItemAsRelationship(itemTwo);\n itemTwo.addItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n\n removeRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.removeItemAsRelationship(itemTwo);\n itemTwo.removeItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file +{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","email","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","getCurrentUser","directive","$timeout","restrict","scope","save","remove","note","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","markdownRenderer","extensionManager","editorMode","safeText","dummy","focusTitle","hasChanges","hasAvailableExtensions","extensionsInContextOfItem","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","isUserSignedIn","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","setDirty","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","syncUpdated","$state","serverSideValidation","user","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","showExtensionsMenu","toggleExtensions","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","running","executeAction","deleteExtension","confirm","reloadExtensionsPressed","refreshExtensionsFromServer","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","archiveEncryptionFormat","downloadDataArchive","setAttribute","itemsDataFile","importFileSelected","files","file","reader","FileReader","onload","e","importJSONData","result","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","allTag","Tag","all","title","tags","notes","setInterval","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","selectedNote","removeItemLocally","tagsAddNew","addItem","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","createRelationshipBetweenItems","notesRemoveTag","validNotes","Note","filterDummyNotes","setItemToBeDeleted","notesSelectionMade","notesAddNew","didShowErrorAlert","headerLogout","clearLocalStorage","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","updateFromJSON","observers","generateUUID","json","created_at","updated_at","content","mapContentToLocalProperties","contentObject","dirty","notifyObserversOfChange","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","JSON","items","sort","b","Action","lastExecuted","permissions","permission","charAt","content_types","contentType","verb","encryptionMode","accepts_encrypted","accepts_decrypted","Extension","actions","context","map","externalResponseItem","pull","hasOnePublicTag","isPublic","filtered","unshift","provider","domainName","domain_comps","hostname","split","domain","$get","ngDialog","ApiController","syncToken","refresh","setItem","userId","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","generateInitialEncryptionKeysForUser","_performPasswordChange","current_keys","new_keys","patch","setSyncToken","syncWithOptions","options","writeAllItemsToLocalStorage","responseItems","clearDirtyItems","dirtyItems","getDirtyItems","createRequestParamsForItem","additionalFields","sync_token","handleItemsResponse","retrieved_items","omitFields","saved_items","undefined","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","paramsForExportFile","paramsForExtension","forExportFile","itemCopy","cloneDeep","assert","deleted","encryptSingleItem","retrieveMk","auth_hash","createContentJSONFromProperties","base64","stringify","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","needingUpdate","open","template","resolve","className","disableAnimation","jsonString","mapResponseItemsToLocalModels","allItems","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","removeItem","staticifyObject","object","writeToLocalStorage","value","toJson","sortItemsByDate","draftString","jsonObj","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","saveBatchItems","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","enabledRepeatActionUrls","decryptedExtensions","addItemSyncObserver","ext","enableRepeatAction","actionsWithContextForItem","retrieveExtensionFromServer","repeat_mode","isRepeatActionEnabled","disableRepeatAction","oneUrl","handleExtensionLoadExternalResponseItem","updateFromExternalResponseItem","actionWithURL","win","outgoingParamsForItem","performPost","removeItemChangeObserver","addItemChangeObserver","changedItems","triggerWatchAction","actionQueue","repeat_timeout","diffInSeconds","queueAction","service","$filter","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","itemSyncObservers","itemChangeObservers","_extensions","contentTypes","itemId","models","findItem","resolveReferencesForItem","notifySyncObserversOfModels","sortItems","relevantItems","addObserver","changedItem","notifyItemChangeObserversOfModels","uniq","addItems","reference","referencedItem","addItemAsRelationship","id","removeAllRelationships","itemOne","itemTwo","removeItemAsRelationship","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":"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","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({email, password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback(_.merge({pw: pw, mk: mk, pw_nonce: pw_nonce}, defaults));\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText()));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n } else {\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"(Offline) — All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n if(apiController.isUserSignedIn()) {\n // signed out users have local autosave, dont need draft saving\n apiController.saveDraftToDisk(this.note);\n }\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n this.note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(apiController, extensionManager){\n return {\n restrict: 'E',\n scope: {\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$on(\"sync:updated_token\", function(){\n ctrl.syncUpdated();\n })\n }\n }\n })\n .controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) {\n\n this.user = apiController.user;\n this.extensionManager = extensionManager;\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n this.showExtensionsMenu = false;\n }\n\n this.toggleExtensions = function() {\n this.showAccountMenu = false;\n this.showExtensionsMenu = !this.showExtensionsMenu;\n }\n\n this.toggleExtensionForm = function() {\n this.newExtensionData = {};\n this.showNewExtensionForm = !this.showNewExtensionForm;\n }\n\n this.submitNewExtensionForm = function() {\n if(this.newExtensionData.url) {\n extensionManager.addExtension(this.newExtensionData.url, function(response){\n if(!response) {\n alert(\"Unable to register this extension. Make sure the link is valid and try again.\");\n } else {\n this.newExtensionData.url = \"\";\n this.showNewExtensionForm = false;\n }\n }.bind(this))\n }\n }\n\n this.selectedAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, null, function(response){\n action.running = false;\n if(response && response.error) {\n action.error = true;\n alert(\"There was an error performing this action. Please try again.\");\n } else {\n action.error = false;\n apiController.sync(null);\n }\n })\n }\n\n this.deleteExtension = function(extension) {\n if(confirm(\"Are you sure you want to delete this extension?\")) {\n extensionManager.deleteExtension(extension);\n }\n }\n\n this.reloadExtensionsPressed = function() {\n if(confirm(\"For your security, reloading extensions will disable any currently enabled repeat actions.\")) {\n extensionManager.refreshExtensionsFromServer();\n }\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(response && response.error) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.archiveEncryptionFormat = {encrypted: true};\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile(this.archiveEncryptionFormat.encrypted);\n link.click();\n }\n\n this.importFileSelected = function(files) {\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n apiController.importJSONData(e.target.result, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n // window.location.reload();\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n })\n }\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n apiController.loadLocalItems();\n $scope.allTag = new Tag({all: true});\n $scope.allTag.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n\n if($scope.selectedNote && $scope.selectedNote.dummy) {\n modelManager.removeItemLocally($scope.selectedNote);\n }\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addItem(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n tag.setDirty(true);\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.createRelationshipBetweenItems(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.setItemToBeDeleted(tag);\n // if no more notes, delete tag\n apiController.sync(function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addItem(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.createRelationshipBetweenItems($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n if(!$scope.didShowErrorAlert) {\n $scope.didShowErrorAlert = true;\n alert(\"There was an error saving your note. Please try again.\");\n }\n callback(false);\n } else {\n note.hasChanges = false;\n if(callback) {\n callback(true);\n }\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.setItemToBeDeleted(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n modelManager.removeItemLocally(note);\n return;\n }\n\n apiController.sync(null);\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n apiController.clearLocalStorage();\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!apiController.isUserSignedIn()) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = modelManager.createItem({content_type: \"Note\", dummy: true, text: \"\"});\n this.newNote.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function (modelManager) {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = modelManager.createItem({content_type: \"Tag\"});\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.title.length == 0) {\n tag.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.title || tag.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername($scope.formData.username, function(response){\n var username = response.username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n\n constructor(json_obj) {\n\n this.updateFromJSON(json_obj);\n\n this.observers = [];\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n get contentObject() {\n if(!this.content) {\n return {};\n }\n\n if(this.content !== null && typeof this.content === 'object') {\n // this is the case when mapping localStorage content, in which case the content is already parsed\n return this.content;\n }\n\n return JSON.parse(this.content);\n }\n\n updateFromJSON(json) {\n _.merge(this, json);\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(json.content) {\n this.mapContentToLocalProperties(this.contentObject);\n }\n }\n\n setDirty(dirty) {\n this.dirty = dirty;\n\n if(dirty) {\n this.notifyObserversOfChange();\n }\n }\n\n addObserver(observer, callback) {\n if(!_.find(this.observers, observer)) {\n this.observers.push({observer: observer, callback: callback});\n }\n }\n\n removeObserver(observer) {\n _.remove(this.observers, {observer: observer})\n }\n\n notifyObserversOfChange() {\n for(var observer of this.observers) {\n observer.callback(this);\n }\n }\n\n mapContentToLocalProperties(contentObj) {\n\n }\n\n createContentJSONFromProperties() {\n return this.structureParams();\n }\n\n referenceParams() {\n // must override\n }\n\n structureParams() {\n return {references: this.referenceParams()}\n }\n\n addItemAsRelationship(item) {\n // must override\n }\n\n removeItemAsRelationship(item) {\n // must override\n }\n\n removeAllRelationships() {\n // must override\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return null;\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Action {\n constructor(json) {\n _.merge(this, json);\n this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory\n this.error = false;\n if(this.lastExecuted) {\n // is string\n this.lastExecuted = new Date(this.lastExecuted);\n }\n }\n\n get permissionsString() {\n if(!this.permissions) {\n return \"\";\n }\n var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter\n permission += \": \";\n for(var contentType of this.content_types) {\n if(contentType == \"*\") {\n permission += \"All items\";\n } else {\n permission += contentType;\n }\n\n permission += \" \";\n }\n\n return permission;\n }\n\n get encryptionModeString() {\n if(this.verb != \"post\") {\n return null;\n }\n var encryptionMode = \"This action accepts data \";\n if(this.accepts_encrypted && this.accepts_decrypted) {\n encryptionMode += \"encrypted or decrypted.\";\n } else {\n if(this.accepts_encrypted) {\n encryptionMode += \"encrypted.\";\n } else {\n encryptionMode += \"decrypted.\";\n }\n }\n return encryptionMode;\n }\n\n}\n\nclass Extension extends Item {\n constructor(json) {\n super(json);\n _.merge(this, json);\n\n this.encrypted = true;\n this.content_type = \"Extension\";\n }\n\n actionsInGlobalContext() {\n return this.actions.filter(function(action){\n return action.context == \"global\";\n })\n }\n\n actionsWithContextForItem(item) {\n return this.actions.filter(function(action){\n return action.context == item.content_type || action.context == \"Item\";\n })\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.name = contentObject.name;\n this.url = contentObject.url;\n this.actions = contentObject.actions.map(function(action){\n return new Action(action);\n })\n }\n\n updateFromExternalResponseItem(externalResponseItem) {\n _.merge(this, externalResponseItem);\n this.actions = externalResponseItem.actions.map(function(action){\n return new Action(action);\n })\n }\n\n referenceParams() {\n return null;\n }\n\n structureParams() {\n var params = {\n name: this.name,\n url: this.url,\n actions: this.actions\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n this.text = contentObject.text;\n }\n\n referenceParams() {\n var references = _.map(this.tags, function(tag){\n return {uuid: tag.uuid, content_type: tag.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title,\n text: this.text\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, item)) {\n this.tags.push(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.tags.forEach(function(tag){\n _.pull(tag.notes, this);\n tag.setDirty(true);\n }.bind(this))\n this.tags = [];\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n safeText() {\n return this.text || \"\";\n }\n\n safeTitle() {\n return this.title || \"\";\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n }\n\n referenceParams() {\n var references = _.map(this.notes, function(note){\n return {uuid: note.uuid, content_type: note.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n if(!_.find(this.notes, item)) {\n this.notes.unshift(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.notes.forEach(function(note){\n _.pull(note.tags, this);\n note.setDirty(true);\n }.bind(this))\n\n this.notes = [];\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n referencesAffectedBySharingChange() {\n return this.notes;\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.user = {};\n this.syncToken = localStorage.getItem(\"syncToken\");\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.isUserSignedIn = function() {\n return localStorage.getItem(\"jwt\");\n }\n\n this.userId = function() {\n return localStorage.getItem(\"uuid\");\n }\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n _.merge(this.user, user);\n callback();\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, keys);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n // this.changePassword = function(current_password, new_password) {\n // this.getAuthParamsForEmail(email, function(authParams){\n // if(!authParams) {\n // callback(null);\n // return;\n // }\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n // var data = {};\n // data.current_password = currentKeys.pw;\n // data.password = newKeys.pw;\n // data.password_confirmation = newKeys.pw;\n //\n // var user = this.user;\n //\n // this._performPasswordChange(currentKeys, newKeys, function(response){\n // if(response && !response.error) {\n // // this.showNewPasswordForm = false;\n // // reencrypt data with new mk\n // this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n // if(success) {\n // this.setMk(newKeys.mk);\n // alert(\"Your password has been changed and your data re-encrypted.\");\n // } else {\n // // rollback password\n // this._performPasswordChange(newKeys, currentKeys, function(response){\n // alert(\"There was an error changing your password. Your password has been rolled back.\");\n // window.location.reload();\n // })\n // }\n // }.bind(this));\n // } else {\n // // this.showNewPasswordForm = false;\n // alert(\"There was an error changing your password. Please try again.\");\n // }\n // }.bind(this))\n // }.bind(this));\n // }.bind(this));\n // }.bind(this));\n // }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(username, callback) {\n var request = Restangular.one(\"users\", this.userId());\n request.username = username;\n request.patch().then(function(response){\n this.user.username = response.username;\n callback(response.plain());\n }.bind(this))\n }\n\n\n /*\n Items\n */\n\n this.setSyncToken = function(syncToken) {\n this.syncToken = syncToken;\n localStorage.setItem(\"syncToken\", this.syncToken);\n }\n\n this.syncWithOptions = function(callback, options = {}) {\n this.writeAllItemsToLocalStorage(function(responseItems){\n if(!this.isUserSignedIn()) {\n // is not signed in\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n }\n }.bind(this))\n\n if(!this.isUserSignedIn()) {\n return;\n }\n\n var dirtyItems = modelManager.getDirtyItems();\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n // console.log(\"syncing items\", request.items);\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n this.writeAllItemsToLocalStorage();\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n if(callback) {\n callback({error: \"Sync error\"});\n }\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForExportFile = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForExtension = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n console.assert(!item.dummy, \"Item is dummy, should not have gotten here.\", item.dummy)\n\n var params = {uuid: item.uuid, content_type: item.content_type,\n presentation_name: item.presentation_name, deleted: item.deleted};\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.createContentJSONFromProperties() : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties()));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n this.shareItem = function(item, callback) {\n if(!this.isUserSignedIn()) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(jsonString, callback) {\n var data = JSON.parse(jsonString);\n console.log(\"importing data\", data);\n this.decryptItems(data.items);\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.allItems.forEach(function(item){\n item.setDirty(true);\n })\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(encrypted) {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.allItemsMatchingTypes([\"Tag\", \"Note\"]), function(item){\n return this.paramsForExportFile(item, encrypted);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n // this.mergeLocalDataRemotely = function(user, callback) {\n // var request = Restangular.one(\"users\", this.userId()).one(\"merge\");\n // var tags = user.tags;\n // request.items = user.items;\n // request.items.forEach(function(item){\n // if(item.tag_id) {\n // var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n // item.tag_name = tag.title;\n // }\n // })\n // request.post().then(function(response){\n // callback();\n // localStorage.removeItem('user');\n // })\n // }\n\n\n\n\n this.clearLocalStorage = function() {\n localStorage.removeItem(\"items\");\n localStorage.removeItem(\"mk\");\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"uuid\");\n localStorage.removeItem(\"syncToken\");\n }\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeAllItemsToLocalStorage = function(callback) {\n var items = _.map(modelManager.allItems, function(item){\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\"], false)\n }.bind(this));\n // console.log(\"Writing items to local\", items);\n this.writeToLocalStorage('items', items);\n if(callback) {\n callback(items);\n }\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItems = function() {\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n var jsonObj = _.merge({content_type: \"Note\"}, JSON.parse(draftString));\n return modelManager.createItem(jsonObj);\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n var isString = typeof item.content === 'string' || item.content instanceof String;\n if(isString) {\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, masterKey);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = modelManager.allItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;class ContextualExtensionsMenu {\n\n constructor() {\n this.restrict = \"E\";\n this.templateUrl = \"frontend/directives/contextual-menu.html\";\n this.scope = {\n item: \"=\"\n };\n }\n\n controller($scope, modelManager, extensionManager) {\n $scope.extensions = extensionManager.extensionsInContextOfItem($scope.item);\n\n $scope.executeAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, $scope.item, function(response){\n action.running = false;\n })\n }\n\n $scope.accessTypeForExtension = function(extension) {\n return extensionManager.extensionUsesEncryptedData(extension) ? \"encrypted\" : \"decrypted\";\n }\n\n }\n\n\n}\n\nangular.module('app.frontend').directive('contextualExtensionsMenu', () => new ContextualExtensionsMenu);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager, apiController) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.apiController = apiController;\n this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem(\"enabledRepeatActionUrls\")) || [];\n this.decryptedExtensions = JSON.parse(localStorage.getItem(\"decryptedExtensions\")) || [];\n\n modelManager.addItemSyncObserver(\"extensionManager\", \"Extension\", function(items){\n for (var ext of items) {\n\n ext.encrypted = this.extensionUsesEncryptedData(ext);\n\n for (var action of ext.actions) {\n if(this.enabledRepeatActionUrls.includes(action.url)) {\n this.enableRepeatAction(action, ext);\n }\n }\n }\n }.bind(this))\n }\n\n get extensions() {\n return this.modelManager.extensions;\n }\n\n extensionsInContextOfItem(item) {\n return this.extensions.filter(function(ext){\n return ext.actionsWithContextForItem(item).length > 0;\n })\n }\n\n actionWithURL(url) {\n for (var extension of this.extensions) {\n return _.find(extension.actions, {url: url})\n }\n }\n\n extensionUsesEncryptedData(extension) {\n return !this.decryptedExtensions.includes(extension.url);\n }\n\n changeExtensionEncryptionFormat(encrypted, extension) {\n if(encrypted) {\n _.pull(this.decryptedExtensions, extension.url);\n } else {\n this.decryptedExtensions.push(extension.url);\n }\n\n localStorage.setItem(\"decryptedExtensions\", JSON.stringify(this.decryptedExtensions))\n\n extension.encrypted = this.extensionUsesEncryptedData(extension);\n }\n\n addExtension(url, callback) {\n this.retrieveExtensionFromServer(url, callback);\n }\n\n deleteExtension(extension) {\n for(var action of extension.actions) {\n _.pull(this.decryptedExtensions, extension);\n if(action.repeat_mode) {\n if(this.isRepeatActionEnabled(action)) {\n this.disableRepeatAction(action);\n }\n }\n }\n\n this.modelManager.setItemToBeDeleted(extension);\n this.apiController.sync(null);\n }\n\n retrieveExtensionFromServer(url, callback) {\n this.Restangular.oneUrl(url, url).get().then(function(response){\n var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());\n if(callback) {\n callback(ext);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n callback(null);\n })\n }\n\n handleExtensionLoadExternalResponseItem(url, externalResponseItem) {\n var extension = _.find(this.extensions, {url: url});\n if(extension) {\n extension.updateFromExternalResponseItem(externalResponseItem);\n } else {\n extension = new Extension(externalResponseItem);\n extension.url = url;\n extension.setDirty(true);\n this.modelManager.addItem(extension);\n this.apiController.sync(null);\n }\n\n return extension;\n }\n\n refreshExtensionsFromServer() {\n for (var url of this.enabledRepeatActionUrls) {\n var action = this.actionWithURL(url);\n if(action) {\n this.disableRepeatAction(action);\n }\n }\n\n for(var ext of this.extensions) {\n this.retrieveExtensionFromServer(ext.url, function(extension){\n extension.setDirty(true);\n });\n }\n }\n\n executeAction(action, extension, item, callback) {\n\n if(this.extensionUsesEncryptedData(extension) && !this.apiController.isUserSignedIn()) {\n alert(\"To send data encrypted, you must have an encryption key, and must therefore be signed in.\");\n callback(null);\n return;\n }\n\n switch (action.verb) {\n case \"get\": {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n action.error = false;\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n .catch(function(response){\n action.error = true;\n })\n\n break;\n }\n\n case \"show\": {\n var win = window.open(action.url, '_blank');\n win.focus();\n callback();\n break;\n }\n\n case \"post\": {\n var params = {};\n\n if(action.all) {\n var items = this.modelManager.allItemsMatchingTypes(action.content_types);\n params.items = items.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n\n } else {\n params.item = this.outgoingParamsForItem(item, extension);\n }\n\n this.performPost(action, extension, params, function(response){\n callback(response);\n });\n\n break;\n }\n\n default: {\n\n }\n }\n\n action.lastExecuted = new Date();\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n _.pull(this.enabledRepeatActionUrls, action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n this.modelManager.removeItemChangeObserver(action.url);\n\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n if(!_.find(this.enabledRepeatActionUrls, action.url)) {\n this.enabledRepeatActionUrls.push(action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n }\n\n if(action.repeat_mode) {\n\n if(action.repeat_mode == \"watch\") {\n this.modelManager.addItemChangeObserver(action.url, action.content_types, function(changedItems){\n this.triggerWatchAction(action, extension, changedItems);\n }.bind(this))\n }\n\n if(action.repeat_mode == \"loop\") {\n // todo\n }\n\n }\n }\n\n queueAction(action, extension, delay, changedItems) {\n this.actionQueue = this.actionQueue || [];\n if(_.find(this.actionQueue, {url: action.url})) {\n return;\n }\n\n // console.log(\"Successfully queued\", action, this.actionQueue.length);\n this.actionQueue.push(action);\n\n setTimeout(function () {\n // console.log(\"Performing queued action\", action);\n this.triggerWatchAction(action, extension, changedItems);\n _.pull(this.actionQueue, action);\n }.bind(this), delay * 1000);\n }\n\n triggerWatchAction(action, extension, changedItems) {\n if(action.repeat_timeout > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeat_timeout) {\n var delay = action.repeat_timeout - diffInSeconds;\n this.queueAction(action, extension, delay, changedItems);\n return;\n }\n }\n\n action.lastExecuted = new Date();\n\n console.log(\"Performing action.\");\n\n if(action.verb == \"post\") {\n var params = {};\n params.items = changedItems.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n this.performPost(action, extension, params, null);\n } else {\n // todo\n }\n }\n\n outgoingParamsForItem(item, extension) {\n return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));\n }\n\n performPost(action, extension, params, callback) {\n var request = this.Restangular.oneUrl(action.url, action.url);\n _.merge(request, params);\n\n request.post().then(function(response){\n action.error = false;\n if(callback) {\n callback(response.plain());\n }\n })\n .catch(function(response){\n action.error = true;\n console.log(\"Action error response:\", response);\n if(callback) {\n callback({error: \"Request error\"});\n }\n })\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager {\n\n constructor() {\n this.notes = [];\n this.tags = [];\n this.itemSyncObservers = [];\n this.itemChangeObservers = [];\n this.items = [];\n this._extensions = [];\n }\n\n get allItems() {\n return this.items.filter(function(item){\n return !item.dummy;\n })\n }\n\n get extensions() {\n return this._extensions.filter(function(ext){\n return !ext.deleted;\n })\n }\n\n allItemsMatchingTypes(contentTypes) {\n return this.items.filter(function(item){\n return (contentTypes.includes(item.content_type) || contentTypes.includes(\"*\")) && !item.dummy;\n })\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null);\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.removeItemLocally(item)\n }\n continue;\n }\n\n _.omit(json_obj, omitFields);\n\n if(!item) {\n item = this.createItem(json_obj);\n } else {\n item.updateFromJSON(json_obj);\n }\n\n this.addItem(item);\n\n if(json_obj.content) {\n this.resolveReferencesForItem(item)\n }\n\n models.push(item)\n }\n\n this.notifySyncObserversOfModels(models);\n\n this.sortItems();\n return models;\n }\n\n notifySyncObserversOfModels(models) {\n for(var observer of this.itemSyncObservers) {\n var relevantItems = models.filter(function(item){return item.content_type == observer.type});\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n notifyItemChangeObserversOfModels(models) {\n for(var observer of this.itemChangeObservers) {\n var relevantItems = models.filter(function(item){\n return observer.content_types.includes(item.content_type) || observer.content_types.includes(\"*\");\n });\n\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n createItem(json_obj) {\n var item;\n if(json_obj.content_type == \"Note\") {\n item = new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n item = new Tag(json_obj);\n } else if(json_obj.content_type == \"Extension\") {\n item = new Extension(json_obj);\n } else {\n item = new Item(json_obj);\n }\n\n item.addObserver(this, function(changedItem){\n this.notifyItemChangeObserversOfModels([changedItem]);\n }.bind(this));\n\n return item;\n }\n\n addItems(items) {\n this.items = _.uniq(this.items.concat(items));\n\n items.forEach(function(item){\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, {uuid: item.uuid})) {\n this.tags.unshift(item);\n }\n } else if(item.content_type == \"Note\") {\n if(!_.find(this.notes, {uuid: item.uuid})) {\n this.notes.unshift(item);\n }\n } else if(item.content_type == \"Extension\") {\n if(!_.find(this._extensions, {uuid: item.uuid})) {\n this._extensions.unshift(item);\n }\n }\n }.bind(this))\n }\n\n addItem(item) {\n this.addItems([item])\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n resolveReferencesForItem(item) {\n var contentObject = item.contentObject;\n if(!contentObject.references) {\n return;\n }\n\n for(var reference of contentObject.references) {\n var referencedItem = this.findItem(reference.uuid);\n if(referencedItem) {\n item.addItemAsRelationship(referencedItem);\n referencedItem.addItemAsRelationship(item);\n } else {\n // console.log(\"Unable to find item:\", reference.uuid);\n }\n }\n }\n\n sortItems() {\n Item.sortItemsByDate(this.notes);\n\n this.tags.forEach(function(tag){\n Item.sortItemsByDate(tag.notes);\n })\n }\n\n addItemSyncObserver(id, type, callback) {\n this.itemSyncObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemSyncObserver(id) {\n _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));\n }\n\n addItemChangeObserver(id, content_types, callback) {\n this.itemChangeObservers.push({id: id, content_types: content_types, callback: callback});\n }\n\n removeItemChangeObserver(id) {\n _.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, {id: id}));\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n getDirtyItems() {\n return this.items.filter(function(item){return item.dirty == true && !item.dummy})\n }\n\n clearDirtyItems() {\n this.getDirtyItems().forEach(function(item){\n item.setDirty(false);\n })\n }\n\n setItemToBeDeleted(item) {\n item.deleted = true;\n if(!item.dummy) {\n item.setDirty(true);\n }\n item.removeAllRelationships();\n }\n\n removeItemLocally(item) {\n _.pull(this.items, item);\n\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n } else if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n } else if(item.content_type == \"Extension\") {\n _.pull(this._extensions, item);\n }\n }\n\n /*\n Relationships\n */\n\n createRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.addItemAsRelationship(itemTwo);\n itemTwo.addItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n\n removeRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.removeItemAsRelationship(itemTwo);\n itemTwo.removeItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file From ca3eff7f15ab5975a8fabbc0c1f45dfdfd77c160 Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Sun, 8 Jan 2017 14:15:33 -0600 Subject: [PATCH 2/5] import require password --- .../app/frontend/controllers/header.js | 34 +++++-- .../javascripts/app/services/apiController.js | 55 ++++++++--- .../app/services/extensionManager.js | 3 + .../app/services/helpers/crypto.js | 4 +- app/assets/stylesheets/app/_header.scss | 13 ++- .../templates/frontend/header.html.haml | 4 + vendor/assets/javascripts/transpiled.js | 94 +++++++++++++++---- vendor/assets/javascripts/transpiled.js.map | 2 +- 8 files changed, 166 insertions(+), 43 deletions(-) diff --git a/app/assets/javascripts/app/frontend/controllers/header.js b/app/assets/javascripts/app/frontend/controllers/header.js index 8ecd61a21..2860507e8 100644 --- a/app/assets/javascripts/app/frontend/controllers/header.js +++ b/app/assets/javascripts/app/frontend/controllers/header.js @@ -193,19 +193,39 @@ angular.module('app.frontend') link.click(); } + this.performImport = function(data, password) { + apiController.importJSONData(data, password, function(success, response){ + console.log("import response", success, response); + if(success) { + this.importData = null; + } else { + alert("There was an error importing your data. Please try again."); + } + }.bind(this)) + } + + this.submitImportPassword = function() { + this.performImport(this.importData.data, this.importData.password); + } + this.importFileSelected = function(files) { + this.importData = {}; + var file = files[0]; var reader = new FileReader(); reader.onload = function(e) { - apiController.importJSONData(e.target.result, function(success, response){ - console.log("import response", success, response); - if(success) { - // window.location.reload(); + var data = JSON.parse(e.target.result); + $timeout(function(){ + if(data.auth_params) { + // request password + this.importData.requestPassword = true; + this.importData.data = data; } else { - alert("There was an error importing your data. Please try again."); + this.performImport(data, null); } - }) - } + }.bind(this)) + }.bind(this) + reader.readAsText(file); } diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index 79e2e8e85..da4985db7 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -56,6 +56,10 @@ angular.module('app.frontend') Auth */ + this.getAuthParams = function() { + return JSON.parse(localStorage.getItem("auth_params")); + } + this.isUserSignedIn = function() { return localStorage.getItem("jwt"); } @@ -97,7 +101,7 @@ angular.module('app.frontend') callback(null); return; } - Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams), function(keys){ + Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, authParams), function(keys){ this.setMk(keys.mk); var request = Restangular.one("auth/sign_in"); var params = {password: keys.pw, email: email}; @@ -105,6 +109,7 @@ angular.module('app.frontend') request.post().then(function(response){ localStorage.setItem("jwt", response.token); localStorage.setItem("uuid", response.uuid); + localStorage.setItem("auth_params", JSON.stringify(authParams)); callback(response); }) .catch(function(response){ @@ -124,6 +129,7 @@ angular.module('app.frontend') request.post().then(function(response){ localStorage.setItem("jwt", response.token); localStorage.setItem("uuid", response.uuid); + localStorage.setItem("auth_params", JSON.stringify(authParams)); callback(response); }) .catch(function(response){ @@ -352,15 +358,34 @@ angular.module('app.frontend') Import */ - this.importJSONData = function(jsonString, callback) { - var data = JSON.parse(jsonString); - console.log("importing data", data); - this.decryptItems(data.items); - modelManager.mapResponseItemsToLocalModels(data.items); - modelManager.allItems.forEach(function(item){ - item.setDirty(true); - }) - this.syncWithOptions(callback, {additionalFields: ["created_at", "updated_at"]}); + this.importJSONData = function(data, password, callback) { + console.log("Importing data", data); + + var onDataReady = function() { + modelManager.mapResponseItemsToLocalModels(data.items); + modelManager.allItems.forEach(function(item){ + item.setDirty(true); + }) + this.syncWithOptions(callback, {additionalFields: ["created_at", "updated_at"]}); + }.bind(this) + + if(data.auth_params) { + Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, data.auth_params), function(keys){ + var mk = keys.mk; + try { + this.decryptItemsWithKey(data.items, mk); + onDataReady(); + } + catch (e) { + console.log("Error decrypting", e); + alert("There was an error decrypting your items. Make sure the password you entered is correct and try again."); + callback(false, null); + return; + } + }.bind(this)); + } else { + onDataReady(); + } } /* @@ -392,6 +417,10 @@ angular.module('app.frontend') items: items } + if(encrypted) { + data["auth_params"] = this.getAuthParams(); + } + return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */)); } @@ -530,6 +559,10 @@ angular.module('app.frontend') this.decryptItems = function(items) { var masterKey = this.retrieveMk(); + this.decryptItemsWithKey(items, masterKey); + } + + this.decryptItemsWithKey = function(items, key) { for (var item of items) { if(item.deleted == true) { continue; @@ -538,7 +571,7 @@ angular.module('app.frontend') if(isString) { if(item.content.substring(0, 3) == "001" && item.enc_item_key) { // is encrypted - this.decryptSingleItem(item, masterKey); + this.decryptSingleItem(item, key); } else { // is base64 encoded item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length)) diff --git a/app/assets/javascripts/app/services/extensionManager.js b/app/assets/javascripts/app/services/extensionManager.js index 00b0efc91..d44f2cd52 100644 --- a/app/assets/javascripts/app/services/extensionManager.js +++ b/app/assets/javascripts/app/services/extensionManager.js @@ -255,6 +255,9 @@ class ExtensionManager { performPost(action, extension, params, callback) { var request = this.Restangular.oneUrl(action.url, action.url); + if(this.extensionUsesEncryptedData(extension)) { + request.auth_params = this.apiController.getAuthParams(); + } _.merge(request, params); request.post().then(function(response){ diff --git a/app/assets/javascripts/app/services/helpers/crypto.js b/app/assets/javascripts/app/services/helpers/crypto.js index c2a9df978..3572450c1 100644 --- a/app/assets/javascripts/app/services/helpers/crypto.js +++ b/app/assets/javascripts/app/services/helpers/crypto.js @@ -80,7 +80,7 @@ class SNCrypto { return CryptoJS.HmacSHA256(messageData, keyData).toString(); } - computeEncryptionKeysForUser({email, password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) { + computeEncryptionKeysForUser({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) { this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt, pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){ var pw = keys[0]; @@ -99,7 +99,7 @@ class SNCrypto { var pw = keys[0]; var mk = keys[1]; - callback(_.merge({pw: pw, mk: mk, pw_nonce: pw_nonce}, defaults)); + callback({pw: pw, mk: mk, pw_nonce: pw_nonce}, defaults); }); } } diff --git a/app/assets/stylesheets/app/_header.scss b/app/assets/stylesheets/app/_header.scss index 0ddc6df0c..5e5e5208f 100644 --- a/app/assets/stylesheets/app/_header.scss +++ b/app/assets/stylesheets/app/_header.scss @@ -129,7 +129,7 @@ margin-bottom: 8px; a { font-size: 12px; - color: #00228f; + color: $blue-color; font-weight: bold; } } @@ -152,7 +152,7 @@ margin-bottom: 34px; a { - color: #00228f; + color: $blue-color; font-weight: bold; cursor: pointer; } @@ -186,6 +186,15 @@ } } + .import-password { + margin-top: 14px; + + > .field { + display: block; + margin: 5px 0px; + } + } + .encryption-confirmation { position: relative; .buttons { diff --git a/app/assets/templates/frontend/header.html.haml b/app/assets/templates/frontend/header.html.haml index ec183b998..7f88689f6 100644 --- a/app/assets/templates/frontend/header.html.haml +++ b/app/assets/templates/frontend/header.html.haml @@ -90,6 +90,10 @@ %a.disabled %span Import Data from Archive + .import-password{"ng-if" => "ctrl.importData.requestPassword"} + Enter the account password associated with the import file. + %input.field{"type" => "text", "ng-model" => "ctrl.importData.password"} + %button{"ng-click" => "ctrl.submitImportPassword()"} Decrypt & Import .item %a{"ng-click" => "ctrl.toggleExtensions()"} Extensions diff --git a/vendor/assets/javascripts/transpiled.js b/vendor/assets/javascripts/transpiled.js index 23d891163..85742afd2 100644 --- a/vendor/assets/javascripts/transpiled.js +++ b/vendor/assets/javascripts/transpiled.js @@ -118,7 +118,6 @@ var SNCrypto = function () { key: 'computeEncryptionKeysForUser', value: function computeEncryptionKeysForUser() { var _ref = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, - email = _ref.email, password = _ref.password, pw_salt = _ref.pw_salt, pw_func = _ref.pw_func, @@ -157,7 +156,7 @@ var SNCrypto = function () { var pw = keys[0]; var mk = keys[1]; - callback(_.merge({ pw: pw, mk: mk, pw_nonce: pw_nonce }, defaults)); + callback({ pw: pw, mk: mk, pw_nonce: pw_nonce }, defaults); }); } }]); @@ -903,19 +902,39 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); link.click(); }; + this.performImport = function (data, password) { + apiController.importJSONData(data, password, function (success, response) { + console.log("import response", success, response); + if (success) { + this.importData = null; + } else { + alert("There was an error importing your data. Please try again."); + } + }.bind(this)); + }; + + this.submitImportPassword = function () { + this.performImport(this.importData.data, this.importData.password); + }; + this.importFileSelected = function (files) { + this.importData = {}; + var file = files[0]; var reader = new FileReader(); reader.onload = function (e) { - apiController.importJSONData(e.target.result, function (success, response) { - console.log("import response", success, response); - if (success) { - // window.location.reload(); + var data = JSON.parse(e.target.result); + $timeout(function () { + if (data.auth_params) { + // request password + this.importData.requestPassword = true; + this.importData.data = data; } else { - alert("There was an error importing your data. Please try again."); + this.performImport(data, null); } - }); - }; + }.bind(this)); + }.bind(this); + reader.readAsText(file); }; @@ -1926,6 +1945,10 @@ var Tag = function (_Item3) { Auth */ + this.getAuthParams = function () { + return JSON.parse(localStorage.getItem("auth_params")); + }; + this.isUserSignedIn = function () { return localStorage.getItem("jwt"); }; @@ -1965,7 +1988,7 @@ var Tag = function (_Item3) { callback(null); return; } - Neeto.crypto.computeEncryptionKeysForUser(_.merge({ email: email, password: password }, authParams), function (keys) { + Neeto.crypto.computeEncryptionKeysForUser(_.merge({ password: password }, authParams), function (keys) { this.setMk(keys.mk); var request = Restangular.one("auth/sign_in"); var params = { password: keys.pw, email: email }; @@ -1973,6 +1996,7 @@ var Tag = function (_Item3) { request.post().then(function (response) { localStorage.setItem("jwt", response.token); localStorage.setItem("uuid", response.uuid); + localStorage.setItem("auth_params", JSON.stringify(authParams)); callback(response); }).catch(function (response) { callback(response.data); @@ -1991,6 +2015,7 @@ var Tag = function (_Item3) { request.post().then(function (response) { localStorage.setItem("jwt", response.token); localStorage.setItem("uuid", response.uuid); + localStorage.setItem("auth_params", JSON.stringify(authParams)); callback(response); }).catch(function (response) { callback(response.data); @@ -2216,15 +2241,33 @@ var Tag = function (_Item3) { Import */ - this.importJSONData = function (jsonString, callback) { - var data = JSON.parse(jsonString); - console.log("importing data", data); - this.decryptItems(data.items); - modelManager.mapResponseItemsToLocalModels(data.items); - modelManager.allItems.forEach(function (item) { - item.setDirty(true); - }); - this.syncWithOptions(callback, { additionalFields: ["created_at", "updated_at"] }); + this.importJSONData = function (data, password, callback) { + console.log("Importing data", data); + + var onDataReady = function () { + modelManager.mapResponseItemsToLocalModels(data.items); + modelManager.allItems.forEach(function (item) { + item.setDirty(true); + }); + this.syncWithOptions(callback, { additionalFields: ["created_at", "updated_at"] }); + }.bind(this); + + if (data.auth_params) { + Neeto.crypto.computeEncryptionKeysForUser(_.merge({ password: password }, data.auth_params), function (keys) { + var mk = keys.mk; + try { + this.decryptItemsWithKey(data.items, mk); + onDataReady(); + } catch (e) { + console.log("Error decrypting", e); + alert("There was an error decrypting your items. Make sure the password you entered is correct and try again."); + callback(false, null); + return; + } + }.bind(this)); + } else { + onDataReady(); + } }; /* @@ -2256,6 +2299,10 @@ var Tag = function (_Item3) { items: items }; + if (encrypted) { + data["auth_params"] = this.getAuthParams(); + } + return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */)); }; @@ -2389,6 +2436,10 @@ var Tag = function (_Item3) { this.decryptItems = function (items) { var masterKey = this.retrieveMk(); + this.decryptItemsWithKey(items, masterKey); + }; + + this.decryptItemsWithKey = function (items, key) { var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; @@ -2404,7 +2455,7 @@ var Tag = function (_Item3) { if (isString) { if (item.content.substring(0, 3) == "001" && item.enc_item_key) { // is encrypted - this.decryptSingleItem(item, masterKey); + this.decryptSingleItem(item, key); } else { // is base64 encoded item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length)); @@ -3218,6 +3269,9 @@ var ExtensionManager = function () { key: 'performPost', value: function performPost(action, extension, params, callback) { var request = this.Restangular.oneUrl(action.url, action.url); + if (this.extensionUsesEncryptedData(extension)) { + request.auth_params = this.apiController.getAuthParams(); + } _.merge(request, params); request.post().then(function (response) { diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index 971374668..d0723b915 100644 --- a/vendor/assets/javascripts/transpiled.js.map +++ b/vendor/assets/javascripts/transpiled.js.map @@ -1 +1 @@ -{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","email","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","getCurrentUser","directive","$timeout","restrict","scope","save","remove","note","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","markdownRenderer","extensionManager","editorMode","safeText","dummy","focusTitle","hasChanges","hasAvailableExtensions","extensionsInContextOfItem","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","isUserSignedIn","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","setDirty","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","syncUpdated","$state","serverSideValidation","user","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","showExtensionsMenu","toggleExtensions","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","running","executeAction","deleteExtension","confirm","reloadExtensionsPressed","refreshExtensionsFromServer","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","archiveEncryptionFormat","downloadDataArchive","setAttribute","itemsDataFile","importFileSelected","files","file","reader","FileReader","onload","e","importJSONData","result","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","allTag","Tag","all","title","tags","notes","setInterval","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","selectedNote","removeItemLocally","tagsAddNew","addItem","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","createRelationshipBetweenItems","notesRemoveTag","validNotes","Note","filterDummyNotes","setItemToBeDeleted","notesSelectionMade","notesAddNew","didShowErrorAlert","headerLogout","clearLocalStorage","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","updateFromJSON","observers","generateUUID","json","created_at","updated_at","content","mapContentToLocalProperties","contentObject","dirty","notifyObserversOfChange","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","JSON","items","sort","b","Action","lastExecuted","permissions","permission","charAt","content_types","contentType","verb","encryptionMode","accepts_encrypted","accepts_decrypted","Extension","actions","context","map","externalResponseItem","pull","hasOnePublicTag","isPublic","filtered","unshift","provider","domainName","domain_comps","hostname","split","domain","$get","ngDialog","ApiController","syncToken","refresh","setItem","userId","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","generateInitialEncryptionKeysForUser","_performPasswordChange","current_keys","new_keys","patch","setSyncToken","syncWithOptions","options","writeAllItemsToLocalStorage","responseItems","clearDirtyItems","dirtyItems","getDirtyItems","createRequestParamsForItem","additionalFields","sync_token","handleItemsResponse","retrieved_items","omitFields","saved_items","undefined","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","paramsForExportFile","paramsForExtension","forExportFile","itemCopy","cloneDeep","assert","deleted","encryptSingleItem","retrieveMk","auth_hash","createContentJSONFromProperties","base64","stringify","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","needingUpdate","open","template","resolve","className","disableAnimation","jsonString","mapResponseItemsToLocalModels","allItems","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","removeItem","staticifyObject","object","writeToLocalStorage","value","toJson","sortItemsByDate","draftString","jsonObj","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","saveBatchItems","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","enabledRepeatActionUrls","decryptedExtensions","addItemSyncObserver","ext","enableRepeatAction","actionsWithContextForItem","retrieveExtensionFromServer","repeat_mode","isRepeatActionEnabled","disableRepeatAction","oneUrl","handleExtensionLoadExternalResponseItem","updateFromExternalResponseItem","actionWithURL","win","outgoingParamsForItem","performPost","removeItemChangeObserver","addItemChangeObserver","changedItems","triggerWatchAction","actionQueue","repeat_timeout","diffInSeconds","queueAction","service","$filter","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","itemSyncObservers","itemChangeObservers","_extensions","contentTypes","itemId","models","findItem","resolveReferencesForItem","notifySyncObserversOfModels","sortItems","relevantItems","addObserver","changedItem","notifyItemChangeObserversOfModels","uniq","addItems","reference","referencedItem","addItemAsRelationship","id","removeAllRelationships","itemOne","itemTwo","removeItemAsRelationship","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":";;;;;;;;;;;;;;;;;;IAAMA,Q;;;;;;;wCAEgB;AAClB,aAAOC,SAASC,GAAT,CAAaC,SAAb,CAAuBC,MAAvB,CAA8B,MAAI,CAAlC,EAAqCC,QAArC,EAAP;AACD;;;mCAEc;AACb,UAAIC,SAASC,OAAOD,MAAP,IAAiBC,OAAOC,QAArC;AACA,UAAGF,MAAH,EAAW;AACT,YAAIG,MAAM,IAAIC,WAAJ,CAAgB,CAAhB,CAAV;AACAJ,eAAOK,eAAP,CAAuBF,GAAvB;AACA,YAAIG,MAAM,CAAC,CAAX;AACA,eAAO,uCAAuCC,OAAvC,CAA+C,OAA/C,EAAwD,UAASC,CAAT,EAAY;AACvEF;AACA,cAAIG,IAAKN,IAAIG,OAAK,CAAT,KAAiBA,MAAI,CAAL,GAAQ,CAAzB,GAA6B,EAArC;AACA,cAAII,IAAIF,KAAK,GAAL,GAAWC,CAAX,GAAgBA,IAAE,GAAF,GAAM,GAA9B;AACA,iBAAOC,EAAEX,QAAF,CAAW,EAAX,CAAP;AACH,SALM,CAAP;AAMD,OAVD,MAUO;AACL,YAAIY,IAAI,IAAIC,IAAJ,GAAWC,OAAX,EAAR;AACA,YAAGZ,OAAOa,WAAP,IAAsB,OAAOb,OAAOa,WAAP,CAAmBC,GAA1B,KAAkC,UAA3D,EAAsE;AACpEJ,eAAKG,YAAYC,GAAZ,EAAL,CADoE,CAC5C;AACzB;AACD,YAAIC,OAAO,uCAAuCT,OAAvC,CAA+C,OAA/C,EAAwD,UAASC,CAAT,EAAY;AAC7E,cAAIC,IAAI,CAACE,IAAIM,KAAKnB,MAAL,KAAc,EAAnB,IAAuB,EAAvB,GAA4B,CAApC;AACAa,cAAIM,KAAKC,KAAL,CAAWP,IAAE,EAAb,CAAJ;AACA,iBAAO,CAACH,KAAG,GAAH,GAASC,CAAT,GAAcA,IAAE,GAAF,GAAM,GAArB,EAA2BV,QAA3B,CAAoC,EAApC,CAAP;AACD,SAJU,CAAX;AAKA,eAAOiB,IAAP;AACD;AACF;;;gCAEWG,iB,EAAmBC,G,EAAK;AAClC,UAAIC,UAAU1B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuBJ,GAAvB,CAAd;AACA,UAAIK,SAAU9B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuB,EAAvB,CAAd;AACA,UAAIE,YAAY/B,SAASgC,GAAT,CAAaC,OAAb,CAAqBT,iBAArB,EAAwCE,OAAxC,EAAiD,EAAEQ,IAAIJ,MAAN,EAAeK,MAAMnC,SAASmC,IAAT,CAAcC,GAAnC,EAAwCC,SAASrC,SAASsC,GAAT,CAAaC,KAA9D,EAAjD,CAAhB;AACA,aAAOR,UAAU3B,QAAV,CAAmBJ,SAAS2B,GAAT,CAAaa,IAAhC,CAAP;AACD;;;gCAEWC,I,EAAMhB,G,EAAK;AACrB,UAAIC,UAAU1B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuBJ,GAAvB,CAAd;AACA,UAAIK,SAAU9B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuB,EAAvB,CAAd;AACA,UAAIa,YAAY1C,SAASgC,GAAT,CAAaW,OAAb,CAAqBF,IAArB,EAA2Bf,OAA3B,EAAoC,EAAEQ,IAAIJ,MAAN,EAAeK,MAAMnC,SAASmC,IAAT,CAAcC,GAAnC,EAAwCC,SAASrC,SAASsC,GAAT,CAAaC,KAA9D,EAApC,CAAhB;AACA,aAAOG,UAAUtC,QAAV,EAAP;AACD;;;kDAE6B;AAC5B,UAAIwC,OAAOC,MAAMxC,MAAN,CAAayC,iBAAb,EAAX;AACA,UAAIC,aAAaF,MAAMxC,MAAN,CAAayC,iBAAb,EAAjB;AACA,aAAO9C,SAASgD,MAAT,CAAgBD,UAAhB,EAA4BH,IAA5B,EAAkC,EAAEK,SAAS,MAAI,EAAf,EAAlC,EAAuD7C,QAAvD,EAAP;AACD;;;mCAEcqB,G,EAAK;AAClB,aAAOA,IAAIyB,SAAJ,CAAc,CAAd,EAAiBzB,IAAI0B,MAAJ,GAAW,CAA5B,CAAP;AACD;;;oCAEe1B,G,EAAK;AACnB,aAAOA,IAAIyB,SAAJ,CAAczB,IAAI0B,MAAJ,GAAW,CAAzB,EAA4B1B,IAAI0B,MAAhC,CAAP;AACD;;;2BAEMV,I,EAAM;AACX,aAAOzC,SAAS2B,GAAT,CAAaa,IAAb,CAAkBX,KAAlB,CAAwBY,IAAxB,EAA8BrC,QAA9B,CAAuCJ,SAAS2B,GAAT,CAAayB,MAApD,CAAP;AACD;;;iCAEYC,Y,EAAc;AACzB,aAAOrD,SAAS2B,GAAT,CAAayB,MAAb,CAAoBvB,KAApB,CAA0BwB,YAA1B,EAAwCjD,QAAxC,CAAiDJ,SAAS2B,GAAT,CAAaa,IAA9D,CAAP;AACD;;;2BAEMC,I,EAAM;AACX,aAAOzC,SAASsD,MAAT,CAAgBb,IAAhB,EAAsBrC,QAAtB,EAAP;AACD;;;yBAEIqC,I,EAAM;AACT,aAAOzC,SAASuD,IAAT,CAAcd,IAAd,EAAoBrC,QAApB,EAAP;AACD;;;4BAEOoD,O,EAAS/B,G,EAAK;AACpB,UAAIC,UAAU1B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuBJ,GAAvB,CAAd;AACA,UAAIgC,cAAczD,SAAS2B,GAAT,CAAaa,IAAb,CAAkBX,KAAlB,CAAwB2B,OAAxB,CAAlB;AACA,aAAOxD,SAAS0D,UAAT,CAAoBD,WAApB,EAAiC/B,OAAjC,EAA0CtB,QAA1C,EAAP;AACD;;;mDAE8G;AAAA,qFAAd,EAAc;AAAA,UAAjFuD,KAAiF,QAAjFA,KAAiF;AAAA,UAA1EC,QAA0E,QAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,QAAhEA,OAAgE;AAAA,UAAvDC,OAAuD,QAAvDA,OAAuD;AAAA,UAA9CC,MAA8C,QAA9CA,MAA8C;AAAA,UAAtCC,OAAsC,QAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,QAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AAC5G,WAAKC,wBAAL,CAA8B,EAACP,UAAUA,QAAX,EAAqBC,SAASA,OAA9B;AAC5BC,iBAASA,OADmB,EACVC,QAAQA,MADE,EACMC,SAASA,OADf,EACwBC,aAAaA,WADrC,EAA9B,EACiF,UAASG,IAAT,EAAc;AAC3F,YAAIC,KAAKD,KAAK,CAAL,CAAT;AACA,YAAIE,KAAKF,KAAK,CAAL,CAAT;;AAEAF,iBAAS,EAACG,IAAIA,EAAL,EAASC,IAAIA,EAAb,EAAT;AACD,OANH;AAOD;;;2DAEsE;AAAA,sFAAd,EAAc;AAAA,UAAjCX,KAAiC,SAAjCA,KAAiC;AAAA,UAA1BC,QAA0B,SAA1BA,QAA0B;;AAAA,UAAVM,QAAU;;AACrE,UAAIK,WAAW,KAAKC,+BAAL,EAAf;AADqE,UAEhEV,OAFgE,GAEvBS,QAFuB,CAEhET,OAFgE;AAAA,UAEvDC,MAFuD,GAEvBQ,QAFuB,CAEvDR,MAFuD;AAAA,UAE/CE,WAF+C,GAEvBM,QAFuB,CAE/CN,WAF+C;AAAA,UAElCD,OAFkC,GAEvBO,QAFuB,CAElCP,OAFkC;;AAGrE,UAAIS,WAAW,KAAK3B,iBAAL,EAAf;AACA,UAAIe,UAAU,KAAKa,IAAL,CAAUf,QAAQ,IAAR,GAAec,QAAzB,CAAd;AACA,WAAKN,wBAAL,CAA8BQ,EAAEC,KAAF,CAAQ,EAACjB,OAAOA,KAAR,EAAeC,UAAUA,QAAzB,EAAmCC,SAASA,OAA5C,EAAR,EAA8DU,QAA9D,CAA9B,EAAuG,UAASH,IAAT,EAAc;AACnH,YAAIC,KAAKD,KAAK,CAAL,CAAT;AACA,YAAIE,KAAKF,KAAK,CAAL,CAAT;;AAEAF,iBAASS,EAAEC,KAAF,CAAQ,EAACP,IAAIA,EAAL,EAASC,IAAIA,EAAb,EAAiBG,UAAUA,QAA3B,EAAR,EAA8CF,QAA9C,CAAT;AACD,OALD;AAMD;;;;;;QAGKxE,Q,GAAAA,Q;;IACF8E,U;;;;;;;;;;;;;AAEJ;+CACoG;AAAA,sFAAd,EAAc;AAAA,UAA1EjB,QAA0E,SAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDC,OAAuD,SAAvDA,OAAuD;AAAA,UAA9CC,MAA8C,SAA9CA,MAA8C;AAAA,UAAtCC,OAAsC,SAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AAClG,UAAIY,aAAa;AACf,kBAAW9E,SAAS+E,IAAT,CAAczB,MADV;AAEf,kBAAWtD,SAAS+E,IAAT,CAAcC;AAFV,OAAjB;AAIA,UAAIC,YAAY;AACd,kBAAWjF,SAASgD;AADN,OAAhB;;AAIA,UAAIkC,MAAMJ,WAAWf,MAAX,CAAV;AACA,UAAIoB,MAAMF,UAAUnB,OAAV,CAAV;AACA,UAAIsB,SAASD,IAAIvB,QAAJ,EAAcC,OAAd,EAAuB,EAAEZ,SAASgB,cAAY,EAAvB,EAA2BoB,QAAQH,GAAnC,EAAwCI,YAAYtB,OAApD,EAAvB,EAAsF5D,QAAtF,EAAb;;AAEA,UAAImF,eAAeH,OAAOjC,MAA1B;AACA,UAAIqC,YAAYJ,OAAOK,KAAP,CAAa,CAAb,EAAgBF,eAAa,CAA7B,CAAhB;AACA,UAAIG,aAAaN,OAAOK,KAAP,CAAaF,eAAa,CAA1B,EAA6BA,YAA7B,CAAjB;AACArB,eAAS,CAACsB,SAAD,EAAYE,UAAZ,CAAT;AACD;;;sDAEiC;AAChC,aAAO,EAAC5B,SAAS,QAAV,EAAoBC,QAAQ,QAA5B,EAAsCE,aAAa,GAAnD,EAAwDD,SAAS,IAAjE,EAAP;AACD;;;;EAxBsBjE,Q;;QA4BjB8E,U,GAAAA,U;AACR,IAAIc,eAAerF,OAAOD,MAAP,CAAcuF,MAAjC;;IAEKC,W;;;;;;;;;;;;;AAEJ;;;sDAGkC;AAChC,aAAO,EAAC/B,SAAS,QAAV,EAAoBC,QAAQ,QAA5B,EAAsCE,aAAa,GAAnD,EAAwDD,SAAS,IAAjE,EAAP;AACD;;AAED;;;;+CACoG;AAAA,sFAAd,EAAc;AAAA,UAA1EJ,QAA0E,SAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDC,OAAuD,SAAvDA,OAAuD;AAAA,UAA9CC,MAA8C,SAA9CA,MAA8C;AAAA,UAAtCC,OAAsC,SAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AACnG,WAAK4B,eAAL,CAAqB,EAAClC,UAAUA,QAAX,EAAqBE,SAASA,OAA9B,EAAuCC,QAAQA,MAA/C,EAAuDF,SAASA,OAAhE,EAAyEG,SAASA,OAAlF,EAA2FC,aAAaA,WAAxG,EAArB,EAA2I,UAASmB,MAAT,EAAgB;AACzJ,YAAIG,eAAeH,OAAOjC,MAA1B;AACA,YAAIqC,YAAYJ,OAAOK,KAAP,CAAa,CAAb,EAAgBF,eAAa,CAA7B,CAAhB;AACA,YAAIG,aAAaN,OAAOK,KAAP,CAAaF,eAAa,CAA1B,EAA6BA,YAA7B,CAAjB;AACArB,iBAAS,CAACsB,SAAD,EAAYE,UAAZ,CAAT;AACD,OALD;AAMA;;AAED;;;;;;sCAI2F;AAAA,sFAAd,EAAc;AAAA,UAA1E9B,QAA0E,SAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDG,OAAuD,SAAvDA,OAAuD;AAAA,UAA9CF,OAA8C,SAA9CA,OAA8C;AAAA,UAArCC,MAAqC,SAArCA,MAAqC;AAAA,UAA7BE,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;;AAE1F,WAAK6B,kBAAL,CAAwBnC,QAAxB,EAAkCE,OAAlC,EAA2C,UAASrC,GAAT,EAAa;;AAEtD,YAAG,CAACA,GAAJ,EAAS;AACPuE,kBAAQC,GAAR,CAAY,iCAAZ;AACA/B,mBAAS,IAAT;AACA;AACD;;AAED,aAAKgC,mBAAL,CAAyB,EAACzE,KAAKA,GAAN,EAAWqC,SAASA,OAApB,EAA6BC,QAAQA,MAArC,EAA6CF,SAASA,OAAtD,EAA+DG,SAASA,OAAxE,EAAiFC,aAAaA,WAA9F,EAAzB,EAAqI,UAASxC,GAAT,EAAa;AAChJ,cAAG,CAACA,GAAJ,EAAS;AACPyC,qBAAS,IAAT;AACA;AACD;;AAEDA,mBAASzC,GAAT;AAED,SARoI,CAQnI0E,IARmI,CAQ9H,IAR8H,CAArI;AASD,OAjB0C,CAiBzCA,IAjByC,CAiBpC,IAjBoC,CAA3C;AAkBA;;;uCAEkBC,K,EAAOtC,O,EAASI,Q,EAAU;AAC1CyB,mBAAaU,SAAb,CACC,KADD,EAEC,KAAKC,mBAAL,CAAyBF,KAAzB,CAFD,EAGC,EAACG,MAAMzC,QAAQ0C,WAAR,EAAP,EAHD,EAIC,KAJD,EAKC,CAAC,YAAD,CALD,EAOAC,IAPA,CAOK,UAAShF,GAAT,EAAa;AACjByC,iBAASzC,GAAT;AACD,OATA,EAUAiF,KAVA,CAUM,UAASC,GAAT,EAAa;AAClBX,gBAAQY,KAAR,CAAcD,GAAd;AACAzC,iBAAS,IAAT;AACD,OAbA;AAcF;;;0CAEyF;AAAA,sFAAd,EAAc;AAAA,UAArEzC,GAAqE,SAArEA,GAAqE;AAAA,UAAhEqC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDC,MAAuD,SAAvDA,MAAuD;AAAA,UAA/CF,OAA+C,SAA/CA,OAA+C;AAAA,UAAtCG,OAAsC,SAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AACvF,UAAIY,aAAa;AACf,kBAAW,SADI;AAEf,kBAAW;AAFI,OAAjB;AAIA,UAAII,MAAMJ,WAAWf,MAAX,CAAV;AACA4B,mBAAakB,UAAb,CACC;AACE,gBAAQ/C,QAAQ0C,WAAR,EADV;AAEE5D,cAAM,KAAK0D,mBAAL,CAAyBzC,OAAzB,CAFR;AAGEyB,oBAAYtB,OAHd;AAIE8C,cAAM,EAACP,MAAMrB,GAAP;AAJR,OADD,EAOCzD,GAPD,EAQCwC,WARD,EAUAwC,IAVA,CAUK,UAASM,IAAT,EAAc;AAClB,YAAItF,MAAM,KAAKuF,sBAAL,CAA4B,IAAIC,UAAJ,CAAeF,IAAf,CAA5B,CAAV;AACA7C,iBAASzC,GAAT;AACD,OAHK,CAGJ0E,IAHI,CAGC,IAHD,CAVL,EAcAO,KAdA,CAcM,UAASC,GAAT,EAAa;AAClBX,gBAAQY,KAAR,CAAcD,GAAd;AACAzC,iBAAS,IAAT;AACD,OAjBA;AAkBF;;;wCAEmBgD,M,EAAQ;AACzB,UAAIC,UAAU,IAAIC,WAAJ,CAAgB,OAAhB,CAAd;AACA,aAAOD,QAAQE,MAAR,CAAeH,MAAf,CAAP;AACD;;;2CAEqBI,W,EAAa;AAChC,UAAIC,YAAY,IAAIN,UAAJ,CAAeK,WAAf,CAAhB;AACA,UAAIE,YAAY,EAAhB;AACA,UAAIC,WAAJ;;AAEA,WAAK,IAAIC,IAAE,CAAX,EAAcA,IAAEH,UAAUI,UAA1B,EAAsCD,GAAtC,EAA2C;AACvCD,sBAAcF,UAAUG,CAAV,EAAatH,QAAb,CAAsB,EAAtB,CAAd;AACA,YAAIqH,YAAYtE,MAAZ,GAAqB,CAAzB,EAA4B;AACxBsE,wBAAc,MAAMA,WAApB;AACH;AACDD,qBAAaC,WAAb;AACH;AACD,aAAOD,SAAP;AACH;;;;EA1GuBzH,Q;;QA6GjB8F,W,GAAAA,W;AACR;;AAED,IAAIhD,QAAQA,SAAS,EAArB;;AAEA,IAAGvC,OAAOD,MAAP,CAAcuF,MAAjB,EAAyB;AACvB/C,QAAMxC,MAAN,GAAe,IAAIwF,WAAJ,EAAf;AACD,CAFD,MAEO;AACLhD,QAAMxC,MAAN,GAAe,IAAIwE,UAAJ,EAAf;AACD;;AAED+C,QAAQC,MAAR,CAAe,cAAf,EAA+B,CAC7B,WAD6B,EAE7B,aAF6B,EAG7B,UAH6B,CAA/B,EAMCC,MAND,CAMQ,UAAUC,mBAAV,EAA+BC,qBAA/B,EAAsD;AAC5DD,sBAAoBE,iBAApB,CAAsC,EAAC,gBAAgB,kBAAjB,EAAtC;;AAEA,MAAIC,MAAMF,sBAAsBG,gBAAtB,EAAV;AACAJ,sBAAoBK,UAApB,CAA+BF,MAAM,MAArC;;AAEAH,sBAAoBM,yBAApB,CAA8C,UAASC,OAAT,EAAkBC,SAAlB,EAA6BC,KAA7B,EAAoCN,GAApC,EAAyCO,OAAzC,EAAkDC,MAAlD,EAA0DC,UAA1D,EAAsE;AAClH,QAAIC,QAAQC,aAAaC,OAAb,CAAqB,KAArB,CAAZ;AACA,QAAGF,KAAH,EAAU;AACRH,gBAAU9D,EAAEoE,MAAF,CAASN,OAAT,EAAkB,EAACO,eAAe,YAAYH,aAAaC,OAAb,CAAqB,KAArB,CAA5B,EAAlB,CAAV;AACD;;AAED,WAAO;AACLR,eAASA,OADJ;AAELI,cAAQA,MAFH;AAGLD,eAASA,OAHJ;AAILE,kBAAYA;AAJP,KAAP;AAMD,GAZD;AAaD,CAzBD,EA0BCb,MA1BD,CA0BQ,CAAC,YAAD,EAAe,UAAUmB,UAAV,EAAsB;AACzC;AACH,CAFO,CA1BR;AA6BA,CAACrB,QAAQC,MAAR,CAAe,cAAf,EACEC,MADF,CACS,UAAUoB,cAAV,EAA0BC,kBAA1B,EAA8CC,iBAA9C,EAAiE;;AAEvEF,iBACGG,KADH,CACS,MADT,EACiB;AACbC,cAAU;AADG,GADjB,EAKGD,KALH,CAKS,MALT,EAKiB;AACbnB,SAAK,GADQ;AAEbqB,YAAQ,MAFK;AAGbC,WAAO;AACL,kBAAa;AACXC,qBAAa,oBADF;AAEXC,oBAAY;AAFD;AADR;AAHM,GALjB;;AAgBE;AAhBF,GAiBGL,KAjBH,CAiBS,KAjBT,EAiBgB;AACZE,YAAQ,MADI;AAEZC,WAAO;AACL,kBAAa;AACXC,qBAAa;AADF;AADR;AAFK,GAjBhB;;AA0BE;AACAN,qBAAmBQ,SAAnB,CAA6B,UAASC,SAAT,EAAoBC,SAApB,EAA8B;AACxD,QAAIR,QAAQO,UAAUE,GAAV,CAAc,QAAd,CAAZ;AACAT,UAAMU,EAAN,CAAS,KAAT;AACA,WAAOF,UAAUG,IAAV,EAAP;AACF,GAJD;;AAMA;AACAZ,oBAAkBa,SAAlB,CAA4B,IAA5B;AAEH,CAvCF;AAwCD;IAAOC,Q,GACL,kBAAYC,UAAZ,EAAwBC,YAAxB,EAAsCC,aAAtC,EAAqD;AAAA;;AACnDA,gBAAcC,cAAd,CAA6B,YAAU,CAAE,CAAzC;AACD,C;;AAGH1C,QAAQC,MAAR,CAAe,cAAf,EAA+B6B,UAA/B,CAA0C,UAA1C,EAAsDQ,QAAtD;AACA,CAACtC,QAAQC,MAAR,CAAe,cAAf,EACE0C,SADF,CACY,eADZ,EAC6B,UAASC,QAAT,EAAkB;AAC5C,SAAO;AACLC,cAAU,GADL;AAELC,WAAO;AACLC,YAAM,GADD;AAELC,cAAQ,GAFH;AAGLC,YAAM;AAHD,KAFF;AAOLpB,iBAAa,sBAPR;AAQL7I,aAAS,IARJ;AASL8I,gBAAY,YATP;AAULoB,kBAAc,MAVT;AAWLC,sBAAkB,IAXb;;AAaLC,UAAK,cAASN,KAAT,EAAgBO,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;;AAEtC,UAAIC,UAAU,SAAVA,OAAU,CAASC,KAAT,EAAgB;AAC5B,YAAIA,MAAMC,OAAN,IAAiBD,MAAME,OAA3B,EAAoC;AAChC,kBAAQC,OAAOC,YAAP,CAAoBJ,MAAMK,KAA1B,EAAiCC,WAAjC,EAAR;AACA,iBAAK,GAAL;AACIN,oBAAMO,cAAN;AACApB,uBAAS,YAAU;AACjBW,qBAAKU,QAAL,CAAcR,KAAd;AACD,eAFD;AAGA;AACJ,iBAAK,GAAL;AACIA,oBAAMO,cAAN;AACApB,uBAAS,YAAU;AACjBW,qBAAKW,eAAL;AACD,eAFD;AAGA;AACJ,iBAAK,GAAL;AACIT,oBAAMO,cAAN;AACApB,uBAAS,YAAU;AACjBW,qBAAKY,cAAL;AACD,eAFD;AAGA;AACJ,iBAAK,GAAL;AACIV,oBAAMO,cAAN;AACApB,uBAAS,YAAU;AACjBW,qBAAKa,gBAAL;AACD,eAFD;AAGA;AAxBJ;AA0BH;AACF,OA7BD;;AA+BA1L,aAAO2L,gBAAP,CAAwB,SAAxB,EAAmCb,OAAnC;;AAEAV,YAAMwB,GAAN,CAAU,UAAV,EAAsB,YAAU;AAC9B5L,eAAO6L,mBAAP,CAA2B,SAA3B,EAAsCf,OAAtC;AACD,OAFD;;AAIAV,YAAM0B,MAAN,CAAa,WAAb,EAA0B,UAASvB,IAAT,EAAewB,OAAf,EAAuB;AAC/C,YAAGxB,IAAH,EAAS;AACPM,eAAKmB,OAAL,CAAazB,IAAb,EAAmBwB,OAAnB;AACD,SAFD,MAEO;AACLlB,eAAKN,IAAL,GAAY,EAAZ;AACD;AACF,OAND;AAOD;AA3DI,GAAP;AA6DD,CA/DF,EAgEEnB,UAhEF,CAgEa,YAhEb,EAgE2B,UAAU6C,IAAV,EAAgB/B,QAAhB,EAA0BH,aAA1B,EAAyCmC,gBAAzC,EAA2DrC,UAA3D,EAAuEsC,gBAAvE,EAAyF;;AAEjH,OAAKH,OAAL,GAAe,UAASzB,IAAT,EAAewB,OAAf,EAAwB;AACrC,SAAKK,UAAL,GAAkB,MAAlB;;AAEA,QAAG7B,KAAK8B,QAAL,GAAgBxJ,MAAhB,IAA0B,CAA1B,IAA+B0H,KAAK+B,KAAvC,EAA8C;AAC5C,WAAKC,UAAL,CAAgB,GAAhB;AACD;;AAED,QAAGR,WAAWA,WAAWxB,IAAzB,EAA+B;AAC7B,UAAGwB,QAAQS,UAAX,EAAuB;AACrB,aAAKnC,IAAL,GAAY0B,OAAZ,EAAqB,IAArB;AACD,OAFD,MAEO,IAAGA,QAAQO,KAAX,EAAkB;AACvB,aAAKhC,MAAL,GAAcyB,OAAd;AACD;AACF;AACF,GAdD;;AAgBA,OAAKU,sBAAL,GAA8B,YAAW;AACvC,WAAON,iBAAiBO,yBAAjB,CAA2C,KAAKnC,IAAhD,EAAsD1H,MAAtD,GAA+D,CAAtE;AACD,GAFD;;AAIA,OAAK8J,oBAAL,GAA4B,YAAW;AACrC,SAAKP,UAAL,GAAkB,MAAlB;AACA,SAAKQ,WAAL,CAAiB,GAAjB;AACD,GAHD;;AAKA,OAAKA,WAAL,GAAmB,UAASC,KAAT,EAAgB;AACjCC,eAAW,YAAU;AACnB,UAAI9E,UAAU+E,SAASC,cAAT,CAAwB,kBAAxB,CAAd;AACAhF,cAAQiF,KAAR;AACD,KAHD,EAGGJ,KAHH;AAID,GALD;;AAOA,OAAKN,UAAL,GAAkB,UAASM,KAAT,EAAgB;AAChCC,eAAW,YAAU;AACnBC,eAASC,cAAT,CAAwB,mBAAxB,EAA6CC,KAA7C;AACD,KAFD,EAEGJ,KAFH;AAGD,GAJD;;AAMA,OAAKK,eAAL,GAAuB,YAAW;AAChC,SAAKC,QAAL,GAAgB,KAAhB;AACD,GAFD;;AAIA,OAAKC,eAAL,GAAuB,YAAW;AAChC,WAAOlB,iBAAiBmB,UAAjB,CAA4BnB,iBAAiBoB,sBAAjB,CAAwC,KAAK/C,IAAL,CAAU8B,QAAV,EAAxC,CAA5B,CAAP;AACD,GAFD;;AAIA,MAAIkB,aAAJ;;AAEA,OAAKhC,QAAL,GAAgB,UAASiC,MAAT,EAAiB;AAC/B,QAAIjD,OAAO,KAAKA,IAAhB;AACAA,SAAK+B,KAAL,GAAa,KAAb;AACA,SAAKjC,IAAL,GAAYE,IAAZ,EAAkB,UAASkD,OAAT,EAAiB;AACjC,UAAGA,OAAH,EAAY;AACV1D,sBAAc2D,UAAd;;AAEA,YAAGH,aAAH,EAAkBrD,SAASyD,MAAT,CAAgBJ,aAAhB;AAClBA,wBAAgBrD,SAAS,YAAU;AACjC,eAAK0D,UAAL,GAAkB,mBAAlB;AACD,SAFwB,CAEvB/H,IAFuB,CAElB,IAFkB,CAAT,EAEF,GAFE,CAAhB;AAGD,OAPD,MAOO;AACL,YAAG0H,aAAH,EAAkBrD,SAASyD,MAAT,CAAgBJ,aAAhB;AAClBA,wBAAgBrD,SAAS,YAAU;AACjC,eAAK0D,UAAL,GAAkB,+BAAlB;AACD,SAFwB,CAEvB/H,IAFuB,CAElB,IAFkB,CAAT,EAEF,GAFE,CAAhB;AAGD;AACF,KAdiB,CAchBA,IAdgB,CAcX,IAdW,CAAlB;AAeD,GAlBD;;AAoBA,OAAKgI,SAAL,GAAiB,UAASL,MAAT,EAAiB;AAChCA,WAAOM,MAAP,CAAcC,IAAd;AACA,SAAKxC,QAAL,CAAciC,MAAd;AACA,SAAKZ,WAAL;AACD,GAJD;;AAMA,MAAIoB,WAAJ;AACA,OAAKC,WAAL,GAAmB,YAAW;AAC5B,SAAK1D,IAAL,CAAUiC,UAAV,GAAuB,IAAvB;AACA,SAAKjC,IAAL,CAAU+B,KAAV,GAAkB,KAAlB;AACA,QAAGvC,cAAcmE,cAAd,EAAH,EAAmC;AACjC;AACAnE,oBAAcoE,eAAd,CAA8B,KAAK5D,IAAnC;AACD;;AAED,QAAGyD,WAAH,EAAgB9D,SAASyD,MAAT,CAAgBK,WAAhB;AAChB,QAAGT,aAAH,EAAkBrD,SAASyD,MAAT,CAAgBJ,aAAhB;AAClBS,kBAAc9D,SAAS,YAAU;AAC/B,WAAK0D,UAAL,GAAkB,WAAlB;AACA,WAAKrC,QAAL;AACD,KAHsB,CAGrB1F,IAHqB,CAGhB,IAHgB,CAAT,EAGA,GAHA,CAAd;AAID,GAdD;;AAiBA,OAAKuI,cAAL,GAAsB,YAAW;AAC/B,SAAKH,WAAL;AACD,GAFD;;AAIA,OAAKI,WAAL,GAAmB,YAAW;AAC5B,SAAKJ,WAAL;AACD,GAFD;;AAIA,OAAKK,WAAL,GAAmB,YAAW;AAC5B,SAAKC,WAAL,GAAmB,IAAnB;AACD,GAFD;;AAIA,OAAKC,cAAL,GAAsB,YAAW;AAC/B,SAAKC,WAAL,GAAmB,KAAnB;AACA5E,eAAW6E,UAAX,CAAsB,eAAtB;AACA,SAAKC,UAAL,GAAkB,KAAlB;AACD,GAJD;;AAMA,OAAKC,UAAL,GAAkB,YAAW;AAC3B,SAAKL,WAAL,GAAmB,KAAnB;AACD,GAFD;;AAIA,OAAK7C,gBAAL,GAAwB,YAAW;AACjC,SAAKmD,UAAL,GAAkB,CAAC,KAAKA,UAAxB;AACA,QAAG,KAAKA,UAAR,EAAoB;AAClB,UAAG,KAAKzC,UAAL,IAAmB,MAAtB,EAA8B;AAC5B;AACA,aAAKQ,WAAL,CAAiB,CAAjB;AACD;AACF,KALD,MAKO,CAEN;AACF,GAVD;;AAYA,OAAKkC,gBAAL,GAAwB,YAAW;AACjC,SAAK3B,QAAL,GAAgB,KAAhB;AACD,GAFD;;AAIA,OAAK1B,cAAL,GAAsB,YAAW;AAC/B,QAAG,KAAKW,UAAL,IAAmB,SAAtB,EAAiC;AAC/B,WAAKA,UAAL,GAAkB,MAAlB;AACD,KAFD,MAEO;AACL,WAAKA,UAAL,GAAkB,SAAlB;AACD;AACF,GAND;;AAQA,OAAK2C,cAAL,GAAsB,YAAW;AAC/B,SAAK5B,QAAL,GAAgB,KAAhB;AACA,QAAIvF,MAAM,KAAKoH,gBAAL,CAAsB,KAAKzE,IAA3B,CAAV;AACA3C,UAAMA,IAAItH,OAAJ,CAAY,KAAKiK,IAAL,CAAU0E,iBAAtB,EAAyC,EAAzC,CAAN;AACA,SAAKrH,GAAL,GAAW,EAACsH,MAAMtH,GAAP,EAAYU,OAAQ,KAAKiC,IAAL,CAAU0E,iBAA9B,EAAX;AACA,SAAKN,UAAL,GAAkB,IAAlB;AACD,GAND;;AAQA,OAAKQ,OAAL,GAAe,UAAS3B,MAAT,EAAiB;AAC9BA,WAAOM,MAAP,CAAcC,IAAd;;AAEA,QAAIqB,WAAW,KAAK7E,IAAL,CAAU0E,iBAAzB;AACA,SAAK1E,IAAL,CAAU0E,iBAAV,GAA8B,KAAKrH,GAAL,CAASU,KAAvC;AACA,SAAKiC,IAAL,CAAU8E,QAAV,CAAmB,IAAnB;;AAEAtF,kBAAcuF,IAAd,CAAmB,UAASC,QAAT,EAAkB;AACnC,UAAGA,YAAYA,SAASjJ,KAAxB,EAA+B;AAC7B,aAAKiE,IAAL,CAAU0E,iBAAV,GAA8BG,QAA9B;AACA,aAAKxH,GAAL,CAASU,KAAT,GAAiB8G,QAAjB;AACAI,cAAM,4BAAN;AACD,OAJD,MAIO;AACL,aAAKb,UAAL,GAAkB,KAAlB;AACD;AACF,KARkB,CAQjB9I,IARiB,CAQZ,IARY,CAAnB;AASD,GAhBD;;AAkBA,OAAK4J,SAAL,GAAiB,YAAW;;AAE1B,aAASC,YAAT,CAAsB9H,GAAtB,EAA2B;AACzB,UAAI+H,IAAI5C,SAAS6C,aAAT,CAAuB,GAAvB,CAAR;AACAD,QAAE7B,MAAF,GAAW,QAAX;AACA6B,QAAEE,IAAF,GAASjI,GAAT;AACA+H,QAAEG,KAAF;AACH;;AAEC/F,kBAAcgG,SAAd,CAAwB,KAAKxF,IAA7B,EAAmC,UAASA,IAAT,EAAc;AAC/CmF,mBAAa,KAAKV,gBAAL,CAAsBzE,IAAtB,CAAb;AACD,KAFkC,CAEjC1E,IAFiC,CAE5B,IAF4B,CAAnC;AAGA,SAAKsH,QAAL,GAAgB,KAAhB;AACD,GAbD;;AAeA,OAAK6C,WAAL,GAAmB,YAAW;AAC5BjG,kBAAckG,WAAd,CAA0B,KAAK1F,IAA/B,EAAqC,UAASA,IAAT,EAAc,CAElD,CAFD;AAGA,SAAK4C,QAAL,GAAgB,KAAhB;AACD,GALD;;AAOA,OAAK6B,gBAAL,GAAwB,YAAW;AACjC,WAAO,KAAKzE,IAAL,CAAU2F,eAAV,EAAP;AACD,GAFD;;AAIA,OAAKC,WAAL,GAAmB,YAAW;AAC5B,QAAG,KAAK5F,IAAL,CAAU6F,MAAb,EAAqB;AACnBZ,YAAM,iFAAN;AACD,KAFD,MAEO;AACL,WAAKrC,QAAL,GAAgB,CAAC,KAAKA,QAAtB;AACD;AACF,GAND;;AAQA,OAAKkD,UAAL,GAAkB,YAAW;AAC3BtG,kBAAc2D,UAAd;AACA,SAAKpD,MAAL,GAAc,KAAKC,IAAnB;AACA,SAAK4C,QAAL,GAAgB,KAAhB;AACD,GAJD;;AAMA,OAAK3B,eAAL,GAAuB,YAAW;AAChC,SAAKY,UAAL,GAAkB,MAAlB;AACA,SAAKQ,WAAL,CAAiB,GAAjB;AACD,GAHD;AAKD,CAnRF;AAoRD,CAACtF,QAAQC,MAAR,CAAe,cAAf,EACE0C,SADF,CACY,QADZ,EACsB,UAASF,aAAT,EAAwBoC,gBAAxB,EAAyC;AAC5D,SAAO;AACLhC,cAAU,GADL;AAELC,WAAO;AACLkG,cAAQ;AADH,KAFF;AAKLnH,iBAAa,sBALR;AAML7I,aAAS,IANJ;AAOL8I,gBAAY,YAPP;AAQLoB,kBAAc,MART;AASLC,sBAAkB,IATb;;AAWLC,UAAK,cAASN,KAAT,EAAgBO,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;AACtCT,YAAMwB,GAAN,CAAU,oBAAV,EAAgC,YAAU;AACxCf,aAAK0F,WAAL;AACD,OAFD;AAGD;AAfI,GAAP;AAiBD,CAnBF,EAoBEnH,UApBF,CAoBa,YApBb,EAoB2B,UAAUoH,MAAV,EAAkBzG,aAAlB,EAAiCD,YAAjC,EAA+C2G,oBAA/C,EAAqEvG,QAArE,EAA+EiC,gBAA/E,EAAiG;;AAEzH,OAAKuE,IAAL,GAAY3G,cAAc2G,IAA1B;AACA,OAAKvE,gBAAL,GAAwBA,gBAAxB;;AAEA,OAAKwE,qBAAL,GAA6B,YAAW;AACtC,SAAKC,mBAAL,GAA2B,CAAC,KAAKA,mBAAjC;AACD,GAFD;;AAIA,OAAKC,kBAAL,GAA0B,YAAW;AACnC,SAAKC,UAAL,GAAkB,EAAClJ,KAAKmC,cAAcgH,SAAd,EAAN,EAAlB;AACA,SAAKC,eAAL,GAAuB,CAAC,KAAKA,eAA7B;AACA,SAAKC,OAAL,GAAe,KAAf;AACA,SAAKL,mBAAL,GAA2B,KAA3B;AACA,SAAKM,kBAAL,GAA0B,KAA1B;AACD,GAND;;AAQA,OAAKC,gBAAL,GAAwB,YAAW;AACjC,SAAKH,eAAL,GAAuB,KAAvB;AACA,SAAKE,kBAAL,GAA0B,CAAC,KAAKA,kBAAhC;AACD,GAHD;;AAKA,OAAKE,mBAAL,GAA2B,YAAW;AACpC,SAAKC,gBAAL,GAAwB,EAAxB;AACA,SAAKC,oBAAL,GAA4B,CAAC,KAAKA,oBAAlC;AACD,GAHD;;AAKA,OAAKC,sBAAL,GAA8B,YAAW;AACvC,QAAG,KAAKF,gBAAL,CAAsBzJ,GAAzB,EAA8B;AAC5BuE,uBAAiBqF,YAAjB,CAA8B,KAAKH,gBAAL,CAAsBzJ,GAApD,EAAyD,UAAS2H,QAAT,EAAkB;AACzE,YAAG,CAACA,QAAJ,EAAc;AACZC,gBAAM,+EAAN;AACD,SAFD,MAEO;AACL,eAAK6B,gBAAL,CAAsBzJ,GAAtB,GAA4B,EAA5B;AACA,eAAK0J,oBAAL,GAA4B,KAA5B;AACD;AACF,OAPwD,CAOvDzL,IAPuD,CAOlD,IAPkD,CAAzD;AAQD;AACF,GAXD;;AAaA,OAAK4L,cAAL,GAAsB,UAASC,MAAT,EAAiBC,SAAjB,EAA4B;AAChDD,WAAOE,OAAP,GAAiB,IAAjB;AACAzF,qBAAiB0F,aAAjB,CAA+BH,MAA/B,EAAuCC,SAAvC,EAAkD,IAAlD,EAAwD,UAASpC,QAAT,EAAkB;AACxEmC,aAAOE,OAAP,GAAiB,KAAjB;AACA,UAAGrC,YAAYA,SAASjJ,KAAxB,EAA+B;AAC7BoL,eAAOpL,KAAP,GAAe,IAAf;AACAkJ,cAAM,8DAAN;AACD,OAHD,MAGO;AACLkC,eAAOpL,KAAP,GAAe,KAAf;AACAyD,sBAAcuF,IAAd,CAAmB,IAAnB;AACD;AACF,KATD;AAUD,GAZD;;AAcA,OAAKwC,eAAL,GAAuB,UAASH,SAAT,EAAoB;AACzC,QAAGI,QAAQ,iDAAR,CAAH,EAA+D;AAC7D5F,uBAAiB2F,eAAjB,CAAiCH,SAAjC;AACD;AACF,GAJD;;AAMA,OAAKK,uBAAL,GAA+B,YAAW;AACxC,QAAGD,QAAQ,4FAAR,CAAH,EAA0G;AACxG5F,uBAAiB8F,2BAAjB;AACD;AACF,GAJD;;AAMA,OAAKC,YAAL,GAAoB,YAAW;AAC7BnI,kBAAcoI,SAAd,CAAwB,KAAKrB,UAAL,CAAgBlJ,GAAxC,EAA6C,IAA7C;AACD,GAFD;;AAIA,OAAKwK,cAAL,GAAsB,YAAW;AAC/B,SAAKpB,eAAL,GAAuB,KAAvB;AACA,SAAKV,MAAL;AACAvG,kBAAcsI,OAAd;AACArS,WAAOsS,QAAP,CAAgBC,MAAhB;AACD,GALD;;AAOA,OAAKC,oBAAL,GAA4B,YAAW;AACrC,SAAKC,kBAAL,CAAwBC,MAAxB,GAAiC,wBAAjC;;AAEAxI,aAAS,YAAU;AACjB,UAAGyI,KAAKrP,QAAL,IAAiBqP,KAAKC,qBAAzB,EAAgD;AAC9CpD,cAAM,oDAAN;AACA;AACD;;AAEDzF,oBAAc8I,cAAd,CAA6B,KAAKJ,kBAAL,CAAwBK,gBAArD,EAAuE,KAAKL,kBAAL,CAAwBM,YAA/F,EAA6G,UAASxD,QAAT,EAAkB,CAE9H,CAFD;AAID,KAVQ,CAUP1J,IAVO,CAUF,IAVE,CAAT;AAWD,GAdD;;AAgBA,OAAKmN,YAAL,GAAoB,YAAW;AAC7B,WAAOlJ,aAAamJ,aAAb,CAA2BpQ,MAA3B,GAAoC,CAA3C;AACD,GAFD;;AAIA,OAAKqQ,iBAAL,GAAyB,YAAW;AAClC,QAAG,CAAC,KAAKxC,IAAL,CAAUyC,WAAd,EAA2B;AACzB,UAAG,CAACpB,QAAQ,iIAAR,CAAJ,EAAgJ;AAC9I,aAAKrB,IAAL,CAAUyC,WAAV,GAAwB,IAAxB;AACD;AACF;AACF,GAND;;AAQA,OAAKC,WAAL,GAAmB,YAAW;AAC5B,SAAKC,YAAL,GAAoB,IAApB;AACAtJ,kBAAcuF,IAAd,CAAmB,UAASC,QAAT,EAAkB;AACnCrF,eAAS,YAAU;AACjB,aAAKmJ,YAAL,GAAoB,KAApB;AACD,OAFQ,CAEPxN,IAFO,CAEF,IAFE,CAAT,EAEc,GAFd;AAGA,UAAG0J,YAAYA,SAASjJ,KAAxB,EAA+B;AAC7BkJ,cAAM,2FAAN;AACD,OAFD,MAEO;AACL,aAAKe,WAAL;AACD;AACF,KATkB,CASjB1K,IATiB,CASZ,IATY,CAAnB;AAUD,GAZD;;AAcA,OAAK0K,WAAL,GAAmB,YAAW;AAC5B,SAAK+C,YAAL,GAAoB,IAAI3S,IAAJ,EAApB;AACD,GAFD;;AAIA,OAAK4S,kBAAL,GAA0B,YAAW;AACnC,SAAKC,SAAL,CAAed,MAAf,GAAwB,0BAAxB;AACAxI,aAAS,YAAU;AACjBH,oBAAc0J,KAAd,CAAoB,KAAKD,SAAL,CAAenQ,KAAnC,EAA0C,KAAKmQ,SAAL,CAAeE,aAAzD,EAAwE,UAASnE,QAAT,EAAkB;AACxF,YAAG,CAACA,QAAD,IAAaA,SAASjJ,KAAzB,EAAgC;AAC9B,cAAIA,QAAQiJ,WAAWA,SAASjJ,KAApB,GAA4B,EAACpD,SAAS,2BAAV,EAAxC;AACA,eAAKsQ,SAAL,CAAed,MAAf,GAAwB,IAAxB;AACAlD,gBAAMlJ,MAAMpD,OAAZ;AACD,SAJD,MAIO;AACL,eAAKyQ,aAAL,CAAmBpE,SAASmB,IAA5B;AACD;AACF,OARuE,CAQtE7K,IARsE,CAQjE,IARiE,CAAxE;AASD,KAVQ,CAUPA,IAVO,CAUF,IAVE,CAAT;AAWD,GAbD;;AAeA,OAAK+N,sBAAL,GAA8B,YAAW;AACvC,SAAKJ,SAAL,CAAed,MAAf,GAAwB,4BAAxB;;AAEAxI,aAAS,YAAU;AACjBH,oBAAc8J,QAAd,CAAuB,KAAKL,SAAL,CAAenQ,KAAtC,EAA6C,KAAKmQ,SAAL,CAAeE,aAA5D,EAA2E,UAASnE,QAAT,EAAkB;AAC3F,YAAG,CAACA,QAAD,IAAaA,SAASjJ,KAAzB,EAAgC;AAC9B,cAAIA,QAAQiJ,WAAWA,SAASjJ,KAApB,GAA4B,EAACpD,SAAS,2BAAV,EAAxC;AACA,eAAKsQ,SAAL,CAAed,MAAf,GAAwB,IAAxB;AACAlD,gBAAMlJ,MAAMpD,OAAZ;AACD,SAJD,MAIO;AACL,eAAKyQ,aAAL,CAAmBpE,SAASmB,IAA5B;AACD;AACF,OAR0E,CAQzE7K,IARyE,CAQpE,IARoE,CAA3E;AASD,KAVQ,CAUPA,IAVO,CAUF,IAVE,CAAT;AAWD,GAdD;;AAgBA,OAAKiO,wBAAL,GAAgC,YAAW;AACzC,QAAIC,WAAWjK,aAAamJ,aAA5B;AACA,QAAIe,iBAAiB,CAArB;AACAD,aAASE,OAAT,CAAiB,UAAS1J,IAAT,EAAc;AAC7B,UAAGA,KAAK2J,iBAAL,EAAH,EAA6B;AAC3BF;AACD;AACF,KAJgB,CAIfnO,IAJe,CAIV,IAJU,CAAjB;;AAMA,WAAOmO,iBAAiB,GAAjB,GAAuBD,SAASlR,MAAhC,GAAyC,kBAAhD;AACD,GAVD;;AAYA,OAAKsR,uBAAL,GAA+B,EAAC/R,WAAW,IAAZ,EAA/B;;AAEA,OAAKgS,mBAAL,GAA2B,YAAW;AACpC,QAAI1J,OAAOqC,SAAS6C,aAAT,CAAuB,GAAvB,CAAX;AACAlF,SAAK2J,YAAL,CAAkB,UAAlB,EAA8B,YAA9B;AACA3J,SAAKmF,IAAL,GAAY9F,cAAcuK,aAAd,CAA4B,KAAKH,uBAAL,CAA6B/R,SAAzD,CAAZ;AACAsI,SAAKoF,KAAL;AACD,GALD;;AAOA,OAAKyE,kBAAL,GAA0B,UAASC,KAAT,EAAgB;AACxC,QAAIC,OAAOD,MAAM,CAAN,CAAX;AACA,QAAIE,SAAS,IAAIC,UAAJ,EAAb;AACAD,WAAOE,MAAP,GAAgB,UAASC,CAAT,EAAY;AAC1B9K,oBAAc+K,cAAd,CAA6BD,EAAE/G,MAAF,CAASiH,MAAtC,EAA8C,UAAStH,OAAT,EAAkB8B,QAAlB,EAA2B;AACvE7J,gBAAQC,GAAR,CAAY,iBAAZ,EAA+B8H,OAA/B,EAAwC8B,QAAxC;AACA,YAAG9B,OAAH,EAAY;AACV;AACD,SAFD,MAEO;AACL+B,gBAAM,2DAAN;AACD;AACF,OAPD;AAQD,KATD;AAUAkF,WAAOM,UAAP,CAAkBP,IAAlB;AACD,GAdD;;AAgBA,OAAKd,aAAL,GAAqB,UAASjD,IAAT,EAAe;;AAElC;AACE;AACA;AACA;AACF;AACE1Q,WAAOsS,QAAP,CAAgBC,MAAhB;AACF;;AAEA,SAAK0C,SAAL,GAAiB,KAAjB;AACA,SAAKC,gBAAL,GAAwB,KAAxB;AACD,GAZD;AAcD,CAjOF;AAkOD,CAAC5N,QAAQC,MAAR,CAAe,cAAf,EACA6B,UADA,CACW,UADX,EACuB,UAAU+L,MAAV,EAAkBtL,UAAlB,EAA8BK,QAA9B,EAAwCH,aAAxC,EAAuDD,YAAvD,EAAqE;AACzFD,aAAWuL,SAAX,GAAuB,gBAAvB;;AAEArL,gBAAcsL,cAAd;AACAF,SAAOG,MAAP,GAAgB,IAAIC,GAAJ,CAAQ,EAACC,KAAK,IAAN,EAAR,CAAhB;AACAL,SAAOG,MAAP,CAAcG,KAAd,GAAsB,KAAtB;AACAN,SAAOO,IAAP,GAAc5L,aAAa4L,IAA3B;AACAP,SAAOG,MAAP,CAAcK,KAAd,GAAsB7L,aAAa6L,KAAnC;;AAEA5L,gBAAcuF,IAAd,CAAmB,IAAnB;AACA;AACAsG,cAAY,YAAY;AACtB7L,kBAAcuF,IAAd,CAAmB,IAAnB;AACD,GAFD,EAEG,KAFH;;AAIA;;;;AAIA6F,SAAOU,YAAP,GAAsB,YAAW;AAC/B;AACD,GAFD;;AAIAV,SAAOW,qBAAP,GAA+B,UAASC,GAAT,EAAc;AAC3C,QAAGA,IAAIP,GAAP,EAAY;AACVL,aAAOU,YAAP;AACD;AACF,GAJD;;AAMAV,SAAOa,iBAAP,GAA2B,UAASD,GAAT,EAAc;AACvCZ,WAAOc,WAAP,GAAqBF,GAArB;;AAEA,QAAGZ,OAAOe,YAAP,IAAuBf,OAAOe,YAAP,CAAoB5J,KAA9C,EAAqD;AACnDxC,mBAAaqM,iBAAb,CAA+BhB,OAAOe,YAAtC;AACD;AACF,GAND;;AAQAf,SAAOiB,UAAP,GAAoB,UAASL,GAAT,EAAc;AAChCjM,iBAAauM,OAAb,CAAqBN,GAArB;AACD,GAFD;;AAIAZ,SAAOmB,QAAP,GAAkB,UAASP,GAAT,EAAcnS,QAAd,EAAwB;AACxCmS,QAAI1G,QAAJ,CAAa,IAAb;AACAtF,kBAAcuF,IAAd,CAAmB1L,QAAnB;AACD,GAHD;;AAKA;;;;AAIAuR,SAAOoB,iBAAP,GAA2B,UAASC,QAAT,EAAmBC,MAAnB,EAA2BC,MAA3B,EAAmC;;AAE5D,QAAIC,eAAetS,EAAEuS,IAAF,CAAO9M,aAAa6L,KAApB,EAA2B,EAAC5U,MAAMyV,SAASzV,IAAhB,EAA3B,CAAnB;AACA,QAAG,CAAC0V,OAAOjB,GAAX,EAAgB;AACd1L,mBAAa+M,8BAAb,CAA4CJ,MAA5C,EAAoDE,YAApD;AACD;;AAED5M,kBAAcuF,IAAd,CAAmB,YAAU,CAAE,CAA/B;AACD,GARD;;AAUA;;;;AAIA6F,SAAO2B,cAAP,GAAwB,UAASf,GAAT,EAAc;AACpC,QAAIgB,aAAaC,KAAKC,gBAAL,CAAsBlB,IAAIJ,KAA1B,CAAjB;AACA,QAAGoB,cAAc,CAAjB,EAAoB;AAClBjN,mBAAaoN,kBAAb,CAAgCnB,GAAhC;AACA;AACAhM,oBAAcuF,IAAd,CAAmB,YAAU;AAC3B;AACA6F,eAAOO,IAAP,GAAc,EAAd;AACAxL,iBAAS,YAAU;AACjBiL,iBAAOO,IAAP,GAAc5L,aAAa4L,IAA3B;AACD,SAFD;AAGD,OAND;AAOD,KAVD,MAUO;AACLlG,YAAM,iDAAN;AACD;AACF,GAfD;;AAiBA2F,SAAOgC,kBAAP,GAA4B,UAAS5M,IAAT,EAAe;AACzC4K,WAAOe,YAAP,GAAsB3L,IAAtB;AACD,GAFD;;AAIA4K,SAAOiC,WAAP,GAAqB,UAAS7M,IAAT,EAAe;AAClCT,iBAAauM,OAAb,CAAqB9L,IAArB;;AAEA,QAAG,CAAC4K,OAAOc,WAAP,CAAmBT,GAAvB,EAA4B;AAC1B1L,mBAAa+M,8BAAb,CAA4C1B,OAAOc,WAAnD,EAAgE1L,IAAhE;AACA4K,aAAOU,YAAP;AACD;AACF,GAPD;;AASA;;;;AAIAV,SAAO5J,QAAP,GAAkB,UAAShB,IAAT,EAAe3G,QAAf,EAAyB;AACzC2G,SAAK8E,QAAL,CAAc,IAAd;;AAEAtF,kBAAcuF,IAAd,CAAmB,UAASC,QAAT,EAAkB;AACnC,UAAGA,YAAYA,SAASjJ,KAAxB,EAA+B;AAC7B,YAAG,CAAC6O,OAAOkC,iBAAX,EAA8B;AAC5BlC,iBAAOkC,iBAAP,GAA2B,IAA3B;AACA7H,gBAAM,wDAAN;AACD;AACD5L,iBAAS,KAAT;AACD,OAND,MAMO;AACL2G,aAAKiC,UAAL,GAAkB,KAAlB;AACA,YAAG5I,QAAH,EAAa;AACXA,mBAAS,IAAT;AACD;AACF;AACF,KAbD;AAcD,GAjBD;;AAmBAuR,SAAO9E,UAAP,GAAoB,UAAS9F,IAAT,EAAe;;AAEjCT,iBAAaoN,kBAAb,CAAgC3M,IAAhC;;AAEA,QAAGA,QAAQ4K,OAAOe,YAAlB,EAAgC;AAC9Bf,aAAOe,YAAP,GAAsB,IAAtB;AACD;;AAED,QAAG3L,KAAK+B,KAAR,EAAe;AACbxC,mBAAaqM,iBAAb,CAA+B5L,IAA/B;AACA;AACD;;AAEDR,kBAAcuF,IAAd,CAAmB,IAAnB;AACD,GAdD;;AAgBA;;;;AAIA6F,SAAOmC,YAAP,GAAsB,YAAW;AAC/BvN,kBAAcwN,iBAAd;AACD,GAFD;AAKH,CA/IA;AAgJD,CAACjQ,QAAQC,MAAR,CAAe,cAAf,EACE0C,SADF,CACY,cADZ,EAC4B,YAAU;AACnC,SAAO;AACLG,WAAO;AACLoN,cAAQ,GADH;AAELC,qBAAe,GAFV;AAGLnN,cAAQ,GAHH;AAILyL,WAAK,GAJA;AAKL2B,iBAAW;AALN,KADF;;AASLvO,iBAAa,qBATR;AAUL7I,aAAS,IAVJ;AAWL8I,gBAAY,WAXP;AAYLoB,kBAAc,MAZT;AAaLC,sBAAkB,IAbb;;AAeLC,UAAK,cAASN,KAAT,EAAgBO,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;AACtCT,YAAM0B,MAAN,CAAa,UAAb,EAAyB,UAASiK,GAAT,EAAcW,MAAd,EAAqB;AAC5C,YAAGX,GAAH,EAAQ;AACNlL,eAAK8M,YAAL,CAAkB5B,GAAlB,EAAuBW,MAAvB;AACD;AACF,OAJD;AAKD;AArBI,GAAP;AAuBD,CAzBF,EA0BEtN,UA1BF,CA0Ba,WA1Bb,EA0B0B,UAAUW,aAAV,EAAyBG,QAAzB,EAAmCL,UAAnC,EAA+CC,YAA/C,EAA6D;;AAEpFD,aAAW+B,GAAX,CAAe,eAAf,EAAgC,YAAU;AACxC,SAAKuB,QAAL,GAAgB,KAAhB;AACD,GAF+B,CAE9BtH,IAF8B,CAEzB,IAFyB,CAAhC;;AAIA,MAAI+R,cAAc,IAAlB;;AAEA,OAAKD,YAAL,GAAoB,UAAS5B,GAAT,EAAcW,MAAd,EAAsB;AACxC,SAAKvJ,QAAL,GAAgB,KAAhB;;AAEA,QAAG,KAAK+I,YAAL,IAAqB,KAAKA,YAAL,CAAkB5J,KAA1C,EAAiD;AAC/CjI,QAAEiG,MAAF,CAASoM,OAAOf,KAAhB,EAAuB,KAAKO,YAA5B;AACD;;AAED,SAAK2B,UAAL,CAAgB1V,IAAhB,GAAuB,EAAvB;;AAEA4T,QAAIJ,KAAJ,CAAU1B,OAAV,CAAkB,UAAS1J,IAAT,EAAc;AAC9BA,WAAKuN,OAAL,GAAe,IAAf;AACD,KAFD;AAGA,SAAKC,eAAL,CAAqB,KAArB;;AAEA,QAAGH,WAAH,EAAgB;AACd1N,eAAS,YAAU;AACjB,YAAI8N,QAAQjO,cAAckO,QAAd,EAAZ;AACA,YAAGD,KAAH,EAAU;AACR,cAAIzN,OAAOyN,KAAX;AACA,eAAKE,UAAL,CAAgB3N,IAAhB;AACD,SAHD,MAGO;AACL,eAAK4N,aAAL;AACAP,wBAAc,KAAd;AACD;AACF,OATQ,CASP/R,IATO,CASF,IATE,CAAT;AAUD,KAXD,MAWO,IAAGkQ,IAAIJ,KAAJ,CAAU9S,MAAV,IAAoB,CAAvB,EAA0B;AAC7B,WAAKsV,aAAL;AACH;AACF,GA5BD;;AA8BA,OAAKC,iBAAL,GAAyB,YAAW;AAClC,SAAKjL,QAAL,GAAgB,KAAhB;AACA,SAAKuK,SAAL,GAAiB,KAAK3B,GAAtB;AACD,GAHD;;AAKA,OAAKsC,gBAAL,GAAwB,YAAW;AACjC,SAAKlL,QAAL,GAAgB,KAAhB;;AAEA,QAAG,CAACpD,cAAcmE,cAAd,EAAJ,EAAoC;AAClCsB,YAAM,uCAAN;AACA;AACD;;AAED,QAAG,KAAKuG,GAAL,CAASP,GAAZ,EAAiB;AACfhG,YAAM,iCAAN;AACA;AACD;;AAEDzF,kBAAcgG,SAAd,CAAwB,KAAKgG,GAA7B,EAAkC,UAASxG,QAAT,EAAkB,CAAE,CAAtD;AACD,GAdD;;AAgBA,OAAK+I,kBAAL,GAA0B,YAAW;AACnC,SAAKnL,QAAL,GAAgB,KAAhB;AACApD,kBAAckG,WAAd,CAA0B,KAAK8F,GAA/B,EAAoC,UAASxG,QAAT,EAAkB,CAErD,CAFD;AAGD,GALD;;AAOA,OAAKwI,eAAL,GAAuB,UAASQ,SAAT,EAAoB;AACzC,QAAIC,eAAe,KAAKzC,GAAL,CAASJ,KAAT,CAAe8C,MAAf,CAAsB,UAASlO,IAAT,EAAc;AACrD,aAAOA,KAAKuN,OAAZ;AACD,KAFkB,CAAnB;;AAIA,QAAGU,aAAa3V,MAAb,GAAsB,CAAzB,EAA4B;AAC1B,WAAKqV,UAAL,CAAgBM,aAAa,CAAb,CAAhB;AACD,KAFD,MAEO,IAAGD,SAAH,EAAc;AACnB,WAAKJ,aAAL;AACD;AACF,GAVD;;AAYA,OAAKD,UAAL,GAAkB,UAAS3N,IAAT,EAAe;AAC/B,SAAK2L,YAAL,GAAoB3L,IAApB;AACA,SAAKkN,aAAL,GAAqBlN,IAArB;AACD,GAHD;;AAKA,OAAK4N,aAAL,GAAqB,YAAW;AAC9B,QAAI1C,QAAQ,cAAc,KAAKM,GAAL,CAASJ,KAAT,GAAkB,OAAO,KAAKI,GAAL,CAASJ,KAAT,CAAe9S,MAAf,GAAwB,CAA/B,CAAlB,GAAuD,EAArE,CAAZ;AACA,SAAK6V,OAAL,GAAe5O,aAAa6O,UAAb,CAAwB,EAACC,cAAc,MAAf,EAAuBtM,OAAO,IAA9B,EAAoCnK,MAAM,EAA1C,EAAxB,CAAf;AACA,SAAKuW,OAAL,CAAajD,KAAb,GAAqBA,KAArB;AACA,SAAKyC,UAAL,CAAgB,KAAKQ,OAArB;AACA,SAAKlB,MAAL,GAAc,KAAKkB,OAAnB;AACD,GAND;;AAQA,OAAKb,UAAL,GAAkB,EAAC1V,MAAO,EAAR,EAAlB;;AAEA,OAAK0W,WAAL,GAAmB,UAAStO,IAAT,EAAe;AAChC,QAAG,KAAKsN,UAAL,CAAgB1V,IAAhB,CAAqBU,MAArB,IAA+B,CAAlC,EAAqC;AACnC0H,WAAKuN,OAAL,GAAe,IAAf;AACD,KAFD,MAEO;AACLvN,WAAKuN,OAAL,GAAevN,KAAKkL,KAAL,CAAWpK,WAAX,GAAyByN,QAAzB,CAAkC,KAAKjB,UAAL,CAAgB1V,IAAlD,KAA2DoI,KAAKpI,IAAL,CAAUkJ,WAAV,GAAwByN,QAAxB,CAAiC,KAAKjB,UAAL,CAAgB1V,IAAjD,CAA1E;AACD;AACD,WAAOoI,KAAKuN,OAAZ;AACD,GAPkB,CAOjBjS,IAPiB,CAOZ,IAPY,CAAnB;;AASA,OAAKkT,iBAAL,GAAyB,YAAW;AAClC7O,aAAS,YAAU;AACjB,UAAG,CAAC,KAAKgM,YAAL,CAAkB4B,OAAtB,EAA+B;AAC7B,aAAKC,eAAL,CAAqB,KAArB;AACD;AACF,KAJQ,CAIPlS,IAJO,CAIF,IAJE,CAAT,EAIc,GAJd;AAKD,GAND;AAOD,CAvIF;AAwID,CAACyB,QAAQC,MAAR,CAAe,cAAf,EACE0C,SADF,CACY,aADZ,EAC2B,YAAU;AAClC,SAAO;AACLE,cAAU,GADL;AAELC,WAAO;AACLoN,cAAQ,GADH;AAELC,qBAAe,GAFV;AAGLuB,kBAAY,GAHP;AAIL3O,YAAM,GAJD;AAKLqL,YAAM,GALD;AAMLJ,cAAQ,GANH;AAOL2D,qBAAe;AAPV,KAFF;AAWL9P,iBAAa,oBAXR;AAYL7I,aAAS,IAZJ;AAaL8I,gBAAY,UAbP;AAcLoB,kBAAc,MAdT;AAeLC,sBAAkB,IAfb;;AAiBLC,UAAK,cAASN,KAAT,EAAgBO,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;AACtCT,YAAM0B,MAAN,CAAa,WAAb,EAA0B,UAASoN,OAAT,EAAiB;AACzC,YAAGA,OAAH,EAAY;AACVrO,eAAKsO,OAAL,CAAaD,OAAb;AACD;AACF,OAJD;;AAMA9O,YAAM0B,MAAN,CAAa,aAAb,EAA4B,UAASwJ,MAAT,EAAgB;AAC1C,YAAGA,MAAH,EAAW;AACTzK,eAAKuO,SAAL,CAAe9D,MAAf;AACD;AACF,OAJD;AAKD;AA7BI,GAAP;AA+BD,CAjCF,EAkCElM,UAlCF,CAkCa,UAlCb,EAkCyB,UAAUU,YAAV,EAAwB;;AAE9C,MAAIuP,cAAc,IAAlB;;AAEA,OAAKD,SAAL,GAAiB,UAAS9D,MAAT,EAAiB;AAChC,SAAKgE,SAAL,CAAe,KAAKhE,MAApB;AACD,GAFD;;AAIA,OAAK6D,OAAL,GAAe,UAASzD,IAAT,EAAe;AAC5B,QAAG2D,WAAH,EAAgB;AACZA,oBAAc,KAAd;AACA,WAAKC,SAAL,CAAe,KAAKhE,MAApB;AACH,KAHD,MAGO;AACL,UAAGI,QAAQA,KAAK7S,MAAL,GAAc,CAAzB,EAA4B;AAC1B,aAAKyW,SAAL,CAAe5D,KAAK,CAAL,CAAf;AACD;AACF;AACF,GATD;;AAWA,OAAK4D,SAAL,GAAiB,UAASvD,GAAT,EAAc;AAC7B,SAAKiD,UAAL,GAAkBjD,GAAlB;AACA,SAAKE,WAAL,GAAmBF,GAAnB;AACA,SAAK0B,aAAL,GAAqB1B,GAArB;AACD,GAJD;;AAMA,OAAKwD,gBAAL,GAAwB,YAAW;AACjC,QAAG,KAAKC,UAAR,EAAoB;AAClB;AACD;;AAED,SAAK/C,MAAL,GAAc3M,aAAa6O,UAAb,CAAwB,EAACC,cAAc,KAAf,EAAxB,CAAd;AACA,SAAK3C,WAAL,GAAmB,KAAKQ,MAAxB;AACA,SAAK+C,UAAL,GAAkB,KAAK/C,MAAvB;AACA,SAAKe,MAAL,GAAc,KAAKf,MAAnB;AACD,GATD;;AAWA,MAAIgD,kBAAkB,EAAtB;AACA,OAAKC,eAAL,GAAuB,UAAS3D,GAAT,EAAc;AACnC0D,sBAAkB1D,IAAIN,KAAtB;AACD,GAFD;;AAIA,OAAKkE,iBAAL,GAAyB,UAAS5D,GAAT,EAAc;AACrC,SAAKyD,UAAL,GAAkBzD,GAAlB;AACD,GAFD;;AAIA,OAAK6D,OAAL,GAAe,UAASpM,MAAT,EAAiBuI,GAAjB,EAAsB;AACnC,SAAKyD,UAAL,GAAkB,IAAlB;AACA,QAAGzD,IAAIN,KAAJ,CAAU5S,MAAV,IAAoB,CAAvB,EAA0B;AACxBkT,UAAIN,KAAJ,GAAYgE,eAAZ;AACAA,wBAAkB,EAAlB;AACA;AACD;;AAEDjM,WAAOM,MAAP,CAAcC,IAAd;AACA,QAAG,CAACgI,IAAIN,KAAL,IAAcM,IAAIN,KAAJ,CAAU5S,MAAV,IAAoB,CAArC,EAAwC;AACpC;AACH;;AAED,SAAKwH,IAAL,GAAY0L,GAAZ,EAAiB,UAAS8D,QAAT,EAAkB;AACjC;AACA,WAAKP,SAAL,CAAevD,GAAf;AACA,WAAKU,MAAL,GAAc,IAAd;AACD,KAJgB,CAIf5Q,IAJe,CAIV,IAJU,CAAjB;AAKD,GAlBD;;AAoBA,OAAKiU,SAAL,GAAiB,UAAS/D,GAAT,EAAc;AAC7B,QAAIgB,aAAaC,KAAKC,gBAAL,CAAsBlB,IAAIJ,KAA1B,CAAjB;AACA,WAAOoB,WAAWlU,MAAlB;AACD,GAHD;;AAKA,OAAKkX,UAAL,GAAkB,UAASlF,CAAT,EAAY4B,MAAZ,EAAoBlM,IAApB,EAA0B;AAC1C,SAAK0O,aAAL,GAAqB1O,IAArB,EAA2BkM,MAA3B,EAAmC,KAAKR,WAAxC;AACD,GAFiB,CAEhBpQ,IAFgB,CAEX,IAFW,CAAlB;AAKD,CA7GF;AA8GD,CAACyB,QAAQC,MAAR,CAAe,cAAf,EACA6B,UADA,CACW,mBADX,EACgC,UAAU+L,MAAV,EAAkBpL,aAAlB,EAAiCiQ,WAAjC,EAA8CpW,QAA9C,EAAwDsG,QAAxD,EAAkE;AACjGiL,SAAO8E,QAAP,GAAkB,EAAlB;;AAEA9E,SAAO+E,YAAP,GAAsB,YAAW;AAC/BnQ,kBAAcoQ,WAAd,CAA0BhF,OAAO8E,QAAP,CAAgBG,QAA1C,EAAoD,UAAS7K,QAAT,EAAkB;AACpE,UAAI6K,WAAW7K,SAAS6K,QAAxB;AACAxW,eAASwW,QAAT;AACAjF,aAAOkF,eAAP;AACD,KAJD;AAKD,GAND;AAOD,CAXA;AAYD;IAAOC,I;AAEL,gBAAYC,QAAZ,EAAsB;AAAA;;AAEpB,SAAKC,cAAL,CAAoBD,QAApB;;AAEA,SAAKE,SAAL,GAAiB,EAAjB;;AAEA,QAAG,CAAC,KAAK1Z,IAAT,EAAe;AACb,WAAKA,IAAL,GAAYwB,MAAMxC,MAAN,CAAa2a,YAAb,EAAZ;AACD;AACF;;;;mCAqBcC,I,EAAM;AACnBtW,QAAEC,KAAF,CAAQ,IAAR,EAAcqW,IAAd;AACA,UAAG,KAAKC,UAAR,EAAoB;AAClB,aAAKA,UAAL,GAAkB,IAAIja,IAAJ,CAAS,KAAKia,UAAd,CAAlB;AACA,aAAKC,UAAL,GAAkB,IAAIla,IAAJ,CAAS,KAAKka,UAAd,CAAlB;AACD,OAHD,MAGO;AACL,aAAKD,UAAL,GAAkB,IAAIja,IAAJ,EAAlB;AACA,aAAKka,UAAL,GAAkB,IAAIla,IAAJ,EAAlB;AACD;;AAED,UAAGga,KAAKG,OAAR,EAAiB;AACf,aAAKC,2BAAL,CAAiC,KAAKC,aAAtC;AACD;AACF;;;6BAEQC,K,EAAO;AACd,WAAKA,KAAL,GAAaA,KAAb;;AAEA,UAAGA,KAAH,EAAU;AACR,aAAKC,uBAAL;AACD;AACF;;;gCAEWC,Q,EAAUvX,Q,EAAU;AAC9B,UAAG,CAACS,EAAEuS,IAAF,CAAO,KAAK6D,SAAZ,EAAuBU,QAAvB,CAAJ,EAAsC;AACpC,aAAKV,SAAL,CAAeW,IAAf,CAAoB,EAACD,UAAUA,QAAX,EAAqBvX,UAAUA,QAA/B,EAApB;AACD;AACF;;;mCAEcuX,Q,EAAU;AACvB9W,QAAEiG,MAAF,CAAS,KAAKmQ,SAAd,EAAyB,EAACU,UAAUA,QAAX,EAAzB;AACD;;;8CAEyB;AAAA;AAAA;AAAA;;AAAA;AACxB,6BAAoB,KAAKV,SAAzB,8HAAoC;AAAA,cAA5BU,QAA4B;;AAClCA,mBAASvX,QAAT,CAAkB,IAAlB;AACD;AAHuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIzB;;;gDAE2ByX,U,EAAY,CAEvC;;;sDAEiC;AAChC,aAAO,KAAKC,eAAL,EAAP;AACD;;;sCAEiB;AAChB;AACD;;;sCAEiB;AAChB,aAAO,EAACC,YAAY,KAAKC,eAAL,EAAb,EAAP;AACD;;;0CAEqBC,I,EAAM;AAC1B;AACD;;;6CAEwBA,I,EAAM;AAC7B;AACD;;;6CAEwB;AACvB;AACD;;;0CAEqBA,I,EAAM;AAC1BpX,QAAEC,KAAF,CAAQ,IAAR,EAAcD,EAAEqX,IAAF,CAAOD,IAAP,EAAa,CAAC,SAAD,CAAb,CAAd;AACD;;;wDAEmC;AAClC;AACA,aAAO,IAAP;AACD;;;+BAEU;AACT,aAAO,KAAKxM,iBAAZ;AACD;;;kCAEa;AACZ,aAAO,KAAKiF,iBAAL,MAA4B,KAAK4G,OAAL,CAAalY,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,MAAiC,KAA7D,GAAqE,IAArE,GAA4E,KAAnF;AACD;;;wCAEmB;AAClB,aAAO,KAAK+Y,YAAZ;AACD;;;sCAEiB;AAChB,aAAO,KAAKC,gBAAZ;AACD;;;wBAvGmB;AAClB,UAAG,CAAC,KAAKd,OAAT,EAAkB;AAChB,eAAO,EAAP;AACD;;AAED,UAAG,KAAKA,OAAL,KAAiB,IAAjB,IAAyB,QAAO,KAAKA,OAAZ,MAAwB,QAApD,EAA8D;AAC5D;AACA,eAAO,KAAKA,OAAZ;AACD;;AAED,aAAOe,KAAKta,KAAL,CAAW,KAAKuZ,OAAhB,CAAP;AACD;;;oCAjBsBgB,K,EAAO;AAC5BA,YAAMC,IAAN,CAAW,UAASpM,CAAT,EAAWqM,CAAX,EAAa;AACtB,eAAO,IAAIrb,IAAJ,CAASqb,EAAEpB,UAAX,IAAyB,IAAIja,IAAJ,CAASgP,EAAEiL,UAAX,CAAhC;AACD,OAFD;AAGD;;;;;;AA4GH;IAAOqB,M;AACL,kBAAYtB,IAAZ,EAAkB;AAAA;;AACdtW,MAAEC,KAAF,CAAQ,IAAR,EAAcqW,IAAd;AACA,SAAK/I,OAAL,GAAe,KAAf,CAFc,CAEQ;AACtB,SAAKtL,KAAL,GAAa,KAAb;AACA,QAAG,KAAK4V,YAAR,EAAsB;AACpB;AACA,WAAKA,YAAL,GAAoB,IAAIvb,IAAJ,CAAS,KAAKub,YAAd,CAApB;AACD;AACJ;;;;wBAEuB;AACtB,UAAG,CAAC,KAAKC,WAAT,EAAsB;AACpB,eAAO,EAAP;AACD;AACD,UAAIC,aAAa,KAAKD,WAAL,CAAiBE,MAAjB,CAAwB,CAAxB,EAA2BnW,WAA3B,KAA2C,KAAKiW,WAAL,CAAiBhX,KAAjB,CAAuB,CAAvB,CAA5D,CAJsB,CAIiE;AACvFiX,oBAAc,IAAd;AALsB;AAAA;AAAA;;AAAA;AAMtB,8BAAuB,KAAKE,aAA5B,mIAA2C;AAAA,cAAnCC,WAAmC;;AACzC,cAAGA,eAAe,GAAlB,EAAuB;AACrBH,0BAAc,WAAd;AACD,WAFD,MAEO;AACLA,0BAAcG,WAAd;AACD;;AAEDH,wBAAc,GAAd;AACD;AAdqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAgBtB,aAAOA,UAAP;AACD;;;wBAE0B;AACzB,UAAG,KAAKI,IAAL,IAAa,MAAhB,EAAwB;AACtB,eAAO,IAAP;AACD;AACD,UAAIC,iBAAiB,2BAArB;AACA,UAAG,KAAKC,iBAAL,IAA0B,KAAKC,iBAAlC,EAAqD;AACnDF,0BAAkB,yBAAlB;AACD,OAFD,MAEO;AACL,YAAG,KAAKC,iBAAR,EAA2B;AACzBD,4BAAkB,YAAlB;AACD,SAFD,MAEO;AACLA,4BAAkB,YAAlB;AACD;AACF;AACD,aAAOA,cAAP;AACD;;;;;;IAIGG,S;;;AACJ,qBAAYjC,IAAZ,EAAkB;AAAA;;AAAA,uHACRA,IADQ;;AAEdtW,MAAEC,KAAF,SAAcqW,IAAd;;AAEA,WAAKvY,SAAL,GAAiB,IAAjB;AACA,WAAKwW,YAAL,GAAoB,WAApB;AALc;AAMjB;;;;6CAEwB;AACvB,aAAO,KAAKiE,OAAL,CAAapE,MAAb,CAAoB,UAAS/G,MAAT,EAAgB;AACzC,eAAOA,OAAOoL,OAAP,IAAkB,QAAzB;AACD,OAFM,CAAP;AAGD;;;8CAEyBrB,I,EAAM;AAC9B,aAAO,KAAKoB,OAAL,CAAapE,MAAb,CAAoB,UAAS/G,MAAT,EAAgB;AACzC,eAAOA,OAAOoL,OAAP,IAAkBrB,KAAK7C,YAAvB,IAAuClH,OAAOoL,OAAP,IAAkB,MAAhE;AACD,OAFM,CAAP;AAGD;;;gDAE2B9B,a,EAAe;AACzC,wIAAkCA,aAAlC;AACA,WAAK/U,IAAL,GAAY+U,cAAc/U,IAA1B;AACA,WAAK2B,GAAL,GAAWoT,cAAcpT,GAAzB;AACA,WAAKiV,OAAL,GAAe7B,cAAc6B,OAAd,CAAsBE,GAAtB,CAA0B,UAASrL,MAAT,EAAgB;AACvD,eAAO,IAAIuK,MAAJ,CAAWvK,MAAX,CAAP;AACD,OAFc,CAAf;AAGD;;;mDAE8BsL,oB,EAAsB;AACnD3Y,QAAEC,KAAF,CAAQ,IAAR,EAAc0Y,oBAAd;AACA,WAAKH,OAAL,GAAeG,qBAAqBH,OAArB,CAA6BE,GAA7B,CAAiC,UAASrL,MAAT,EAAgB;AAC9D,eAAO,IAAIuK,MAAJ,CAAWvK,MAAX,CAAP;AACD,OAFc,CAAf;AAGD;;;sCAEiB;AAChB,aAAO,IAAP;AACD;;;sCAEiB;AAChB,UAAItJ,SAAS;AACXnC,cAAM,KAAKA,IADA;AAEX2B,aAAK,KAAKA,GAFC;AAGXiV,iBAAS,KAAKA;AAHH,OAAb;;AAMAxY,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;;EAlDqBkS,I;;AAqDxB;IAAOtD,I;;;AAEL,gBAAYuD,QAAZ,EAAsB;AAAA;;AAAA,6GACdA,QADc;;AAGpB,QAAG,CAAC,OAAK7E,IAAT,EAAe;AACb,aAAKA,IAAL,GAAY,EAAZ;AACD;AALmB;AAMrB;;;;gDAE2BsF,a,EAAe;AACzC,8HAAkCA,aAAlC;AACA,WAAKvF,KAAL,GAAauF,cAAcvF,KAA3B;AACA,WAAKtT,IAAL,GAAY6Y,cAAc7Y,IAA1B;AACD;;;sCAEiB;AAChB,UAAIoZ,aAAalX,EAAE0Y,GAAF,CAAM,KAAKrH,IAAX,EAAiB,UAASK,GAAT,EAAa;AAC7C,eAAO,EAAChV,MAAMgV,IAAIhV,IAAX,EAAiB6X,cAAc7C,IAAI6C,YAAnC,EAAP;AACD,OAFgB,CAAjB;;AAIA,aAAO2C,UAAP;AACD;;;sCAEiB;AAChB,UAAInT,SAAS;AACXqN,eAAO,KAAKA,KADD;AAEXtT,cAAM,KAAKA;AAFA,OAAb;;AAKAkC,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;0CAEqBqT,I,EAAM;AAC1B,UAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7B,YAAG,CAACvU,EAAEuS,IAAF,CAAO,KAAKlB,IAAZ,EAAkB+F,IAAlB,CAAJ,EAA6B;AAC3B,eAAK/F,IAAL,CAAU0F,IAAV,CAAeK,IAAf;AACD;AACF;AACD,wHAA4BA,IAA5B;AACD;;;6CAEwBA,I,EAAM;AAC7B,UAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7BvU,UAAE4Y,IAAF,CAAO,KAAKvH,IAAZ,EAAkB+F,IAAlB;AACD;AACD,2HAA+BA,IAA/B;AACD;;;6CAEwB;AACvB,WAAK/F,IAAL,CAAUzB,OAAV,CAAkB,UAAS8B,GAAT,EAAa;AAC7B1R,UAAE4Y,IAAF,CAAOlH,IAAIJ,KAAX,EAAkB,IAAlB;AACAI,YAAI1G,QAAJ,CAAa,IAAb;AACD,OAHiB,CAGhBxJ,IAHgB,CAGX,IAHW,CAAlB;AAIA,WAAK6P,IAAL,GAAY,EAAZ;AACD;;;wDAOmC;AAClC;AACD;;;+BAWU;AACT,aAAO,KAAKvT,IAAL,IAAa,EAApB;AACD;;;gCAEW;AACV,aAAO,KAAKsT,KAAL,IAAc,EAArB;AACD;;;6BAEQ;AACP,aAAO,EAAC1U,MAAM,KAAKA,IAAZ,EAAP;AACD;;;2CAEsB;AACrB,aAAO,KAAKkO,iBAAZ;AACD;;;+BAEU;AACT,aAAO,wGAAoB,KAAKiO,eAAhC;AACD;;;wBA3BqB;AAAA;AAAA;AAAA;;AAAA;AACpB,8BAAgB,KAAKxH,IAArB,mIAA2B;AAAA,cAAlBK,GAAkB;;AACzB,cAAGA,IAAIoH,QAAJ,EAAH,EAAmB;AACjB,mBAAO,IAAP;AACD;AACF;AALmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAMpB,aAAO,KAAP;AACD;;;wBAsBkB;AACjB,aAAO,MAAP;AACD;;;qCAxCuBxH,K,EAAO;AAC7B,UAAIyH,WAAWzH,MAAM8C,MAAN,CAAa,UAASlO,IAAT,EAAc;AAAC,eAAOA,KAAK+B,KAAL,IAAc,KAAd,IAAuB/B,KAAK+B,KAAL,IAAc,IAA5C;AAAiD,OAA7E,CAAf;AACA,aAAO8Q,QAAP;AACD;;;;EA7DiB9C,I;;AAoGpB;IAAO/E,G;;;AAEL,eAAYgF,QAAZ,EAAsB;AAAA;;AAAA,2GACdA,QADc;;AAGpB,QAAG,CAAC,OAAK5E,KAAT,EAAgB;AACd,aAAKA,KAAL,GAAa,EAAb;AACD;AALmB;AAMrB;;;;gDAE2BqF,a,EAAe;AACzC,4HAAkCA,aAAlC;AACA,WAAKvF,KAAL,GAAauF,cAAcvF,KAA3B;AACD;;;sCAEiB;AAChB,UAAI8F,aAAalX,EAAE0Y,GAAF,CAAM,KAAKpH,KAAX,EAAkB,UAASpL,IAAT,EAAc;AAC/C,eAAO,EAACxJ,MAAMwJ,KAAKxJ,IAAZ,EAAkB6X,cAAcrO,KAAKqO,YAArC,EAAP;AACD,OAFgB,CAAjB;;AAIA,aAAO2C,UAAP;AACD;;;sCAEiB;AAChB,UAAInT,SAAS;AACXqN,eAAO,KAAKA;AADD,OAAb;;AAIApR,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;0CAEqBqT,I,EAAM;AAC1B,UAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AAC9B,YAAG,CAACvU,EAAEuS,IAAF,CAAO,KAAKjB,KAAZ,EAAmB8F,IAAnB,CAAJ,EAA8B;AAC5B,eAAK9F,KAAL,CAAW0H,OAAX,CAAmB5B,IAAnB;AACD;AACF;AACD,sHAA4BA,IAA5B;AACD;;;6CAEwBA,I,EAAM;AAC7B,UAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AAC9BvU,UAAE4Y,IAAF,CAAO,KAAKtH,KAAZ,EAAmB8F,IAAnB;AACD;AACD,yHAA+BA,IAA/B;AACD;;;6CAEwB;AACvB,WAAK9F,KAAL,CAAW1B,OAAX,CAAmB,UAAS1J,IAAT,EAAc;AAC/BlG,UAAE4Y,IAAF,CAAO1S,KAAKmL,IAAZ,EAAkB,IAAlB;AACAnL,aAAK8E,QAAL,CAAc,IAAd;AACD,OAHkB,CAGjBxJ,IAHiB,CAGZ,IAHY,CAAnB;;AAKA,WAAK8P,KAAL,GAAa,EAAb;AACD;;;wDAMmC;AAClC,aAAO,KAAKA,KAAZ;AACD;;;wBANkB;AACjB,aAAO,KAAP;AACD;;;;EA3DgB2E,I;;AAiEnB,CAAChT,QAAQC,MAAR,CAAe,cAAf,EACE+V,QADF,CACW,eADX,EAC4B,YAAY;;AAErC,WAASC,UAAT,GAAuB;AACrB,QAAIC,eAAelL,SAASmL,QAAT,CAAkBC,KAAlB,CAAwB,GAAxB,CAAnB;AACA,QAAIC,SAASH,aAAaA,aAAa3a,MAAb,GAAsB,CAAnC,IAAwC,GAAxC,GAA8C2a,aAAaA,aAAa3a,MAAb,GAAsB,CAAnC,CAA3D;AACA,WAAO8a,MAAP;AACD;;AAED,MAAI/V,GAAJ;;AAEA,OAAKC,gBAAL,GAAwB,YAAW;AACjC,QAAG,CAACD,GAAJ,EAAS;AACPA,YAAMW,aAAaC,OAAb,CAAqB,QAArB,CAAN;AACA,UAAG,CAACZ,GAAJ,EAAS;AACPA,cAAM,8BAAN;AACD;AACF;AACD,WAAOA,GAAP;AACD,GARD;;AAWA,OAAKgW,IAAL,GAAY,UAAS/T,UAAT,EAAqBmQ,WAArB,EAAkClQ,YAAlC,EAAgD+T,QAAhD,EAA0D;AAClE,WAAO,IAAIC,aAAJ,CAAkBjU,UAAlB,EAA8BmQ,WAA9B,EAA2ClQ,YAA3C,EAAyD+T,QAAzD,CAAP;AACH,GAFD;;AAIA,WAASC,aAAT,CAAuBjU,UAAvB,EAAmCmQ,WAAnC,EAAgDlQ,YAAhD,EAA8D+T,QAA9D,EAAwE;;AAEtE,SAAKnN,IAAL,GAAY,EAAZ;AACA,SAAKqN,SAAL,GAAiBxV,aAAaC,OAAb,CAAqB,WAArB,CAAjB;;AAEA;;;;AAIA,SAAKuI,SAAL,GAAiB,YAAW;AAC1B,UAAG,CAACnJ,GAAJ,EAAS;AACPA,cAAMW,aAAaC,OAAb,CAAqB,QAArB,CAAN;AACA,YAAG,CAACZ,GAAJ,EAAS;AACPA,gBAAM,8BAAN;AACA,eAAKuK,SAAL,CAAevK,GAAf;AACD;AACF;AACD,aAAOA,GAAP;AACD,KATD;;AAWA,SAAKuK,SAAL,GAAiB,UAASvK,GAAT,EAAcoW,OAAd,EAAuB;AACtCzV,mBAAa0V,OAAb,CAAqB,QAArB,EAA+BrW,GAA/B;AACA,UAAGoW,OAAH,EAAY;AACVhe,eAAOsS,QAAP,CAAgBC,MAAhB;AACD;AACF,KALD;;AAQA;;;;AAIA,SAAKrE,cAAL,GAAsB,YAAW;AAC/B,aAAO3F,aAAaC,OAAb,CAAqB,KAArB,CAAP;AACD,KAFD;;AAIA,SAAK0V,MAAL,GAAc,YAAW;AACvB,aAAO3V,aAAaC,OAAb,CAAqB,MAArB,CAAP;AACD,KAFD;;AAIA,SAAK2V,qBAAL,GAA6B,UAAS9a,KAAT,EAAgBO,QAAhB,EAA0B;AACrD,UAAIwa,UAAUpE,YAAYqE,GAAZ,CAAgB,MAAhB,EAAwB,QAAxB,CAAd;AACAD,cAAQ5U,GAAR,CAAY,EAACnG,OAAOA,KAAR,EAAZ,EAA4B8C,IAA5B,CAAiC,UAASoJ,QAAT,EAAkB;AACjD3L,iBAAS2L,SAAS+O,KAAT,EAAT;AACD,OAFD,EAGClY,KAHD,CAGO,UAASmJ,QAAT,EAAkB;AACvB7J,gBAAQC,GAAR,CAAY,4BAAZ,EAA0C4J,QAA1C;AACA3L,iBAAS2L,SAASoD,IAAlB;AACD,OAND;AAOD,KATD;;AAWA,SAAK3I,cAAL,GAAsB,UAASpG,QAAT,EAAmB;AACvC,UAAG,CAAC2E,aAAaC,OAAb,CAAqB,KAArB,CAAJ,EAAiC;AAC/B5E,iBAAS,IAAT;AACA;AACD;AACDoW,kBAAYqE,GAAZ,CAAgB,eAAhB,EAAiC7U,GAAjC,GAAuCrD,IAAvC,CAA4C,UAASoJ,QAAT,EAAkB;AAC5D,YAAImB,OAAOnB,SAAS+O,KAAT,EAAX;AACAja,UAAEC,KAAF,CAAQ,KAAKoM,IAAb,EAAmBA,IAAnB;AACA9M;AACD,OAJ2C,CAI1CiC,IAJ0C,CAIrC,IAJqC,CAA5C,EAKCO,KALD,CAKO,UAASmJ,QAAT,EAAkB;AACvB7J,gBAAQC,GAAR,CAAY,4BAAZ,EAA0C4J,QAA1C;AACA3L,iBAAS2L,SAASoD,IAAlB;AACD,OARD;AASD,KAdD;;AAgBA,SAAKc,KAAL,GAAa,UAASpQ,KAAT,EAAgBC,QAAhB,EAA0BM,QAA1B,EAAoC;AAC/C,WAAKua,qBAAL,CAA2B9a,KAA3B,EAAkC,UAASkb,UAAT,EAAoB;AACpD,YAAG,CAACA,UAAJ,EAAgB;AACd3a,mBAAS,IAAT;AACA;AACD;AACDrB,cAAMxC,MAAN,CAAaye,4BAAb,CAA0Cna,EAAEC,KAAF,CAAQ,EAACjB,OAAOA,KAAR,EAAeC,UAAUA,QAAzB,EAAR,EAA4Cib,UAA5C,CAA1C,EAAmG,UAASza,IAAT,EAAc;AAC/G,eAAK2a,KAAL,CAAW3a,KAAKE,EAAhB;AACA,cAAIoa,UAAUpE,YAAYqE,GAAZ,CAAgB,cAAhB,CAAd;AACA,cAAIjW,SAAS,EAAC9E,UAAUQ,KAAKC,EAAhB,EAAoBV,OAAOA,KAA3B,EAAb;AACAgB,YAAEC,KAAF,CAAQ8Z,OAAR,EAAiBhW,MAAjB;AACAgW,kBAAQM,IAAR,GAAevY,IAAf,CAAoB,UAASoJ,QAAT,EAAkB;AACpChH,yBAAa0V,OAAb,CAAqB,KAArB,EAA4B1O,SAASjH,KAArC;AACAC,yBAAa0V,OAAb,CAAqB,MAArB,EAA6B1O,SAASxO,IAAtC;AACA6C,qBAAS2L,QAAT;AACD,WAJD,EAKCnJ,KALD,CAKO,UAASmJ,QAAT,EAAkB;AACvB3L,qBAAS2L,SAASoD,IAAlB;AACD,WAPD;AAQD,SAbkG,CAajG9M,IAbiG,CAa5F,IAb4F,CAAnG;AAcD,OAnBiC,CAmBhCA,IAnBgC,CAmB3B,IAnB2B,CAAlC;AAoBD,KArBD;;AAuBA,SAAKgO,QAAL,GAAgB,UAASxQ,KAAT,EAAgBC,QAAhB,EAA0BM,QAA1B,EAAoC;AAClDrB,YAAMxC,MAAN,CAAa4e,oCAAb,CAAkD,EAACrb,UAAUA,QAAX,EAAqBD,OAAOA,KAA5B,EAAlD,EAAsF,UAASS,IAAT,EAAc;AAClG,aAAK2a,KAAL,CAAW3a,KAAKE,EAAhB;AACAF,aAAKE,EAAL,GAAU,IAAV;AACA,YAAIoa,UAAUpE,YAAYqE,GAAZ,CAAgB,MAAhB,CAAd;AACA,YAAIjW,SAAS/D,EAAEC,KAAF,CAAQ,EAAChB,UAAUQ,KAAKC,EAAhB,EAAoBV,OAAOA,KAA3B,EAAR,EAA2CS,IAA3C,CAAb;AACAO,UAAEC,KAAF,CAAQ8Z,OAAR,EAAiBhW,MAAjB;AACAgW,gBAAQM,IAAR,GAAevY,IAAf,CAAoB,UAASoJ,QAAT,EAAkB;AACpChH,uBAAa0V,OAAb,CAAqB,KAArB,EAA4B1O,SAASjH,KAArC;AACAC,uBAAa0V,OAAb,CAAqB,MAArB,EAA6B1O,SAASxO,IAAtC;AACA6C,mBAAS2L,QAAT;AACD,SAJD,EAKCnJ,KALD,CAKO,UAASmJ,QAAT,EAAkB;AACvB3L,mBAAS2L,SAASoD,IAAlB;AACD,SAPD;AAQD,OAdqF,CAcpF9M,IAdoF,CAc/E,IAd+E,CAAtF;AAeD,KAhBD;;AAkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAK+Y,sBAAL,GAA8B,UAASvb,KAAT,EAAgBwb,YAAhB,EAA8BC,QAA9B,EAAwClb,QAAxC,EAAkD;AAC9E,UAAIwa,UAAUpE,YAAYqE,GAAZ,CAAgB,MAAhB,CAAd;AACA,UAAIjW,SAAS,EAAC9E,UAAUwb,SAAS/a,EAApB,EAAwB6O,uBAAuBkM,SAAS/a,EAAxD,EAA4D+O,kBAAkB+L,aAAa9a,EAA3F,EAA+FV,OAAOA,KAAtG,EAAb;AACAgB,QAAEC,KAAF,CAAQ8Z,OAAR,EAAiBhW,MAAjB;AACAgW,cAAQW,KAAR,GAAgB5Y,IAAhB,CAAqB,UAASoJ,QAAT,EAAkB;AACrC3L,iBAAS2L,QAAT;AACD,OAFD;AAGD,KAPD;;AAUA;;;;AAIA,SAAK4K,WAAL,GAAmB,UAASC,QAAT,EAAmBxW,QAAnB,EAA6B;AAC9C,UAAIwa,UAAUpE,YAAYqE,GAAZ,CAAgB,OAAhB,EAAyB,KAAKH,MAAL,EAAzB,CAAd;AACAE,cAAQhE,QAAR,GAAmBA,QAAnB;AACAgE,cAAQW,KAAR,GAAgB5Y,IAAhB,CAAqB,UAASoJ,QAAT,EAAkB;AACrC,aAAKmB,IAAL,CAAU0J,QAAV,GAAqB7K,SAAS6K,QAA9B;AACAxW,iBAAS2L,SAAS+O,KAAT,EAAT;AACD,OAHoB,CAGnBzY,IAHmB,CAGd,IAHc,CAArB;AAID,KAPD;;AAUA;;;;AAIA,SAAKmZ,YAAL,GAAoB,UAASjB,SAAT,EAAoB;AACtC,WAAKA,SAAL,GAAiBA,SAAjB;AACAxV,mBAAa0V,OAAb,CAAqB,WAArB,EAAkC,KAAKF,SAAvC;AACD,KAHD;;AAKA,SAAKkB,eAAL,GAAuB,UAASrb,QAAT,EAAiC;AAAA,UAAdsb,OAAc,uEAAJ,EAAI;;AACtD,WAAKC,2BAAL,CAAiC,UAASC,aAAT,EAAuB;AACtD,YAAG,CAAC,KAAKlR,cAAL,EAAJ,EAA2B;AACzB;AACApE,uBAAauV,eAAb;AACA,cAAGzb,QAAH,EAAa;AACXA;AACD;AACF;AACF,OARgC,CAQ/BiC,IAR+B,CAQ1B,IAR0B,CAAjC;;AAUA,UAAG,CAAC,KAAKqI,cAAL,EAAJ,EAA2B;AACzB;AACD;;AAED,UAAIoR,aAAaxV,aAAayV,aAAb,EAAjB;AACA,UAAInB,UAAUpE,YAAYqE,GAAZ,CAAgB,YAAhB,CAAd;AACAD,cAAQtC,KAAR,GAAgBzX,EAAE0Y,GAAF,CAAMuC,UAAN,EAAkB,UAAS7D,IAAT,EAAc;AAC9C,eAAO,KAAK+D,0BAAL,CAAgC/D,IAAhC,EAAsCyD,QAAQO,gBAA9C,CAAP;AACD,OAFiC,CAEhC5Z,IAFgC,CAE3B,IAF2B,CAAlB,CAAhB;;AAIA;;AAEA,UAAG,KAAKkY,SAAR,EAAmB;AACjBK,gBAAQsB,UAAR,GAAqB,KAAK3B,SAA1B;AACD;;AAEDK,cAAQM,IAAR,GAAevY,IAAf,CAAoB,UAASoJ,QAAT,EAAmB;AACrCzF,qBAAauV,eAAb;AACA,aAAKL,YAAL,CAAkBzP,SAASmQ,UAA3B;AACA7V,mBAAW6E,UAAX,CAAsB,oBAAtB,EAA4C,KAAKqP,SAAjD;;AAEA,aAAK4B,mBAAL,CAAyBpQ,SAASqQ,eAAlC,EAAmD,IAAnD;AACA;AACA,YAAIC,aAAa,CAAC,SAAD,EAAY,cAAZ,EAA4B,WAA5B,CAAjB;AACA,aAAKF,mBAAL,CAAyBpQ,SAASuQ,WAAlC,EAA+CD,UAA/C;;AAEA,aAAKV,2BAAL;;AAEA,YAAGvb,QAAH,EAAa;AACXA,mBAAS2L,QAAT;AACD;AACF,OAfmB,CAelB1J,IAfkB,CAeb,IAfa,CAApB,EAgBCO,KAhBD,CAgBO,UAASmJ,QAAT,EAAkB;AACvB7J,gBAAQC,GAAR,CAAY,cAAZ,EAA4B4J,QAA5B;AACA,YAAG3L,QAAH,EAAa;AACXA,mBAAS,EAAC0C,OAAO,YAAR,EAAT;AACD;AACF,OArBD;AAsBD,KAjDD;;AAmDA,SAAKgJ,IAAL,GAAY,UAAS1L,QAAT,EAAmB;AAC7B,WAAKqb,eAAL,CAAqBrb,QAArB,EAA+Bmc,SAA/B;AACD,KAFD;;AAIA,SAAKJ,mBAAL,GAA2B,UAASP,aAAT,EAAwBS,UAAxB,EAAoC;AAC7D,WAAKG,YAAL,CAAkBZ,aAAlB;AACA,aAAOtV,aAAamW,2CAAb,CAAyDb,aAAzD,EAAwES,UAAxE,CAAP;AACD,KAHD;;AAKA,SAAKL,0BAAL,GAAkC,UAAS/D,IAAT,EAAegE,gBAAf,EAAiC;AACjE,aAAO,KAAKS,aAAL,CAAmBzE,IAAnB,EAAyB,CAACA,KAAK0B,QAAL,EAA1B,EAA2CsC,gBAA3C,EAA6D,KAA7D,CAAP;AACD,KAFD;;AAIA,SAAKU,mBAAL,GAA2B,UAAS1E,IAAT,EAAerZ,SAAf,EAA0B;AACnD,aAAOiC,EAAEqX,IAAF,CAAO,KAAKwE,aAAL,CAAmBzE,IAAnB,EAAyBrZ,SAAzB,EAAoC,CAAC,YAAD,EAAe,YAAf,CAApC,EAAkE,IAAlE,CAAP,EAAgF,CAAC,SAAD,CAAhF,CAAP;AACD,KAFD;;AAIA,SAAKge,kBAAL,GAA0B,UAAS3E,IAAT,EAAerZ,SAAf,EAA0B;AAClD,aAAOiC,EAAEqX,IAAF,CAAO,KAAKwE,aAAL,CAAmBzE,IAAnB,EAAyBrZ,SAAzB,EAAoC,CAAC,YAAD,EAAe,YAAf,CAApC,EAAkE,IAAlE,CAAP,EAAgF,CAAC,SAAD,CAAhF,CAAP;AACD,KAFD;;AAIA,SAAK8d,aAAL,GAAqB,UAASzE,IAAT,EAAerZ,SAAf,EAA0Bqd,gBAA1B,EAA4CY,aAA5C,EAA2D;AAC9E,UAAIC,WAAWjc,EAAEkc,SAAF,CAAY9E,IAAZ,CAAf;;AAEA/V,cAAQ8a,MAAR,CAAe,CAAC/E,KAAKnP,KAArB,EAA4B,6CAA5B,EAA2EmP,KAAKnP,KAAhF;;AAEA,UAAIlE,SAAS,EAACrH,MAAM0a,KAAK1a,IAAZ,EAAkB6X,cAAc6C,KAAK7C,YAArC;AACX3J,2BAAmBwM,KAAKxM,iBADb,EACgCwR,SAAShF,KAAKgF,OAD9C,EAAb;;AAGA,UAAGre,SAAH,EAAc;AACZ,aAAKse,iBAAL,CAAuBJ,QAAvB,EAAiC,KAAKK,UAAL,EAAjC;AACAvY,eAAO0S,OAAP,GAAiBwF,SAASxF,OAA1B;AACA1S,eAAOuT,YAAP,GAAsB2E,SAAS3E,YAA/B;AACAvT,eAAOwY,SAAP,GAAmBN,SAASM,SAA5B;AACD,OALD,MAMK;AACHxY,eAAO0S,OAAP,GAAiBuF,gBAAgBC,SAASO,+BAAT,EAAhB,GAA6D,QAAQte,MAAMxC,MAAN,CAAa+gB,MAAb,CAAoBjF,KAAKkF,SAAL,CAAeT,SAASO,+BAAT,EAAf,CAApB,CAAtF;AACA,YAAG,CAACR,aAAJ,EAAmB;AACjBjY,iBAAOuT,YAAP,GAAsB,IAAtB;AACAvT,iBAAOwY,SAAP,GAAmB,IAAnB;AACD;AACF;;AAED,UAAGnB,gBAAH,EAAqB;AACnBpb,UAAEC,KAAF,CAAQ8D,MAAR,EAAgB/D,EAAE2c,IAAF,CAAOvF,IAAP,EAAagE,gBAAb,CAAhB;AACD;;AAED,aAAOrX,MAAP;AACD,KA3BD;;AA6BA,SAAK2H,SAAL,GAAiB,UAAS0L,IAAT,EAAe7X,QAAf,EAAyB;AACxC,UAAG,CAAC,KAAKsK,cAAL,EAAJ,EAA2B;AACzBsB,cAAM,iCAAN;AACA;AACD;;AAED,UAAIyR,UAAU,YAAW;AACvBxF,aAAKxM,iBAAL,GAAyB,QAAzB;AACA,YAAIiS,cAAc,CAACzF,IAAD,EAAO0F,MAAP,CAAc1F,KAAK2F,iCAAL,MAA4C,EAA1D,CAAlB;AACAF,oBAAYjN,OAAZ,CAAoB,UAASoN,aAAT,EAAuB;AACzCA,wBAAchS,QAAd,CAAuB,IAAvB;AACD,SAFD;AAGA,aAAKC,IAAL;AACD,OAPa,CAOZzJ,IAPY,CAOP,IAPO,CAAd;;AASA,UAAG,CAAC,KAAK6K,IAAL,CAAU0J,QAAd,EAAwB;AACtByD,iBAASyD,IAAT,CAAc;AACZC,oBAAU,+BADE;AAEZnY,sBAAY,mBAFA;AAGZoY,mBAAS;AACP5d,sBAAU,oBAAW;AACnB,qBAAOqd,OAAP;AACD;AAHM,WAHG;AAQZQ,qBAAW,wBARC;AASZC,4BAAkB;AATN,SAAd;AAWD,OAZD,MAYO;AACLT;AACD;AACF,KA9BD;;AAgCA,SAAKhR,WAAL,GAAmB,UAASwL,IAAT,EAAe7X,QAAf,EAAyB;AAC1C6X,WAAKxM,iBAAL,GAAyB,IAAzB;AACA,UAAIiS,cAAc,CAACzF,IAAD,EAAO0F,MAAP,CAAc1F,KAAK2F,iCAAL,MAA4C,EAA1D,CAAlB;AACAF,kBAAYjN,OAAZ,CAAoB,UAASoN,aAAT,EAAuB;AACzCA,sBAAchS,QAAd,CAAuB,IAAvB;AACD,OAFD;AAGA,WAAKC,IAAL,CAAU,IAAV;AACD,KAPD;;AASA;;;;AAIA,SAAKwF,cAAL,GAAsB,UAAS6M,UAAT,EAAqB/d,QAArB,EAA+B;AACnD,UAAI+O,OAAOkJ,KAAKta,KAAL,CAAWogB,UAAX,CAAX;AACAjc,cAAQC,GAAR,CAAY,gBAAZ,EAA8BgN,IAA9B;AACA,WAAKqN,YAAL,CAAkBrN,KAAKmJ,KAAvB;AACAhS,mBAAa8X,6BAAb,CAA2CjP,KAAKmJ,KAAhD;AACAhS,mBAAa+X,QAAb,CAAsB5N,OAAtB,CAA8B,UAASwH,IAAT,EAAc;AAC1CA,aAAKpM,QAAL,CAAc,IAAd;AACD,OAFD;AAGA,WAAK4P,eAAL,CAAqBrb,QAArB,EAA+B,EAAC6b,kBAAkB,CAAC,YAAD,EAAe,YAAf,CAAnB,EAA/B;AACD,KATD;;AAWA;;;;AAIA,SAAKnL,aAAL,GAAqB,UAASlS,SAAT,EAAoB;AACvC,UAAI0f,WAAW,IAAf;AACA,UAAIC,eAAe,UAAU5f,IAAV,EAAgB;AACjC,YAAIwQ,OAAO,IAAIqP,IAAJ,CAAS,CAAC7f,IAAD,CAAT,EAAiB,EAAC8f,MAAM,WAAP,EAAjB,CAAX;;AAEA;AACA;AACA,YAAIH,aAAa,IAAjB,EAAuB;AACrB9hB,iBAAOkiB,GAAP,CAAWC,eAAX,CAA2BL,QAA3B;AACD;;AAEDA,mBAAW9hB,OAAOkiB,GAAP,CAAWE,eAAX,CAA2BzP,IAA3B,CAAX;;AAEA;AACA,eAAOmP,QAAP;AACD,OAbkB,CAajBjc,IAbiB,CAaZ,IAbY,CAAnB;;AAeA,UAAIiW,QAAQzX,EAAE0Y,GAAF,CAAMjT,aAAauY,qBAAb,CAAmC,CAAC,KAAD,EAAQ,MAAR,CAAnC,CAAN,EAA2D,UAAS5G,IAAT,EAAc;AACnF,eAAO,KAAK0E,mBAAL,CAAyB1E,IAAzB,EAA+BrZ,SAA/B,CAAP;AACD,OAFsE,CAErEyD,IAFqE,CAEhE,IAFgE,CAA3D,CAAZ;;AAIA,UAAI8M,OAAO;AACTmJ,eAAOA;AADE,OAAX;;AAIA,aAAOiG,aAAalG,KAAKkF,SAAL,CAAepO,IAAf,EAAqB,IAArB,EAA2B,CAA3B,CAA6B,kBAA7B,CAAb,CAAP;AACD,KA1BD;;AA8BA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAKA,SAAK4E,iBAAL,GAAyB,YAAW;AAClChP,mBAAa+Z,UAAb,CAAwB,OAAxB;AACA/Z,mBAAa+Z,UAAb,CAAwB,IAAxB;AACA/Z,mBAAa+Z,UAAb,CAAwB,KAAxB;AACA/Z,mBAAa+Z,UAAb,CAAwB,MAAxB;AACA/Z,mBAAa+Z,UAAb,CAAwB,WAAxB;AACD,KAND;;AAQA,SAAKC,eAAL,GAAuB,UAASC,MAAT,EAAiB;AACtC,aAAO3G,KAAKta,KAAL,CAAWsa,KAAKkF,SAAL,CAAeyB,MAAf,CAAX,CAAP;AACD,KAFD;;AAIA,SAAKrD,2BAAL,GAAmC,UAASvb,QAAT,EAAmB;AACpD,UAAIkY,QAAQzX,EAAE0Y,GAAF,CAAMjT,aAAa+X,QAAnB,EAA6B,UAASpG,IAAT,EAAc;AACrD,eAAO,KAAKyE,aAAL,CAAmBzE,IAAnB,EAAyB,KAAKvN,cAAL,EAAzB,EAAgD,CAAC,YAAD,EAAe,YAAf,CAAhD,EAA8E,KAA9E,CAAP;AACD,OAFwC,CAEvCrI,IAFuC,CAElC,IAFkC,CAA7B,CAAZ;AAGA;AACA,WAAK4c,mBAAL,CAAyB,OAAzB,EAAkC3G,KAAlC;AACA,UAAGlY,QAAH,EAAa;AACXA,iBAASkY,KAAT;AACD;AACF,KATD;;AAWA,SAAK2G,mBAAL,GAA2B,UAASthB,GAAT,EAAcuhB,KAAd,EAAqB;AAC9Cna,mBAAa0V,OAAb,CAAqB9c,GAArB,EAA0BmG,QAAQqb,MAAR,CAAeD,KAAf,CAA1B;AACD,KAFD;;AAIA,SAAKrN,cAAL,GAAsB,YAAW;AAC/B,UAAIyG,QAAQD,KAAKta,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,OAArB,CAAX,KAA6C,EAAzD;AACAsT,cAAQ,KAAK6D,mBAAL,CAAyB7D,KAAzB,EAAgC,IAAhC,CAAR;AACAxB,WAAKsI,eAAL,CAAqB9G,KAArB;AACD,KAJD;;AAMA;;;;AAIA,SAAK3N,eAAL,GAAuB,UAAS6J,KAAT,EAAgB;AACrCzP,mBAAa0V,OAAb,CAAqB,OAArB,EAA8BpC,KAAKkF,SAAL,CAAe/I,KAAf,CAA9B;AACD,KAFD;;AAIA,SAAKtK,UAAL,GAAkB,YAAW;AAC3BnF,mBAAa+Z,UAAb,CAAwB,OAAxB;AACD,KAFD;;AAIA,SAAKrK,QAAL,GAAgB,YAAW;AACzB,UAAI4K,cAActa,aAAaC,OAAb,CAAqB,OAArB,CAAlB;AACA,UAAG,CAACqa,WAAD,IAAgBA,eAAe,WAAlC,EAA+C;AAC7C,eAAO,IAAP;AACD;AACD,UAAIC,UAAUze,EAAEC,KAAF,CAAQ,EAACsU,cAAc,MAAf,EAAR,EAAgCiD,KAAKta,KAAL,CAAWshB,WAAX,CAAhC,CAAd;AACA,aAAO/Y,aAAa6O,UAAb,CAAwBmK,OAAxB,CAAP;AACD,KAPD;;AAUA;;;;AAIA,SAAKnC,UAAL,GAAkB,YAAW;AAC3B,UAAG,CAAC,KAAK3c,EAAT,EAAa;AACX,aAAKA,EAAL,GAAUuE,aAAaC,OAAb,CAAqB,IAArB,CAAV;AACD;AACD,aAAO,KAAKxE,EAAZ;AACD,KALD;;AAOA,SAAKya,KAAL,GAAa,UAASza,EAAT,EAAa;AACxBuE,mBAAa0V,OAAb,CAAqB,IAArB,EAA2Bja,EAA3B;AACD,KAFD;;AAIA,SAAKqO,OAAL,GAAe,YAAW;AACxB9J,mBAAa+Z,UAAb,CAAwB,KAAxB;AACA/Z,mBAAa+Z,UAAb,CAAwB,IAAxB;AACD,KAHD;;AAKA,SAAK5B,iBAAL,GAAyB,UAASjF,IAAT,EAAesH,SAAf,EAA0B;AACjD,UAAIC,WAAW,IAAf;AACA,UAAGvH,KAAKE,YAAR,EAAsB;AACpBqH,mBAAWzgB,MAAMxC,MAAN,CAAakjB,WAAb,CAAyBxH,KAAKE,YAA9B,EAA4CoH,SAA5C,CAAX;AACD,OAFD,MAEO;AACLC,mBAAWzgB,MAAMxC,MAAN,CAAamjB,2BAAb,EAAX;AACAzH,aAAKE,YAAL,GAAoBpZ,MAAMxC,MAAN,CAAaojB,WAAb,CAAyBH,QAAzB,EAAmCD,SAAnC,CAApB;AACD;;AAED,UAAIK,KAAK7gB,MAAMxC,MAAN,CAAasjB,cAAb,CAA4BL,QAA5B,CAAT;AACA,UAAIM,KAAK/gB,MAAMxC,MAAN,CAAawjB,eAAb,CAA6BP,QAA7B,CAAT;AACA,UAAIQ,mBAAmB,QAAQjhB,MAAMxC,MAAN,CAAaojB,WAAb,CAAyBtH,KAAKkF,SAAL,CAAetF,KAAKoF,+BAAL,EAAf,CAAzB,EAAiFuC,EAAjF,CAA/B;AACA,UAAIK,WAAWlhB,MAAMxC,MAAN,CAAa2jB,OAAb,CAAqBF,gBAArB,EAAuCF,EAAvC,CAAf;;AAEA7H,WAAKX,OAAL,GAAe0I,gBAAf;AACA/H,WAAKmF,SAAL,GAAiB6C,QAAjB;AACAhI,WAAKkI,uBAAL,GAA+B,KAA/B;AACD,KAjBD;;AAmBC,SAAKC,iBAAL,GAAyB,UAASnI,IAAT,EAAesH,SAAf,EAA0B;AACjD,UAAIC,WAAWzgB,MAAMxC,MAAN,CAAakjB,WAAb,CAAyBxH,KAAKE,YAA9B,EAA4CoH,SAA5C,CAAf;;AAEA,UAAIK,KAAK7gB,MAAMxC,MAAN,CAAasjB,cAAb,CAA4BL,QAA5B,CAAT;AACA,UAAIM,KAAK/gB,MAAMxC,MAAN,CAAawjB,eAAb,CAA6BP,QAA7B,CAAT;AACA,UAAIS,WAAWlhB,MAAMxC,MAAN,CAAa2jB,OAAb,CAAqBjI,KAAKX,OAA1B,EAAmCwI,EAAnC,CAAf;AACA,UAAGG,aAAahI,KAAKmF,SAAlB,IAA+B,CAACnF,KAAKmF,SAAxC,EAAmD;AACjDlb,gBAAQC,GAAR,CAAY,qCAAZ;AACA;AACD;;AAED,UAAImV,UAAUvY,MAAMxC,MAAN,CAAakjB,WAAb,CAAyBxH,KAAKX,OAAL,CAAalY,SAAb,CAAuB,CAAvB,EAA0B6Y,KAAKX,OAAL,CAAajY,MAAvC,CAAzB,EAAyEugB,EAAzE,CAAd;AACA3H,WAAKX,OAAL,GAAeA,OAAf;AACD,KAbD;;AAeA,SAAKkF,YAAL,GAAoB,UAASlE,KAAT,EAAgB;AAClC,UAAIiH,YAAY,KAAKpC,UAAL,EAAhB;AADkC;AAAA;AAAA;;AAAA;AAElC,8BAAiB7E,KAAjB,mIAAwB;AAAA,cAAfL,IAAe;;AACtB,cAAGA,KAAKgF,OAAL,IAAgB,IAAnB,EAAyB;AACvB;AACD;AACD,cAAIoD,WAAW,OAAOpI,KAAKX,OAAZ,KAAwB,QAAxB,IAAoCW,KAAKX,OAAL,YAAwB5P,MAA3E;AACA,cAAG2Y,QAAH,EAAa;AACX,gBAAGpI,KAAKX,OAAL,CAAalY,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,KAAgC,KAAhC,IAAyC6Y,KAAKE,YAAjD,EAA+D;AAC7D;AACA,mBAAKiI,iBAAL,CAAuBnI,IAAvB,EAA6BsH,SAA7B;AACD,aAHD,MAGO;AACL;AACAtH,mBAAKX,OAAL,GAAevY,MAAMxC,MAAN,CAAa+jB,YAAb,CAA0BrI,KAAKX,OAAL,CAAalY,SAAb,CAAuB,CAAvB,EAA0B6Y,KAAKX,OAAL,CAAajY,MAAvC,CAA1B,CAAf;AACD;AACF;AACF;AAhBiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiBnC,KAjBD;;AAmBA,SAAKkhB,wBAAL,GAAgC,UAASrT,IAAT,EAAesT,YAAf,EAA6BC,YAA7B,EAA2CrgB,QAA3C,EAAqD;AACnF,UAAIkY,QAAQhS,aAAa+X,QAAb,EAAZ;AACA/F,YAAM7H,OAAN,CAAc,UAASwH,IAAT,EAAc;AAC1B,YAAGA,KAAKX,OAAL,CAAalY,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,KAAgC,KAAhC,IAAyC6Y,KAAKE,YAAjD,EAA+D;AAC7D;AACA,cAAIqH,WAAWzgB,MAAMxC,MAAN,CAAakjB,WAAb,CAAyBxH,KAAKE,YAA9B,EAA4CsI,YAA5C,CAAf;AACA;AACAxI,eAAKE,YAAL,GAAoBpZ,MAAMxC,MAAN,CAAaojB,WAAb,CAAyBH,QAAzB,EAAmCgB,YAAnC,CAApB;AACD;AACF,OAPD;;AASA,WAAKE,cAAL,CAAoBxT,IAApB,EAA0BoL,KAA1B,EAAiC,UAASrO,OAAT,EAAkB;AACjD7J,iBAAS6J,OAAT;AACD,OAFgC,CAE/B5H,IAF+B,CAE1B,IAF0B,CAAjC;AAGD,KAdD;AAeD;AACL,CArjBA;AAsjBD,CAACyB,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,aAFZ,EAE2B,CAAC,UAAD,EAAa,UAASC,QAAT,EAAmB;AACxD,SAAO;AACLC,cAAU,GADL;AAELC,WAAO;AACL+Z,mBAAa;AADR,KAFF;AAKLzZ,UAAO,cAASyK,MAAT,EAAiBiP,QAAjB,EAA2B;AAChCla,eAAS,YAAW;AAClB,YAAGiL,OAAOgP,WAAV,EAAuB;AACrBC,mBAAS,CAAT,EAAYnX,KAAZ;AACD;AACF,OAJD;AAKD;AAXI,GAAP;AAaD,CAdyB,CAF3B;AAiBD;IAAOoX,wB;AAEL,sCAAc;AAAA;;AACZ,SAAKla,QAAL,GAAgB,GAAhB;AACA,SAAKhB,WAAL,GAAmB,0CAAnB;AACA,SAAKiB,KAAL,GAAa;AACXqR,YAAM;AADK,KAAb;AAGD;;;;+BAEUtG,M,EAAQrL,Y,EAAcqC,gB,EAAkB;AACjDgJ,aAAOmP,UAAP,GAAoBnY,iBAAiBO,yBAAjB,CAA2CyI,OAAOsG,IAAlD,CAApB;;AAEAtG,aAAOtD,aAAP,GAAuB,UAASH,MAAT,EAAiBC,SAAjB,EAA4B;AACjDD,eAAOE,OAAP,GAAiB,IAAjB;AACAzF,yBAAiB0F,aAAjB,CAA+BH,MAA/B,EAAuCC,SAAvC,EAAkDwD,OAAOsG,IAAzD,EAA+D,UAASlM,QAAT,EAAkB;AAC/EmC,iBAAOE,OAAP,GAAiB,KAAjB;AACD,SAFD;AAGD,OALD;;AAOAuD,aAAOoP,sBAAP,GAAgC,UAAS5S,SAAT,EAAoB;AAClD,eAAOxF,iBAAiBqY,0BAAjB,CAA4C7S,SAA5C,IAAyD,WAAzD,GAAuE,WAA9E;AACD,OAFD;AAID;;;;;;AAKHrK,QAAQC,MAAR,CAAe,cAAf,EAA+B0C,SAA/B,CAAyC,0BAAzC,EAAqE;AAAA,SAAM,IAAIoa,wBAAJ,EAAN;AAAA,CAArE;AACA,CAAC/c,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,WAFZ,EAEyB,YAAW;AACnC,SAAQ;AACNG,WAAO;AACLG,YAAM;AADD,KADD;AAING,UAAM,cAASN,KAAT,EAAgBpC,OAAhB,EAAyB;AAC7B;AACA,UAAIyc,KAAKzc,QAAQ,CAAR,CAAT;;AAEAyc,SAAGC,SAAH,GAAe,IAAf;;AAEAD,SAAG9Y,gBAAH,CACE,WADF,EAEE,UAASkJ,CAAT,EAAY;AACVA,UAAE8P,YAAF,CAAeC,aAAf,GAA+B,MAA/B;AACA/P,UAAE8P,YAAF,CAAeE,OAAf,CAAuB,MAAvB,EAA+BhJ,KAAKkF,SAAL,CAAe3W,MAAMG,IAArB,CAA/B;AACA,aAAKua,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OAPH,EAQE,KARF;;AAWAN,SAAG9Y,gBAAH,CACE,SADF,EAEE,UAASkJ,CAAT,EAAY;AACV,aAAKiQ,SAAL,CAAexa,MAAf,CAAsB,MAAtB;AACA,eAAO,KAAP;AACD,OALH,EAME,KANF;AAQD;AA7BK,GAAR;AA+BD,CAlCA;;AAoCDhD,QACGC,MADH,CACU,cADV,EAEG0C,SAFH,CAEa,WAFb,EAE0B,YAAW;AACnC,SAAO;AACLG,WAAO;AACL4a,YAAM,GADD;AAELC,WAAK,GAFA;AAGLlP,WAAK;AAHA,KADF;AAMLrL,UAAM,cAASN,KAAT,EAAgBpC,OAAhB,EAAyB;AAC7B;AACA,UAAIyc,KAAKzc,QAAQ,CAAR,CAAT;;AAEAyc,SAAG9Y,gBAAH,CACE,UADF,EAEE,UAASkJ,CAAT,EAAY;AACVA,UAAE8P,YAAF,CAAeO,UAAf,GAA4B,MAA5B;AACA;AACA,YAAIrQ,EAAEvJ,cAAN,EAAsBuJ,EAAEvJ,cAAF;AACtB,aAAKwZ,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OARH,EASE,KATF;;AAYA,UAAII,UAAU,CAAd;;AAEAV,SAAG9Y,gBAAH,CACE,WADF,EAEE,UAASkJ,CAAT,EAAY;AACVsQ;AACA,aAAKL,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OANH,EAOE,KAPF;;AAUAN,SAAG9Y,gBAAH,CACE,WADF,EAEE,UAASkJ,CAAT,EAAY;AACVsQ;AACC,YAAIA,YAAY,CAAhB,EAAmB;AACjB,eAAKL,SAAL,CAAexa,MAAf,CAAsB,MAAtB;AACD;AACF,eAAO,KAAP;AACD,OARH,EASE,KATF;;AAYAma,SAAG9Y,gBAAH,CACE,MADF,EAEE,UAASkJ,CAAT,EAAY;AACV;AACA,YAAIA,EAAEuQ,eAAN,EAAuBvQ,EAAEuQ,eAAF;;AAEvB,aAAKN,SAAL,CAAexa,MAAf,CAAsB,MAAtB;;AAEA,YAAI+a,QAAQ,KAAKtkB,IAAjB;AACA,YAAIwJ,OAAO,IAAIyM,IAAJ,CAAS6E,KAAKta,KAAL,CAAWsT,EAAE8P,YAAF,CAAeW,OAAf,CAAuB,MAAvB,CAAX,CAAT,CAAX;AACAlb,cAAMmb,MAAN,CAAa,UAASnb,KAAT,EAAgB;AAC3B,cAAIob,KAAKpb,MAAM4a,IAAN,EAAT;AACA,cAAI,gBAAgB,OAAOQ,EAA3B,EAA+B;AAC7BA,eAAG3Q,CAAH,EAAMzK,MAAM2L,GAAZ,EAAiBxL,IAAjB;AACD;AACF,SALD;;AAOA,eAAO,KAAP;AACD,OAlBH,EAmBE,KAnBF;AAqBD;AAnEI,GAAP;AAqED,CAxED;AAyEA,CAACjD,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,YAFZ,EAE0B,YAAW;AAClC,SAAO;AACNE,cAAU,GADJ;AAENC,WAAO;AACLU,eAAS;AADJ,KAFD;AAKNJ,UAAM,cAAUN,KAAV,EAAiBpC,OAAjB,EAA0B;AAC/BA,cAAQyd,EAAR,CAAW,QAAX,EAAqB,UAAU1a,KAAV,EAAiB;AACpCX,cAAMmb,MAAN,CAAa,YAAU;AACrBnb,gBAAMU,OAAN,CAAc,EAAC0J,OAAOzJ,MAAM+C,MAAN,CAAa0G,KAArB,EAAd;AACD,SAFD;AAGD,OAJD;AAKA;AAXK,GAAP;AAaH,CAhBA;AAiBD,CAAClN,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,WAFZ,EAEyB,YAAW;AACjC,SAAO;AACLyb,aAAS,SADJ;AAELhb,UAAM,cAASN,KAAT,EAAgBpC,OAAhB,EAAyB4C,KAAzB,EAAgC+a,SAAhC,EAA2C;AAC/C,UAAIC,YAAY,SAAZA,SAAY,CAASC,UAAT,EAAqB;AACnC,YAAIA,cAAc9F,SAAlB,EAA6B8F,aAAa,EAAb;AAC7B,YAAIC,aAAaD,WAAWxa,WAAX,EAAjB;AACA,YAAIya,eAAeD,UAAnB,EAA+B;AAC7BF,oBAAUI,aAAV,CAAwBD,UAAxB;AACAH,oBAAUK,OAAV;AACD;AACD,eAAOF,UAAP;AACD,OARD;AASAH,gBAAUM,QAAV,CAAmB7K,IAAnB,CAAwBwK,SAAxB;AACAA,gBAAUxb,MAAMQ,MAAMsb,OAAZ,CAAV;AACD;AAdI,GAAP;AAgBD,CAnBF;AAoBD,CAAC5e,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,eAFZ,EAE6B,CAAC,SAAD,EAAY,UAAUkc,OAAV,EAAmB;AACzD,SAAO;AACHhc,cAAU,GADP;AAEHO,UAAM,cAAUN,KAAV,EAAiBpC,OAAjB,EAA0B4C,KAA1B,EAAiC;AACnC5C,cAAQyd,EAAR,CAAW,OAAX,EAAoB,YAAY;AAC5B,YAAI,CAACU,QAAQC,YAAR,GAAuBtmB,QAAvB,EAAL,EAAwC;AACpC;AACA,eAAKumB,iBAAL,CAAuB,CAAvB,EAA0B,KAAK3D,KAAL,CAAW7f,MAArC;AACH;AACJ,OALD;AAMH;AATE,GAAP;AAWH,CAZ6B,CAF7B;AAeD,CAACyE,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,MAFZ,EAEoB,UAASC,QAAT,EAAmB;AACpC,SAAO;AACLC,cAAU,GADL;AAELf,gBAAY,gBAFP;AAGLD,iBAAa,+BAHR;AAILiB,WAAO;AACLG,YAAM;AADD;AAJF,GAAP;AAQD,CAXF,EAYEnB,UAZF,CAYa,gBAZb,EAY+B,UAAUS,UAAV,EAAsBsL,MAAtB,EAA8B3E,MAA9B,EAAsCtE,gBAAtC,EAAwD;AACpFiJ,SAAO/H,eAAP,GAAyB,YAAW;AAClC,WAAOlB,iBAAiBmB,UAAjB,CAA4BnB,iBAAiBoB,sBAAjB,CAAwC6H,OAAO5K,IAAP,CAAYpI,IAApD,CAA5B,CAAP;AACD,GAFD;AAGD,CAhBF;AAiBD,C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BDmF,QACKC,MADL,CACY,cADZ,EAC4B0C,SAD5B,CACsC,WADtC,EACmD,CAAC,UAAD,EAAa,UAAUC,QAAV,EAAoB;AAC5E,WAASoc,YAAT,CAAsBnR,MAAtB,EAA8BiP,QAA9B,EAAwCmC,MAAxC,EAAgD;AAC5C,QAAIC,QAAQ,IAAZ;AAAA,QACIC,eAAeF,OAAOE,YAAP,GAAsBC,aAAaH,OAAOE,YAApB,CAAtB,GAA0D,GAD7E;AAAA,QAEIE,YAAYJ,OAAOI,SAAP,IAAoB,GAFpC;AAAA,QAGIC,aAAaL,OAAOK,UAAP,IAAqBD,YAAY,CAHlD;AAAA,QAIIE,aAAaN,OAAOM,UAAP,GAAoBC,kBAAkBP,OAAOM,UAAzB,CAApB,GAA2D,KAJ5E;AAAA,QAKIE,SAASR,OAAOQ,MAAP,IAAiB,GAL9B;AAAA,QAMIC,cAAc,OAAOT,OAAOS,WAAd,KAA8B,WAA9B,GAA4CT,OAAOS,WAAP,KAAuB,MAAnE,GAA4E,IAN9F;AAAA,QAOIC,WAPJ;AAAA,QAQIC,SARJ;AAAA,QASItV,OATJ;AAAA,QAUIuV,QAVJ;;AAcA,QAAIhS,OAAOhT,IAAX,EAAiB;AACb,UAAIgT,OAAOhT,IAAP,YAAuBilB,KAA3B,EAAkC;AAC9BF,oBAAY/R,OAAOhT,IAAnB;AACA8kB,sBAAcC,UAAU,CAAV,CAAd;AACH,OAHD,MAGO;AACHD,sBAAc9R,OAAOhT,IAArB;AACH;AACJ;AACD,QAAI,OAAOgT,OAAOkS,KAAd,KAAwB,WAAxB,IAAuClS,OAAOkS,KAAlD,EAAyD;AACrDC;AACH;;AAED,aAASA,SAAT,GAAqB;AACjBd,cAAQtc,SAAS,YAAY;AACzBqd,iBAASnD,QAAT,EAAmB,CAAnB,EAAsB,CAAtB,EAAyB6C,WAAzB;AACH,OAFO,EAELR,YAFK,CAAR;AAGH;;AAED,aAASc,QAAT,CAAkBvf,OAAlB,EAA2Bwf,SAA3B,EAAsCC,QAAtC,EAAgDtlB,IAAhD,EAAsD;AAClD,UAAIqlB,aAAarlB,KAAKU,MAAtB,EAA8B;AAC1B6kB,oBAAY1f,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkB4kB,SAAlB,IAA+BT,MAApD;AACAS;AACAhB,gBAAQtc,SAAS,YAAY;AACzBqd,mBAASvf,OAAT,EAAkBwf,SAAlB,EAA6BC,QAA7B,EAAuCtlB,IAAvC;AACH,SAFO,EAELwkB,SAFK,CAAR;AAGA;AACH,OAPD,MAOO;AACHa;;AAEA,YAAGrS,OAAOwS,iBAAV,EAA6B;AAC3BxS,iBAAOwS,iBAAP,GAA2BF,QAA3B;AACD;;AAED;AACA,YAAIP,aAAaO,WAAWP,UAAUrkB,MAAV,GAAmB,CAA/C,EAAkD;AAC9C2jB,kBAAQtc,SAAS,YAAY;AACzB0d,4BAAgB5f,OAAhB,EAAyBwf,SAAzB,EAAoCC,QAApC,EAA8CP,UAAUO,QAAV,CAA9C;AACH,WAFO,EAELtS,OAAO0S,cAFF,CAAR;AAGH,SAJD,MAIO;AACH,cAAI1S,OAAO2S,UAAX,EAAuB;AACnB3S,mBAAO2S,UAAP;AACH;AACDC,kBAAQ/f,OAAR,EAAiBwf,SAAjB,EAA4BP,WAA5B;AACH;AACJ;AACJ;;AAED,aAASc,OAAT,CAAiB/f,OAAjB,EAA0Bwf,SAA1B,EAAqC;AACjC,UAAIrlB,OAAO6F,QAAQ7F,IAAR,GAAeS,SAAf,CAAyB,CAAzB,EAA4BoF,QAAQ7F,IAAR,GAAeU,MAAf,GAAwB,CAApD,CAAX;AACA,UAAImkB,WAAJ,EAAiB;AACb,YAAIH,UAAJ,EAAgB;AACZM,qBAAW,yCAAyCN,UAAzC,GAAsD,6CAAtD,GAAsGA,UAAtG,GAAmH,YAAnH,GACP,kCADO,GAC8BA,UAD9B,GAC2C,2CAD3C,GACyFA,UADzF,GACsG,aADtG,GAEP,8BAFO,GAE0BA,UAF1B,GAEuC,YAFlD;AAGAa,sBAAY1f,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkB4kB,SAAlB,IAA+B,6BAA/B,GAA+DL,QAA/D,GAA0E,IAA1E,GAAiFJ,MAAjF,GAA0F,SAA/G;AACH,SALD,MAKO;AACHW,sBAAY1f,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkB4kB,SAAlB,IAA+B,sBAA/B,GAAwDT,MAAxD,GAAiE,SAAtF;AACH;AACJ,OATD,MASO;AACHW,oBAAY1f,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkB4kB,SAAlB,CAArB;AACH;AACJ;;AAED,aAASI,eAAT,CAAyB5f,OAAzB,EAAkCwf,SAAlC,EAA6CC,QAA7C,EAAuDR,WAAvD,EAAoE;AAClE,UAAGO,aAAa,CAAhB,EAAmB;AACjB,YAAGrS,OAAO6S,UAAV,EAAsB;AACpB7S,iBAAO6S,UAAP;AACD;AACF;AACC,UAAIR,YAAY,CAAhB,EAAmB;AACfP,sBAAcA,YAAY9hB,KAAZ,CAAkB,CAAlB,EAAqB,CAAC,CAAtB,CAAd;AACA;AACAuiB,oBAAY1f,OAAZ,EAAqBif,cAAcF,MAAnC;AACAS;AACAhB,gBAAQtc,SAAS,YAAY;AACzB0d,0BAAgB5f,OAAhB,EAAyBwf,SAAzB,EAAoCC,QAApC,EAA8CR,WAA9C;AACH,SAFO,EAELL,UAFK,CAAR;AAGA;AACH,OATD,MASO;AACHa;AACAR,sBAAcC,UAAUO,QAAV,CAAd;AACAjB,gBAAQtc,SAAS,YAAY;AACzBqd,mBAASvf,OAAT,EAAkB,CAAlB,EAAqByf,QAArB,EAA+BR,WAA/B;AACH,SAFO,EAELN,SAFK,CAAR;AAGH;AACJ;;AAED,aAASD,YAAT,CAAsB7Z,KAAtB,EAA6B;AACzB,UAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;AAC3B,eAAOA,MAAMwP,MAAN,CAAaxP,MAAMhK,MAAN,GAAe,CAA5B,MAAmC,GAAnC,GAAyColB,SAASpb,MAAMjK,SAAN,CAAgB,CAAhB,EAAmBiK,MAAMhK,MAAN,GAAe,CAAlC,CAAT,EAA+C,EAA/C,IAAqD,IAA9F,GAAqG,CAACgK,KAA7G;AACH,OAFD,MAEO;AACH,eAAO,KAAP;AACH;AACJ;;AAED,aAASia,iBAAT,CAA2Bja,KAA3B,EAAkC;AAC9B,UAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;AAC3B,eAAOA,MAAMwP,MAAN,CAAaxP,MAAMhK,MAAN,GAAe,CAA5B,MAAmC,GAAnC,GAAyCgK,KAAzC,GAAiDob,SAASpb,MAAMjK,SAAN,CAAgB,CAAhB,EAAmBiK,MAAMhK,MAAN,GAAe,CAAlC,CAAT,EAA+C,EAA/C,IAAqD,IAA7G;AACH;AACJ;;AAED,aAAS6kB,WAAT,CAAqB1f,OAArB,EAA8B0a,KAA9B,EAAqC;AACjC,UAAI1a,QAAQkgB,IAAR,CAAa,UAAb,EAAyBhiB,WAAzB,OAA2C,OAA/C,EAAwD;AACpD,eAAO8B,QAAQmgB,GAAR,CAAYzF,KAAZ,CAAP;AACH;AACD,aAAO1a,QAAQogB,IAAR,CAAa1F,KAAb,CAAP;AACH;;AAEDvN,WAAOvJ,GAAP,CAAW,UAAX,EAAuB,YAAY;AAC/B,UAAI4a,KAAJ,EAAW;AACPtc,iBAASyD,MAAT,CAAgB6Y,KAAhB;AACH;AACJ,KAJD;;AAMArR,WAAOrJ,MAAP,CAAc,OAAd,EAAuB,UAAUuc,MAAV,EAAkB;AACrC,UAAI,CAACzW,OAAD,IAAYyW,MAAhB,EAAwB;AACpBzW,kBAAU,CAACA,OAAX;AACA0V;AACH;AACJ,KALD;;AAOAnS,WAAOrJ,MAAP,CAAc,MAAd,EAAsB,UAAUuc,MAAV,EAAkBC,MAAlB,EAA0B;AAC9C,UAAG,EAAED,kBAAkBjB,KAApB,CAAH,EAA+B;AAC7BH,sBAAcoB,MAAd;AACAf;AACD;AACF,KALD;AAMH;;AAED,SAAO;AACHnd,cAAU,GADP;AAEHO,UAAM4b,YAFH;AAGHhmB,aAAS,IAHN;AAIH8J,WAAO;AACHjI,YAAM,GADH;AAEH2lB,kBAAY,GAFT;AAGHH,yBAAmB,GAHhB;AAIHE,sBAAgB,GAJb;AAKHG,kBAAY,GALT;AAMHX,aAAO;AANJ;AAJJ,GAAP;AAcH,CA/J8C,CADnD;AAiKA;IAAOkB,gB;AAEL,4BAAYvO,WAAZ,EAAyBlQ,YAAzB,EAAuCC,aAAvC,EAAsD;AAAA;;AAClD,SAAKiQ,WAAL,GAAmBA,WAAnB;AACA,SAAKlQ,YAAL,GAAoBA,YAApB;AACA,SAAKC,aAAL,GAAqBA,aAArB;AACA,SAAKye,uBAAL,GAA+B3M,KAAKta,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,yBAArB,CAAX,KAA+D,EAA9F;AACA,SAAKigB,mBAAL,GAA2B5M,KAAKta,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,qBAArB,CAAX,KAA2D,EAAtF;;AAEAsB,iBAAa4e,mBAAb,CAAiC,kBAAjC,EAAqD,WAArD,EAAkE,UAAS5M,KAAT,EAAe;AAAA;AAAA;AAAA;;AAAA;AAC/E,8BAAgBA,KAAhB,mIAAuB;AAAA,cAAd6M,GAAc;;;AAErBA,cAAIvmB,SAAJ,GAAgB,KAAKoiB,0BAAL,CAAgCmE,GAAhC,CAAhB;;AAFqB;AAAA;AAAA;;AAAA;AAIrB,kCAAmBA,IAAI9L,OAAvB,mIAAgC;AAAA,kBAAvBnL,MAAuB;;AAC9B,kBAAG,KAAK8W,uBAAL,CAA6B1P,QAA7B,CAAsCpH,OAAO9J,GAA7C,CAAH,EAAsD;AACpD,qBAAKghB,kBAAL,CAAwBlX,MAAxB,EAAgCiX,GAAhC;AACD;AACF;AARoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAStB;AAV8E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWhF,KAXiE,CAWhE9iB,IAXgE,CAW3D,IAX2D,CAAlE;AAYH;;;;8CAMyB4V,I,EAAM;AAC9B,aAAO,KAAK6I,UAAL,CAAgB7L,MAAhB,CAAuB,UAASkQ,GAAT,EAAa;AACzC,eAAOA,IAAIE,yBAAJ,CAA8BpN,IAA9B,EAAoC5Y,MAApC,GAA6C,CAApD;AACD,OAFM,CAAP;AAGD;;;kCAEa+E,G,EAAK;AAAA;AAAA;AAAA;;AAAA;AACjB,8BAAsB,KAAK0c,UAA3B,mIAAuC;AAAA,cAA9B3S,SAA8B;;AACrC,iBAAOtN,EAAEuS,IAAF,CAAOjF,UAAUkL,OAAjB,EAA0B,EAACjV,KAAKA,GAAN,EAA1B,CAAP;AACD;AAHgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIlB;;;+CAE0B+J,S,EAAW;AACpC,aAAO,CAAC,KAAK8W,mBAAL,CAAyB3P,QAAzB,CAAkCnH,UAAU/J,GAA5C,CAAR;AACD;;;oDAE+BxF,S,EAAWuP,S,EAAW;AACpD,UAAGvP,SAAH,EAAc;AACZiC,UAAE4Y,IAAF,CAAO,KAAKwL,mBAAZ,EAAiC9W,UAAU/J,GAA3C;AACD,OAFD,MAEO;AACL,aAAK6gB,mBAAL,CAAyBrN,IAAzB,CAA8BzJ,UAAU/J,GAAxC;AACD;;AAEDW,mBAAa0V,OAAb,CAAqB,qBAArB,EAA4CpC,KAAKkF,SAAL,CAAe,KAAK0H,mBAApB,CAA5C;;AAEA9W,gBAAUvP,SAAV,GAAsB,KAAKoiB,0BAAL,CAAgC7S,SAAhC,CAAtB;AACD;;;iCAEY/J,G,EAAKhE,Q,EAAU;AAC1B,WAAKklB,2BAAL,CAAiClhB,GAAjC,EAAsChE,QAAtC;AACD;;;oCAEe+N,S,EAAW;AAAA;AAAA;AAAA;;AAAA;AACzB,8BAAkBA,UAAUkL,OAA5B,mIAAqC;AAAA,cAA7BnL,MAA6B;;AACnCrN,YAAE4Y,IAAF,CAAO,KAAKwL,mBAAZ,EAAiC9W,SAAjC;AACA,cAAGD,OAAOqX,WAAV,EAAuB;AACrB,gBAAG,KAAKC,qBAAL,CAA2BtX,MAA3B,CAAH,EAAuC;AACrC,mBAAKuX,mBAAL,CAAyBvX,MAAzB;AACD;AACF;AACF;AARwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAUzB,WAAK5H,YAAL,CAAkBoN,kBAAlB,CAAqCvF,SAArC;AACA,WAAK5H,aAAL,CAAmBuF,IAAnB,CAAwB,IAAxB;AACD;;;gDAE2B1H,G,EAAKhE,Q,EAAU;AACzC,WAAKoW,WAAL,CAAiBkP,MAAjB,CAAwBthB,GAAxB,EAA6BA,GAA7B,EAAkC4B,GAAlC,GAAwCrD,IAAxC,CAA6C,UAASoJ,QAAT,EAAkB;AAC7D,YAAIoZ,MAAM,KAAKQ,uCAAL,CAA6CvhB,GAA7C,EAAkD2H,SAAS+O,KAAT,EAAlD,CAAV;AACA,YAAG1a,QAAH,EAAa;AACXA,mBAAS+kB,GAAT;AACD;AACF,OAL4C,CAK3C9iB,IAL2C,CAKtC,IALsC,CAA7C,EAMCO,KAND,CAMO,UAASmJ,QAAT,EAAkB;AACvB7J,gBAAQC,GAAR,CAAY,6BAAZ,EAA2C4J,QAA3C;AACA3L,iBAAS,IAAT;AACD,OATD;AAUD;;;4DAEuCgE,G,EAAKoV,oB,EAAsB;AACjE,UAAIrL,YAAYtN,EAAEuS,IAAF,CAAO,KAAK0N,UAAZ,EAAwB,EAAC1c,KAAKA,GAAN,EAAxB,CAAhB;AACA,UAAG+J,SAAH,EAAc;AACZA,kBAAUyX,8BAAV,CAAyCpM,oBAAzC;AACD,OAFD,MAEO;AACLrL,oBAAY,IAAIiL,SAAJ,CAAcI,oBAAd,CAAZ;AACArL,kBAAU/J,GAAV,GAAgBA,GAAhB;AACA+J,kBAAUtC,QAAV,CAAmB,IAAnB;AACA,aAAKvF,YAAL,CAAkBuM,OAAlB,CAA0B1E,SAA1B;AACA,aAAK5H,aAAL,CAAmBuF,IAAnB,CAAwB,IAAxB;AACD;;AAED,aAAOqC,SAAP;AACD;;;kDAE6B;AAAA;AAAA;AAAA;;AAAA;AAC5B,8BAAgB,KAAK6W,uBAArB,mIAA8C;AAAA,cAArC5gB,GAAqC;;AAC5C,cAAI8J,SAAS,KAAK2X,aAAL,CAAmBzhB,GAAnB,CAAb;AACA,cAAG8J,MAAH,EAAW;AACT,iBAAKuX,mBAAL,CAAyBvX,MAAzB;AACD;AACF;AAN2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAQ5B,+BAAe,KAAK4S,UAApB,wIAAgC;AAAA,cAAxBqE,GAAwB;;AAC9B,eAAKG,2BAAL,CAAiCH,IAAI/gB,GAArC,EAA0C,UAAS+J,SAAT,EAAmB;AAC3DA,sBAAUtC,QAAV,CAAmB,IAAnB;AACD,WAFD;AAGD;AAZ2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAa7B;;;kCAEaqC,M,EAAQC,S,EAAW8J,I,EAAM7X,Q,EAAU;;AAE/C,UAAG,KAAK4gB,0BAAL,CAAgC7S,SAAhC,KAA8C,CAAC,KAAK5H,aAAL,CAAmBmE,cAAnB,EAAlD,EAAuF;AACrFsB,cAAM,2FAAN;AACA5L,iBAAS,IAAT;AACA;AACD;;AAED,cAAQ8N,OAAO8K,IAAf;AACE,aAAK,KAAL;AAAY;AACV,iBAAKxC,WAAL,CAAiBkP,MAAjB,CAAwBxX,OAAO9J,GAA/B,EAAoC8J,OAAO9J,GAA3C,EAAgD4B,GAAhD,GAAsDrD,IAAtD,CAA2D,UAASoJ,QAAT,EAAkB;AAC3EmC,qBAAOpL,KAAP,GAAe,KAAf;AACA,kBAAIwV,QAAQvM,SAASuM,KAArB;AACA,mBAAKhS,YAAL,CAAkB8X,6BAAlB,CAAgD9F,KAAhD;AACAlY,uBAASkY,KAAT;AACD,aAL0D,CAKzDjW,IALyD,CAKpD,IALoD,CAA3D,EAMCO,KAND,CAMO,UAASmJ,QAAT,EAAkB;AACvBmC,qBAAOpL,KAAP,GAAe,IAAf;AACD,aARD;;AAUA;AACD;;AAED,aAAK,MAAL;AAAa;AACX,gBAAIgjB,MAAMtpB,OAAOshB,IAAP,CAAY5P,OAAO9J,GAAnB,EAAwB,QAAxB,CAAV;AACA0hB,gBAAIrc,KAAJ;AACArJ;AACA;AACD;;AAED,aAAK,MAAL;AAAa;AACX,gBAAIwE,SAAS,EAAb;;AAEA,gBAAGsJ,OAAO8D,GAAV,EAAe;AACb,kBAAIsG,QAAQ,KAAKhS,YAAL,CAAkBuY,qBAAlB,CAAwC3Q,OAAO4K,aAA/C,CAAZ;AACAlU,qBAAO0T,KAAP,GAAeA,MAAMiB,GAAN,CAAU,UAAStB,IAAT,EAAc;AACrC,oBAAIrT,SAAS,KAAKmhB,qBAAL,CAA2B9N,IAA3B,EAAiC9J,SAAjC,CAAb;AACA,uBAAOvJ,MAAP;AACD,eAHwB,CAGvBvC,IAHuB,CAGlB,IAHkB,CAAV,CAAf;AAKD,aAPD,MAOO;AACLuC,qBAAOqT,IAAP,GAAc,KAAK8N,qBAAL,CAA2B9N,IAA3B,EAAiC9J,SAAjC,CAAd;AACD;;AAED,iBAAK6X,WAAL,CAAiB9X,MAAjB,EAAyBC,SAAzB,EAAoCvJ,MAApC,EAA4C,UAASmH,QAAT,EAAkB;AAC5D3L,uBAAS2L,QAAT;AACD,aAFD;;AAIA;AACD;;AAED;AAAS,WAER;AA7CH;;AAgDAmC,aAAOwK,YAAP,GAAsB,IAAIvb,IAAJ,EAAtB;AACD;;;0CAEqB+Q,M,EAAQ;AAC5B,aAAO,KAAK8W,uBAAL,CAA6B1P,QAA7B,CAAsCpH,OAAO9J,GAA7C,CAAP;AACD;;;wCAEmB8J,M,EAAQC,S,EAAW;AACrCtN,QAAE4Y,IAAF,CAAO,KAAKuL,uBAAZ,EAAqC9W,OAAO9J,GAA5C;AACAW,mBAAa0V,OAAb,CAAqB,yBAArB,EAAgDpC,KAAKkF,SAAL,CAAe,KAAKyH,uBAApB,CAAhD;AACA,WAAK1e,YAAL,CAAkB2f,wBAAlB,CAA2C/X,OAAO9J,GAAlD;;AAEAlC,cAAQ8a,MAAR,CAAe,KAAKwI,qBAAL,CAA2BtX,MAA3B,KAAsC,KAArD;AACD;;;uCAEkBA,M,EAAQC,S,EAAW;AACpC,UAAG,CAACtN,EAAEuS,IAAF,CAAO,KAAK4R,uBAAZ,EAAqC9W,OAAO9J,GAA5C,CAAJ,EAAsD;AACpD,aAAK4gB,uBAAL,CAA6BpN,IAA7B,CAAkC1J,OAAO9J,GAAzC;AACAW,qBAAa0V,OAAb,CAAqB,yBAArB,EAAgDpC,KAAKkF,SAAL,CAAe,KAAKyH,uBAApB,CAAhD;AACD;;AAED,UAAG9W,OAAOqX,WAAV,EAAuB;;AAErB,YAAGrX,OAAOqX,WAAP,IAAsB,OAAzB,EAAkC;AAChC,eAAKjf,YAAL,CAAkB4f,qBAAlB,CAAwChY,OAAO9J,GAA/C,EAAoD8J,OAAO4K,aAA3D,EAA0E,UAASqN,YAAT,EAAsB;AAC9F,iBAAKC,kBAAL,CAAwBlY,MAAxB,EAAgCC,SAAhC,EAA2CgY,YAA3C;AACD,WAFyE,CAExE9jB,IAFwE,CAEnE,IAFmE,CAA1E;AAGD;;AAED,YAAG6L,OAAOqX,WAAP,IAAsB,MAAzB,EAAiC;AAC/B;AACD;AAEF;AACF;;;gCAEWrX,M,EAAQC,S,EAAW9E,K,EAAO8c,Y,EAAc;AAClD,WAAKE,WAAL,GAAmB,KAAKA,WAAL,IAAoB,EAAvC;AACA,UAAGxlB,EAAEuS,IAAF,CAAO,KAAKiT,WAAZ,EAAyB,EAACjiB,KAAK8J,OAAO9J,GAAb,EAAzB,CAAH,EAAgD;AAC9C;AACD;;AAED;AACA,WAAKiiB,WAAL,CAAiBzO,IAAjB,CAAsB1J,MAAtB;;AAEA5E,iBAAW,YAAY;AACrB;AACA,aAAK8c,kBAAL,CAAwBlY,MAAxB,EAAgCC,SAAhC,EAA2CgY,YAA3C;AACAtlB,UAAE4Y,IAAF,CAAO,KAAK4M,WAAZ,EAAyBnY,MAAzB;AACD,OAJU,CAIT7L,IAJS,CAIJ,IAJI,CAAX,EAIcgH,QAAQ,IAJtB;AAKD;;;uCAEkB6E,M,EAAQC,S,EAAWgY,Y,EAAc;AAClD,UAAGjY,OAAOoY,cAAP,GAAwB,CAA3B,EAA8B;AAC5B,YAAI5N,eAAexK,OAAOwK,YAA1B;AACA,YAAI6N,gBAAgB,CAAC,IAAIppB,IAAJ,KAAaub,YAAd,IAA4B,IAAhD;AACA,YAAG6N,gBAAgBrY,OAAOoY,cAA1B,EAA0C;AACxC,cAAIjd,QAAQ6E,OAAOoY,cAAP,GAAwBC,aAApC;AACA,eAAKC,WAAL,CAAiBtY,MAAjB,EAAyBC,SAAzB,EAAoC9E,KAApC,EAA2C8c,YAA3C;AACA;AACD;AACF;;AAEDjY,aAAOwK,YAAP,GAAsB,IAAIvb,IAAJ,EAAtB;;AAEA+E,cAAQC,GAAR,CAAY,oBAAZ;;AAEA,UAAG+L,OAAO8K,IAAP,IAAe,MAAlB,EAA0B;AACxB,YAAIpU,SAAS,EAAb;AACAA,eAAO0T,KAAP,GAAe6N,aAAa5M,GAAb,CAAiB,UAAStB,IAAT,EAAc;AAC5C,cAAIrT,SAAS,KAAKmhB,qBAAL,CAA2B9N,IAA3B,EAAiC9J,SAAjC,CAAb;AACA,iBAAOvJ,MAAP;AACD,SAH+B,CAG9BvC,IAH8B,CAGzB,IAHyB,CAAjB,CAAf;AAIA,aAAK2jB,WAAL,CAAiB9X,MAAjB,EAAyBC,SAAzB,EAAoCvJ,MAApC,EAA4C,IAA5C;AACD,OAPD,MAOO;AACL;AACD;AACF;;;0CAEqBqT,I,EAAM9J,S,EAAW;AACrC,aAAO,KAAK5H,aAAL,CAAmBqW,kBAAnB,CAAsC3E,IAAtC,EAA4C,KAAK+I,0BAAL,CAAgC7S,SAAhC,CAA5C,CAAP;AACD;;;gCAEWD,M,EAAQC,S,EAAWvJ,M,EAAQxE,Q,EAAU;AAC/C,UAAIwa,UAAU,KAAKpE,WAAL,CAAiBkP,MAAjB,CAAwBxX,OAAO9J,GAA/B,EAAoC8J,OAAO9J,GAA3C,CAAd;AACAvD,QAAEC,KAAF,CAAQ8Z,OAAR,EAAiBhW,MAAjB;;AAEAgW,cAAQM,IAAR,GAAevY,IAAf,CAAoB,UAASoJ,QAAT,EAAkB;AACpCmC,eAAOpL,KAAP,GAAe,KAAf;AACA,YAAG1C,QAAH,EAAa;AACXA,mBAAS2L,SAAS+O,KAAT,EAAT;AACD;AACF,OALD,EAMClY,KAND,CAMO,UAASmJ,QAAT,EAAkB;AACvBmC,eAAOpL,KAAP,GAAe,IAAf;AACAZ,gBAAQC,GAAR,CAAY,wBAAZ,EAAsC4J,QAAtC;AACA,YAAG3L,QAAH,EAAa;AACXA,mBAAS,EAAC0C,OAAO,eAAR,EAAT;AACD;AACF,OAZD;AAaD;;;wBAzPgB;AACf,aAAO,KAAKwD,YAAL,CAAkBwa,UAAzB;AACD;;;;;;AA2PHhd,QAAQC,MAAR,CAAe,cAAf,EAA+B0iB,OAA/B,CAAuC,kBAAvC,EAA2D1B,gBAA3D;AACA,CAACjhB,QAAQC,MAAR,CAAe,cAAf,EACEkR,MADF,CACS,SADT,EACoB,UAAUyR,OAAV,EAAmB;AAClC,SAAO,UAAUpkB,KAAV,EAAiB;AACpB,WAAOA,QAAQokB,QAAQ,MAAR,EAAgB,IAAIvpB,IAAJ,CAASmF,KAAT,CAAhB,EAAiC,YAAjC,EAA+C,KAA/C,CAAR,GAAgE,EAAvE;AACH,GAFD;AAGH,CALF,EAME2S,MANF,CAMS,aANT,EAMwB,UAAUyR,OAAV,EAAmB;AACtC,SAAO,UAAUpkB,KAAV,EAAiB;AACpB,WAAOA,QAAQokB,QAAQ,MAAR,EAAgB,IAAIvpB,IAAJ,CAASmF,KAAT,CAAhB,EAAiC,mBAAjC,CAAR,GAAgE,EAAvE;AACH,GAFD;AAGH,CAVF;AAWD,CAACwB,QAAQC,MAAR,CAAe,cAAf,EACE0iB,OADF,CACU,kBADV,EAC8B,UAAUhe,IAAV,EAAgB;;AAE3Cke,SAAOC,UAAP,CAAkB;AAChBC,YAAQ,IADQ;AAEhBC,cAAU;AAFM,GAAlB;;AAKA,OAAKhd,sBAAL,GAA8B,UAASnL,IAAT,EAAe;AAC3C,QAAG,CAACA,IAAD,IAASA,KAAKU,MAAL,IAAe,CAA3B,EAA8B;AAC5B,aAAO,EAAP;AACD;AACD,WAAOsnB,OAAOhoB,IAAP,CAAP;AACD,GALD;;AAOA,OAAKkL,UAAL,GAAkB,UAASkd,SAAT,EAAoB;AACpC,WAAOte,KAAKue,WAAL,CAAiBD,SAAjB,CAAP;AACD,GAFD;AAKD,CApBF;AAqBD;IAAOE,Y;AAEL,0BAAc;AAAA;;AACZ,SAAK9U,KAAL,GAAa,EAAb;AACA,SAAKD,IAAL,GAAY,EAAZ;AACA,SAAKgV,iBAAL,GAAyB,EAAzB;AACA,SAAKC,mBAAL,GAA2B,EAA3B;AACA,SAAK7O,KAAL,GAAa,EAAb;AACA,SAAK8O,WAAL,GAAmB,EAAnB;AACD;;;;0CAcqBC,Y,EAAc;AAClC,aAAO,KAAK/O,KAAL,CAAWrD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AACrC,eAAO,CAACoP,aAAa/R,QAAb,CAAsB2C,KAAK7C,YAA3B,KAA4CiS,aAAa/R,QAAb,CAAsB,GAAtB,CAA7C,KAA4E,CAAC2C,KAAKnP,KAAzF;AACD,OAFM,CAAP;AAGD;;;6BAEQwe,M,EAAQ;AACf,aAAOzmB,EAAEuS,IAAF,CAAO,KAAKkF,KAAZ,EAAmB,EAAC/a,MAAM+pB,MAAP,EAAnB,CAAP;AACD;;;kDAE6BhP,K,EAAO;AACnC,aAAO,KAAKmE,2CAAL,CAAiDnE,KAAjD,EAAwD,IAAxD,CAAP;AACD;;;gEAE2CA,K,EAAO+D,U,EAAY;AAC7D,UAAIkL,SAAS,EAAb;AAD6D;AAAA;AAAA;;AAAA;AAE7D,+BAAqBjP,KAArB,wIAA4B;AAAA,cAAnBvB,QAAmB;;AAC1BA,qBAAWlW,EAAEqX,IAAF,CAAOnB,QAAP,EAAiBsF,cAAc,EAA/B,CAAX;AACA,cAAIpE,OAAO,KAAKuP,QAAL,CAAczQ,SAAS,MAAT,CAAd,CAAX;AACA,cAAGA,SAAS,SAAT,KAAuB,IAA1B,EAAgC;AAC5B,gBAAGkB,IAAH,EAAS;AACP,mBAAKtF,iBAAL,CAAuBsF,IAAvB;AACD;AACD;AACH;;AAEDpX,YAAEqX,IAAF,CAAOnB,QAAP,EAAiBsF,UAAjB;;AAEA,cAAG,CAACpE,IAAJ,EAAU;AACRA,mBAAO,KAAK9C,UAAL,CAAgB4B,QAAhB,CAAP;AACD,WAFD,MAEO;AACLkB,iBAAKjB,cAAL,CAAoBD,QAApB;AACD;;AAED,eAAKlE,OAAL,CAAaoF,IAAb;;AAEA,cAAGlB,SAASO,OAAZ,EAAqB;AACnB,iBAAKmQ,wBAAL,CAA8BxP,IAA9B;AACD;;AAEDsP,iBAAO3P,IAAP,CAAYK,IAAZ;AACD;AA3B4D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AA6B7D,WAAKyP,2BAAL,CAAiCH,MAAjC;;AAEA,WAAKI,SAAL;AACA,aAAOJ,MAAP;AACD;;;gDAE2BA,M,EAAQ;AAAA;AAAA;AAAA;;AAAA;AAClC,+BAAoB,KAAKL,iBAAzB,wIAA4C;AAAA,cAApCvP,QAAoC;;AAC1C,cAAIiQ,gBAAgBL,OAAOtS,MAAP,CAAc,UAASgD,IAAT,EAAc;AAAC,mBAAOA,KAAK7C,YAAL,IAAqBuC,SAAS8G,IAArC;AAA0C,WAAvE,CAApB;AACA,cAAGmJ,cAAcvoB,MAAd,GAAuB,CAA1B,EAA6B;AAC3BsY,qBAASvX,QAAT,CAAkBwnB,aAAlB;AACD;AACF;AANiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOnC;;;sDAEiCL,M,EAAQ;AAAA;AAAA;AAAA;;AAAA;AACxC,+BAAoB,KAAKJ,mBAAzB,wIAA8C;AAAA,cAAtCxP,QAAsC;;AAC5C,cAAIiQ,gBAAgBL,OAAOtS,MAAP,CAAc,UAASgD,IAAT,EAAc;AAC9C,mBAAON,SAASmB,aAAT,CAAuBxD,QAAvB,CAAgC2C,KAAK7C,YAArC,KAAsDuC,SAASmB,aAAT,CAAuBxD,QAAvB,CAAgC,GAAhC,CAA7D;AACD,WAFmB,CAApB;;AAIA,cAAGsS,cAAcvoB,MAAd,GAAuB,CAA1B,EAA6B;AAC3BsY,qBAASvX,QAAT,CAAkBwnB,aAAlB;AACD;AACF;AATuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUzC;;;+BAEU7Q,Q,EAAU;AACnB,UAAIkB,IAAJ;AACA,UAAGlB,SAAS3B,YAAT,IAAyB,MAA5B,EAAoC;AAClC6C,eAAO,IAAIzE,IAAJ,CAASuD,QAAT,CAAP;AACD,OAFD,MAEO,IAAGA,SAAS3B,YAAT,IAAyB,KAA5B,EAAmC;AACxC6C,eAAO,IAAIlG,GAAJ,CAAQgF,QAAR,CAAP;AACD,OAFM,MAEA,IAAGA,SAAS3B,YAAT,IAAyB,WAA5B,EAAyC;AAC9C6C,eAAO,IAAImB,SAAJ,CAAcrC,QAAd,CAAP;AACD,OAFM,MAEA;AACLkB,eAAO,IAAInB,IAAJ,CAASC,QAAT,CAAP;AACD;;AAEDkB,WAAK4P,WAAL,CAAiB,IAAjB,EAAuB,UAASC,WAAT,EAAqB;AAC1C,aAAKC,iCAAL,CAAuC,CAACD,WAAD,CAAvC;AACD,OAFsB,CAErBzlB,IAFqB,CAEhB,IAFgB,CAAvB;;AAIA,aAAO4V,IAAP;AACD;;;6BAEQK,K,EAAO;AACd,WAAKA,KAAL,GAAazX,EAAEmnB,IAAF,CAAO,KAAK1P,KAAL,CAAWqF,MAAX,CAAkBrF,KAAlB,CAAP,CAAb;;AAEAA,YAAM7H,OAAN,CAAc,UAASwH,IAAT,EAAc;AAC1B,YAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7B,cAAG,CAACvU,EAAEuS,IAAF,CAAO,KAAKlB,IAAZ,EAAkB,EAAC3U,MAAM0a,KAAK1a,IAAZ,EAAlB,CAAJ,EAA0C;AACxC,iBAAK2U,IAAL,CAAU2H,OAAV,CAAkB5B,IAAlB;AACD;AACF,SAJD,MAIO,IAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AACrC,cAAG,CAACvU,EAAEuS,IAAF,CAAO,KAAKjB,KAAZ,EAAmB,EAAC5U,MAAM0a,KAAK1a,IAAZ,EAAnB,CAAJ,EAA2C;AACzC,iBAAK4U,KAAL,CAAW0H,OAAX,CAAmB5B,IAAnB;AACD;AACF,SAJM,MAIA,IAAGA,KAAK7C,YAAL,IAAqB,WAAxB,EAAqC;AAC1C,cAAG,CAACvU,EAAEuS,IAAF,CAAO,KAAKgU,WAAZ,EAAyB,EAAC7pB,MAAM0a,KAAK1a,IAAZ,EAAzB,CAAJ,EAAiD;AAC/C,iBAAK6pB,WAAL,CAAiBvN,OAAjB,CAAyB5B,IAAzB;AACD;AACF;AACF,OAda,CAcZ5V,IAdY,CAcP,IAdO,CAAd;AAeD;;;4BAEO4V,I,EAAM;AACZ,WAAKgQ,QAAL,CAAc,CAAChQ,IAAD,CAAd;AACD;;;wCAEmBc,W,EAAa;AAC/B,aAAO,KAAKT,KAAL,CAAWrD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AACrC,eAAOA,KAAK7C,YAAL,IAAqB2D,WAA5B;AACD,OAFM,CAAP;AAGD;;;6CAEwBd,I,EAAM;AAC7B,UAAIT,gBAAgBS,KAAKT,aAAzB;AACA,UAAG,CAACA,cAAcO,UAAlB,EAA8B;AAC5B;AACD;;AAJ4B;AAAA;AAAA;;AAAA;AAM7B,+BAAqBP,cAAcO,UAAnC,wIAA+C;AAAA,cAAvCmQ,SAAuC;;AAC7C,cAAIC,iBAAiB,KAAKX,QAAL,CAAcU,UAAU3qB,IAAxB,CAArB;AACA,cAAG4qB,cAAH,EAAmB;AACjBlQ,iBAAKmQ,qBAAL,CAA2BD,cAA3B;AACAA,2BAAeC,qBAAf,CAAqCnQ,IAArC;AACD,WAHD,MAGO;AACL;AACD;AACF;AAd4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe9B;;;gCAEW;AACVnB,WAAKsI,eAAL,CAAqB,KAAKjN,KAA1B;;AAEA,WAAKD,IAAL,CAAUzB,OAAV,CAAkB,UAAS8B,GAAT,EAAa;AAC7BuE,aAAKsI,eAAL,CAAqB7M,IAAIJ,KAAzB;AACD,OAFD;AAGD;;;wCAEmBkW,E,EAAI5J,I,EAAMre,Q,EAAU;AACtC,WAAK8mB,iBAAL,CAAuBtP,IAAvB,CAA4B,EAACyQ,IAAIA,EAAL,EAAS5J,MAAMA,IAAf,EAAqBre,UAAUA,QAA/B,EAA5B;AACD;;;2CAEsBioB,E,EAAI;AACzBxnB,QAAEiG,MAAF,CAAS,KAAKogB,iBAAd,EAAiCrmB,EAAEuS,IAAF,CAAO,KAAK8T,iBAAZ,EAA+B,EAACmB,IAAIA,EAAL,EAA/B,CAAjC;AACD;;;0CAEqBA,E,EAAIvP,a,EAAe1Y,Q,EAAU;AACjD,WAAK+mB,mBAAL,CAAyBvP,IAAzB,CAA8B,EAACyQ,IAAIA,EAAL,EAASvP,eAAeA,aAAxB,EAAuC1Y,UAAUA,QAAjD,EAA9B;AACD;;;6CAEwBioB,E,EAAI;AAC3BxnB,QAAEiG,MAAF,CAAS,KAAKqgB,mBAAd,EAAmCtmB,EAAEuS,IAAF,CAAO,KAAK+T,mBAAZ,EAAiC,EAACkB,IAAIA,EAAL,EAAjC,CAAnC;AACD;;;oCAMe;AACd,aAAO,KAAK/P,KAAL,CAAWrD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AAAC,eAAOA,KAAKR,KAAL,IAAc,IAAd,IAAsB,CAACQ,KAAKnP,KAAnC;AAAyC,OAA1E,CAAP;AACD;;;sCAEiB;AAChB,WAAKiT,aAAL,GAAqBtL,OAArB,CAA6B,UAASwH,IAAT,EAAc;AACzCA,aAAKpM,QAAL,CAAc,KAAd;AACD,OAFD;AAGD;;;uCAEkBoM,I,EAAM;AACvBA,WAAKgF,OAAL,GAAe,IAAf;AACA,UAAG,CAAChF,KAAKnP,KAAT,EAAgB;AACdmP,aAAKpM,QAAL,CAAc,IAAd;AACD;AACDoM,WAAKqQ,sBAAL;AACD;;;sCAEiBrQ,I,EAAM;AACtBpX,QAAE4Y,IAAF,CAAO,KAAKnB,KAAZ,EAAmBL,IAAnB;;AAEA,UAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7BvU,UAAE4Y,IAAF,CAAO,KAAKvH,IAAZ,EAAkB+F,IAAlB;AACD,OAFD,MAEO,IAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AACrCvU,UAAE4Y,IAAF,CAAO,KAAKtH,KAAZ,EAAmB8F,IAAnB;AACD,OAFM,MAEA,IAAGA,KAAK7C,YAAL,IAAqB,WAAxB,EAAqC;AAC1CvU,UAAE4Y,IAAF,CAAO,KAAK2N,WAAZ,EAAyBnP,IAAzB;AACD;AACF;;AAED;;;;;;mDAI+BsQ,O,EAASC,O,EAAS;AAC/CD,cAAQH,qBAAR,CAA8BI,OAA9B;AACAA,cAAQJ,qBAAR,CAA8BG,OAA9B;;AAEAA,cAAQ1c,QAAR,CAAiB,IAAjB;AACA2c,cAAQ3c,QAAR,CAAiB,IAAjB;AACD;;;mDAE8B0c,O,EAASC,O,EAAS;AAC/CD,cAAQE,wBAAR,CAAiCD,OAAjC;AACAA,cAAQC,wBAAR,CAAiCF,OAAjC;;AAEAA,cAAQ1c,QAAR,CAAiB,IAAjB;AACA2c,cAAQ3c,QAAR,CAAiB,IAAjB;AACD;;;wBAhOc;AACb,aAAO,KAAKyM,KAAL,CAAWrD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AACrC,eAAO,CAACA,KAAKnP,KAAb;AACD,OAFM,CAAP;AAGD;;;wBAEgB;AACf,aAAO,KAAKse,WAAL,CAAiBnS,MAAjB,CAAwB,UAASkQ,GAAT,EAAa;AAC1C,eAAO,CAACA,IAAIlI,OAAZ;AACD,OAFM,CAAP;AAGD;;;wBAkKmB;AAClB,aAAOzJ,KAAKC,gBAAL,CAAsB,KAAKtB,KAA3B,CAAP;AACD;;;;;;AAqDHrO,QAAQC,MAAR,CAAe,cAAf,EAA+B0iB,OAA/B,CAAuC,cAAvC,EAAuDQ,YAAvD;AACA,CAACnjB,QAAQC,MAAR,CAAe,cAAf,EACE0iB,OADF,CACU,sBADV,EACkC,UAAUhe,IAAV,EAAgB;AAC/C;AACA,OAAKigB,UAAL,GAAkB,UAAUC,UAAV,EAAsBC,IAAtB,EAA4B;AAC5C9kB,YAAQ2M,OAAR,CAAgBkY,UAAhB,EAA4B,UAAUE,MAAV,EAAkBlrB,GAAlB,EAAuB;AACjD,UAAI,OAAOirB,KAAKjrB,GAAL,CAAP,KAAqB,WAAzB,EAAsC;AACpCirB,aAAKjrB,GAAL,EAAUmrB,SAAV;AACAF,aAAKjrB,GAAL,EAAUorB,YAAV,CAAuB,QAAvB,EAAiC,KAAjC;AACAH,aAAKjrB,GAAL,EAAUqrB,MAAV,CAAiBC,MAAjB,GAA0BxgB,KAAKue,WAAL,CAAiB6B,OAAOK,IAAP,CAAY,IAAZ,CAAjB,CAA1B;AACD;AACF,KAND;AAOD,GARD;;AAUA;AACA,OAAKC,WAAL,GAAmB,UAAUpd,QAAV,EAAoB6c,IAApB,EAA0B;AAC3C,QAAI7c,SAASmD,MAAT,KAAoB,GAAxB,EAA6B;AAC3B,WAAKwZ,UAAL,CAAgB3c,SAASoD,IAAzB,EAA+ByZ,IAA/B;AACD;AACF,GAJD;AAKH,CAnBA","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({email, password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback(_.merge({pw: pw, mk: mk, pw_nonce: pw_nonce}, defaults));\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText()));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n } else {\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"(Offline) — All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n if(apiController.isUserSignedIn()) {\n // signed out users have local autosave, dont need draft saving\n apiController.saveDraftToDisk(this.note);\n }\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n this.note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(apiController, extensionManager){\n return {\n restrict: 'E',\n scope: {\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$on(\"sync:updated_token\", function(){\n ctrl.syncUpdated();\n })\n }\n }\n })\n .controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) {\n\n this.user = apiController.user;\n this.extensionManager = extensionManager;\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n this.showExtensionsMenu = false;\n }\n\n this.toggleExtensions = function() {\n this.showAccountMenu = false;\n this.showExtensionsMenu = !this.showExtensionsMenu;\n }\n\n this.toggleExtensionForm = function() {\n this.newExtensionData = {};\n this.showNewExtensionForm = !this.showNewExtensionForm;\n }\n\n this.submitNewExtensionForm = function() {\n if(this.newExtensionData.url) {\n extensionManager.addExtension(this.newExtensionData.url, function(response){\n if(!response) {\n alert(\"Unable to register this extension. Make sure the link is valid and try again.\");\n } else {\n this.newExtensionData.url = \"\";\n this.showNewExtensionForm = false;\n }\n }.bind(this))\n }\n }\n\n this.selectedAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, null, function(response){\n action.running = false;\n if(response && response.error) {\n action.error = true;\n alert(\"There was an error performing this action. Please try again.\");\n } else {\n action.error = false;\n apiController.sync(null);\n }\n })\n }\n\n this.deleteExtension = function(extension) {\n if(confirm(\"Are you sure you want to delete this extension?\")) {\n extensionManager.deleteExtension(extension);\n }\n }\n\n this.reloadExtensionsPressed = function() {\n if(confirm(\"For your security, reloading extensions will disable any currently enabled repeat actions.\")) {\n extensionManager.refreshExtensionsFromServer();\n }\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(response && response.error) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.archiveEncryptionFormat = {encrypted: true};\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile(this.archiveEncryptionFormat.encrypted);\n link.click();\n }\n\n this.importFileSelected = function(files) {\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n apiController.importJSONData(e.target.result, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n // window.location.reload();\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n })\n }\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n apiController.loadLocalItems();\n $scope.allTag = new Tag({all: true});\n $scope.allTag.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n\n if($scope.selectedNote && $scope.selectedNote.dummy) {\n modelManager.removeItemLocally($scope.selectedNote);\n }\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addItem(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n tag.setDirty(true);\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.createRelationshipBetweenItems(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.setItemToBeDeleted(tag);\n // if no more notes, delete tag\n apiController.sync(function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addItem(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.createRelationshipBetweenItems($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n if(!$scope.didShowErrorAlert) {\n $scope.didShowErrorAlert = true;\n alert(\"There was an error saving your note. Please try again.\");\n }\n callback(false);\n } else {\n note.hasChanges = false;\n if(callback) {\n callback(true);\n }\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.setItemToBeDeleted(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n modelManager.removeItemLocally(note);\n return;\n }\n\n apiController.sync(null);\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n apiController.clearLocalStorage();\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!apiController.isUserSignedIn()) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = modelManager.createItem({content_type: \"Note\", dummy: true, text: \"\"});\n this.newNote.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function (modelManager) {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = modelManager.createItem({content_type: \"Tag\"});\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.title.length == 0) {\n tag.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.title || tag.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername($scope.formData.username, function(response){\n var username = response.username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n\n constructor(json_obj) {\n\n this.updateFromJSON(json_obj);\n\n this.observers = [];\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n get contentObject() {\n if(!this.content) {\n return {};\n }\n\n if(this.content !== null && typeof this.content === 'object') {\n // this is the case when mapping localStorage content, in which case the content is already parsed\n return this.content;\n }\n\n return JSON.parse(this.content);\n }\n\n updateFromJSON(json) {\n _.merge(this, json);\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(json.content) {\n this.mapContentToLocalProperties(this.contentObject);\n }\n }\n\n setDirty(dirty) {\n this.dirty = dirty;\n\n if(dirty) {\n this.notifyObserversOfChange();\n }\n }\n\n addObserver(observer, callback) {\n if(!_.find(this.observers, observer)) {\n this.observers.push({observer: observer, callback: callback});\n }\n }\n\n removeObserver(observer) {\n _.remove(this.observers, {observer: observer})\n }\n\n notifyObserversOfChange() {\n for(var observer of this.observers) {\n observer.callback(this);\n }\n }\n\n mapContentToLocalProperties(contentObj) {\n\n }\n\n createContentJSONFromProperties() {\n return this.structureParams();\n }\n\n referenceParams() {\n // must override\n }\n\n structureParams() {\n return {references: this.referenceParams()}\n }\n\n addItemAsRelationship(item) {\n // must override\n }\n\n removeItemAsRelationship(item) {\n // must override\n }\n\n removeAllRelationships() {\n // must override\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return null;\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Action {\n constructor(json) {\n _.merge(this, json);\n this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory\n this.error = false;\n if(this.lastExecuted) {\n // is string\n this.lastExecuted = new Date(this.lastExecuted);\n }\n }\n\n get permissionsString() {\n if(!this.permissions) {\n return \"\";\n }\n var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter\n permission += \": \";\n for(var contentType of this.content_types) {\n if(contentType == \"*\") {\n permission += \"All items\";\n } else {\n permission += contentType;\n }\n\n permission += \" \";\n }\n\n return permission;\n }\n\n get encryptionModeString() {\n if(this.verb != \"post\") {\n return null;\n }\n var encryptionMode = \"This action accepts data \";\n if(this.accepts_encrypted && this.accepts_decrypted) {\n encryptionMode += \"encrypted or decrypted.\";\n } else {\n if(this.accepts_encrypted) {\n encryptionMode += \"encrypted.\";\n } else {\n encryptionMode += \"decrypted.\";\n }\n }\n return encryptionMode;\n }\n\n}\n\nclass Extension extends Item {\n constructor(json) {\n super(json);\n _.merge(this, json);\n\n this.encrypted = true;\n this.content_type = \"Extension\";\n }\n\n actionsInGlobalContext() {\n return this.actions.filter(function(action){\n return action.context == \"global\";\n })\n }\n\n actionsWithContextForItem(item) {\n return this.actions.filter(function(action){\n return action.context == item.content_type || action.context == \"Item\";\n })\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.name = contentObject.name;\n this.url = contentObject.url;\n this.actions = contentObject.actions.map(function(action){\n return new Action(action);\n })\n }\n\n updateFromExternalResponseItem(externalResponseItem) {\n _.merge(this, externalResponseItem);\n this.actions = externalResponseItem.actions.map(function(action){\n return new Action(action);\n })\n }\n\n referenceParams() {\n return null;\n }\n\n structureParams() {\n var params = {\n name: this.name,\n url: this.url,\n actions: this.actions\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n this.text = contentObject.text;\n }\n\n referenceParams() {\n var references = _.map(this.tags, function(tag){\n return {uuid: tag.uuid, content_type: tag.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title,\n text: this.text\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, item)) {\n this.tags.push(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.tags.forEach(function(tag){\n _.pull(tag.notes, this);\n tag.setDirty(true);\n }.bind(this))\n this.tags = [];\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n safeText() {\n return this.text || \"\";\n }\n\n safeTitle() {\n return this.title || \"\";\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n }\n\n referenceParams() {\n var references = _.map(this.notes, function(note){\n return {uuid: note.uuid, content_type: note.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n if(!_.find(this.notes, item)) {\n this.notes.unshift(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.notes.forEach(function(note){\n _.pull(note.tags, this);\n note.setDirty(true);\n }.bind(this))\n\n this.notes = [];\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n referencesAffectedBySharingChange() {\n return this.notes;\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.user = {};\n this.syncToken = localStorage.getItem(\"syncToken\");\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.isUserSignedIn = function() {\n return localStorage.getItem(\"jwt\");\n }\n\n this.userId = function() {\n return localStorage.getItem(\"uuid\");\n }\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n _.merge(this.user, user);\n callback();\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({email: email, password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, keys);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n // this.changePassword = function(current_password, new_password) {\n // this.getAuthParamsForEmail(email, function(authParams){\n // if(!authParams) {\n // callback(null);\n // return;\n // }\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n // var data = {};\n // data.current_password = currentKeys.pw;\n // data.password = newKeys.pw;\n // data.password_confirmation = newKeys.pw;\n //\n // var user = this.user;\n //\n // this._performPasswordChange(currentKeys, newKeys, function(response){\n // if(response && !response.error) {\n // // this.showNewPasswordForm = false;\n // // reencrypt data with new mk\n // this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n // if(success) {\n // this.setMk(newKeys.mk);\n // alert(\"Your password has been changed and your data re-encrypted.\");\n // } else {\n // // rollback password\n // this._performPasswordChange(newKeys, currentKeys, function(response){\n // alert(\"There was an error changing your password. Your password has been rolled back.\");\n // window.location.reload();\n // })\n // }\n // }.bind(this));\n // } else {\n // // this.showNewPasswordForm = false;\n // alert(\"There was an error changing your password. Please try again.\");\n // }\n // }.bind(this))\n // }.bind(this));\n // }.bind(this));\n // }.bind(this));\n // }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(username, callback) {\n var request = Restangular.one(\"users\", this.userId());\n request.username = username;\n request.patch().then(function(response){\n this.user.username = response.username;\n callback(response.plain());\n }.bind(this))\n }\n\n\n /*\n Items\n */\n\n this.setSyncToken = function(syncToken) {\n this.syncToken = syncToken;\n localStorage.setItem(\"syncToken\", this.syncToken);\n }\n\n this.syncWithOptions = function(callback, options = {}) {\n this.writeAllItemsToLocalStorage(function(responseItems){\n if(!this.isUserSignedIn()) {\n // is not signed in\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n }\n }.bind(this))\n\n if(!this.isUserSignedIn()) {\n return;\n }\n\n var dirtyItems = modelManager.getDirtyItems();\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n // console.log(\"syncing items\", request.items);\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n this.writeAllItemsToLocalStorage();\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n if(callback) {\n callback({error: \"Sync error\"});\n }\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForExportFile = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForExtension = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n console.assert(!item.dummy, \"Item is dummy, should not have gotten here.\", item.dummy)\n\n var params = {uuid: item.uuid, content_type: item.content_type,\n presentation_name: item.presentation_name, deleted: item.deleted};\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.createContentJSONFromProperties() : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties()));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n this.shareItem = function(item, callback) {\n if(!this.isUserSignedIn()) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(jsonString, callback) {\n var data = JSON.parse(jsonString);\n console.log(\"importing data\", data);\n this.decryptItems(data.items);\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.allItems.forEach(function(item){\n item.setDirty(true);\n })\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(encrypted) {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.allItemsMatchingTypes([\"Tag\", \"Note\"]), function(item){\n return this.paramsForExportFile(item, encrypted);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n // this.mergeLocalDataRemotely = function(user, callback) {\n // var request = Restangular.one(\"users\", this.userId()).one(\"merge\");\n // var tags = user.tags;\n // request.items = user.items;\n // request.items.forEach(function(item){\n // if(item.tag_id) {\n // var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n // item.tag_name = tag.title;\n // }\n // })\n // request.post().then(function(response){\n // callback();\n // localStorage.removeItem('user');\n // })\n // }\n\n\n\n\n this.clearLocalStorage = function() {\n localStorage.removeItem(\"items\");\n localStorage.removeItem(\"mk\");\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"uuid\");\n localStorage.removeItem(\"syncToken\");\n }\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeAllItemsToLocalStorage = function(callback) {\n var items = _.map(modelManager.allItems, function(item){\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\"], false)\n }.bind(this));\n // console.log(\"Writing items to local\", items);\n this.writeToLocalStorage('items', items);\n if(callback) {\n callback(items);\n }\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItems = function() {\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n var jsonObj = _.merge({content_type: \"Note\"}, JSON.parse(draftString));\n return modelManager.createItem(jsonObj);\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n var isString = typeof item.content === 'string' || item.content instanceof String;\n if(isString) {\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, masterKey);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = modelManager.allItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;class ContextualExtensionsMenu {\n\n constructor() {\n this.restrict = \"E\";\n this.templateUrl = \"frontend/directives/contextual-menu.html\";\n this.scope = {\n item: \"=\"\n };\n }\n\n controller($scope, modelManager, extensionManager) {\n $scope.extensions = extensionManager.extensionsInContextOfItem($scope.item);\n\n $scope.executeAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, $scope.item, function(response){\n action.running = false;\n })\n }\n\n $scope.accessTypeForExtension = function(extension) {\n return extensionManager.extensionUsesEncryptedData(extension) ? \"encrypted\" : \"decrypted\";\n }\n\n }\n\n\n}\n\nangular.module('app.frontend').directive('contextualExtensionsMenu', () => new ContextualExtensionsMenu);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager, apiController) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.apiController = apiController;\n this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem(\"enabledRepeatActionUrls\")) || [];\n this.decryptedExtensions = JSON.parse(localStorage.getItem(\"decryptedExtensions\")) || [];\n\n modelManager.addItemSyncObserver(\"extensionManager\", \"Extension\", function(items){\n for (var ext of items) {\n\n ext.encrypted = this.extensionUsesEncryptedData(ext);\n\n for (var action of ext.actions) {\n if(this.enabledRepeatActionUrls.includes(action.url)) {\n this.enableRepeatAction(action, ext);\n }\n }\n }\n }.bind(this))\n }\n\n get extensions() {\n return this.modelManager.extensions;\n }\n\n extensionsInContextOfItem(item) {\n return this.extensions.filter(function(ext){\n return ext.actionsWithContextForItem(item).length > 0;\n })\n }\n\n actionWithURL(url) {\n for (var extension of this.extensions) {\n return _.find(extension.actions, {url: url})\n }\n }\n\n extensionUsesEncryptedData(extension) {\n return !this.decryptedExtensions.includes(extension.url);\n }\n\n changeExtensionEncryptionFormat(encrypted, extension) {\n if(encrypted) {\n _.pull(this.decryptedExtensions, extension.url);\n } else {\n this.decryptedExtensions.push(extension.url);\n }\n\n localStorage.setItem(\"decryptedExtensions\", JSON.stringify(this.decryptedExtensions))\n\n extension.encrypted = this.extensionUsesEncryptedData(extension);\n }\n\n addExtension(url, callback) {\n this.retrieveExtensionFromServer(url, callback);\n }\n\n deleteExtension(extension) {\n for(var action of extension.actions) {\n _.pull(this.decryptedExtensions, extension);\n if(action.repeat_mode) {\n if(this.isRepeatActionEnabled(action)) {\n this.disableRepeatAction(action);\n }\n }\n }\n\n this.modelManager.setItemToBeDeleted(extension);\n this.apiController.sync(null);\n }\n\n retrieveExtensionFromServer(url, callback) {\n this.Restangular.oneUrl(url, url).get().then(function(response){\n var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());\n if(callback) {\n callback(ext);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n callback(null);\n })\n }\n\n handleExtensionLoadExternalResponseItem(url, externalResponseItem) {\n var extension = _.find(this.extensions, {url: url});\n if(extension) {\n extension.updateFromExternalResponseItem(externalResponseItem);\n } else {\n extension = new Extension(externalResponseItem);\n extension.url = url;\n extension.setDirty(true);\n this.modelManager.addItem(extension);\n this.apiController.sync(null);\n }\n\n return extension;\n }\n\n refreshExtensionsFromServer() {\n for (var url of this.enabledRepeatActionUrls) {\n var action = this.actionWithURL(url);\n if(action) {\n this.disableRepeatAction(action);\n }\n }\n\n for(var ext of this.extensions) {\n this.retrieveExtensionFromServer(ext.url, function(extension){\n extension.setDirty(true);\n });\n }\n }\n\n executeAction(action, extension, item, callback) {\n\n if(this.extensionUsesEncryptedData(extension) && !this.apiController.isUserSignedIn()) {\n alert(\"To send data encrypted, you must have an encryption key, and must therefore be signed in.\");\n callback(null);\n return;\n }\n\n switch (action.verb) {\n case \"get\": {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n action.error = false;\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n .catch(function(response){\n action.error = true;\n })\n\n break;\n }\n\n case \"show\": {\n var win = window.open(action.url, '_blank');\n win.focus();\n callback();\n break;\n }\n\n case \"post\": {\n var params = {};\n\n if(action.all) {\n var items = this.modelManager.allItemsMatchingTypes(action.content_types);\n params.items = items.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n\n } else {\n params.item = this.outgoingParamsForItem(item, extension);\n }\n\n this.performPost(action, extension, params, function(response){\n callback(response);\n });\n\n break;\n }\n\n default: {\n\n }\n }\n\n action.lastExecuted = new Date();\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n _.pull(this.enabledRepeatActionUrls, action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n this.modelManager.removeItemChangeObserver(action.url);\n\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n if(!_.find(this.enabledRepeatActionUrls, action.url)) {\n this.enabledRepeatActionUrls.push(action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n }\n\n if(action.repeat_mode) {\n\n if(action.repeat_mode == \"watch\") {\n this.modelManager.addItemChangeObserver(action.url, action.content_types, function(changedItems){\n this.triggerWatchAction(action, extension, changedItems);\n }.bind(this))\n }\n\n if(action.repeat_mode == \"loop\") {\n // todo\n }\n\n }\n }\n\n queueAction(action, extension, delay, changedItems) {\n this.actionQueue = this.actionQueue || [];\n if(_.find(this.actionQueue, {url: action.url})) {\n return;\n }\n\n // console.log(\"Successfully queued\", action, this.actionQueue.length);\n this.actionQueue.push(action);\n\n setTimeout(function () {\n // console.log(\"Performing queued action\", action);\n this.triggerWatchAction(action, extension, changedItems);\n _.pull(this.actionQueue, action);\n }.bind(this), delay * 1000);\n }\n\n triggerWatchAction(action, extension, changedItems) {\n if(action.repeat_timeout > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeat_timeout) {\n var delay = action.repeat_timeout - diffInSeconds;\n this.queueAction(action, extension, delay, changedItems);\n return;\n }\n }\n\n action.lastExecuted = new Date();\n\n console.log(\"Performing action.\");\n\n if(action.verb == \"post\") {\n var params = {};\n params.items = changedItems.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n this.performPost(action, extension, params, null);\n } else {\n // todo\n }\n }\n\n outgoingParamsForItem(item, extension) {\n return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));\n }\n\n performPost(action, extension, params, callback) {\n var request = this.Restangular.oneUrl(action.url, action.url);\n _.merge(request, params);\n\n request.post().then(function(response){\n action.error = false;\n if(callback) {\n callback(response.plain());\n }\n })\n .catch(function(response){\n action.error = true;\n console.log(\"Action error response:\", response);\n if(callback) {\n callback({error: \"Request error\"});\n }\n })\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager {\n\n constructor() {\n this.notes = [];\n this.tags = [];\n this.itemSyncObservers = [];\n this.itemChangeObservers = [];\n this.items = [];\n this._extensions = [];\n }\n\n get allItems() {\n return this.items.filter(function(item){\n return !item.dummy;\n })\n }\n\n get extensions() {\n return this._extensions.filter(function(ext){\n return !ext.deleted;\n })\n }\n\n allItemsMatchingTypes(contentTypes) {\n return this.items.filter(function(item){\n return (contentTypes.includes(item.content_type) || contentTypes.includes(\"*\")) && !item.dummy;\n })\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null);\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.removeItemLocally(item)\n }\n continue;\n }\n\n _.omit(json_obj, omitFields);\n\n if(!item) {\n item = this.createItem(json_obj);\n } else {\n item.updateFromJSON(json_obj);\n }\n\n this.addItem(item);\n\n if(json_obj.content) {\n this.resolveReferencesForItem(item)\n }\n\n models.push(item)\n }\n\n this.notifySyncObserversOfModels(models);\n\n this.sortItems();\n return models;\n }\n\n notifySyncObserversOfModels(models) {\n for(var observer of this.itemSyncObservers) {\n var relevantItems = models.filter(function(item){return item.content_type == observer.type});\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n notifyItemChangeObserversOfModels(models) {\n for(var observer of this.itemChangeObservers) {\n var relevantItems = models.filter(function(item){\n return observer.content_types.includes(item.content_type) || observer.content_types.includes(\"*\");\n });\n\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n createItem(json_obj) {\n var item;\n if(json_obj.content_type == \"Note\") {\n item = new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n item = new Tag(json_obj);\n } else if(json_obj.content_type == \"Extension\") {\n item = new Extension(json_obj);\n } else {\n item = new Item(json_obj);\n }\n\n item.addObserver(this, function(changedItem){\n this.notifyItemChangeObserversOfModels([changedItem]);\n }.bind(this));\n\n return item;\n }\n\n addItems(items) {\n this.items = _.uniq(this.items.concat(items));\n\n items.forEach(function(item){\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, {uuid: item.uuid})) {\n this.tags.unshift(item);\n }\n } else if(item.content_type == \"Note\") {\n if(!_.find(this.notes, {uuid: item.uuid})) {\n this.notes.unshift(item);\n }\n } else if(item.content_type == \"Extension\") {\n if(!_.find(this._extensions, {uuid: item.uuid})) {\n this._extensions.unshift(item);\n }\n }\n }.bind(this))\n }\n\n addItem(item) {\n this.addItems([item])\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n resolveReferencesForItem(item) {\n var contentObject = item.contentObject;\n if(!contentObject.references) {\n return;\n }\n\n for(var reference of contentObject.references) {\n var referencedItem = this.findItem(reference.uuid);\n if(referencedItem) {\n item.addItemAsRelationship(referencedItem);\n referencedItem.addItemAsRelationship(item);\n } else {\n // console.log(\"Unable to find item:\", reference.uuid);\n }\n }\n }\n\n sortItems() {\n Item.sortItemsByDate(this.notes);\n\n this.tags.forEach(function(tag){\n Item.sortItemsByDate(tag.notes);\n })\n }\n\n addItemSyncObserver(id, type, callback) {\n this.itemSyncObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemSyncObserver(id) {\n _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));\n }\n\n addItemChangeObserver(id, content_types, callback) {\n this.itemChangeObservers.push({id: id, content_types: content_types, callback: callback});\n }\n\n removeItemChangeObserver(id) {\n _.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, {id: id}));\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n getDirtyItems() {\n return this.items.filter(function(item){return item.dirty == true && !item.dummy})\n }\n\n clearDirtyItems() {\n this.getDirtyItems().forEach(function(item){\n item.setDirty(false);\n })\n }\n\n setItemToBeDeleted(item) {\n item.deleted = true;\n if(!item.dummy) {\n item.setDirty(true);\n }\n item.removeAllRelationships();\n }\n\n removeItemLocally(item) {\n _.pull(this.items, item);\n\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n } else if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n } else if(item.content_type == \"Extension\") {\n _.pull(this._extensions, item);\n }\n }\n\n /*\n Relationships\n */\n\n createRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.addItemAsRelationship(itemTwo);\n itemTwo.addItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n\n removeRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.removeItemAsRelationship(itemTwo);\n itemTwo.removeItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file +{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","email","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","getCurrentUser","directive","$timeout","restrict","scope","save","remove","note","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","markdownRenderer","extensionManager","editorMode","safeText","dummy","focusTitle","hasChanges","hasAvailableExtensions","extensionsInContextOfItem","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","isUserSignedIn","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","setDirty","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","syncUpdated","$state","serverSideValidation","user","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","showExtensionsMenu","toggleExtensions","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","running","executeAction","deleteExtension","confirm","reloadExtensionsPressed","refreshExtensionsFromServer","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","archiveEncryptionFormat","downloadDataArchive","setAttribute","itemsDataFile","performImport","importJSONData","importData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","allTag","Tag","all","title","tags","notes","setInterval","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","selectedNote","removeItemLocally","tagsAddNew","addItem","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","createRelationshipBetweenItems","notesRemoveTag","validNotes","Note","filterDummyNotes","setItemToBeDeleted","notesSelectionMade","notesAddNew","didShowErrorAlert","headerLogout","clearLocalStorage","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","updateFromJSON","observers","generateUUID","json","created_at","updated_at","content","mapContentToLocalProperties","contentObject","dirty","notifyObserversOfChange","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","items","sort","b","Action","lastExecuted","permissions","permission","charAt","content_types","contentType","verb","encryptionMode","accepts_encrypted","accepts_decrypted","Extension","actions","context","map","externalResponseItem","pull","hasOnePublicTag","isPublic","filtered","unshift","provider","domainName","domain_comps","hostname","split","domain","$get","ngDialog","ApiController","syncToken","refresh","setItem","getAuthParams","userId","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","stringify","generateInitialEncryptionKeysForUser","_performPasswordChange","current_keys","new_keys","patch","setSyncToken","syncWithOptions","options","writeAllItemsToLocalStorage","responseItems","clearDirtyItems","dirtyItems","getDirtyItems","createRequestParamsForItem","additionalFields","sync_token","handleItemsResponse","retrieved_items","omitFields","saved_items","undefined","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","paramsForExportFile","paramsForExtension","forExportFile","itemCopy","cloneDeep","assert","deleted","encryptSingleItem","retrieveMk","auth_hash","createContentJSONFromProperties","base64","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","needingUpdate","open","template","resolve","className","disableAnimation","onDataReady","mapResponseItemsToLocalModels","allItems","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","removeItem","staticifyObject","object","writeToLocalStorage","value","toJson","sortItemsByDate","draftString","jsonObj","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","saveBatchItems","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","enabledRepeatActionUrls","decryptedExtensions","addItemSyncObserver","ext","enableRepeatAction","actionsWithContextForItem","retrieveExtensionFromServer","repeat_mode","isRepeatActionEnabled","disableRepeatAction","oneUrl","handleExtensionLoadExternalResponseItem","updateFromExternalResponseItem","actionWithURL","win","outgoingParamsForItem","performPost","removeItemChangeObserver","addItemChangeObserver","changedItems","triggerWatchAction","actionQueue","repeat_timeout","diffInSeconds","queueAction","service","$filter","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","itemSyncObservers","itemChangeObservers","_extensions","contentTypes","itemId","models","findItem","resolveReferencesForItem","notifySyncObserversOfModels","sortItems","relevantItems","addObserver","changedItem","notifyItemChangeObserversOfModels","uniq","addItems","reference","referencedItem","addItemAsRelationship","id","removeAllRelationships","itemOne","itemTwo","removeItemAsRelationship","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":"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","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk, pw_nonce: pw_nonce}, defaults);\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText()));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n } else {\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"(Offline) — All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n if(apiController.isUserSignedIn()) {\n // signed out users have local autosave, dont need draft saving\n apiController.saveDraftToDisk(this.note);\n }\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n this.note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(apiController, extensionManager){\n return {\n restrict: 'E',\n scope: {\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$on(\"sync:updated_token\", function(){\n ctrl.syncUpdated();\n })\n }\n }\n })\n .controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) {\n\n this.user = apiController.user;\n this.extensionManager = extensionManager;\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n this.showExtensionsMenu = false;\n }\n\n this.toggleExtensions = function() {\n this.showAccountMenu = false;\n this.showExtensionsMenu = !this.showExtensionsMenu;\n }\n\n this.toggleExtensionForm = function() {\n this.newExtensionData = {};\n this.showNewExtensionForm = !this.showNewExtensionForm;\n }\n\n this.submitNewExtensionForm = function() {\n if(this.newExtensionData.url) {\n extensionManager.addExtension(this.newExtensionData.url, function(response){\n if(!response) {\n alert(\"Unable to register this extension. Make sure the link is valid and try again.\");\n } else {\n this.newExtensionData.url = \"\";\n this.showNewExtensionForm = false;\n }\n }.bind(this))\n }\n }\n\n this.selectedAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, null, function(response){\n action.running = false;\n if(response && response.error) {\n action.error = true;\n alert(\"There was an error performing this action. Please try again.\");\n } else {\n action.error = false;\n apiController.sync(null);\n }\n })\n }\n\n this.deleteExtension = function(extension) {\n if(confirm(\"Are you sure you want to delete this extension?\")) {\n extensionManager.deleteExtension(extension);\n }\n }\n\n this.reloadExtensionsPressed = function() {\n if(confirm(\"For your security, reloading extensions will disable any currently enabled repeat actions.\")) {\n extensionManager.refreshExtensionsFromServer();\n }\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(response && response.error) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.archiveEncryptionFormat = {encrypted: true};\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile(this.archiveEncryptionFormat.encrypted);\n link.click();\n }\n\n this.performImport = function(data, password) {\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n this.importData = null;\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n }.bind(this))\n }\n\n this.submitImportPassword = function() {\n this.performImport(this.importData.data, this.importData.password);\n }\n\n this.importFileSelected = function(files) {\n this.importData = {};\n\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n var data = JSON.parse(e.target.result);\n $timeout(function(){\n if(data.auth_params) {\n // request password\n this.importData.requestPassword = true;\n this.importData.data = data;\n } else {\n this.performImport(data, null);\n }\n }.bind(this))\n }.bind(this)\n\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n apiController.loadLocalItems();\n $scope.allTag = new Tag({all: true});\n $scope.allTag.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n\n if($scope.selectedNote && $scope.selectedNote.dummy) {\n modelManager.removeItemLocally($scope.selectedNote);\n }\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addItem(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n tag.setDirty(true);\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.createRelationshipBetweenItems(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.setItemToBeDeleted(tag);\n // if no more notes, delete tag\n apiController.sync(function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addItem(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.createRelationshipBetweenItems($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n if(!$scope.didShowErrorAlert) {\n $scope.didShowErrorAlert = true;\n alert(\"There was an error saving your note. Please try again.\");\n }\n callback(false);\n } else {\n note.hasChanges = false;\n if(callback) {\n callback(true);\n }\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.setItemToBeDeleted(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n modelManager.removeItemLocally(note);\n return;\n }\n\n apiController.sync(null);\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n apiController.clearLocalStorage();\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!apiController.isUserSignedIn()) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = modelManager.createItem({content_type: \"Note\", dummy: true, text: \"\"});\n this.newNote.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function (modelManager) {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = modelManager.createItem({content_type: \"Tag\"});\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.title.length == 0) {\n tag.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.title || tag.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername($scope.formData.username, function(response){\n var username = response.username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n\n constructor(json_obj) {\n\n this.updateFromJSON(json_obj);\n\n this.observers = [];\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n get contentObject() {\n if(!this.content) {\n return {};\n }\n\n if(this.content !== null && typeof this.content === 'object') {\n // this is the case when mapping localStorage content, in which case the content is already parsed\n return this.content;\n }\n\n return JSON.parse(this.content);\n }\n\n updateFromJSON(json) {\n _.merge(this, json);\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(json.content) {\n this.mapContentToLocalProperties(this.contentObject);\n }\n }\n\n setDirty(dirty) {\n this.dirty = dirty;\n\n if(dirty) {\n this.notifyObserversOfChange();\n }\n }\n\n addObserver(observer, callback) {\n if(!_.find(this.observers, observer)) {\n this.observers.push({observer: observer, callback: callback});\n }\n }\n\n removeObserver(observer) {\n _.remove(this.observers, {observer: observer})\n }\n\n notifyObserversOfChange() {\n for(var observer of this.observers) {\n observer.callback(this);\n }\n }\n\n mapContentToLocalProperties(contentObj) {\n\n }\n\n createContentJSONFromProperties() {\n return this.structureParams();\n }\n\n referenceParams() {\n // must override\n }\n\n structureParams() {\n return {references: this.referenceParams()}\n }\n\n addItemAsRelationship(item) {\n // must override\n }\n\n removeItemAsRelationship(item) {\n // must override\n }\n\n removeAllRelationships() {\n // must override\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return null;\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Action {\n constructor(json) {\n _.merge(this, json);\n this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory\n this.error = false;\n if(this.lastExecuted) {\n // is string\n this.lastExecuted = new Date(this.lastExecuted);\n }\n }\n\n get permissionsString() {\n if(!this.permissions) {\n return \"\";\n }\n var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter\n permission += \": \";\n for(var contentType of this.content_types) {\n if(contentType == \"*\") {\n permission += \"All items\";\n } else {\n permission += contentType;\n }\n\n permission += \" \";\n }\n\n return permission;\n }\n\n get encryptionModeString() {\n if(this.verb != \"post\") {\n return null;\n }\n var encryptionMode = \"This action accepts data \";\n if(this.accepts_encrypted && this.accepts_decrypted) {\n encryptionMode += \"encrypted or decrypted.\";\n } else {\n if(this.accepts_encrypted) {\n encryptionMode += \"encrypted.\";\n } else {\n encryptionMode += \"decrypted.\";\n }\n }\n return encryptionMode;\n }\n\n}\n\nclass Extension extends Item {\n constructor(json) {\n super(json);\n _.merge(this, json);\n\n this.encrypted = true;\n this.content_type = \"Extension\";\n }\n\n actionsInGlobalContext() {\n return this.actions.filter(function(action){\n return action.context == \"global\";\n })\n }\n\n actionsWithContextForItem(item) {\n return this.actions.filter(function(action){\n return action.context == item.content_type || action.context == \"Item\";\n })\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.name = contentObject.name;\n this.url = contentObject.url;\n this.actions = contentObject.actions.map(function(action){\n return new Action(action);\n })\n }\n\n updateFromExternalResponseItem(externalResponseItem) {\n _.merge(this, externalResponseItem);\n this.actions = externalResponseItem.actions.map(function(action){\n return new Action(action);\n })\n }\n\n referenceParams() {\n return null;\n }\n\n structureParams() {\n var params = {\n name: this.name,\n url: this.url,\n actions: this.actions\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n this.text = contentObject.text;\n }\n\n referenceParams() {\n var references = _.map(this.tags, function(tag){\n return {uuid: tag.uuid, content_type: tag.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title,\n text: this.text\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, item)) {\n this.tags.push(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.tags.forEach(function(tag){\n _.pull(tag.notes, this);\n tag.setDirty(true);\n }.bind(this))\n this.tags = [];\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n safeText() {\n return this.text || \"\";\n }\n\n safeTitle() {\n return this.title || \"\";\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n }\n\n referenceParams() {\n var references = _.map(this.notes, function(note){\n return {uuid: note.uuid, content_type: note.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n if(!_.find(this.notes, item)) {\n this.notes.unshift(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.notes.forEach(function(note){\n _.pull(note.tags, this);\n note.setDirty(true);\n }.bind(this))\n\n this.notes = [];\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n referencesAffectedBySharingChange() {\n return this.notes;\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.user = {};\n this.syncToken = localStorage.getItem(\"syncToken\");\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.getAuthParams = function() {\n return JSON.parse(localStorage.getItem(\"auth_params\"));\n }\n\n this.isUserSignedIn = function() {\n return localStorage.getItem(\"jwt\");\n }\n\n this.userId = function() {\n return localStorage.getItem(\"uuid\");\n }\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n _.merge(this.user, user);\n callback();\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(authParams));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, keys);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(authParams));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n // this.changePassword = function(current_password, new_password) {\n // this.getAuthParamsForEmail(email, function(authParams){\n // if(!authParams) {\n // callback(null);\n // return;\n // }\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n // var data = {};\n // data.current_password = currentKeys.pw;\n // data.password = newKeys.pw;\n // data.password_confirmation = newKeys.pw;\n //\n // var user = this.user;\n //\n // this._performPasswordChange(currentKeys, newKeys, function(response){\n // if(response && !response.error) {\n // // this.showNewPasswordForm = false;\n // // reencrypt data with new mk\n // this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n // if(success) {\n // this.setMk(newKeys.mk);\n // alert(\"Your password has been changed and your data re-encrypted.\");\n // } else {\n // // rollback password\n // this._performPasswordChange(newKeys, currentKeys, function(response){\n // alert(\"There was an error changing your password. Your password has been rolled back.\");\n // window.location.reload();\n // })\n // }\n // }.bind(this));\n // } else {\n // // this.showNewPasswordForm = false;\n // alert(\"There was an error changing your password. Please try again.\");\n // }\n // }.bind(this))\n // }.bind(this));\n // }.bind(this));\n // }.bind(this));\n // }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(username, callback) {\n var request = Restangular.one(\"users\", this.userId());\n request.username = username;\n request.patch().then(function(response){\n this.user.username = response.username;\n callback(response.plain());\n }.bind(this))\n }\n\n\n /*\n Items\n */\n\n this.setSyncToken = function(syncToken) {\n this.syncToken = syncToken;\n localStorage.setItem(\"syncToken\", this.syncToken);\n }\n\n this.syncWithOptions = function(callback, options = {}) {\n this.writeAllItemsToLocalStorage(function(responseItems){\n if(!this.isUserSignedIn()) {\n // is not signed in\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n }\n }.bind(this))\n\n if(!this.isUserSignedIn()) {\n return;\n }\n\n var dirtyItems = modelManager.getDirtyItems();\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n // console.log(\"syncing items\", request.items);\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n this.writeAllItemsToLocalStorage();\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n if(callback) {\n callback({error: \"Sync error\"});\n }\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForExportFile = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForExtension = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n console.assert(!item.dummy, \"Item is dummy, should not have gotten here.\", item.dummy)\n\n var params = {uuid: item.uuid, content_type: item.content_type,\n presentation_name: item.presentation_name, deleted: item.deleted};\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.createContentJSONFromProperties() : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties()));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n this.shareItem = function(item, callback) {\n if(!this.isUserSignedIn()) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.allItems.forEach(function(item){\n item.setDirty(true);\n })\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }.bind(this)\n\n if(data.auth_params) {\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, data.auth_params), function(keys){\n var mk = keys.mk;\n try {\n this.decryptItemsWithKey(data.items, mk);\n onDataReady();\n }\n catch (e) {\n console.log(\"Error decrypting\", e);\n alert(\"There was an error decrypting your items. Make sure the password you entered is correct and try again.\");\n callback(false, null);\n return;\n }\n }.bind(this));\n } else {\n onDataReady();\n }\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(encrypted) {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.allItemsMatchingTypes([\"Tag\", \"Note\"]), function(item){\n return this.paramsForExportFile(item, encrypted);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n if(encrypted) {\n data[\"auth_params\"] = this.getAuthParams();\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n // this.mergeLocalDataRemotely = function(user, callback) {\n // var request = Restangular.one(\"users\", this.userId()).one(\"merge\");\n // var tags = user.tags;\n // request.items = user.items;\n // request.items.forEach(function(item){\n // if(item.tag_id) {\n // var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n // item.tag_name = tag.title;\n // }\n // })\n // request.post().then(function(response){\n // callback();\n // localStorage.removeItem('user');\n // })\n // }\n\n\n\n\n this.clearLocalStorage = function() {\n localStorage.removeItem(\"items\");\n localStorage.removeItem(\"mk\");\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"uuid\");\n localStorage.removeItem(\"syncToken\");\n }\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeAllItemsToLocalStorage = function(callback) {\n var items = _.map(modelManager.allItems, function(item){\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\"], false)\n }.bind(this));\n // console.log(\"Writing items to local\", items);\n this.writeToLocalStorage('items', items);\n if(callback) {\n callback(items);\n }\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItems = function() {\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n var jsonObj = _.merge({content_type: \"Note\"}, JSON.parse(draftString));\n return modelManager.createItem(jsonObj);\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n this.decryptItemsWithKey(items, masterKey);\n }\n\n this.decryptItemsWithKey = function(items, key) {\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n var isString = typeof item.content === 'string' || item.content instanceof String;\n if(isString) {\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, key);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = modelManager.allItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;class ContextualExtensionsMenu {\n\n constructor() {\n this.restrict = \"E\";\n this.templateUrl = \"frontend/directives/contextual-menu.html\";\n this.scope = {\n item: \"=\"\n };\n }\n\n controller($scope, modelManager, extensionManager) {\n $scope.extensions = extensionManager.extensionsInContextOfItem($scope.item);\n\n $scope.executeAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, $scope.item, function(response){\n action.running = false;\n })\n }\n\n $scope.accessTypeForExtension = function(extension) {\n return extensionManager.extensionUsesEncryptedData(extension) ? \"encrypted\" : \"decrypted\";\n }\n\n }\n\n\n}\n\nangular.module('app.frontend').directive('contextualExtensionsMenu', () => new ContextualExtensionsMenu);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager, apiController) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.apiController = apiController;\n this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem(\"enabledRepeatActionUrls\")) || [];\n this.decryptedExtensions = JSON.parse(localStorage.getItem(\"decryptedExtensions\")) || [];\n\n modelManager.addItemSyncObserver(\"extensionManager\", \"Extension\", function(items){\n for (var ext of items) {\n\n ext.encrypted = this.extensionUsesEncryptedData(ext);\n\n for (var action of ext.actions) {\n if(this.enabledRepeatActionUrls.includes(action.url)) {\n this.enableRepeatAction(action, ext);\n }\n }\n }\n }.bind(this))\n }\n\n get extensions() {\n return this.modelManager.extensions;\n }\n\n extensionsInContextOfItem(item) {\n return this.extensions.filter(function(ext){\n return ext.actionsWithContextForItem(item).length > 0;\n })\n }\n\n actionWithURL(url) {\n for (var extension of this.extensions) {\n return _.find(extension.actions, {url: url})\n }\n }\n\n extensionUsesEncryptedData(extension) {\n return !this.decryptedExtensions.includes(extension.url);\n }\n\n changeExtensionEncryptionFormat(encrypted, extension) {\n if(encrypted) {\n _.pull(this.decryptedExtensions, extension.url);\n } else {\n this.decryptedExtensions.push(extension.url);\n }\n\n localStorage.setItem(\"decryptedExtensions\", JSON.stringify(this.decryptedExtensions))\n\n extension.encrypted = this.extensionUsesEncryptedData(extension);\n }\n\n addExtension(url, callback) {\n this.retrieveExtensionFromServer(url, callback);\n }\n\n deleteExtension(extension) {\n for(var action of extension.actions) {\n _.pull(this.decryptedExtensions, extension);\n if(action.repeat_mode) {\n if(this.isRepeatActionEnabled(action)) {\n this.disableRepeatAction(action);\n }\n }\n }\n\n this.modelManager.setItemToBeDeleted(extension);\n this.apiController.sync(null);\n }\n\n retrieveExtensionFromServer(url, callback) {\n this.Restangular.oneUrl(url, url).get().then(function(response){\n var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());\n if(callback) {\n callback(ext);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n callback(null);\n })\n }\n\n handleExtensionLoadExternalResponseItem(url, externalResponseItem) {\n var extension = _.find(this.extensions, {url: url});\n if(extension) {\n extension.updateFromExternalResponseItem(externalResponseItem);\n } else {\n extension = new Extension(externalResponseItem);\n extension.url = url;\n extension.setDirty(true);\n this.modelManager.addItem(extension);\n this.apiController.sync(null);\n }\n\n return extension;\n }\n\n refreshExtensionsFromServer() {\n for (var url of this.enabledRepeatActionUrls) {\n var action = this.actionWithURL(url);\n if(action) {\n this.disableRepeatAction(action);\n }\n }\n\n for(var ext of this.extensions) {\n this.retrieveExtensionFromServer(ext.url, function(extension){\n extension.setDirty(true);\n });\n }\n }\n\n executeAction(action, extension, item, callback) {\n\n if(this.extensionUsesEncryptedData(extension) && !this.apiController.isUserSignedIn()) {\n alert(\"To send data encrypted, you must have an encryption key, and must therefore be signed in.\");\n callback(null);\n return;\n }\n\n switch (action.verb) {\n case \"get\": {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n action.error = false;\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n .catch(function(response){\n action.error = true;\n })\n\n break;\n }\n\n case \"show\": {\n var win = window.open(action.url, '_blank');\n win.focus();\n callback();\n break;\n }\n\n case \"post\": {\n var params = {};\n\n if(action.all) {\n var items = this.modelManager.allItemsMatchingTypes(action.content_types);\n params.items = items.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n\n } else {\n params.item = this.outgoingParamsForItem(item, extension);\n }\n\n this.performPost(action, extension, params, function(response){\n callback(response);\n });\n\n break;\n }\n\n default: {\n\n }\n }\n\n action.lastExecuted = new Date();\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n _.pull(this.enabledRepeatActionUrls, action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n this.modelManager.removeItemChangeObserver(action.url);\n\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n if(!_.find(this.enabledRepeatActionUrls, action.url)) {\n this.enabledRepeatActionUrls.push(action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n }\n\n if(action.repeat_mode) {\n\n if(action.repeat_mode == \"watch\") {\n this.modelManager.addItemChangeObserver(action.url, action.content_types, function(changedItems){\n this.triggerWatchAction(action, extension, changedItems);\n }.bind(this))\n }\n\n if(action.repeat_mode == \"loop\") {\n // todo\n }\n\n }\n }\n\n queueAction(action, extension, delay, changedItems) {\n this.actionQueue = this.actionQueue || [];\n if(_.find(this.actionQueue, {url: action.url})) {\n return;\n }\n\n // console.log(\"Successfully queued\", action, this.actionQueue.length);\n this.actionQueue.push(action);\n\n setTimeout(function () {\n // console.log(\"Performing queued action\", action);\n this.triggerWatchAction(action, extension, changedItems);\n _.pull(this.actionQueue, action);\n }.bind(this), delay * 1000);\n }\n\n triggerWatchAction(action, extension, changedItems) {\n if(action.repeat_timeout > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeat_timeout) {\n var delay = action.repeat_timeout - diffInSeconds;\n this.queueAction(action, extension, delay, changedItems);\n return;\n }\n }\n\n action.lastExecuted = new Date();\n\n console.log(\"Performing action.\");\n\n if(action.verb == \"post\") {\n var params = {};\n params.items = changedItems.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n this.performPost(action, extension, params, null);\n } else {\n // todo\n }\n }\n\n outgoingParamsForItem(item, extension) {\n return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));\n }\n\n performPost(action, extension, params, callback) {\n var request = this.Restangular.oneUrl(action.url, action.url);\n if(this.extensionUsesEncryptedData(extension)) {\n request.auth_params = this.apiController.getAuthParams();\n }\n _.merge(request, params);\n\n request.post().then(function(response){\n action.error = false;\n if(callback) {\n callback(response.plain());\n }\n })\n .catch(function(response){\n action.error = true;\n console.log(\"Action error response:\", response);\n if(callback) {\n callback({error: \"Request error\"});\n }\n })\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager {\n\n constructor() {\n this.notes = [];\n this.tags = [];\n this.itemSyncObservers = [];\n this.itemChangeObservers = [];\n this.items = [];\n this._extensions = [];\n }\n\n get allItems() {\n return this.items.filter(function(item){\n return !item.dummy;\n })\n }\n\n get extensions() {\n return this._extensions.filter(function(ext){\n return !ext.deleted;\n })\n }\n\n allItemsMatchingTypes(contentTypes) {\n return this.items.filter(function(item){\n return (contentTypes.includes(item.content_type) || contentTypes.includes(\"*\")) && !item.dummy;\n })\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null);\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.removeItemLocally(item)\n }\n continue;\n }\n\n _.omit(json_obj, omitFields);\n\n if(!item) {\n item = this.createItem(json_obj);\n } else {\n item.updateFromJSON(json_obj);\n }\n\n this.addItem(item);\n\n if(json_obj.content) {\n this.resolveReferencesForItem(item)\n }\n\n models.push(item)\n }\n\n this.notifySyncObserversOfModels(models);\n\n this.sortItems();\n return models;\n }\n\n notifySyncObserversOfModels(models) {\n for(var observer of this.itemSyncObservers) {\n var relevantItems = models.filter(function(item){return item.content_type == observer.type});\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n notifyItemChangeObserversOfModels(models) {\n for(var observer of this.itemChangeObservers) {\n var relevantItems = models.filter(function(item){\n return observer.content_types.includes(item.content_type) || observer.content_types.includes(\"*\");\n });\n\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n createItem(json_obj) {\n var item;\n if(json_obj.content_type == \"Note\") {\n item = new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n item = new Tag(json_obj);\n } else if(json_obj.content_type == \"Extension\") {\n item = new Extension(json_obj);\n } else {\n item = new Item(json_obj);\n }\n\n item.addObserver(this, function(changedItem){\n this.notifyItemChangeObserversOfModels([changedItem]);\n }.bind(this));\n\n return item;\n }\n\n addItems(items) {\n this.items = _.uniq(this.items.concat(items));\n\n items.forEach(function(item){\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, {uuid: item.uuid})) {\n this.tags.unshift(item);\n }\n } else if(item.content_type == \"Note\") {\n if(!_.find(this.notes, {uuid: item.uuid})) {\n this.notes.unshift(item);\n }\n } else if(item.content_type == \"Extension\") {\n if(!_.find(this._extensions, {uuid: item.uuid})) {\n this._extensions.unshift(item);\n }\n }\n }.bind(this))\n }\n\n addItem(item) {\n this.addItems([item])\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n resolveReferencesForItem(item) {\n var contentObject = item.contentObject;\n if(!contentObject.references) {\n return;\n }\n\n for(var reference of contentObject.references) {\n var referencedItem = this.findItem(reference.uuid);\n if(referencedItem) {\n item.addItemAsRelationship(referencedItem);\n referencedItem.addItemAsRelationship(item);\n } else {\n // console.log(\"Unable to find item:\", reference.uuid);\n }\n }\n }\n\n sortItems() {\n Item.sortItemsByDate(this.notes);\n\n this.tags.forEach(function(tag){\n Item.sortItemsByDate(tag.notes);\n })\n }\n\n addItemSyncObserver(id, type, callback) {\n this.itemSyncObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemSyncObserver(id) {\n _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));\n }\n\n addItemChangeObserver(id, content_types, callback) {\n this.itemChangeObservers.push({id: id, content_types: content_types, callback: callback});\n }\n\n removeItemChangeObserver(id) {\n _.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, {id: id}));\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n getDirtyItems() {\n return this.items.filter(function(item){return item.dirty == true && !item.dummy})\n }\n\n clearDirtyItems() {\n this.getDirtyItems().forEach(function(item){\n item.setDirty(false);\n })\n }\n\n setItemToBeDeleted(item) {\n item.deleted = true;\n if(!item.dummy) {\n item.setDirty(true);\n }\n item.removeAllRelationships();\n }\n\n removeItemLocally(item) {\n _.pull(this.items, item);\n\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n } else if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n } else if(item.content_type == \"Extension\") {\n _.pull(this._extensions, item);\n }\n }\n\n /*\n Relationships\n */\n\n createRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.addItemAsRelationship(itemTwo);\n itemTwo.addItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n\n removeRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.removeItemAsRelationship(itemTwo);\n itemTwo.removeItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file From 5e1d045847e0ef5d7d88100ef0acb239b0ac99ec Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Sun, 8 Jan 2017 21:59:09 -0600 Subject: [PATCH 3/5] fixes --- .../app/frontend/models/api/item.js | 10 + .../app/frontend/models/app/note.js | 4 + .../app/frontend/models/app/tag.js | 4 + .../javascripts/app/services/apiController.js | 43 +- .../app/services/helpers/crypto.js | 3 +- vendor/assets/javascripts/transpiled.js | 383 +++++++++++------- vendor/assets/javascripts/transpiled.js.map | 2 +- 7 files changed, 293 insertions(+), 156 deletions(-) diff --git a/app/assets/javascripts/app/frontend/models/api/item.js b/app/assets/javascripts/app/frontend/models/api/item.js index 805f0ce52..bf55ac013 100644 --- a/app/assets/javascripts/app/frontend/models/api/item.js +++ b/app/assets/javascripts/app/frontend/models/api/item.js @@ -45,6 +45,11 @@ class Item { } } + alternateUUID() { + this.uuid = Neeto.crypto.generateUUID(); + console.log("Generating new UUID", this.uuid); + } + setDirty(dirty) { this.dirty = dirty; @@ -101,6 +106,11 @@ class Item { _.merge(this, _.omit(item, ["content"])); } + allReferencedObjects() { + // must override + return null; + } + referencesAffectedBySharingChange() { // should be overriden to determine which references should be decrypted/encrypted return null; diff --git a/app/assets/javascripts/app/frontend/models/app/note.js b/app/assets/javascripts/app/frontend/models/app/note.js index c3213e476..1e8f58882 100644 --- a/app/assets/javascripts/app/frontend/models/app/note.js +++ b/app/assets/javascripts/app/frontend/models/app/note.js @@ -61,6 +61,10 @@ class Note extends Item { return filtered; } + allReferencedObjects() { + return this.tags; + } + referencesAffectedBySharingChange() { return super.referencesAffectedBySharingChange(); } diff --git a/app/assets/javascripts/app/frontend/models/app/tag.js b/app/assets/javascripts/app/frontend/models/app/tag.js index e1c960fc0..c5da2bc63 100644 --- a/app/assets/javascripts/app/frontend/models/app/tag.js +++ b/app/assets/javascripts/app/frontend/models/app/tag.js @@ -59,6 +59,10 @@ class Tag extends Item { return "Tag"; } + allReferencedObjects() { + return this.notes; + } + referencesAffectedBySharingChange() { return this.notes; } diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index da4985db7..61bf1b22f 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -120,16 +120,16 @@ angular.module('app.frontend') } this.register = function(email, password, callback) { - Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys){ + Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys, authParams){ this.setMk(keys.mk); keys.mk = null; var request = Restangular.one("auth"); - var params = _.merge({password: keys.pw, email: email}, keys); + var params = _.merge({password: keys.pw, email: email}, authParams); _.merge(request, params); request.post().then(function(response){ localStorage.setItem("jwt", response.token); localStorage.setItem("uuid", response.uuid); - localStorage.setItem("auth_params", JSON.stringify(authParams)); + localStorage.setItem("auth_params", JSON.stringify(_.omit(authParams, ["pw_nonce"]))); callback(response); }) .catch(function(response){ @@ -216,6 +216,13 @@ angular.module('app.frontend') this.writeAllItemsToLocalStorage(function(responseItems){ if(!this.isUserSignedIn()) { // is not signed in + var dirtyItems = modelManager.getDirtyItems(); + // delete anything needing to be deleted + dirtyItems.forEach(function(item){ + if(item.deleted) { + modelManager.removeItemLocally(item); + } + }.bind(this)) modelManager.clearDirtyItems(); if(callback) { callback(); @@ -249,6 +256,8 @@ angular.module('app.frontend') var omitFields = ["content", "enc_item_key", "auth_hash"]; this.handleItemsResponse(response.saved_items, omitFields); + this.handleUnsavedItemsResponse(response.unsaved) + this.writeAllItemsToLocalStorage(); if(callback) { @@ -267,6 +276,28 @@ angular.module('app.frontend') this.syncWithOptions(callback, undefined); } + this.handleUnsavedItemsResponse = function(unsaved) { + if(unsaved.length == 0) { + return; + } + + console.log("handle unsaved", unsaved); + for(var mapping of unsaved) { + var itemResponse = mapping.item; + var item = modelManager.findItem(itemResponse.uuid); + var error = mapping.error; + if(error.tag == "uuid_conflict") { + item.alternateUUID(); + item.setDirty(true); + item.allReferencedObjects().forEach(function(reference){ + reference.setDirty(true); + }) + } + } + + this.sync(null); + } + this.handleItemsResponse = function(responseItems, omitFields) { this.decryptItems(responseItems); return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields); @@ -374,6 +405,11 @@ angular.module('app.frontend') var mk = keys.mk; try { this.decryptItemsWithKey(data.items, mk); + // delete items enc_item_key since the user's actually key will do the encrypting once its passed off + data.items.forEach(function(item){ + item.enc_item_key = null; + item.auth_hash = null; + }) onDataReady(); } catch (e) { @@ -454,6 +490,7 @@ angular.module('app.frontend') localStorage.removeItem("jwt"); localStorage.removeItem("uuid"); localStorage.removeItem("syncToken"); + localStorage.removeItem("auth_params"); } this.staticifyObject = function(object) { diff --git a/app/assets/javascripts/app/services/helpers/crypto.js b/app/assets/javascripts/app/services/helpers/crypto.js index 3572450c1..8a021da3e 100644 --- a/app/assets/javascripts/app/services/helpers/crypto.js +++ b/app/assets/javascripts/app/services/helpers/crypto.js @@ -95,11 +95,12 @@ class SNCrypto { var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults; var pw_nonce = this.generateRandomKey(); var pw_salt = this.sha1(email + "SN" + pw_nonce); + _.merge(defaults, {pw_salt: pw_salt, pw_nonce: pw_nonce}) this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){ var pw = keys[0]; var mk = keys[1]; - callback({pw: pw, mk: mk, pw_nonce: pw_nonce}, defaults); + callback({pw: pw, mk: mk}, defaults); }); } } diff --git a/vendor/assets/javascripts/transpiled.js b/vendor/assets/javascripts/transpiled.js index 85742afd2..f7886e136 100644 --- a/vendor/assets/javascripts/transpiled.js +++ b/vendor/assets/javascripts/transpiled.js @@ -152,11 +152,12 @@ var SNCrypto = function () { var pw_nonce = this.generateRandomKey(); var pw_salt = this.sha1(email + "SN" + pw_nonce); + _.merge(defaults, { pw_salt: pw_salt, pw_nonce: pw_nonce }); this.generateSymmetricKeyPair(_.merge({ email: email, password: password, pw_salt: pw_salt }, defaults), function (keys) { var pw = keys[0]; var mk = keys[1]; - callback({ pw: pw, mk: mk, pw_nonce: pw_nonce }, defaults); + callback({ pw: pw, mk: mk }, defaults); }); } }]); @@ -1372,6 +1373,12 @@ var Item = function () { this.mapContentToLocalProperties(this.contentObject); } } + }, { + key: 'alternateUUID', + value: function alternateUUID() { + this.uuid = Neeto.crypto.generateUUID(); + console.log("Generating new UUID", this.uuid); + } }, { key: 'setDirty', value: function setDirty(dirty) { @@ -1459,6 +1466,12 @@ var Item = function () { value: function mergeMetadataFromItem(item) { _.merge(this, _.omit(item, ["content"])); } + }, { + key: 'allReferencedObjects', + value: function allReferencedObjects() { + // must override + return null; + } }, { key: 'referencesAffectedBySharingChange', value: function referencesAffectedBySharingChange() { @@ -1727,6 +1740,11 @@ var Note = function (_Item2) { }.bind(this)); this.tags = []; } + }, { + key: 'allReferencedObjects', + value: function allReferencedObjects() { + return this.tags; + } }, { key: 'referencesAffectedBySharingChange', value: function referencesAffectedBySharingChange() { @@ -1875,6 +1893,11 @@ var Tag = function (_Item3) { this.notes = []; } + }, { + key: 'allReferencedObjects', + value: function allReferencedObjects() { + return this.notes; + } }, { key: 'referencesAffectedBySharingChange', value: function referencesAffectedBySharingChange() { @@ -2006,16 +2029,16 @@ var Tag = function (_Item3) { }; this.register = function (email, password, callback) { - Neeto.crypto.generateInitialEncryptionKeysForUser({ password: password, email: email }, function (keys) { + Neeto.crypto.generateInitialEncryptionKeysForUser({ password: password, email: email }, function (keys, authParams) { this.setMk(keys.mk); keys.mk = null; var request = Restangular.one("auth"); - var params = _.merge({ password: keys.pw, email: email }, keys); + var params = _.merge({ password: keys.pw, email: email }, authParams); _.merge(request, params); request.post().then(function (response) { localStorage.setItem("jwt", response.token); localStorage.setItem("uuid", response.uuid); - localStorage.setItem("auth_params", JSON.stringify(authParams)); + localStorage.setItem("auth_params", JSON.stringify(_.omit(authParams, ["pw_nonce"]))); callback(response); }).catch(function (response) { callback(response.data); @@ -2101,6 +2124,13 @@ var Tag = function (_Item3) { this.writeAllItemsToLocalStorage(function (responseItems) { if (!this.isUserSignedIn()) { // is not signed in + var dirtyItems = modelManager.getDirtyItems(); + // delete anything needing to be deleted + dirtyItems.forEach(function (item) { + if (item.deleted) { + modelManager.removeItemLocally(item); + } + }.bind(this)); modelManager.clearDirtyItems(); if (callback) { callback(); @@ -2134,6 +2164,8 @@ var Tag = function (_Item3) { var omitFields = ["content", "enc_item_key", "auth_hash"]; this.handleItemsResponse(response.saved_items, omitFields); + this.handleUnsavedItemsResponse(response.unsaved); + this.writeAllItemsToLocalStorage(); if (callback) { @@ -2151,6 +2183,49 @@ var Tag = function (_Item3) { this.syncWithOptions(callback, undefined); }; + this.handleUnsavedItemsResponse = function (unsaved) { + if (unsaved.length == 0) { + return; + } + + console.log("handle unsaved", unsaved); + var _iteratorNormalCompletion4 = true; + var _didIteratorError4 = false; + var _iteratorError4 = undefined; + + try { + for (var _iterator4 = unsaved[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { + var mapping = _step4.value; + + var itemResponse = mapping.item; + var item = modelManager.findItem(itemResponse.uuid); + var error = mapping.error; + if (error.tag == "uuid_conflict") { + item.alternateUUID(); + item.setDirty(true); + item.allReferencedObjects().forEach(function (reference) { + reference.setDirty(true); + }); + } + } + } catch (err) { + _didIteratorError4 = true; + _iteratorError4 = err; + } finally { + try { + if (!_iteratorNormalCompletion4 && _iterator4.return) { + _iterator4.return(); + } + } finally { + if (_didIteratorError4) { + throw _iteratorError4; + } + } + } + + this.sync(null); + }; + this.handleItemsResponse = function (responseItems, omitFields) { this.decryptItems(responseItems); return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields); @@ -2257,6 +2332,11 @@ var Tag = function (_Item3) { var mk = keys.mk; try { this.decryptItemsWithKey(data.items, mk); + // delete items enc_item_key since the user's actually key will do the encrypting once its passed off + data.items.forEach(function (item) { + item.enc_item_key = null; + item.auth_hash = null; + }); onDataReady(); } catch (e) { console.log("Error decrypting", e); @@ -2332,6 +2412,7 @@ var Tag = function (_Item3) { localStorage.removeItem("jwt"); localStorage.removeItem("uuid"); localStorage.removeItem("syncToken"); + localStorage.removeItem("auth_params"); }; this.staticifyObject = function (object) { @@ -2440,13 +2521,13 @@ var Tag = function (_Item3) { }; this.decryptItemsWithKey = function (items, key) { - var _iteratorNormalCompletion4 = true; - var _didIteratorError4 = false; - var _iteratorError4 = undefined; + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; try { - for (var _iterator4 = items[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) { - var item = _step4.value; + for (var _iterator5 = items[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var item = _step5.value; if (item.deleted == true) { continue; @@ -2463,16 +2544,16 @@ var Tag = function (_Item3) { } } } catch (err) { - _didIteratorError4 = true; - _iteratorError4 = err; + _didIteratorError5 = true; + _iteratorError5 = err; } finally { try { - if (!_iteratorNormalCompletion4 && _iterator4.return) { - _iterator4.return(); + if (!_iteratorNormalCompletion5 && _iterator5.return) { + _iterator5.return(); } } finally { - if (_didIteratorError4) { - throw _iteratorError4; + if (_didIteratorError5) { + throw _iteratorError5; } } } @@ -2884,55 +2965,55 @@ var ExtensionManager = function () { this.decryptedExtensions = JSON.parse(localStorage.getItem("decryptedExtensions")) || []; modelManager.addItemSyncObserver("extensionManager", "Extension", function (items) { - var _iteratorNormalCompletion5 = true; - var _didIteratorError5 = false; - var _iteratorError5 = undefined; + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; try { - for (var _iterator5 = items[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { - var ext = _step5.value; + for (var _iterator6 = items[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { + var ext = _step6.value; ext.encrypted = this.extensionUsesEncryptedData(ext); - var _iteratorNormalCompletion6 = true; - var _didIteratorError6 = false; - var _iteratorError6 = undefined; + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; try { - for (var _iterator6 = ext.actions[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { - var action = _step6.value; + for (var _iterator7 = ext.actions[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { + var action = _step7.value; if (this.enabledRepeatActionUrls.includes(action.url)) { this.enableRepeatAction(action, ext); } } } catch (err) { - _didIteratorError6 = true; - _iteratorError6 = err; + _didIteratorError7 = true; + _iteratorError7 = err; } finally { try { - if (!_iteratorNormalCompletion6 && _iterator6.return) { - _iterator6.return(); + if (!_iteratorNormalCompletion7 && _iterator7.return) { + _iterator7.return(); } } finally { - if (_didIteratorError6) { - throw _iteratorError6; + if (_didIteratorError7) { + throw _iteratorError7; } } } } } catch (err) { - _didIteratorError5 = true; - _iteratorError5 = err; + _didIteratorError6 = true; + _iteratorError6 = err; } finally { try { - if (!_iteratorNormalCompletion5 && _iterator5.return) { - _iterator5.return(); + if (!_iteratorNormalCompletion6 && _iterator6.return) { + _iterator6.return(); } } finally { - if (_didIteratorError5) { - throw _iteratorError5; + if (_didIteratorError6) { + throw _iteratorError6; } } } @@ -2949,27 +3030,27 @@ var ExtensionManager = function () { }, { key: 'actionWithURL', value: function actionWithURL(url) { - var _iteratorNormalCompletion7 = true; - var _didIteratorError7 = false; - var _iteratorError7 = undefined; + var _iteratorNormalCompletion8 = true; + var _didIteratorError8 = false; + var _iteratorError8 = undefined; try { - for (var _iterator7 = this.extensions[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { - var extension = _step7.value; + for (var _iterator8 = this.extensions[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { + var extension = _step8.value; return _.find(extension.actions, { url: url }); } } catch (err) { - _didIteratorError7 = true; - _iteratorError7 = err; + _didIteratorError8 = true; + _iteratorError8 = err; } finally { try { - if (!_iteratorNormalCompletion7 && _iterator7.return) { - _iterator7.return(); + if (!_iteratorNormalCompletion8 && _iterator8.return) { + _iterator8.return(); } } finally { - if (_didIteratorError7) { - throw _iteratorError7; + if (_didIteratorError8) { + throw _iteratorError8; } } } @@ -3000,13 +3081,13 @@ var ExtensionManager = function () { }, { key: 'deleteExtension', value: function deleteExtension(extension) { - var _iteratorNormalCompletion8 = true; - var _didIteratorError8 = false; - var _iteratorError8 = undefined; + var _iteratorNormalCompletion9 = true; + var _didIteratorError9 = false; + var _iteratorError9 = undefined; try { - for (var _iterator8 = extension.actions[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { - var action = _step8.value; + for (var _iterator9 = extension.actions[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { + var action = _step9.value; _.pull(this.decryptedExtensions, extension); if (action.repeat_mode) { @@ -3016,16 +3097,16 @@ var ExtensionManager = function () { } } } catch (err) { - _didIteratorError8 = true; - _iteratorError8 = err; + _didIteratorError9 = true; + _iteratorError9 = err; } finally { try { - if (!_iteratorNormalCompletion8 && _iterator8.return) { - _iterator8.return(); + if (!_iteratorNormalCompletion9 && _iterator9.return) { + _iterator9.return(); } } finally { - if (_didIteratorError8) { - throw _iteratorError8; + if (_didIteratorError9) { + throw _iteratorError9; } } } @@ -3065,45 +3146,18 @@ var ExtensionManager = function () { }, { key: 'refreshExtensionsFromServer', value: function refreshExtensionsFromServer() { - var _iteratorNormalCompletion9 = true; - var _didIteratorError9 = false; - var _iteratorError9 = undefined; - - try { - for (var _iterator9 = this.enabledRepeatActionUrls[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { - var url = _step9.value; - - var action = this.actionWithURL(url); - if (action) { - this.disableRepeatAction(action); - } - } - } catch (err) { - _didIteratorError9 = true; - _iteratorError9 = err; - } finally { - try { - if (!_iteratorNormalCompletion9 && _iterator9.return) { - _iterator9.return(); - } - } finally { - if (_didIteratorError9) { - throw _iteratorError9; - } - } - } - var _iteratorNormalCompletion10 = true; var _didIteratorError10 = false; var _iteratorError10 = undefined; try { - for (var _iterator10 = this.extensions[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { - var ext = _step10.value; + for (var _iterator10 = this.enabledRepeatActionUrls[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { + var url = _step10.value; - this.retrieveExtensionFromServer(ext.url, function (extension) { - extension.setDirty(true); - }); + var action = this.actionWithURL(url); + if (action) { + this.disableRepeatAction(action); + } } } catch (err) { _didIteratorError10 = true; @@ -3119,6 +3173,33 @@ var ExtensionManager = function () { } } } + + var _iteratorNormalCompletion11 = true; + var _didIteratorError11 = false; + var _iteratorError11 = undefined; + + try { + for (var _iterator11 = this.extensions[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) { + var ext = _step11.value; + + this.retrieveExtensionFromServer(ext.url, function (extension) { + extension.setDirty(true); + }); + } + } catch (err) { + _didIteratorError11 = true; + _iteratorError11 = err; + } finally { + try { + if (!_iteratorNormalCompletion11 && _iterator11.return) { + _iterator11.return(); + } + } finally { + if (_didIteratorError11) { + throw _iteratorError11; + } + } + } } }, { key: 'executeAction', @@ -3359,13 +3440,13 @@ var ModelManager = function () { key: 'mapResponseItemsToLocalModelsOmittingFields', value: function mapResponseItemsToLocalModelsOmittingFields(items, omitFields) { var models = []; - var _iteratorNormalCompletion11 = true; - var _didIteratorError11 = false; - var _iteratorError11 = undefined; + var _iteratorNormalCompletion12 = true; + var _didIteratorError12 = false; + var _iteratorError12 = undefined; try { - for (var _iterator11 = items[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) { - var json_obj = _step11.value; + for (var _iterator12 = items[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) { + var json_obj = _step12.value; json_obj = _.omit(json_obj, omitFields || []); var item = this.findItem(json_obj["uuid"]); @@ -3392,44 +3473,6 @@ var ModelManager = function () { models.push(item); } - } catch (err) { - _didIteratorError11 = true; - _iteratorError11 = err; - } finally { - try { - if (!_iteratorNormalCompletion11 && _iterator11.return) { - _iterator11.return(); - } - } finally { - if (_didIteratorError11) { - throw _iteratorError11; - } - } - } - - this.notifySyncObserversOfModels(models); - - this.sortItems(); - return models; - } - }, { - key: 'notifySyncObserversOfModels', - value: function notifySyncObserversOfModels(models) { - var _iteratorNormalCompletion12 = true; - var _didIteratorError12 = false; - var _iteratorError12 = undefined; - - try { - for (var _iterator12 = this.itemSyncObservers[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) { - var observer = _step12.value; - - var relevantItems = models.filter(function (item) { - return item.content_type == observer.type; - }); - if (relevantItems.length > 0) { - observer.callback(relevantItems); - } - } } catch (err) { _didIteratorError12 = true; _iteratorError12 = err; @@ -3444,22 +3487,26 @@ var ModelManager = function () { } } } + + this.notifySyncObserversOfModels(models); + + this.sortItems(); + return models; } }, { - key: 'notifyItemChangeObserversOfModels', - value: function notifyItemChangeObserversOfModels(models) { + key: 'notifySyncObserversOfModels', + value: function notifySyncObserversOfModels(models) { var _iteratorNormalCompletion13 = true; var _didIteratorError13 = false; var _iteratorError13 = undefined; try { - for (var _iterator13 = this.itemChangeObservers[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) { + for (var _iterator13 = this.itemSyncObservers[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) { var observer = _step13.value; var relevantItems = models.filter(function (item) { - return observer.content_types.includes(item.content_type) || observer.content_types.includes("*"); + return item.content_type == observer.type; }); - if (relevantItems.length > 0) { observer.callback(relevantItems); } @@ -3479,6 +3526,40 @@ var ModelManager = function () { } } } + }, { + key: 'notifyItemChangeObserversOfModels', + value: function notifyItemChangeObserversOfModels(models) { + var _iteratorNormalCompletion14 = true; + var _didIteratorError14 = false; + var _iteratorError14 = undefined; + + try { + for (var _iterator14 = this.itemChangeObservers[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) { + var observer = _step14.value; + + var relevantItems = models.filter(function (item) { + return observer.content_types.includes(item.content_type) || observer.content_types.includes("*"); + }); + + if (relevantItems.length > 0) { + observer.callback(relevantItems); + } + } + } catch (err) { + _didIteratorError14 = true; + _iteratorError14 = err; + } finally { + try { + if (!_iteratorNormalCompletion14 && _iterator14.return) { + _iterator14.return(); + } + } finally { + if (_didIteratorError14) { + throw _iteratorError14; + } + } + } + } }, { key: 'createItem', value: function createItem(json_obj) { @@ -3540,13 +3621,13 @@ var ModelManager = function () { return; } - var _iteratorNormalCompletion14 = true; - var _didIteratorError14 = false; - var _iteratorError14 = undefined; + var _iteratorNormalCompletion15 = true; + var _didIteratorError15 = false; + var _iteratorError15 = undefined; try { - for (var _iterator14 = contentObject.references[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) { - var reference = _step14.value; + for (var _iterator15 = contentObject.references[Symbol.iterator](), _step15; !(_iteratorNormalCompletion15 = (_step15 = _iterator15.next()).done); _iteratorNormalCompletion15 = true) { + var reference = _step15.value; var referencedItem = this.findItem(reference.uuid); if (referencedItem) { @@ -3557,16 +3638,16 @@ var ModelManager = function () { } } } catch (err) { - _didIteratorError14 = true; - _iteratorError14 = err; + _didIteratorError15 = true; + _iteratorError15 = err; } finally { try { - if (!_iteratorNormalCompletion14 && _iterator14.return) { - _iterator14.return(); + if (!_iteratorNormalCompletion15 && _iterator15.return) { + _iterator15.return(); } } finally { - if (_didIteratorError14) { - throw _iteratorError14; + if (_didIteratorError15) { + throw _iteratorError15; } } } diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index d0723b915..f49667c21 100644 --- a/vendor/assets/javascripts/transpiled.js.map +++ b/vendor/assets/javascripts/transpiled.js.map @@ -1 +1 @@ -{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","email","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","getCurrentUser","directive","$timeout","restrict","scope","save","remove","note","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","markdownRenderer","extensionManager","editorMode","safeText","dummy","focusTitle","hasChanges","hasAvailableExtensions","extensionsInContextOfItem","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","isUserSignedIn","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","setDirty","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","syncUpdated","$state","serverSideValidation","user","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","showExtensionsMenu","toggleExtensions","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","running","executeAction","deleteExtension","confirm","reloadExtensionsPressed","refreshExtensionsFromServer","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","archiveEncryptionFormat","downloadDataArchive","setAttribute","itemsDataFile","performImport","importJSONData","importData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","allTag","Tag","all","title","tags","notes","setInterval","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","selectedNote","removeItemLocally","tagsAddNew","addItem","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","createRelationshipBetweenItems","notesRemoveTag","validNotes","Note","filterDummyNotes","setItemToBeDeleted","notesSelectionMade","notesAddNew","didShowErrorAlert","headerLogout","clearLocalStorage","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","updateFromJSON","observers","generateUUID","json","created_at","updated_at","content","mapContentToLocalProperties","contentObject","dirty","notifyObserversOfChange","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","items","sort","b","Action","lastExecuted","permissions","permission","charAt","content_types","contentType","verb","encryptionMode","accepts_encrypted","accepts_decrypted","Extension","actions","context","map","externalResponseItem","pull","hasOnePublicTag","isPublic","filtered","unshift","provider","domainName","domain_comps","hostname","split","domain","$get","ngDialog","ApiController","syncToken","refresh","setItem","getAuthParams","userId","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","stringify","generateInitialEncryptionKeysForUser","_performPasswordChange","current_keys","new_keys","patch","setSyncToken","syncWithOptions","options","writeAllItemsToLocalStorage","responseItems","clearDirtyItems","dirtyItems","getDirtyItems","createRequestParamsForItem","additionalFields","sync_token","handleItemsResponse","retrieved_items","omitFields","saved_items","undefined","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","paramsForExportFile","paramsForExtension","forExportFile","itemCopy","cloneDeep","assert","deleted","encryptSingleItem","retrieveMk","auth_hash","createContentJSONFromProperties","base64","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","needingUpdate","open","template","resolve","className","disableAnimation","onDataReady","mapResponseItemsToLocalModels","allItems","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","removeItem","staticifyObject","object","writeToLocalStorage","value","toJson","sortItemsByDate","draftString","jsonObj","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","saveBatchItems","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","enabledRepeatActionUrls","decryptedExtensions","addItemSyncObserver","ext","enableRepeatAction","actionsWithContextForItem","retrieveExtensionFromServer","repeat_mode","isRepeatActionEnabled","disableRepeatAction","oneUrl","handleExtensionLoadExternalResponseItem","updateFromExternalResponseItem","actionWithURL","win","outgoingParamsForItem","performPost","removeItemChangeObserver","addItemChangeObserver","changedItems","triggerWatchAction","actionQueue","repeat_timeout","diffInSeconds","queueAction","service","$filter","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","itemSyncObservers","itemChangeObservers","_extensions","contentTypes","itemId","models","findItem","resolveReferencesForItem","notifySyncObserversOfModels","sortItems","relevantItems","addObserver","changedItem","notifyItemChangeObserversOfModels","uniq","addItems","reference","referencedItem","addItemAsRelationship","id","removeAllRelationships","itemOne","itemTwo","removeItemAsRelationship","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":"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","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk, pw_nonce: pw_nonce}, defaults);\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText()));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n } else {\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"(Offline) — All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n if(apiController.isUserSignedIn()) {\n // signed out users have local autosave, dont need draft saving\n apiController.saveDraftToDisk(this.note);\n }\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n this.note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(apiController, extensionManager){\n return {\n restrict: 'E',\n scope: {\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$on(\"sync:updated_token\", function(){\n ctrl.syncUpdated();\n })\n }\n }\n })\n .controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) {\n\n this.user = apiController.user;\n this.extensionManager = extensionManager;\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n this.showExtensionsMenu = false;\n }\n\n this.toggleExtensions = function() {\n this.showAccountMenu = false;\n this.showExtensionsMenu = !this.showExtensionsMenu;\n }\n\n this.toggleExtensionForm = function() {\n this.newExtensionData = {};\n this.showNewExtensionForm = !this.showNewExtensionForm;\n }\n\n this.submitNewExtensionForm = function() {\n if(this.newExtensionData.url) {\n extensionManager.addExtension(this.newExtensionData.url, function(response){\n if(!response) {\n alert(\"Unable to register this extension. Make sure the link is valid and try again.\");\n } else {\n this.newExtensionData.url = \"\";\n this.showNewExtensionForm = false;\n }\n }.bind(this))\n }\n }\n\n this.selectedAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, null, function(response){\n action.running = false;\n if(response && response.error) {\n action.error = true;\n alert(\"There was an error performing this action. Please try again.\");\n } else {\n action.error = false;\n apiController.sync(null);\n }\n })\n }\n\n this.deleteExtension = function(extension) {\n if(confirm(\"Are you sure you want to delete this extension?\")) {\n extensionManager.deleteExtension(extension);\n }\n }\n\n this.reloadExtensionsPressed = function() {\n if(confirm(\"For your security, reloading extensions will disable any currently enabled repeat actions.\")) {\n extensionManager.refreshExtensionsFromServer();\n }\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(response && response.error) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.archiveEncryptionFormat = {encrypted: true};\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile(this.archiveEncryptionFormat.encrypted);\n link.click();\n }\n\n this.performImport = function(data, password) {\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n this.importData = null;\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n }.bind(this))\n }\n\n this.submitImportPassword = function() {\n this.performImport(this.importData.data, this.importData.password);\n }\n\n this.importFileSelected = function(files) {\n this.importData = {};\n\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n var data = JSON.parse(e.target.result);\n $timeout(function(){\n if(data.auth_params) {\n // request password\n this.importData.requestPassword = true;\n this.importData.data = data;\n } else {\n this.performImport(data, null);\n }\n }.bind(this))\n }.bind(this)\n\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n apiController.loadLocalItems();\n $scope.allTag = new Tag({all: true});\n $scope.allTag.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n\n if($scope.selectedNote && $scope.selectedNote.dummy) {\n modelManager.removeItemLocally($scope.selectedNote);\n }\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addItem(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n tag.setDirty(true);\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.createRelationshipBetweenItems(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.setItemToBeDeleted(tag);\n // if no more notes, delete tag\n apiController.sync(function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addItem(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.createRelationshipBetweenItems($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n if(!$scope.didShowErrorAlert) {\n $scope.didShowErrorAlert = true;\n alert(\"There was an error saving your note. Please try again.\");\n }\n callback(false);\n } else {\n note.hasChanges = false;\n if(callback) {\n callback(true);\n }\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.setItemToBeDeleted(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n modelManager.removeItemLocally(note);\n return;\n }\n\n apiController.sync(null);\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n apiController.clearLocalStorage();\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!apiController.isUserSignedIn()) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = modelManager.createItem({content_type: \"Note\", dummy: true, text: \"\"});\n this.newNote.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function (modelManager) {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = modelManager.createItem({content_type: \"Tag\"});\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.title.length == 0) {\n tag.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.title || tag.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername($scope.formData.username, function(response){\n var username = response.username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n\n constructor(json_obj) {\n\n this.updateFromJSON(json_obj);\n\n this.observers = [];\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n get contentObject() {\n if(!this.content) {\n return {};\n }\n\n if(this.content !== null && typeof this.content === 'object') {\n // this is the case when mapping localStorage content, in which case the content is already parsed\n return this.content;\n }\n\n return JSON.parse(this.content);\n }\n\n updateFromJSON(json) {\n _.merge(this, json);\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(json.content) {\n this.mapContentToLocalProperties(this.contentObject);\n }\n }\n\n setDirty(dirty) {\n this.dirty = dirty;\n\n if(dirty) {\n this.notifyObserversOfChange();\n }\n }\n\n addObserver(observer, callback) {\n if(!_.find(this.observers, observer)) {\n this.observers.push({observer: observer, callback: callback});\n }\n }\n\n removeObserver(observer) {\n _.remove(this.observers, {observer: observer})\n }\n\n notifyObserversOfChange() {\n for(var observer of this.observers) {\n observer.callback(this);\n }\n }\n\n mapContentToLocalProperties(contentObj) {\n\n }\n\n createContentJSONFromProperties() {\n return this.structureParams();\n }\n\n referenceParams() {\n // must override\n }\n\n structureParams() {\n return {references: this.referenceParams()}\n }\n\n addItemAsRelationship(item) {\n // must override\n }\n\n removeItemAsRelationship(item) {\n // must override\n }\n\n removeAllRelationships() {\n // must override\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return null;\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Action {\n constructor(json) {\n _.merge(this, json);\n this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory\n this.error = false;\n if(this.lastExecuted) {\n // is string\n this.lastExecuted = new Date(this.lastExecuted);\n }\n }\n\n get permissionsString() {\n if(!this.permissions) {\n return \"\";\n }\n var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter\n permission += \": \";\n for(var contentType of this.content_types) {\n if(contentType == \"*\") {\n permission += \"All items\";\n } else {\n permission += contentType;\n }\n\n permission += \" \";\n }\n\n return permission;\n }\n\n get encryptionModeString() {\n if(this.verb != \"post\") {\n return null;\n }\n var encryptionMode = \"This action accepts data \";\n if(this.accepts_encrypted && this.accepts_decrypted) {\n encryptionMode += \"encrypted or decrypted.\";\n } else {\n if(this.accepts_encrypted) {\n encryptionMode += \"encrypted.\";\n } else {\n encryptionMode += \"decrypted.\";\n }\n }\n return encryptionMode;\n }\n\n}\n\nclass Extension extends Item {\n constructor(json) {\n super(json);\n _.merge(this, json);\n\n this.encrypted = true;\n this.content_type = \"Extension\";\n }\n\n actionsInGlobalContext() {\n return this.actions.filter(function(action){\n return action.context == \"global\";\n })\n }\n\n actionsWithContextForItem(item) {\n return this.actions.filter(function(action){\n return action.context == item.content_type || action.context == \"Item\";\n })\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.name = contentObject.name;\n this.url = contentObject.url;\n this.actions = contentObject.actions.map(function(action){\n return new Action(action);\n })\n }\n\n updateFromExternalResponseItem(externalResponseItem) {\n _.merge(this, externalResponseItem);\n this.actions = externalResponseItem.actions.map(function(action){\n return new Action(action);\n })\n }\n\n referenceParams() {\n return null;\n }\n\n structureParams() {\n var params = {\n name: this.name,\n url: this.url,\n actions: this.actions\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n this.text = contentObject.text;\n }\n\n referenceParams() {\n var references = _.map(this.tags, function(tag){\n return {uuid: tag.uuid, content_type: tag.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title,\n text: this.text\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, item)) {\n this.tags.push(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.tags.forEach(function(tag){\n _.pull(tag.notes, this);\n tag.setDirty(true);\n }.bind(this))\n this.tags = [];\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n safeText() {\n return this.text || \"\";\n }\n\n safeTitle() {\n return this.title || \"\";\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n }\n\n referenceParams() {\n var references = _.map(this.notes, function(note){\n return {uuid: note.uuid, content_type: note.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n if(!_.find(this.notes, item)) {\n this.notes.unshift(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.notes.forEach(function(note){\n _.pull(note.tags, this);\n note.setDirty(true);\n }.bind(this))\n\n this.notes = [];\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n referencesAffectedBySharingChange() {\n return this.notes;\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.user = {};\n this.syncToken = localStorage.getItem(\"syncToken\");\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.getAuthParams = function() {\n return JSON.parse(localStorage.getItem(\"auth_params\"));\n }\n\n this.isUserSignedIn = function() {\n return localStorage.getItem(\"jwt\");\n }\n\n this.userId = function() {\n return localStorage.getItem(\"uuid\");\n }\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n _.merge(this.user, user);\n callback();\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(authParams));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, keys);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(authParams));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n // this.changePassword = function(current_password, new_password) {\n // this.getAuthParamsForEmail(email, function(authParams){\n // if(!authParams) {\n // callback(null);\n // return;\n // }\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n // var data = {};\n // data.current_password = currentKeys.pw;\n // data.password = newKeys.pw;\n // data.password_confirmation = newKeys.pw;\n //\n // var user = this.user;\n //\n // this._performPasswordChange(currentKeys, newKeys, function(response){\n // if(response && !response.error) {\n // // this.showNewPasswordForm = false;\n // // reencrypt data with new mk\n // this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n // if(success) {\n // this.setMk(newKeys.mk);\n // alert(\"Your password has been changed and your data re-encrypted.\");\n // } else {\n // // rollback password\n // this._performPasswordChange(newKeys, currentKeys, function(response){\n // alert(\"There was an error changing your password. Your password has been rolled back.\");\n // window.location.reload();\n // })\n // }\n // }.bind(this));\n // } else {\n // // this.showNewPasswordForm = false;\n // alert(\"There was an error changing your password. Please try again.\");\n // }\n // }.bind(this))\n // }.bind(this));\n // }.bind(this));\n // }.bind(this));\n // }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(username, callback) {\n var request = Restangular.one(\"users\", this.userId());\n request.username = username;\n request.patch().then(function(response){\n this.user.username = response.username;\n callback(response.plain());\n }.bind(this))\n }\n\n\n /*\n Items\n */\n\n this.setSyncToken = function(syncToken) {\n this.syncToken = syncToken;\n localStorage.setItem(\"syncToken\", this.syncToken);\n }\n\n this.syncWithOptions = function(callback, options = {}) {\n this.writeAllItemsToLocalStorage(function(responseItems){\n if(!this.isUserSignedIn()) {\n // is not signed in\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n }\n }.bind(this))\n\n if(!this.isUserSignedIn()) {\n return;\n }\n\n var dirtyItems = modelManager.getDirtyItems();\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n // console.log(\"syncing items\", request.items);\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n this.writeAllItemsToLocalStorage();\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n if(callback) {\n callback({error: \"Sync error\"});\n }\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForExportFile = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForExtension = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n console.assert(!item.dummy, \"Item is dummy, should not have gotten here.\", item.dummy)\n\n var params = {uuid: item.uuid, content_type: item.content_type,\n presentation_name: item.presentation_name, deleted: item.deleted};\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.createContentJSONFromProperties() : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties()));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n this.shareItem = function(item, callback) {\n if(!this.isUserSignedIn()) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.allItems.forEach(function(item){\n item.setDirty(true);\n })\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }.bind(this)\n\n if(data.auth_params) {\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, data.auth_params), function(keys){\n var mk = keys.mk;\n try {\n this.decryptItemsWithKey(data.items, mk);\n onDataReady();\n }\n catch (e) {\n console.log(\"Error decrypting\", e);\n alert(\"There was an error decrypting your items. Make sure the password you entered is correct and try again.\");\n callback(false, null);\n return;\n }\n }.bind(this));\n } else {\n onDataReady();\n }\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(encrypted) {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.allItemsMatchingTypes([\"Tag\", \"Note\"]), function(item){\n return this.paramsForExportFile(item, encrypted);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n if(encrypted) {\n data[\"auth_params\"] = this.getAuthParams();\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n // this.mergeLocalDataRemotely = function(user, callback) {\n // var request = Restangular.one(\"users\", this.userId()).one(\"merge\");\n // var tags = user.tags;\n // request.items = user.items;\n // request.items.forEach(function(item){\n // if(item.tag_id) {\n // var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n // item.tag_name = tag.title;\n // }\n // })\n // request.post().then(function(response){\n // callback();\n // localStorage.removeItem('user');\n // })\n // }\n\n\n\n\n this.clearLocalStorage = function() {\n localStorage.removeItem(\"items\");\n localStorage.removeItem(\"mk\");\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"uuid\");\n localStorage.removeItem(\"syncToken\");\n }\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeAllItemsToLocalStorage = function(callback) {\n var items = _.map(modelManager.allItems, function(item){\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\"], false)\n }.bind(this));\n // console.log(\"Writing items to local\", items);\n this.writeToLocalStorage('items', items);\n if(callback) {\n callback(items);\n }\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItems = function() {\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n var jsonObj = _.merge({content_type: \"Note\"}, JSON.parse(draftString));\n return modelManager.createItem(jsonObj);\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n this.decryptItemsWithKey(items, masterKey);\n }\n\n this.decryptItemsWithKey = function(items, key) {\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n var isString = typeof item.content === 'string' || item.content instanceof String;\n if(isString) {\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, key);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = modelManager.allItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;class ContextualExtensionsMenu {\n\n constructor() {\n this.restrict = \"E\";\n this.templateUrl = \"frontend/directives/contextual-menu.html\";\n this.scope = {\n item: \"=\"\n };\n }\n\n controller($scope, modelManager, extensionManager) {\n $scope.extensions = extensionManager.extensionsInContextOfItem($scope.item);\n\n $scope.executeAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, $scope.item, function(response){\n action.running = false;\n })\n }\n\n $scope.accessTypeForExtension = function(extension) {\n return extensionManager.extensionUsesEncryptedData(extension) ? \"encrypted\" : \"decrypted\";\n }\n\n }\n\n\n}\n\nangular.module('app.frontend').directive('contextualExtensionsMenu', () => new ContextualExtensionsMenu);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager, apiController) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.apiController = apiController;\n this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem(\"enabledRepeatActionUrls\")) || [];\n this.decryptedExtensions = JSON.parse(localStorage.getItem(\"decryptedExtensions\")) || [];\n\n modelManager.addItemSyncObserver(\"extensionManager\", \"Extension\", function(items){\n for (var ext of items) {\n\n ext.encrypted = this.extensionUsesEncryptedData(ext);\n\n for (var action of ext.actions) {\n if(this.enabledRepeatActionUrls.includes(action.url)) {\n this.enableRepeatAction(action, ext);\n }\n }\n }\n }.bind(this))\n }\n\n get extensions() {\n return this.modelManager.extensions;\n }\n\n extensionsInContextOfItem(item) {\n return this.extensions.filter(function(ext){\n return ext.actionsWithContextForItem(item).length > 0;\n })\n }\n\n actionWithURL(url) {\n for (var extension of this.extensions) {\n return _.find(extension.actions, {url: url})\n }\n }\n\n extensionUsesEncryptedData(extension) {\n return !this.decryptedExtensions.includes(extension.url);\n }\n\n changeExtensionEncryptionFormat(encrypted, extension) {\n if(encrypted) {\n _.pull(this.decryptedExtensions, extension.url);\n } else {\n this.decryptedExtensions.push(extension.url);\n }\n\n localStorage.setItem(\"decryptedExtensions\", JSON.stringify(this.decryptedExtensions))\n\n extension.encrypted = this.extensionUsesEncryptedData(extension);\n }\n\n addExtension(url, callback) {\n this.retrieveExtensionFromServer(url, callback);\n }\n\n deleteExtension(extension) {\n for(var action of extension.actions) {\n _.pull(this.decryptedExtensions, extension);\n if(action.repeat_mode) {\n if(this.isRepeatActionEnabled(action)) {\n this.disableRepeatAction(action);\n }\n }\n }\n\n this.modelManager.setItemToBeDeleted(extension);\n this.apiController.sync(null);\n }\n\n retrieveExtensionFromServer(url, callback) {\n this.Restangular.oneUrl(url, url).get().then(function(response){\n var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());\n if(callback) {\n callback(ext);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n callback(null);\n })\n }\n\n handleExtensionLoadExternalResponseItem(url, externalResponseItem) {\n var extension = _.find(this.extensions, {url: url});\n if(extension) {\n extension.updateFromExternalResponseItem(externalResponseItem);\n } else {\n extension = new Extension(externalResponseItem);\n extension.url = url;\n extension.setDirty(true);\n this.modelManager.addItem(extension);\n this.apiController.sync(null);\n }\n\n return extension;\n }\n\n refreshExtensionsFromServer() {\n for (var url of this.enabledRepeatActionUrls) {\n var action = this.actionWithURL(url);\n if(action) {\n this.disableRepeatAction(action);\n }\n }\n\n for(var ext of this.extensions) {\n this.retrieveExtensionFromServer(ext.url, function(extension){\n extension.setDirty(true);\n });\n }\n }\n\n executeAction(action, extension, item, callback) {\n\n if(this.extensionUsesEncryptedData(extension) && !this.apiController.isUserSignedIn()) {\n alert(\"To send data encrypted, you must have an encryption key, and must therefore be signed in.\");\n callback(null);\n return;\n }\n\n switch (action.verb) {\n case \"get\": {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n action.error = false;\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n .catch(function(response){\n action.error = true;\n })\n\n break;\n }\n\n case \"show\": {\n var win = window.open(action.url, '_blank');\n win.focus();\n callback();\n break;\n }\n\n case \"post\": {\n var params = {};\n\n if(action.all) {\n var items = this.modelManager.allItemsMatchingTypes(action.content_types);\n params.items = items.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n\n } else {\n params.item = this.outgoingParamsForItem(item, extension);\n }\n\n this.performPost(action, extension, params, function(response){\n callback(response);\n });\n\n break;\n }\n\n default: {\n\n }\n }\n\n action.lastExecuted = new Date();\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n _.pull(this.enabledRepeatActionUrls, action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n this.modelManager.removeItemChangeObserver(action.url);\n\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n if(!_.find(this.enabledRepeatActionUrls, action.url)) {\n this.enabledRepeatActionUrls.push(action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n }\n\n if(action.repeat_mode) {\n\n if(action.repeat_mode == \"watch\") {\n this.modelManager.addItemChangeObserver(action.url, action.content_types, function(changedItems){\n this.triggerWatchAction(action, extension, changedItems);\n }.bind(this))\n }\n\n if(action.repeat_mode == \"loop\") {\n // todo\n }\n\n }\n }\n\n queueAction(action, extension, delay, changedItems) {\n this.actionQueue = this.actionQueue || [];\n if(_.find(this.actionQueue, {url: action.url})) {\n return;\n }\n\n // console.log(\"Successfully queued\", action, this.actionQueue.length);\n this.actionQueue.push(action);\n\n setTimeout(function () {\n // console.log(\"Performing queued action\", action);\n this.triggerWatchAction(action, extension, changedItems);\n _.pull(this.actionQueue, action);\n }.bind(this), delay * 1000);\n }\n\n triggerWatchAction(action, extension, changedItems) {\n if(action.repeat_timeout > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeat_timeout) {\n var delay = action.repeat_timeout - diffInSeconds;\n this.queueAction(action, extension, delay, changedItems);\n return;\n }\n }\n\n action.lastExecuted = new Date();\n\n console.log(\"Performing action.\");\n\n if(action.verb == \"post\") {\n var params = {};\n params.items = changedItems.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n this.performPost(action, extension, params, null);\n } else {\n // todo\n }\n }\n\n outgoingParamsForItem(item, extension) {\n return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));\n }\n\n performPost(action, extension, params, callback) {\n var request = this.Restangular.oneUrl(action.url, action.url);\n if(this.extensionUsesEncryptedData(extension)) {\n request.auth_params = this.apiController.getAuthParams();\n }\n _.merge(request, params);\n\n request.post().then(function(response){\n action.error = false;\n if(callback) {\n callback(response.plain());\n }\n })\n .catch(function(response){\n action.error = true;\n console.log(\"Action error response:\", response);\n if(callback) {\n callback({error: \"Request error\"});\n }\n })\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager {\n\n constructor() {\n this.notes = [];\n this.tags = [];\n this.itemSyncObservers = [];\n this.itemChangeObservers = [];\n this.items = [];\n this._extensions = [];\n }\n\n get allItems() {\n return this.items.filter(function(item){\n return !item.dummy;\n })\n }\n\n get extensions() {\n return this._extensions.filter(function(ext){\n return !ext.deleted;\n })\n }\n\n allItemsMatchingTypes(contentTypes) {\n return this.items.filter(function(item){\n return (contentTypes.includes(item.content_type) || contentTypes.includes(\"*\")) && !item.dummy;\n })\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null);\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.removeItemLocally(item)\n }\n continue;\n }\n\n _.omit(json_obj, omitFields);\n\n if(!item) {\n item = this.createItem(json_obj);\n } else {\n item.updateFromJSON(json_obj);\n }\n\n this.addItem(item);\n\n if(json_obj.content) {\n this.resolveReferencesForItem(item)\n }\n\n models.push(item)\n }\n\n this.notifySyncObserversOfModels(models);\n\n this.sortItems();\n return models;\n }\n\n notifySyncObserversOfModels(models) {\n for(var observer of this.itemSyncObservers) {\n var relevantItems = models.filter(function(item){return item.content_type == observer.type});\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n notifyItemChangeObserversOfModels(models) {\n for(var observer of this.itemChangeObservers) {\n var relevantItems = models.filter(function(item){\n return observer.content_types.includes(item.content_type) || observer.content_types.includes(\"*\");\n });\n\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n createItem(json_obj) {\n var item;\n if(json_obj.content_type == \"Note\") {\n item = new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n item = new Tag(json_obj);\n } else if(json_obj.content_type == \"Extension\") {\n item = new Extension(json_obj);\n } else {\n item = new Item(json_obj);\n }\n\n item.addObserver(this, function(changedItem){\n this.notifyItemChangeObserversOfModels([changedItem]);\n }.bind(this));\n\n return item;\n }\n\n addItems(items) {\n this.items = _.uniq(this.items.concat(items));\n\n items.forEach(function(item){\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, {uuid: item.uuid})) {\n this.tags.unshift(item);\n }\n } else if(item.content_type == \"Note\") {\n if(!_.find(this.notes, {uuid: item.uuid})) {\n this.notes.unshift(item);\n }\n } else if(item.content_type == \"Extension\") {\n if(!_.find(this._extensions, {uuid: item.uuid})) {\n this._extensions.unshift(item);\n }\n }\n }.bind(this))\n }\n\n addItem(item) {\n this.addItems([item])\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n resolveReferencesForItem(item) {\n var contentObject = item.contentObject;\n if(!contentObject.references) {\n return;\n }\n\n for(var reference of contentObject.references) {\n var referencedItem = this.findItem(reference.uuid);\n if(referencedItem) {\n item.addItemAsRelationship(referencedItem);\n referencedItem.addItemAsRelationship(item);\n } else {\n // console.log(\"Unable to find item:\", reference.uuid);\n }\n }\n }\n\n sortItems() {\n Item.sortItemsByDate(this.notes);\n\n this.tags.forEach(function(tag){\n Item.sortItemsByDate(tag.notes);\n })\n }\n\n addItemSyncObserver(id, type, callback) {\n this.itemSyncObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemSyncObserver(id) {\n _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));\n }\n\n addItemChangeObserver(id, content_types, callback) {\n this.itemChangeObservers.push({id: id, content_types: content_types, callback: callback});\n }\n\n removeItemChangeObserver(id) {\n _.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, {id: id}));\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n getDirtyItems() {\n return this.items.filter(function(item){return item.dirty == true && !item.dummy})\n }\n\n clearDirtyItems() {\n this.getDirtyItems().forEach(function(item){\n item.setDirty(false);\n })\n }\n\n setItemToBeDeleted(item) {\n item.deleted = true;\n if(!item.dummy) {\n item.setDirty(true);\n }\n item.removeAllRelationships();\n }\n\n removeItemLocally(item) {\n _.pull(this.items, item);\n\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n } else if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n } else if(item.content_type == \"Extension\") {\n _.pull(this._extensions, item);\n }\n }\n\n /*\n Relationships\n */\n\n createRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.addItemAsRelationship(itemTwo);\n itemTwo.addItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n\n removeRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.removeItemAsRelationship(itemTwo);\n itemTwo.removeItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file +{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","email","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","getCurrentUser","directive","$timeout","restrict","scope","save","remove","note","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","markdownRenderer","extensionManager","editorMode","safeText","dummy","focusTitle","hasChanges","hasAvailableExtensions","extensionsInContextOfItem","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","isUserSignedIn","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","setDirty","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","syncUpdated","$state","serverSideValidation","user","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","showExtensionsMenu","toggleExtensions","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","running","executeAction","deleteExtension","confirm","reloadExtensionsPressed","refreshExtensionsFromServer","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","archiveEncryptionFormat","downloadDataArchive","setAttribute","itemsDataFile","performImport","importJSONData","importData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","allTag","Tag","all","title","tags","notes","setInterval","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","selectedNote","removeItemLocally","tagsAddNew","addItem","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","createRelationshipBetweenItems","notesRemoveTag","validNotes","Note","filterDummyNotes","setItemToBeDeleted","notesSelectionMade","notesAddNew","didShowErrorAlert","headerLogout","clearLocalStorage","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","updateFromJSON","observers","generateUUID","json","created_at","updated_at","content","mapContentToLocalProperties","contentObject","dirty","notifyObserversOfChange","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","items","sort","b","Action","lastExecuted","permissions","permission","charAt","content_types","contentType","verb","encryptionMode","accepts_encrypted","accepts_decrypted","Extension","actions","context","map","externalResponseItem","pull","hasOnePublicTag","isPublic","filtered","unshift","provider","domainName","domain_comps","hostname","split","domain","$get","ngDialog","ApiController","syncToken","refresh","setItem","getAuthParams","userId","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","stringify","generateInitialEncryptionKeysForUser","_performPasswordChange","current_keys","new_keys","patch","setSyncToken","syncWithOptions","options","writeAllItemsToLocalStorage","responseItems","dirtyItems","getDirtyItems","deleted","clearDirtyItems","createRequestParamsForItem","additionalFields","sync_token","handleItemsResponse","retrieved_items","omitFields","saved_items","handleUnsavedItemsResponse","unsaved","undefined","mapping","itemResponse","findItem","alternateUUID","allReferencedObjects","reference","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","paramsForExportFile","paramsForExtension","forExportFile","itemCopy","cloneDeep","assert","encryptSingleItem","retrieveMk","auth_hash","createContentJSONFromProperties","base64","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","needingUpdate","open","template","resolve","className","disableAnimation","onDataReady","mapResponseItemsToLocalModels","allItems","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","removeItem","staticifyObject","object","writeToLocalStorage","value","toJson","sortItemsByDate","draftString","jsonObj","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","saveBatchItems","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","enabledRepeatActionUrls","decryptedExtensions","addItemSyncObserver","ext","enableRepeatAction","actionsWithContextForItem","retrieveExtensionFromServer","repeat_mode","isRepeatActionEnabled","disableRepeatAction","oneUrl","handleExtensionLoadExternalResponseItem","updateFromExternalResponseItem","actionWithURL","win","outgoingParamsForItem","performPost","removeItemChangeObserver","addItemChangeObserver","changedItems","triggerWatchAction","actionQueue","repeat_timeout","diffInSeconds","queueAction","service","$filter","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","itemSyncObservers","itemChangeObservers","_extensions","contentTypes","itemId","models","resolveReferencesForItem","notifySyncObserversOfModels","sortItems","relevantItems","addObserver","changedItem","notifyItemChangeObserversOfModels","uniq","addItems","referencedItem","addItemAsRelationship","id","removeAllRelationships","itemOne","itemTwo","removeItemAsRelationship","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":";;;;;;;;;;;;;;;;;;IAAMA,Q;;;;;;;wCAEgB;AAClB,aAAOC,SAASC,GAAT,CAAaC,SAAb,CAAuBC,MAAvB,CAA8B,MAAI,CAAlC,EAAqCC,QAArC,EAAP;AACD;;;mCAEc;AACb,UAAIC,SAASC,OAAOD,MAAP,IAAiBC,OAAOC,QAArC;AACA,UAAGF,MAAH,EAAW;AACT,YAAIG,MAAM,IAAIC,WAAJ,CAAgB,CAAhB,CAAV;AACAJ,eAAOK,eAAP,CAAuBF,GAAvB;AACA,YAAIG,MAAM,CAAC,CAAX;AACA,eAAO,uCAAuCC,OAAvC,CAA+C,OAA/C,EAAwD,UAASC,CAAT,EAAY;AACvEF;AACA,cAAIG,IAAKN,IAAIG,OAAK,CAAT,KAAiBA,MAAI,CAAL,GAAQ,CAAzB,GAA6B,EAArC;AACA,cAAII,IAAIF,KAAK,GAAL,GAAWC,CAAX,GAAgBA,IAAE,GAAF,GAAM,GAA9B;AACA,iBAAOC,EAAEX,QAAF,CAAW,EAAX,CAAP;AACH,SALM,CAAP;AAMD,OAVD,MAUO;AACL,YAAIY,IAAI,IAAIC,IAAJ,GAAWC,OAAX,EAAR;AACA,YAAGZ,OAAOa,WAAP,IAAsB,OAAOb,OAAOa,WAAP,CAAmBC,GAA1B,KAAkC,UAA3D,EAAsE;AACpEJ,eAAKG,YAAYC,GAAZ,EAAL,CADoE,CAC5C;AACzB;AACD,YAAIC,OAAO,uCAAuCT,OAAvC,CAA+C,OAA/C,EAAwD,UAASC,CAAT,EAAY;AAC7E,cAAIC,IAAI,CAACE,IAAIM,KAAKnB,MAAL,KAAc,EAAnB,IAAuB,EAAvB,GAA4B,CAApC;AACAa,cAAIM,KAAKC,KAAL,CAAWP,IAAE,EAAb,CAAJ;AACA,iBAAO,CAACH,KAAG,GAAH,GAASC,CAAT,GAAcA,IAAE,GAAF,GAAM,GAArB,EAA2BV,QAA3B,CAAoC,EAApC,CAAP;AACD,SAJU,CAAX;AAKA,eAAOiB,IAAP;AACD;AACF;;;gCAEWG,iB,EAAmBC,G,EAAK;AAClC,UAAIC,UAAU1B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuBJ,GAAvB,CAAd;AACA,UAAIK,SAAU9B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuB,EAAvB,CAAd;AACA,UAAIE,YAAY/B,SAASgC,GAAT,CAAaC,OAAb,CAAqBT,iBAArB,EAAwCE,OAAxC,EAAiD,EAAEQ,IAAIJ,MAAN,EAAeK,MAAMnC,SAASmC,IAAT,CAAcC,GAAnC,EAAwCC,SAASrC,SAASsC,GAAT,CAAaC,KAA9D,EAAjD,CAAhB;AACA,aAAOR,UAAU3B,QAAV,CAAmBJ,SAAS2B,GAAT,CAAaa,IAAhC,CAAP;AACD;;;gCAEWC,I,EAAMhB,G,EAAK;AACrB,UAAIC,UAAU1B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuBJ,GAAvB,CAAd;AACA,UAAIK,SAAU9B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuB,EAAvB,CAAd;AACA,UAAIa,YAAY1C,SAASgC,GAAT,CAAaW,OAAb,CAAqBF,IAArB,EAA2Bf,OAA3B,EAAoC,EAAEQ,IAAIJ,MAAN,EAAeK,MAAMnC,SAASmC,IAAT,CAAcC,GAAnC,EAAwCC,SAASrC,SAASsC,GAAT,CAAaC,KAA9D,EAApC,CAAhB;AACA,aAAOG,UAAUtC,QAAV,EAAP;AACD;;;kDAE6B;AAC5B,UAAIwC,OAAOC,MAAMxC,MAAN,CAAayC,iBAAb,EAAX;AACA,UAAIC,aAAaF,MAAMxC,MAAN,CAAayC,iBAAb,EAAjB;AACA,aAAO9C,SAASgD,MAAT,CAAgBD,UAAhB,EAA4BH,IAA5B,EAAkC,EAAEK,SAAS,MAAI,EAAf,EAAlC,EAAuD7C,QAAvD,EAAP;AACD;;;mCAEcqB,G,EAAK;AAClB,aAAOA,IAAIyB,SAAJ,CAAc,CAAd,EAAiBzB,IAAI0B,MAAJ,GAAW,CAA5B,CAAP;AACD;;;oCAEe1B,G,EAAK;AACnB,aAAOA,IAAIyB,SAAJ,CAAczB,IAAI0B,MAAJ,GAAW,CAAzB,EAA4B1B,IAAI0B,MAAhC,CAAP;AACD;;;2BAEMV,I,EAAM;AACX,aAAOzC,SAAS2B,GAAT,CAAaa,IAAb,CAAkBX,KAAlB,CAAwBY,IAAxB,EAA8BrC,QAA9B,CAAuCJ,SAAS2B,GAAT,CAAayB,MAApD,CAAP;AACD;;;iCAEYC,Y,EAAc;AACzB,aAAOrD,SAAS2B,GAAT,CAAayB,MAAb,CAAoBvB,KAApB,CAA0BwB,YAA1B,EAAwCjD,QAAxC,CAAiDJ,SAAS2B,GAAT,CAAaa,IAA9D,CAAP;AACD;;;2BAEMC,I,EAAM;AACX,aAAOzC,SAASsD,MAAT,CAAgBb,IAAhB,EAAsBrC,QAAtB,EAAP;AACD;;;yBAEIqC,I,EAAM;AACT,aAAOzC,SAASuD,IAAT,CAAcd,IAAd,EAAoBrC,QAApB,EAAP;AACD;;;4BAEOoD,O,EAAS/B,G,EAAK;AACpB,UAAIC,UAAU1B,SAAS2B,GAAT,CAAaC,GAAb,CAAiBC,KAAjB,CAAuBJ,GAAvB,CAAd;AACA,UAAIgC,cAAczD,SAAS2B,GAAT,CAAaa,IAAb,CAAkBX,KAAlB,CAAwB2B,OAAxB,CAAlB;AACA,aAAOxD,SAAS0D,UAAT,CAAoBD,WAApB,EAAiC/B,OAAjC,EAA0CtB,QAA1C,EAAP;AACD;;;mDAEuG;AAAA,qFAAd,EAAc;AAAA,UAA1EuD,QAA0E,QAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,QAAhEA,OAAgE;AAAA,UAAvDC,OAAuD,QAAvDA,OAAuD;AAAA,UAA9CC,MAA8C,QAA9CA,MAA8C;AAAA,UAAtCC,OAAsC,QAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,QAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AACrG,WAAKC,wBAAL,CAA8B,EAACP,UAAUA,QAAX,EAAqBC,SAASA,OAA9B;AAC5BC,iBAASA,OADmB,EACVC,QAAQA,MADE,EACMC,SAASA,OADf,EACwBC,aAAaA,WADrC,EAA9B,EACiF,UAASG,IAAT,EAAc;AAC3F,YAAIC,KAAKD,KAAK,CAAL,CAAT;AACA,YAAIE,KAAKF,KAAK,CAAL,CAAT;;AAEAF,iBAAS,EAACG,IAAIA,EAAL,EAASC,IAAIA,EAAb,EAAT;AACD,OANH;AAOD;;;2DAEsE;AAAA,sFAAd,EAAc;AAAA,UAAjCC,KAAiC,SAAjCA,KAAiC;AAAA,UAA1BX,QAA0B,SAA1BA,QAA0B;;AAAA,UAAVM,QAAU;;AACrE,UAAIM,WAAW,KAAKC,+BAAL,EAAf;AADqE,UAEhEX,OAFgE,GAEvBU,QAFuB,CAEhEV,OAFgE;AAAA,UAEvDC,MAFuD,GAEvBS,QAFuB,CAEvDT,MAFuD;AAAA,UAE/CE,WAF+C,GAEvBO,QAFuB,CAE/CP,WAF+C;AAAA,UAElCD,OAFkC,GAEvBQ,QAFuB,CAElCR,OAFkC;;AAGrE,UAAIU,WAAW,KAAK3B,iBAAL,EAAf;AACA,UAAIc,UAAU,KAAKc,IAAL,CAAUJ,QAAQ,IAAR,GAAeG,QAAzB,CAAd;AACAE,QAAEC,KAAF,CAAQL,QAAR,EAAkB,EAACX,SAASA,OAAV,EAAmBa,UAAUA,QAA7B,EAAlB;AACA,WAAKP,wBAAL,CAA8BS,EAAEC,KAAF,CAAQ,EAACN,OAAOA,KAAR,EAAeX,UAAUA,QAAzB,EAAmCC,SAASA,OAA5C,EAAR,EAA8DW,QAA9D,CAA9B,EAAuG,UAASJ,IAAT,EAAc;AACnH,YAAIC,KAAKD,KAAK,CAAL,CAAT;AACA,YAAIE,KAAKF,KAAK,CAAL,CAAT;;AAEAF,iBAAS,EAACG,IAAIA,EAAL,EAASC,IAAIA,EAAb,EAAT,EAA2BE,QAA3B;AACD,OALD;AAMD;;;;;;QAGKxE,Q,GAAAA,Q;;IACF8E,U;;;;;;;;;;;;;AAEJ;+CACoG;AAAA,sFAAd,EAAc;AAAA,UAA1ElB,QAA0E,SAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDC,OAAuD,SAAvDA,OAAuD;AAAA,UAA9CC,MAA8C,SAA9CA,MAA8C;AAAA,UAAtCC,OAAsC,SAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AAClG,UAAIa,aAAa;AACf,kBAAW9E,SAAS+E,IAAT,CAAczB,MADV;AAEf,kBAAWtD,SAAS+E,IAAT,CAAcC;AAFV,OAAjB;AAIA,UAAIC,YAAY;AACd,kBAAWjF,SAASgD;AADN,OAAhB;;AAIA,UAAIkC,MAAMJ,WAAWhB,MAAX,CAAV;AACA,UAAIqB,MAAMF,UAAUpB,OAAV,CAAV;AACA,UAAIuB,SAASD,IAAIxB,QAAJ,EAAcC,OAAd,EAAuB,EAAEX,SAASe,cAAY,EAAvB,EAA2BqB,QAAQH,GAAnC,EAAwCI,YAAYvB,OAApD,EAAvB,EAAsF3D,QAAtF,EAAb;;AAEA,UAAImF,eAAeH,OAAOjC,MAA1B;AACA,UAAIqC,YAAYJ,OAAOK,KAAP,CAAa,CAAb,EAAgBF,eAAa,CAA7B,CAAhB;AACA,UAAIG,aAAaN,OAAOK,KAAP,CAAaF,eAAa,CAA1B,EAA6BA,YAA7B,CAAjB;AACAtB,eAAS,CAACuB,SAAD,EAAYE,UAAZ,CAAT;AACD;;;sDAEiC;AAChC,aAAO,EAAC7B,SAAS,QAAV,EAAoBC,QAAQ,QAA5B,EAAsCE,aAAa,GAAnD,EAAwDD,SAAS,IAAjE,EAAP;AACD;;;;EAxBsBhE,Q;;QA4BjB8E,U,GAAAA,U;AACR,IAAIc,eAAerF,OAAOD,MAAP,CAAcuF,MAAjC;;IAEKC,W;;;;;;;;;;;;;AAEJ;;;sDAGkC;AAChC,aAAO,EAAChC,SAAS,QAAV,EAAoBC,QAAQ,QAA5B,EAAsCE,aAAa,GAAnD,EAAwDD,SAAS,IAAjE,EAAP;AACD;;AAED;;;;+CACoG;AAAA,sFAAd,EAAc;AAAA,UAA1EJ,QAA0E,SAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDC,OAAuD,SAAvDA,OAAuD;AAAA,UAA9CC,MAA8C,SAA9CA,MAA8C;AAAA,UAAtCC,OAAsC,SAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AACnG,WAAK6B,eAAL,CAAqB,EAACnC,UAAUA,QAAX,EAAqBE,SAASA,OAA9B,EAAuCC,QAAQA,MAA/C,EAAuDF,SAASA,OAAhE,EAAyEG,SAASA,OAAlF,EAA2FC,aAAaA,WAAxG,EAArB,EAA2I,UAASoB,MAAT,EAAgB;AACzJ,YAAIG,eAAeH,OAAOjC,MAA1B;AACA,YAAIqC,YAAYJ,OAAOK,KAAP,CAAa,CAAb,EAAgBF,eAAa,CAA7B,CAAhB;AACA,YAAIG,aAAaN,OAAOK,KAAP,CAAaF,eAAa,CAA1B,EAA6BA,YAA7B,CAAjB;AACAtB,iBAAS,CAACuB,SAAD,EAAYE,UAAZ,CAAT;AACD,OALD;AAMA;;AAED;;;;;;sCAI2F;AAAA,sFAAd,EAAc;AAAA,UAA1E/B,QAA0E,SAA1EA,QAA0E;AAAA,UAAhEC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDG,OAAuD,SAAvDA,OAAuD;AAAA,UAA9CF,OAA8C,SAA9CA,OAA8C;AAAA,UAArCC,MAAqC,SAArCA,MAAqC;AAAA,UAA7BE,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;;AAE1F,WAAK8B,kBAAL,CAAwBpC,QAAxB,EAAkCE,OAAlC,EAA2C,UAASpC,GAAT,EAAa;;AAEtD,YAAG,CAACA,GAAJ,EAAS;AACPuE,kBAAQC,GAAR,CAAY,iCAAZ;AACAhC,mBAAS,IAAT;AACA;AACD;;AAED,aAAKiC,mBAAL,CAAyB,EAACzE,KAAKA,GAAN,EAAWoC,SAASA,OAApB,EAA6BC,QAAQA,MAArC,EAA6CF,SAASA,OAAtD,EAA+DG,SAASA,OAAxE,EAAiFC,aAAaA,WAA9F,EAAzB,EAAqI,UAASvC,GAAT,EAAa;AAChJ,cAAG,CAACA,GAAJ,EAAS;AACPwC,qBAAS,IAAT;AACA;AACD;;AAEDA,mBAASxC,GAAT;AAED,SARoI,CAQnI0E,IARmI,CAQ9H,IAR8H,CAArI;AASD,OAjB0C,CAiBzCA,IAjByC,CAiBpC,IAjBoC,CAA3C;AAkBA;;;uCAEkBC,K,EAAOvC,O,EAASI,Q,EAAU;AAC1C0B,mBAAaU,SAAb,CACC,KADD,EAEC,KAAKC,mBAAL,CAAyBF,KAAzB,CAFD,EAGC,EAACG,MAAM1C,QAAQ2C,WAAR,EAAP,EAHD,EAIC,KAJD,EAKC,CAAC,YAAD,CALD,EAOAC,IAPA,CAOK,UAAShF,GAAT,EAAa;AACjBwC,iBAASxC,GAAT;AACD,OATA,EAUAiF,KAVA,CAUM,UAASC,GAAT,EAAa;AAClBX,gBAAQY,KAAR,CAAcD,GAAd;AACA1C,iBAAS,IAAT;AACD,OAbA;AAcF;;;0CAEyF;AAAA,sFAAd,EAAc;AAAA,UAArExC,GAAqE,SAArEA,GAAqE;AAAA,UAAhEoC,OAAgE,SAAhEA,OAAgE;AAAA,UAAvDC,MAAuD,SAAvDA,MAAuD;AAAA,UAA/CF,OAA+C,SAA/CA,OAA+C;AAAA,UAAtCG,OAAsC,SAAtCA,OAAsC;AAAA,UAA7BC,WAA6B,SAA7BA,WAA6B;;AAAA,UAAVC,QAAU;;AACvF,UAAIa,aAAa;AACf,kBAAW,SADI;AAEf,kBAAW;AAFI,OAAjB;AAIA,UAAII,MAAMJ,WAAWhB,MAAX,CAAV;AACA6B,mBAAakB,UAAb,CACC;AACE,gBAAQhD,QAAQ2C,WAAR,EADV;AAEE5D,cAAM,KAAK0D,mBAAL,CAAyB1C,OAAzB,CAFR;AAGE0B,oBAAYvB,OAHd;AAIE+C,cAAM,EAACP,MAAMrB,GAAP;AAJR,OADD,EAOCzD,GAPD,EAQCuC,WARD,EAUAyC,IAVA,CAUK,UAASM,IAAT,EAAc;AAClB,YAAItF,MAAM,KAAKuF,sBAAL,CAA4B,IAAIC,UAAJ,CAAeF,IAAf,CAA5B,CAAV;AACA9C,iBAASxC,GAAT;AACD,OAHK,CAGJ0E,IAHI,CAGC,IAHD,CAVL,EAcAO,KAdA,CAcM,UAASC,GAAT,EAAa;AAClBX,gBAAQY,KAAR,CAAcD,GAAd;AACA1C,iBAAS,IAAT;AACD,OAjBA;AAkBF;;;wCAEmBiD,M,EAAQ;AACzB,UAAIC,UAAU,IAAIC,WAAJ,CAAgB,OAAhB,CAAd;AACA,aAAOD,QAAQE,MAAR,CAAeH,MAAf,CAAP;AACD;;;2CAEqBI,W,EAAa;AAChC,UAAIC,YAAY,IAAIN,UAAJ,CAAeK,WAAf,CAAhB;AACA,UAAIE,YAAY,EAAhB;AACA,UAAIC,WAAJ;;AAEA,WAAK,IAAIC,IAAE,CAAX,EAAcA,IAAEH,UAAUI,UAA1B,EAAsCD,GAAtC,EAA2C;AACvCD,sBAAcF,UAAUG,CAAV,EAAatH,QAAb,CAAsB,EAAtB,CAAd;AACA,YAAIqH,YAAYtE,MAAZ,GAAqB,CAAzB,EAA4B;AACxBsE,wBAAc,MAAMA,WAApB;AACH;AACDD,qBAAaC,WAAb;AACH;AACD,aAAOD,SAAP;AACH;;;;EA1GuBzH,Q;;QA6GjB8F,W,GAAAA,W;AACR;;AAED,IAAIhD,QAAQA,SAAS,EAArB;;AAEA,IAAGvC,OAAOD,MAAP,CAAcuF,MAAjB,EAAyB;AACvB/C,QAAMxC,MAAN,GAAe,IAAIwF,WAAJ,EAAf;AACD,CAFD,MAEO;AACLhD,QAAMxC,MAAN,GAAe,IAAIwE,UAAJ,EAAf;AACD;;AAED+C,QAAQC,MAAR,CAAe,cAAf,EAA+B,CAC7B,WAD6B,EAE7B,aAF6B,EAG7B,UAH6B,CAA/B,EAMCC,MAND,CAMQ,UAAUC,mBAAV,EAA+BC,qBAA/B,EAAsD;AAC5DD,sBAAoBE,iBAApB,CAAsC,EAAC,gBAAgB,kBAAjB,EAAtC;;AAEA,MAAIC,MAAMF,sBAAsBG,gBAAtB,EAAV;AACAJ,sBAAoBK,UAApB,CAA+BF,MAAM,MAArC;;AAEAH,sBAAoBM,yBAApB,CAA8C,UAASC,OAAT,EAAkBC,SAAlB,EAA6BC,KAA7B,EAAoCN,GAApC,EAAyCO,OAAzC,EAAkDC,MAAlD,EAA0DC,UAA1D,EAAsE;AAClH,QAAIC,QAAQC,aAAaC,OAAb,CAAqB,KAArB,CAAZ;AACA,QAAGF,KAAH,EAAU;AACRH,gBAAU9D,EAAEoE,MAAF,CAASN,OAAT,EAAkB,EAACO,eAAe,YAAYH,aAAaC,OAAb,CAAqB,KAArB,CAA5B,EAAlB,CAAV;AACD;;AAED,WAAO;AACLR,eAASA,OADJ;AAELI,cAAQA,MAFH;AAGLD,eAASA,OAHJ;AAILE,kBAAYA;AAJP,KAAP;AAMD,GAZD;AAaD,CAzBD,EA0BCb,MA1BD,CA0BQ,CAAC,YAAD,EAAe,UAAUmB,UAAV,EAAsB;AACzC;AACH,CAFO,CA1BR;AA6BA,CAACrB,QAAQC,MAAR,CAAe,cAAf,EACEC,MADF,CACS,UAAUoB,cAAV,EAA0BC,kBAA1B,EAA8CC,iBAA9C,EAAiE;;AAEvEF,iBACGG,KADH,CACS,MADT,EACiB;AACbC,cAAU;AADG,GADjB,EAKGD,KALH,CAKS,MALT,EAKiB;AACbnB,SAAK,GADQ;AAEbqB,YAAQ,MAFK;AAGbC,WAAO;AACL,kBAAa;AACXC,qBAAa,oBADF;AAEXC,oBAAY;AAFD;AADR;AAHM,GALjB;;AAgBE;AAhBF,GAiBGL,KAjBH,CAiBS,KAjBT,EAiBgB;AACZE,YAAQ,MADI;AAEZC,WAAO;AACL,kBAAa;AACXC,qBAAa;AADF;AADR;AAFK,GAjBhB;;AA0BE;AACAN,qBAAmBQ,SAAnB,CAA6B,UAASC,SAAT,EAAoBC,SAApB,EAA8B;AACxD,QAAIR,QAAQO,UAAUE,GAAV,CAAc,QAAd,CAAZ;AACAT,UAAMU,EAAN,CAAS,KAAT;AACA,WAAOF,UAAUG,IAAV,EAAP;AACF,GAJD;;AAMA;AACAZ,oBAAkBa,SAAlB,CAA4B,IAA5B;AAEH,CAvCF;AAwCD;IAAOC,Q,GACL,kBAAYC,UAAZ,EAAwBC,YAAxB,EAAsCC,aAAtC,EAAqD;AAAA;;AACnDA,gBAAcC,cAAd,CAA6B,YAAU,CAAE,CAAzC;AACD,C;;AAGH1C,QAAQC,MAAR,CAAe,cAAf,EAA+B6B,UAA/B,CAA0C,UAA1C,EAAsDQ,QAAtD;AACA,CAACtC,QAAQC,MAAR,CAAe,cAAf,EACE0C,SADF,CACY,eADZ,EAC6B,UAASC,QAAT,EAAkB;AAC5C,SAAO;AACLC,cAAU,GADL;AAELC,WAAO;AACLC,YAAM,GADD;AAELC,cAAQ,GAFH;AAGLC,YAAM;AAHD,KAFF;AAOLpB,iBAAa,sBAPR;AAQL7I,aAAS,IARJ;AASL8I,gBAAY,YATP;AAULoB,kBAAc,MAVT;AAWLC,sBAAkB,IAXb;;AAaLC,UAAK,cAASN,KAAT,EAAgBO,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;;AAEtC,UAAIC,UAAU,SAAVA,OAAU,CAASC,KAAT,EAAgB;AAC5B,YAAIA,MAAMC,OAAN,IAAiBD,MAAME,OAA3B,EAAoC;AAChC,kBAAQC,OAAOC,YAAP,CAAoBJ,MAAMK,KAA1B,EAAiCC,WAAjC,EAAR;AACA,iBAAK,GAAL;AACIN,oBAAMO,cAAN;AACApB,uBAAS,YAAU;AACjBW,qBAAKU,QAAL,CAAcR,KAAd;AACD,eAFD;AAGA;AACJ,iBAAK,GAAL;AACIA,oBAAMO,cAAN;AACApB,uBAAS,YAAU;AACjBW,qBAAKW,eAAL;AACD,eAFD;AAGA;AACJ,iBAAK,GAAL;AACIT,oBAAMO,cAAN;AACApB,uBAAS,YAAU;AACjBW,qBAAKY,cAAL;AACD,eAFD;AAGA;AACJ,iBAAK,GAAL;AACIV,oBAAMO,cAAN;AACApB,uBAAS,YAAU;AACjBW,qBAAKa,gBAAL;AACD,eAFD;AAGA;AAxBJ;AA0BH;AACF,OA7BD;;AA+BA1L,aAAO2L,gBAAP,CAAwB,SAAxB,EAAmCb,OAAnC;;AAEAV,YAAMwB,GAAN,CAAU,UAAV,EAAsB,YAAU;AAC9B5L,eAAO6L,mBAAP,CAA2B,SAA3B,EAAsCf,OAAtC;AACD,OAFD;;AAIAV,YAAM0B,MAAN,CAAa,WAAb,EAA0B,UAASvB,IAAT,EAAewB,OAAf,EAAuB;AAC/C,YAAGxB,IAAH,EAAS;AACPM,eAAKmB,OAAL,CAAazB,IAAb,EAAmBwB,OAAnB;AACD,SAFD,MAEO;AACLlB,eAAKN,IAAL,GAAY,EAAZ;AACD;AACF,OAND;AAOD;AA3DI,GAAP;AA6DD,CA/DF,EAgEEnB,UAhEF,CAgEa,YAhEb,EAgE2B,UAAU6C,IAAV,EAAgB/B,QAAhB,EAA0BH,aAA1B,EAAyCmC,gBAAzC,EAA2DrC,UAA3D,EAAuEsC,gBAAvE,EAAyF;;AAEjH,OAAKH,OAAL,GAAe,UAASzB,IAAT,EAAewB,OAAf,EAAwB;AACrC,SAAKK,UAAL,GAAkB,MAAlB;;AAEA,QAAG7B,KAAK8B,QAAL,GAAgBxJ,MAAhB,IAA0B,CAA1B,IAA+B0H,KAAK+B,KAAvC,EAA8C;AAC5C,WAAKC,UAAL,CAAgB,GAAhB;AACD;;AAED,QAAGR,WAAWA,WAAWxB,IAAzB,EAA+B;AAC7B,UAAGwB,QAAQS,UAAX,EAAuB;AACrB,aAAKnC,IAAL,GAAY0B,OAAZ,EAAqB,IAArB;AACD,OAFD,MAEO,IAAGA,QAAQO,KAAX,EAAkB;AACvB,aAAKhC,MAAL,GAAcyB,OAAd;AACD;AACF;AACF,GAdD;;AAgBA,OAAKU,sBAAL,GAA8B,YAAW;AACvC,WAAON,iBAAiBO,yBAAjB,CAA2C,KAAKnC,IAAhD,EAAsD1H,MAAtD,GAA+D,CAAtE;AACD,GAFD;;AAIA,OAAK8J,oBAAL,GAA4B,YAAW;AACrC,SAAKP,UAAL,GAAkB,MAAlB;AACA,SAAKQ,WAAL,CAAiB,GAAjB;AACD,GAHD;;AAKA,OAAKA,WAAL,GAAmB,UAASC,KAAT,EAAgB;AACjCC,eAAW,YAAU;AACnB,UAAI9E,UAAU+E,SAASC,cAAT,CAAwB,kBAAxB,CAAd;AACAhF,cAAQiF,KAAR;AACD,KAHD,EAGGJ,KAHH;AAID,GALD;;AAOA,OAAKN,UAAL,GAAkB,UAASM,KAAT,EAAgB;AAChCC,eAAW,YAAU;AACnBC,eAASC,cAAT,CAAwB,mBAAxB,EAA6CC,KAA7C;AACD,KAFD,EAEGJ,KAFH;AAGD,GAJD;;AAMA,OAAKK,eAAL,GAAuB,YAAW;AAChC,SAAKC,QAAL,GAAgB,KAAhB;AACD,GAFD;;AAIA,OAAKC,eAAL,GAAuB,YAAW;AAChC,WAAOlB,iBAAiBmB,UAAjB,CAA4BnB,iBAAiBoB,sBAAjB,CAAwC,KAAK/C,IAAL,CAAU8B,QAAV,EAAxC,CAA5B,CAAP;AACD,GAFD;;AAIA,MAAIkB,aAAJ;;AAEA,OAAKhC,QAAL,GAAgB,UAASiC,MAAT,EAAiB;AAC/B,QAAIjD,OAAO,KAAKA,IAAhB;AACAA,SAAK+B,KAAL,GAAa,KAAb;AACA,SAAKjC,IAAL,GAAYE,IAAZ,EAAkB,UAASkD,OAAT,EAAiB;AACjC,UAAGA,OAAH,EAAY;AACV1D,sBAAc2D,UAAd;;AAEA,YAAGH,aAAH,EAAkBrD,SAASyD,MAAT,CAAgBJ,aAAhB;AAClBA,wBAAgBrD,SAAS,YAAU;AACjC,eAAK0D,UAAL,GAAkB,mBAAlB;AACD,SAFwB,CAEvB/H,IAFuB,CAElB,IAFkB,CAAT,EAEF,GAFE,CAAhB;AAGD,OAPD,MAOO;AACL,YAAG0H,aAAH,EAAkBrD,SAASyD,MAAT,CAAgBJ,aAAhB;AAClBA,wBAAgBrD,SAAS,YAAU;AACjC,eAAK0D,UAAL,GAAkB,+BAAlB;AACD,SAFwB,CAEvB/H,IAFuB,CAElB,IAFkB,CAAT,EAEF,GAFE,CAAhB;AAGD;AACF,KAdiB,CAchBA,IAdgB,CAcX,IAdW,CAAlB;AAeD,GAlBD;;AAoBA,OAAKgI,SAAL,GAAiB,UAASL,MAAT,EAAiB;AAChCA,WAAOM,MAAP,CAAcC,IAAd;AACA,SAAKxC,QAAL,CAAciC,MAAd;AACA,SAAKZ,WAAL;AACD,GAJD;;AAMA,MAAIoB,WAAJ;AACA,OAAKC,WAAL,GAAmB,YAAW;AAC5B,SAAK1D,IAAL,CAAUiC,UAAV,GAAuB,IAAvB;AACA,SAAKjC,IAAL,CAAU+B,KAAV,GAAkB,KAAlB;AACA,QAAGvC,cAAcmE,cAAd,EAAH,EAAmC;AACjC;AACAnE,oBAAcoE,eAAd,CAA8B,KAAK5D,IAAnC;AACD;;AAED,QAAGyD,WAAH,EAAgB9D,SAASyD,MAAT,CAAgBK,WAAhB;AAChB,QAAGT,aAAH,EAAkBrD,SAASyD,MAAT,CAAgBJ,aAAhB;AAClBS,kBAAc9D,SAAS,YAAU;AAC/B,WAAK0D,UAAL,GAAkB,WAAlB;AACA,WAAKrC,QAAL;AACD,KAHsB,CAGrB1F,IAHqB,CAGhB,IAHgB,CAAT,EAGA,GAHA,CAAd;AAID,GAdD;;AAiBA,OAAKuI,cAAL,GAAsB,YAAW;AAC/B,SAAKH,WAAL;AACD,GAFD;;AAIA,OAAKI,WAAL,GAAmB,YAAW;AAC5B,SAAKJ,WAAL;AACD,GAFD;;AAIA,OAAKK,WAAL,GAAmB,YAAW;AAC5B,SAAKC,WAAL,GAAmB,IAAnB;AACD,GAFD;;AAIA,OAAKC,cAAL,GAAsB,YAAW;AAC/B,SAAKC,WAAL,GAAmB,KAAnB;AACA5E,eAAW6E,UAAX,CAAsB,eAAtB;AACA,SAAKC,UAAL,GAAkB,KAAlB;AACD,GAJD;;AAMA,OAAKC,UAAL,GAAkB,YAAW;AAC3B,SAAKL,WAAL,GAAmB,KAAnB;AACD,GAFD;;AAIA,OAAK7C,gBAAL,GAAwB,YAAW;AACjC,SAAKmD,UAAL,GAAkB,CAAC,KAAKA,UAAxB;AACA,QAAG,KAAKA,UAAR,EAAoB;AAClB,UAAG,KAAKzC,UAAL,IAAmB,MAAtB,EAA8B;AAC5B;AACA,aAAKQ,WAAL,CAAiB,CAAjB;AACD;AACF,KALD,MAKO,CAEN;AACF,GAVD;;AAYA,OAAKkC,gBAAL,GAAwB,YAAW;AACjC,SAAK3B,QAAL,GAAgB,KAAhB;AACD,GAFD;;AAIA,OAAK1B,cAAL,GAAsB,YAAW;AAC/B,QAAG,KAAKW,UAAL,IAAmB,SAAtB,EAAiC;AAC/B,WAAKA,UAAL,GAAkB,MAAlB;AACD,KAFD,MAEO;AACL,WAAKA,UAAL,GAAkB,SAAlB;AACD;AACF,GAND;;AAQA,OAAK2C,cAAL,GAAsB,YAAW;AAC/B,SAAK5B,QAAL,GAAgB,KAAhB;AACA,QAAIvF,MAAM,KAAKoH,gBAAL,CAAsB,KAAKzE,IAA3B,CAAV;AACA3C,UAAMA,IAAItH,OAAJ,CAAY,KAAKiK,IAAL,CAAU0E,iBAAtB,EAAyC,EAAzC,CAAN;AACA,SAAKrH,GAAL,GAAW,EAACsH,MAAMtH,GAAP,EAAYU,OAAQ,KAAKiC,IAAL,CAAU0E,iBAA9B,EAAX;AACA,SAAKN,UAAL,GAAkB,IAAlB;AACD,GAND;;AAQA,OAAKQ,OAAL,GAAe,UAAS3B,MAAT,EAAiB;AAC9BA,WAAOM,MAAP,CAAcC,IAAd;;AAEA,QAAIqB,WAAW,KAAK7E,IAAL,CAAU0E,iBAAzB;AACA,SAAK1E,IAAL,CAAU0E,iBAAV,GAA8B,KAAKrH,GAAL,CAASU,KAAvC;AACA,SAAKiC,IAAL,CAAU8E,QAAV,CAAmB,IAAnB;;AAEAtF,kBAAcuF,IAAd,CAAmB,UAASC,QAAT,EAAkB;AACnC,UAAGA,YAAYA,SAASjJ,KAAxB,EAA+B;AAC7B,aAAKiE,IAAL,CAAU0E,iBAAV,GAA8BG,QAA9B;AACA,aAAKxH,GAAL,CAASU,KAAT,GAAiB8G,QAAjB;AACAI,cAAM,4BAAN;AACD,OAJD,MAIO;AACL,aAAKb,UAAL,GAAkB,KAAlB;AACD;AACF,KARkB,CAQjB9I,IARiB,CAQZ,IARY,CAAnB;AASD,GAhBD;;AAkBA,OAAK4J,SAAL,GAAiB,YAAW;;AAE1B,aAASC,YAAT,CAAsB9H,GAAtB,EAA2B;AACzB,UAAI+H,IAAI5C,SAAS6C,aAAT,CAAuB,GAAvB,CAAR;AACAD,QAAE7B,MAAF,GAAW,QAAX;AACA6B,QAAEE,IAAF,GAASjI,GAAT;AACA+H,QAAEG,KAAF;AACH;;AAEC/F,kBAAcgG,SAAd,CAAwB,KAAKxF,IAA7B,EAAmC,UAASA,IAAT,EAAc;AAC/CmF,mBAAa,KAAKV,gBAAL,CAAsBzE,IAAtB,CAAb;AACD,KAFkC,CAEjC1E,IAFiC,CAE5B,IAF4B,CAAnC;AAGA,SAAKsH,QAAL,GAAgB,KAAhB;AACD,GAbD;;AAeA,OAAK6C,WAAL,GAAmB,YAAW;AAC5BjG,kBAAckG,WAAd,CAA0B,KAAK1F,IAA/B,EAAqC,UAASA,IAAT,EAAc,CAElD,CAFD;AAGA,SAAK4C,QAAL,GAAgB,KAAhB;AACD,GALD;;AAOA,OAAK6B,gBAAL,GAAwB,YAAW;AACjC,WAAO,KAAKzE,IAAL,CAAU2F,eAAV,EAAP;AACD,GAFD;;AAIA,OAAKC,WAAL,GAAmB,YAAW;AAC5B,QAAG,KAAK5F,IAAL,CAAU6F,MAAb,EAAqB;AACnBZ,YAAM,iFAAN;AACD,KAFD,MAEO;AACL,WAAKrC,QAAL,GAAgB,CAAC,KAAKA,QAAtB;AACD;AACF,GAND;;AAQA,OAAKkD,UAAL,GAAkB,YAAW;AAC3BtG,kBAAc2D,UAAd;AACA,SAAKpD,MAAL,GAAc,KAAKC,IAAnB;AACA,SAAK4C,QAAL,GAAgB,KAAhB;AACD,GAJD;;AAMA,OAAK3B,eAAL,GAAuB,YAAW;AAChC,SAAKY,UAAL,GAAkB,MAAlB;AACA,SAAKQ,WAAL,CAAiB,GAAjB;AACD,GAHD;AAKD,CAnRF;AAoRD,CAACtF,QAAQC,MAAR,CAAe,cAAf,EACE0C,SADF,CACY,QADZ,EACsB,UAASF,aAAT,EAAwBoC,gBAAxB,EAAyC;AAC5D,SAAO;AACLhC,cAAU,GADL;AAELC,WAAO;AACLkG,cAAQ;AADH,KAFF;AAKLnH,iBAAa,sBALR;AAML7I,aAAS,IANJ;AAOL8I,gBAAY,YAPP;AAQLoB,kBAAc,MART;AASLC,sBAAkB,IATb;;AAWLC,UAAK,cAASN,KAAT,EAAgBO,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;AACtCT,YAAMwB,GAAN,CAAU,oBAAV,EAAgC,YAAU;AACxCf,aAAK0F,WAAL;AACD,OAFD;AAGD;AAfI,GAAP;AAiBD,CAnBF,EAoBEnH,UApBF,CAoBa,YApBb,EAoB2B,UAAUoH,MAAV,EAAkBzG,aAAlB,EAAiCD,YAAjC,EAA+C2G,oBAA/C,EAAqEvG,QAArE,EAA+EiC,gBAA/E,EAAiG;;AAEzH,OAAKuE,IAAL,GAAY3G,cAAc2G,IAA1B;AACA,OAAKvE,gBAAL,GAAwBA,gBAAxB;;AAEA,OAAKwE,qBAAL,GAA6B,YAAW;AACtC,SAAKC,mBAAL,GAA2B,CAAC,KAAKA,mBAAjC;AACD,GAFD;;AAIA,OAAKC,kBAAL,GAA0B,YAAW;AACnC,SAAKC,UAAL,GAAkB,EAAClJ,KAAKmC,cAAcgH,SAAd,EAAN,EAAlB;AACA,SAAKC,eAAL,GAAuB,CAAC,KAAKA,eAA7B;AACA,SAAKC,OAAL,GAAe,KAAf;AACA,SAAKL,mBAAL,GAA2B,KAA3B;AACA,SAAKM,kBAAL,GAA0B,KAA1B;AACD,GAND;;AAQA,OAAKC,gBAAL,GAAwB,YAAW;AACjC,SAAKH,eAAL,GAAuB,KAAvB;AACA,SAAKE,kBAAL,GAA0B,CAAC,KAAKA,kBAAhC;AACD,GAHD;;AAKA,OAAKE,mBAAL,GAA2B,YAAW;AACpC,SAAKC,gBAAL,GAAwB,EAAxB;AACA,SAAKC,oBAAL,GAA4B,CAAC,KAAKA,oBAAlC;AACD,GAHD;;AAKA,OAAKC,sBAAL,GAA8B,YAAW;AACvC,QAAG,KAAKF,gBAAL,CAAsBzJ,GAAzB,EAA8B;AAC5BuE,uBAAiBqF,YAAjB,CAA8B,KAAKH,gBAAL,CAAsBzJ,GAApD,EAAyD,UAAS2H,QAAT,EAAkB;AACzE,YAAG,CAACA,QAAJ,EAAc;AACZC,gBAAM,+EAAN;AACD,SAFD,MAEO;AACL,eAAK6B,gBAAL,CAAsBzJ,GAAtB,GAA4B,EAA5B;AACA,eAAK0J,oBAAL,GAA4B,KAA5B;AACD;AACF,OAPwD,CAOvDzL,IAPuD,CAOlD,IAPkD,CAAzD;AAQD;AACF,GAXD;;AAaA,OAAK4L,cAAL,GAAsB,UAASC,MAAT,EAAiBC,SAAjB,EAA4B;AAChDD,WAAOE,OAAP,GAAiB,IAAjB;AACAzF,qBAAiB0F,aAAjB,CAA+BH,MAA/B,EAAuCC,SAAvC,EAAkD,IAAlD,EAAwD,UAASpC,QAAT,EAAkB;AACxEmC,aAAOE,OAAP,GAAiB,KAAjB;AACA,UAAGrC,YAAYA,SAASjJ,KAAxB,EAA+B;AAC7BoL,eAAOpL,KAAP,GAAe,IAAf;AACAkJ,cAAM,8DAAN;AACD,OAHD,MAGO;AACLkC,eAAOpL,KAAP,GAAe,KAAf;AACAyD,sBAAcuF,IAAd,CAAmB,IAAnB;AACD;AACF,KATD;AAUD,GAZD;;AAcA,OAAKwC,eAAL,GAAuB,UAASH,SAAT,EAAoB;AACzC,QAAGI,QAAQ,iDAAR,CAAH,EAA+D;AAC7D5F,uBAAiB2F,eAAjB,CAAiCH,SAAjC;AACD;AACF,GAJD;;AAMA,OAAKK,uBAAL,GAA+B,YAAW;AACxC,QAAGD,QAAQ,4FAAR,CAAH,EAA0G;AACxG5F,uBAAiB8F,2BAAjB;AACD;AACF,GAJD;;AAMA,OAAKC,YAAL,GAAoB,YAAW;AAC7BnI,kBAAcoI,SAAd,CAAwB,KAAKrB,UAAL,CAAgBlJ,GAAxC,EAA6C,IAA7C;AACD,GAFD;;AAIA,OAAKwK,cAAL,GAAsB,YAAW;AAC/B,SAAKpB,eAAL,GAAuB,KAAvB;AACA,SAAKV,MAAL;AACAvG,kBAAcsI,OAAd;AACArS,WAAOsS,QAAP,CAAgBC,MAAhB;AACD,GALD;;AAOA,OAAKC,oBAAL,GAA4B,YAAW;AACrC,SAAKC,kBAAL,CAAwBC,MAAxB,GAAiC,wBAAjC;;AAEAxI,aAAS,YAAU;AACjB,UAAGyI,KAAKtP,QAAL,IAAiBsP,KAAKC,qBAAzB,EAAgD;AAC9CpD,cAAM,oDAAN;AACA;AACD;;AAEDzF,oBAAc8I,cAAd,CAA6B,KAAKJ,kBAAL,CAAwBK,gBAArD,EAAuE,KAAKL,kBAAL,CAAwBM,YAA/F,EAA6G,UAASxD,QAAT,EAAkB,CAE9H,CAFD;AAID,KAVQ,CAUP1J,IAVO,CAUF,IAVE,CAAT;AAWD,GAdD;;AAgBA,OAAKmN,YAAL,GAAoB,YAAW;AAC7B,WAAOlJ,aAAamJ,aAAb,CAA2BpQ,MAA3B,GAAoC,CAA3C;AACD,GAFD;;AAIA,OAAKqQ,iBAAL,GAAyB,YAAW;AAClC,QAAG,CAAC,KAAKxC,IAAL,CAAUyC,WAAd,EAA2B;AACzB,UAAG,CAACpB,QAAQ,iIAAR,CAAJ,EAAgJ;AAC9I,aAAKrB,IAAL,CAAUyC,WAAV,GAAwB,IAAxB;AACD;AACF;AACF,GAND;;AAQA,OAAKC,WAAL,GAAmB,YAAW;AAC5B,SAAKC,YAAL,GAAoB,IAApB;AACAtJ,kBAAcuF,IAAd,CAAmB,UAASC,QAAT,EAAkB;AACnCrF,eAAS,YAAU;AACjB,aAAKmJ,YAAL,GAAoB,KAApB;AACD,OAFQ,CAEPxN,IAFO,CAEF,IAFE,CAAT,EAEc,GAFd;AAGA,UAAG0J,YAAYA,SAASjJ,KAAxB,EAA+B;AAC7BkJ,cAAM,2FAAN;AACD,OAFD,MAEO;AACL,aAAKe,WAAL;AACD;AACF,KATkB,CASjB1K,IATiB,CASZ,IATY,CAAnB;AAUD,GAZD;;AAcA,OAAK0K,WAAL,GAAmB,YAAW;AAC5B,SAAK+C,YAAL,GAAoB,IAAI3S,IAAJ,EAApB;AACD,GAFD;;AAIA,OAAK4S,kBAAL,GAA0B,YAAW;AACnC,SAAKC,SAAL,CAAed,MAAf,GAAwB,0BAAxB;AACAxI,aAAS,YAAU;AACjBH,oBAAc0J,KAAd,CAAoB,KAAKD,SAAL,CAAexP,KAAnC,EAA0C,KAAKwP,SAAL,CAAeE,aAAzD,EAAwE,UAASnE,QAAT,EAAkB;AACxF,YAAG,CAACA,QAAD,IAAaA,SAASjJ,KAAzB,EAAgC;AAC9B,cAAIA,QAAQiJ,WAAWA,SAASjJ,KAApB,GAA4B,EAACpD,SAAS,2BAAV,EAAxC;AACA,eAAKsQ,SAAL,CAAed,MAAf,GAAwB,IAAxB;AACAlD,gBAAMlJ,MAAMpD,OAAZ;AACD,SAJD,MAIO;AACL,eAAKyQ,aAAL,CAAmBpE,SAASmB,IAA5B;AACD;AACF,OARuE,CAQtE7K,IARsE,CAQjE,IARiE,CAAxE;AASD,KAVQ,CAUPA,IAVO,CAUF,IAVE,CAAT;AAWD,GAbD;;AAeA,OAAK+N,sBAAL,GAA8B,YAAW;AACvC,SAAKJ,SAAL,CAAed,MAAf,GAAwB,4BAAxB;;AAEAxI,aAAS,YAAU;AACjBH,oBAAc8J,QAAd,CAAuB,KAAKL,SAAL,CAAexP,KAAtC,EAA6C,KAAKwP,SAAL,CAAeE,aAA5D,EAA2E,UAASnE,QAAT,EAAkB;AAC3F,YAAG,CAACA,QAAD,IAAaA,SAASjJ,KAAzB,EAAgC;AAC9B,cAAIA,QAAQiJ,WAAWA,SAASjJ,KAApB,GAA4B,EAACpD,SAAS,2BAAV,EAAxC;AACA,eAAKsQ,SAAL,CAAed,MAAf,GAAwB,IAAxB;AACAlD,gBAAMlJ,MAAMpD,OAAZ;AACD,SAJD,MAIO;AACL,eAAKyQ,aAAL,CAAmBpE,SAASmB,IAA5B;AACD;AACF,OAR0E,CAQzE7K,IARyE,CAQpE,IARoE,CAA3E;AASD,KAVQ,CAUPA,IAVO,CAUF,IAVE,CAAT;AAWD,GAdD;;AAgBA,OAAKiO,wBAAL,GAAgC,YAAW;AACzC,QAAIC,WAAWjK,aAAamJ,aAA5B;AACA,QAAIe,iBAAiB,CAArB;AACAD,aAASE,OAAT,CAAiB,UAAS1J,IAAT,EAAc;AAC7B,UAAGA,KAAK2J,iBAAL,EAAH,EAA6B;AAC3BF;AACD;AACF,KAJgB,CAIfnO,IAJe,CAIV,IAJU,CAAjB;;AAMA,WAAOmO,iBAAiB,GAAjB,GAAuBD,SAASlR,MAAhC,GAAyC,kBAAhD;AACD,GAVD;;AAYA,OAAKsR,uBAAL,GAA+B,EAAC/R,WAAW,IAAZ,EAA/B;;AAEA,OAAKgS,mBAAL,GAA2B,YAAW;AACpC,QAAI1J,OAAOqC,SAAS6C,aAAT,CAAuB,GAAvB,CAAX;AACAlF,SAAK2J,YAAL,CAAkB,UAAlB,EAA8B,YAA9B;AACA3J,SAAKmF,IAAL,GAAY9F,cAAcuK,aAAd,CAA4B,KAAKH,uBAAL,CAA6B/R,SAAzD,CAAZ;AACAsI,SAAKoF,KAAL;AACD,GALD;;AAOA,OAAKyE,aAAL,GAAqB,UAAS5B,IAAT,EAAetP,QAAf,EAAyB;AAC5C0G,kBAAcyK,cAAd,CAA6B7B,IAA7B,EAAmCtP,QAAnC,EAA6C,UAASoK,OAAT,EAAkB8B,QAAlB,EAA2B;AACtE7J,cAAQC,GAAR,CAAY,iBAAZ,EAA+B8H,OAA/B,EAAwC8B,QAAxC;AACA,UAAG9B,OAAH,EAAY;AACV,aAAKgH,UAAL,GAAkB,IAAlB;AACD,OAFD,MAEO;AACLjF,cAAM,2DAAN;AACD;AACF,KAP4C,CAO3C3J,IAP2C,CAOtC,IAPsC,CAA7C;AAQD,GATD;;AAWA,OAAK6O,oBAAL,GAA4B,YAAW;AACrC,SAAKH,aAAL,CAAmB,KAAKE,UAAL,CAAgB9B,IAAnC,EAAyC,KAAK8B,UAAL,CAAgBpR,QAAzD;AACD,GAFD;;AAIA,OAAKsR,kBAAL,GAA0B,UAASC,KAAT,EAAgB;AACxC,SAAKH,UAAL,GAAkB,EAAlB;;AAEA,QAAII,OAAOD,MAAM,CAAN,CAAX;AACA,QAAIE,SAAS,IAAIC,UAAJ,EAAb;AACAD,WAAOE,MAAP,GAAgB,UAASC,CAAT,EAAY;AAC1B,UAAItC,OAAOuC,KAAK3T,KAAL,CAAW0T,EAAEnH,MAAF,CAASqH,MAApB,CAAX;AACAjL,eAAS,YAAU;AACjB,YAAGyI,KAAKyC,WAAR,EAAqB;AACnB;AACA,eAAKX,UAAL,CAAgBY,eAAhB,GAAkC,IAAlC;AACA,eAAKZ,UAAL,CAAgB9B,IAAhB,GAAuBA,IAAvB;AACD,SAJD,MAIO;AACL,eAAK4B,aAAL,CAAmB5B,IAAnB,EAAyB,IAAzB;AACD;AACF,OARQ,CAQP9M,IARO,CAQF,IARE,CAAT;AASD,KAXe,CAWdA,IAXc,CAWT,IAXS,CAAhB;;AAaAiP,WAAOQ,UAAP,CAAkBT,IAAlB;AACD,GAnBD;;AAqBA,OAAKlB,aAAL,GAAqB,UAASjD,IAAT,EAAe;;AAElC;AACE;AACA;AACA;AACF;AACE1Q,WAAOsS,QAAP,CAAgBC,MAAhB;AACF;;AAEA,SAAKgD,SAAL,GAAiB,KAAjB;AACA,SAAKC,gBAAL,GAAwB,KAAxB;AACD,GAZD;AAcD,CArPF;AAsPD,CAAClO,QAAQC,MAAR,CAAe,cAAf,EACA6B,UADA,CACW,UADX,EACuB,UAAUqM,MAAV,EAAkB5L,UAAlB,EAA8BK,QAA9B,EAAwCH,aAAxC,EAAuDD,YAAvD,EAAqE;AACzFD,aAAW6L,SAAX,GAAuB,gBAAvB;;AAEA3L,gBAAc4L,cAAd;AACAF,SAAOG,MAAP,GAAgB,IAAIC,GAAJ,CAAQ,EAACC,KAAK,IAAN,EAAR,CAAhB;AACAL,SAAOG,MAAP,CAAcG,KAAd,GAAsB,KAAtB;AACAN,SAAOO,IAAP,GAAclM,aAAakM,IAA3B;AACAP,SAAOG,MAAP,CAAcK,KAAd,GAAsBnM,aAAamM,KAAnC;;AAEAlM,gBAAcuF,IAAd,CAAmB,IAAnB;AACA;AACA4G,cAAY,YAAY;AACtBnM,kBAAcuF,IAAd,CAAmB,IAAnB;AACD,GAFD,EAEG,KAFH;;AAIA;;;;AAIAmG,SAAOU,YAAP,GAAsB,YAAW;AAC/B;AACD,GAFD;;AAIAV,SAAOW,qBAAP,GAA+B,UAASC,GAAT,EAAc;AAC3C,QAAGA,IAAIP,GAAP,EAAY;AACVL,aAAOU,YAAP;AACD;AACF,GAJD;;AAMAV,SAAOa,iBAAP,GAA2B,UAASD,GAAT,EAAc;AACvCZ,WAAOc,WAAP,GAAqBF,GAArB;;AAEA,QAAGZ,OAAOe,YAAP,IAAuBf,OAAOe,YAAP,CAAoBlK,KAA9C,EAAqD;AACnDxC,mBAAa2M,iBAAb,CAA+BhB,OAAOe,YAAtC;AACD;AACF,GAND;;AAQAf,SAAOiB,UAAP,GAAoB,UAASL,GAAT,EAAc;AAChCvM,iBAAa6M,OAAb,CAAqBN,GAArB;AACD,GAFD;;AAIAZ,SAAOmB,QAAP,GAAkB,UAASP,GAAT,EAAc1S,QAAd,EAAwB;AACxC0S,QAAIhH,QAAJ,CAAa,IAAb;AACAtF,kBAAcuF,IAAd,CAAmB3L,QAAnB;AACD,GAHD;;AAKA;;;;AAIA8R,SAAOoB,iBAAP,GAA2B,UAASC,QAAT,EAAmBC,MAAnB,EAA2BC,MAA3B,EAAmC;;AAE5D,QAAIC,eAAe5S,EAAE6S,IAAF,CAAOpN,aAAamM,KAApB,EAA2B,EAAClV,MAAM+V,SAAS/V,IAAhB,EAA3B,CAAnB;AACA,QAAG,CAACgW,OAAOjB,GAAX,EAAgB;AACdhM,mBAAaqN,8BAAb,CAA4CJ,MAA5C,EAAoDE,YAApD;AACD;;AAEDlN,kBAAcuF,IAAd,CAAmB,YAAU,CAAE,CAA/B;AACD,GARD;;AAUA;;;;AAIAmG,SAAO2B,cAAP,GAAwB,UAASf,GAAT,EAAc;AACpC,QAAIgB,aAAaC,KAAKC,gBAAL,CAAsBlB,IAAIJ,KAA1B,CAAjB;AACA,QAAGoB,cAAc,CAAjB,EAAoB;AAClBvN,mBAAa0N,kBAAb,CAAgCnB,GAAhC;AACA;AACAtM,oBAAcuF,IAAd,CAAmB,YAAU;AAC3B;AACAmG,eAAOO,IAAP,GAAc,EAAd;AACA9L,iBAAS,YAAU;AACjBuL,iBAAOO,IAAP,GAAclM,aAAakM,IAA3B;AACD,SAFD;AAGD,OAND;AAOD,KAVD,MAUO;AACLxG,YAAM,iDAAN;AACD;AACF,GAfD;;AAiBAiG,SAAOgC,kBAAP,GAA4B,UAASlN,IAAT,EAAe;AACzCkL,WAAOe,YAAP,GAAsBjM,IAAtB;AACD,GAFD;;AAIAkL,SAAOiC,WAAP,GAAqB,UAASnN,IAAT,EAAe;AAClCT,iBAAa6M,OAAb,CAAqBpM,IAArB;;AAEA,QAAG,CAACkL,OAAOc,WAAP,CAAmBT,GAAvB,EAA4B;AAC1BhM,mBAAaqN,8BAAb,CAA4C1B,OAAOc,WAAnD,EAAgEhM,IAAhE;AACAkL,aAAOU,YAAP;AACD;AACF,GAPD;;AASA;;;;AAIAV,SAAOlK,QAAP,GAAkB,UAAShB,IAAT,EAAe5G,QAAf,EAAyB;AACzC4G,SAAK8E,QAAL,CAAc,IAAd;;AAEAtF,kBAAcuF,IAAd,CAAmB,UAASC,QAAT,EAAkB;AACnC,UAAGA,YAAYA,SAASjJ,KAAxB,EAA+B;AAC7B,YAAG,CAACmP,OAAOkC,iBAAX,EAA8B;AAC5BlC,iBAAOkC,iBAAP,GAA2B,IAA3B;AACAnI,gBAAM,wDAAN;AACD;AACD7L,iBAAS,KAAT;AACD,OAND,MAMO;AACL4G,aAAKiC,UAAL,GAAkB,KAAlB;AACA,YAAG7I,QAAH,EAAa;AACXA,mBAAS,IAAT;AACD;AACF;AACF,KAbD;AAcD,GAjBD;;AAmBA8R,SAAOpF,UAAP,GAAoB,UAAS9F,IAAT,EAAe;;AAEjCT,iBAAa0N,kBAAb,CAAgCjN,IAAhC;;AAEA,QAAGA,QAAQkL,OAAOe,YAAlB,EAAgC;AAC9Bf,aAAOe,YAAP,GAAsB,IAAtB;AACD;;AAED,QAAGjM,KAAK+B,KAAR,EAAe;AACbxC,mBAAa2M,iBAAb,CAA+BlM,IAA/B;AACA;AACD;;AAEDR,kBAAcuF,IAAd,CAAmB,IAAnB;AACD,GAdD;;AAgBA;;;;AAIAmG,SAAOmC,YAAP,GAAsB,YAAW;AAC/B7N,kBAAc8N,iBAAd;AACD,GAFD;AAKH,CA/IA;AAgJD,CAACvQ,QAAQC,MAAR,CAAe,cAAf,EACE0C,SADF,CACY,cADZ,EAC4B,YAAU;AACnC,SAAO;AACLG,WAAO;AACL0N,cAAQ,GADH;AAELC,qBAAe,GAFV;AAGLzN,cAAQ,GAHH;AAIL+L,WAAK,GAJA;AAKL2B,iBAAW;AALN,KADF;;AASL7O,iBAAa,qBATR;AAUL7I,aAAS,IAVJ;AAWL8I,gBAAY,WAXP;AAYLoB,kBAAc,MAZT;AAaLC,sBAAkB,IAbb;;AAeLC,UAAK,cAASN,KAAT,EAAgBO,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;AACtCT,YAAM0B,MAAN,CAAa,UAAb,EAAyB,UAASuK,GAAT,EAAcW,MAAd,EAAqB;AAC5C,YAAGX,GAAH,EAAQ;AACNxL,eAAKoN,YAAL,CAAkB5B,GAAlB,EAAuBW,MAAvB;AACD;AACF,OAJD;AAKD;AArBI,GAAP;AAuBD,CAzBF,EA0BE5N,UA1BF,CA0Ba,WA1Bb,EA0B0B,UAAUW,aAAV,EAAyBG,QAAzB,EAAmCL,UAAnC,EAA+CC,YAA/C,EAA6D;;AAEpFD,aAAW+B,GAAX,CAAe,eAAf,EAAgC,YAAU;AACxC,SAAKuB,QAAL,GAAgB,KAAhB;AACD,GAF+B,CAE9BtH,IAF8B,CAEzB,IAFyB,CAAhC;;AAIA,MAAIqS,cAAc,IAAlB;;AAEA,OAAKD,YAAL,GAAoB,UAAS5B,GAAT,EAAcW,MAAd,EAAsB;AACxC,SAAK7J,QAAL,GAAgB,KAAhB;;AAEA,QAAG,KAAKqJ,YAAL,IAAqB,KAAKA,YAAL,CAAkBlK,KAA1C,EAAiD;AAC/CjI,QAAEiG,MAAF,CAAS0M,OAAOf,KAAhB,EAAuB,KAAKO,YAA5B;AACD;;AAED,SAAK2B,UAAL,CAAgBhW,IAAhB,GAAuB,EAAvB;;AAEAkU,QAAIJ,KAAJ,CAAUhC,OAAV,CAAkB,UAAS1J,IAAT,EAAc;AAC9BA,WAAK6N,OAAL,GAAe,IAAf;AACD,KAFD;AAGA,SAAKC,eAAL,CAAqB,KAArB;;AAEA,QAAGH,WAAH,EAAgB;AACdhO,eAAS,YAAU;AACjB,YAAIoO,QAAQvO,cAAcwO,QAAd,EAAZ;AACA,YAAGD,KAAH,EAAU;AACR,cAAI/N,OAAO+N,KAAX;AACA,eAAKE,UAAL,CAAgBjO,IAAhB;AACD,SAHD,MAGO;AACL,eAAKkO,aAAL;AACAP,wBAAc,KAAd;AACD;AACF,OATQ,CASPrS,IATO,CASF,IATE,CAAT;AAUD,KAXD,MAWO,IAAGwQ,IAAIJ,KAAJ,CAAUpT,MAAV,IAAoB,CAAvB,EAA0B;AAC7B,WAAK4V,aAAL;AACH;AACF,GA5BD;;AA8BA,OAAKC,iBAAL,GAAyB,YAAW;AAClC,SAAKvL,QAAL,GAAgB,KAAhB;AACA,SAAK6K,SAAL,GAAiB,KAAK3B,GAAtB;AACD,GAHD;;AAKA,OAAKsC,gBAAL,GAAwB,YAAW;AACjC,SAAKxL,QAAL,GAAgB,KAAhB;;AAEA,QAAG,CAACpD,cAAcmE,cAAd,EAAJ,EAAoC;AAClCsB,YAAM,uCAAN;AACA;AACD;;AAED,QAAG,KAAK6G,GAAL,CAASP,GAAZ,EAAiB;AACftG,YAAM,iCAAN;AACA;AACD;;AAEDzF,kBAAcgG,SAAd,CAAwB,KAAKsG,GAA7B,EAAkC,UAAS9G,QAAT,EAAkB,CAAE,CAAtD;AACD,GAdD;;AAgBA,OAAKqJ,kBAAL,GAA0B,YAAW;AACnC,SAAKzL,QAAL,GAAgB,KAAhB;AACApD,kBAAckG,WAAd,CAA0B,KAAKoG,GAA/B,EAAoC,UAAS9G,QAAT,EAAkB,CAErD,CAFD;AAGD,GALD;;AAOA,OAAK8I,eAAL,GAAuB,UAASQ,SAAT,EAAoB;AACzC,QAAIC,eAAe,KAAKzC,GAAL,CAASJ,KAAT,CAAe8C,MAAf,CAAsB,UAASxO,IAAT,EAAc;AACrD,aAAOA,KAAK6N,OAAZ;AACD,KAFkB,CAAnB;;AAIA,QAAGU,aAAajW,MAAb,GAAsB,CAAzB,EAA4B;AAC1B,WAAK2V,UAAL,CAAgBM,aAAa,CAAb,CAAhB;AACD,KAFD,MAEO,IAAGD,SAAH,EAAc;AACnB,WAAKJ,aAAL;AACD;AACF,GAVD;;AAYA,OAAKD,UAAL,GAAkB,UAASjO,IAAT,EAAe;AAC/B,SAAKiM,YAAL,GAAoBjM,IAApB;AACA,SAAKwN,aAAL,GAAqBxN,IAArB;AACD,GAHD;;AAKA,OAAKkO,aAAL,GAAqB,YAAW;AAC9B,QAAI1C,QAAQ,cAAc,KAAKM,GAAL,CAASJ,KAAT,GAAkB,OAAO,KAAKI,GAAL,CAASJ,KAAT,CAAepT,MAAf,GAAwB,CAA/B,CAAlB,GAAuD,EAArE,CAAZ;AACA,SAAKmW,OAAL,GAAelP,aAAamP,UAAb,CAAwB,EAACC,cAAc,MAAf,EAAuB5M,OAAO,IAA9B,EAAoCnK,MAAM,EAA1C,EAAxB,CAAf;AACA,SAAK6W,OAAL,CAAajD,KAAb,GAAqBA,KAArB;AACA,SAAKyC,UAAL,CAAgB,KAAKQ,OAArB;AACA,SAAKlB,MAAL,GAAc,KAAKkB,OAAnB;AACD,GAND;;AAQA,OAAKb,UAAL,GAAkB,EAAChW,MAAO,EAAR,EAAlB;;AAEA,OAAKgX,WAAL,GAAmB,UAAS5O,IAAT,EAAe;AAChC,QAAG,KAAK4N,UAAL,CAAgBhW,IAAhB,CAAqBU,MAArB,IAA+B,CAAlC,EAAqC;AACnC0H,WAAK6N,OAAL,GAAe,IAAf;AACD,KAFD,MAEO;AACL7N,WAAK6N,OAAL,GAAe7N,KAAKwL,KAAL,CAAW1K,WAAX,GAAyB+N,QAAzB,CAAkC,KAAKjB,UAAL,CAAgBhW,IAAlD,KAA2DoI,KAAKpI,IAAL,CAAUkJ,WAAV,GAAwB+N,QAAxB,CAAiC,KAAKjB,UAAL,CAAgBhW,IAAjD,CAA1E;AACD;AACD,WAAOoI,KAAK6N,OAAZ;AACD,GAPkB,CAOjBvS,IAPiB,CAOZ,IAPY,CAAnB;;AASA,OAAKwT,iBAAL,GAAyB,YAAW;AAClCnP,aAAS,YAAU;AACjB,UAAG,CAAC,KAAKsM,YAAL,CAAkB4B,OAAtB,EAA+B;AAC7B,aAAKC,eAAL,CAAqB,KAArB;AACD;AACF,KAJQ,CAIPxS,IAJO,CAIF,IAJE,CAAT,EAIc,GAJd;AAKD,GAND;AAOD,CAvIF;AAwID,CAACyB,QAAQC,MAAR,CAAe,cAAf,EACE0C,SADF,CACY,aADZ,EAC2B,YAAU;AAClC,SAAO;AACLE,cAAU,GADL;AAELC,WAAO;AACL0N,cAAQ,GADH;AAELC,qBAAe,GAFV;AAGLuB,kBAAY,GAHP;AAILjP,YAAM,GAJD;AAKL2L,YAAM,GALD;AAMLJ,cAAQ,GANH;AAOL2D,qBAAe;AAPV,KAFF;AAWLpQ,iBAAa,oBAXR;AAYL7I,aAAS,IAZJ;AAaL8I,gBAAY,UAbP;AAcLoB,kBAAc,MAdT;AAeLC,sBAAkB,IAfb;;AAiBLC,UAAK,cAASN,KAAT,EAAgBO,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;AACtCT,YAAM0B,MAAN,CAAa,WAAb,EAA0B,UAAS0N,OAAT,EAAiB;AACzC,YAAGA,OAAH,EAAY;AACV3O,eAAK4O,OAAL,CAAaD,OAAb;AACD;AACF,OAJD;;AAMApP,YAAM0B,MAAN,CAAa,aAAb,EAA4B,UAAS8J,MAAT,EAAgB;AAC1C,YAAGA,MAAH,EAAW;AACT/K,eAAK6O,SAAL,CAAe9D,MAAf;AACD;AACF,OAJD;AAKD;AA7BI,GAAP;AA+BD,CAjCF,EAkCExM,UAlCF,CAkCa,UAlCb,EAkCyB,UAAUU,YAAV,EAAwB;;AAE9C,MAAI6P,cAAc,IAAlB;;AAEA,OAAKD,SAAL,GAAiB,UAAS9D,MAAT,EAAiB;AAChC,SAAKgE,SAAL,CAAe,KAAKhE,MAApB;AACD,GAFD;;AAIA,OAAK6D,OAAL,GAAe,UAASzD,IAAT,EAAe;AAC5B,QAAG2D,WAAH,EAAgB;AACZA,oBAAc,KAAd;AACA,WAAKC,SAAL,CAAe,KAAKhE,MAApB;AACH,KAHD,MAGO;AACL,UAAGI,QAAQA,KAAKnT,MAAL,GAAc,CAAzB,EAA4B;AAC1B,aAAK+W,SAAL,CAAe5D,KAAK,CAAL,CAAf;AACD;AACF;AACF,GATD;;AAWA,OAAK4D,SAAL,GAAiB,UAASvD,GAAT,EAAc;AAC7B,SAAKiD,UAAL,GAAkBjD,GAAlB;AACA,SAAKE,WAAL,GAAmBF,GAAnB;AACA,SAAK0B,aAAL,GAAqB1B,GAArB;AACD,GAJD;;AAMA,OAAKwD,gBAAL,GAAwB,YAAW;AACjC,QAAG,KAAKC,UAAR,EAAoB;AAClB;AACD;;AAED,SAAK/C,MAAL,GAAcjN,aAAamP,UAAb,CAAwB,EAACC,cAAc,KAAf,EAAxB,CAAd;AACA,SAAK3C,WAAL,GAAmB,KAAKQ,MAAxB;AACA,SAAK+C,UAAL,GAAkB,KAAK/C,MAAvB;AACA,SAAKe,MAAL,GAAc,KAAKf,MAAnB;AACD,GATD;;AAWA,MAAIgD,kBAAkB,EAAtB;AACA,OAAKC,eAAL,GAAuB,UAAS3D,GAAT,EAAc;AACnC0D,sBAAkB1D,IAAIN,KAAtB;AACD,GAFD;;AAIA,OAAKkE,iBAAL,GAAyB,UAAS5D,GAAT,EAAc;AACrC,SAAKyD,UAAL,GAAkBzD,GAAlB;AACD,GAFD;;AAIA,OAAK6D,OAAL,GAAe,UAAS1M,MAAT,EAAiB6I,GAAjB,EAAsB;AACnC,SAAKyD,UAAL,GAAkB,IAAlB;AACA,QAAGzD,IAAIN,KAAJ,CAAUlT,MAAV,IAAoB,CAAvB,EAA0B;AACxBwT,UAAIN,KAAJ,GAAYgE,eAAZ;AACAA,wBAAkB,EAAlB;AACA;AACD;;AAEDvM,WAAOM,MAAP,CAAcC,IAAd;AACA,QAAG,CAACsI,IAAIN,KAAL,IAAcM,IAAIN,KAAJ,CAAUlT,MAAV,IAAoB,CAArC,EAAwC;AACpC;AACH;;AAED,SAAKwH,IAAL,GAAYgM,GAAZ,EAAiB,UAAS8D,QAAT,EAAkB;AACjC;AACA,WAAKP,SAAL,CAAevD,GAAf;AACA,WAAKU,MAAL,GAAc,IAAd;AACD,KAJgB,CAIflR,IAJe,CAIV,IAJU,CAAjB;AAKD,GAlBD;;AAoBA,OAAKuU,SAAL,GAAiB,UAAS/D,GAAT,EAAc;AAC7B,QAAIgB,aAAaC,KAAKC,gBAAL,CAAsBlB,IAAIJ,KAA1B,CAAjB;AACA,WAAOoB,WAAWxU,MAAlB;AACD,GAHD;;AAKA,OAAKwX,UAAL,GAAkB,UAASpF,CAAT,EAAY8B,MAAZ,EAAoBxM,IAApB,EAA0B;AAC1C,SAAKgP,aAAL,GAAqBhP,IAArB,EAA2BwM,MAA3B,EAAmC,KAAKR,WAAxC;AACD,GAFiB,CAEhB1Q,IAFgB,CAEX,IAFW,CAAlB;AAKD,CA7GF;AA8GD,CAACyB,QAAQC,MAAR,CAAe,cAAf,EACA6B,UADA,CACW,mBADX,EACgC,UAAUqM,MAAV,EAAkB1L,aAAlB,EAAiCuQ,WAAjC,EAA8C3W,QAA9C,EAAwDuG,QAAxD,EAAkE;AACjGuL,SAAO8E,QAAP,GAAkB,EAAlB;;AAEA9E,SAAO+E,YAAP,GAAsB,YAAW;AAC/BzQ,kBAAc0Q,WAAd,CAA0BhF,OAAO8E,QAAP,CAAgBG,QAA1C,EAAoD,UAASnL,QAAT,EAAkB;AACpE,UAAImL,WAAWnL,SAASmL,QAAxB;AACA/W,eAAS+W,QAAT;AACAjF,aAAOkF,eAAP;AACD,KAJD;AAKD,GAND;AAOD,CAXA;AAYD;IAAOC,I;AAEL,gBAAYC,QAAZ,EAAsB;AAAA;;AAEpB,SAAKC,cAAL,CAAoBD,QAApB;;AAEA,SAAKE,SAAL,GAAiB,EAAjB;;AAEA,QAAG,CAAC,KAAKha,IAAT,EAAe;AACb,WAAKA,IAAL,GAAYwB,MAAMxC,MAAN,CAAaib,YAAb,EAAZ;AACD;AACF;;;;mCAqBcC,I,EAAM;AACnB5W,QAAEC,KAAF,CAAQ,IAAR,EAAc2W,IAAd;AACA,UAAG,KAAKC,UAAR,EAAoB;AAClB,aAAKA,UAAL,GAAkB,IAAIva,IAAJ,CAAS,KAAKua,UAAd,CAAlB;AACA,aAAKC,UAAL,GAAkB,IAAIxa,IAAJ,CAAS,KAAKwa,UAAd,CAAlB;AACD,OAHD,MAGO;AACL,aAAKD,UAAL,GAAkB,IAAIva,IAAJ,EAAlB;AACA,aAAKwa,UAAL,GAAkB,IAAIxa,IAAJ,EAAlB;AACD;;AAED,UAAGsa,KAAKG,OAAR,EAAiB;AACf,aAAKC,2BAAL,CAAiC,KAAKC,aAAtC;AACD;AACF;;;oCAEe;AACZ,WAAKva,IAAL,GAAYwB,MAAMxC,MAAN,CAAaib,YAAb,EAAZ;AACAtV,cAAQC,GAAR,CAAY,qBAAZ,EAAmC,KAAK5E,IAAxC;AACH;;;6BAEQwa,K,EAAO;AACd,WAAKA,KAAL,GAAaA,KAAb;;AAEA,UAAGA,KAAH,EAAU;AACR,aAAKC,uBAAL;AACD;AACF;;;gCAEWC,Q,EAAU9X,Q,EAAU;AAC9B,UAAG,CAACU,EAAE6S,IAAF,CAAO,KAAK6D,SAAZ,EAAuBU,QAAvB,CAAJ,EAAsC;AACpC,aAAKV,SAAL,CAAeW,IAAf,CAAoB,EAACD,UAAUA,QAAX,EAAqB9X,UAAUA,QAA/B,EAApB;AACD;AACF;;;mCAEc8X,Q,EAAU;AACvBpX,QAAEiG,MAAF,CAAS,KAAKyQ,SAAd,EAAyB,EAACU,UAAUA,QAAX,EAAzB;AACD;;;8CAEyB;AAAA;AAAA;AAAA;;AAAA;AACxB,6BAAoB,KAAKV,SAAzB,8HAAoC;AAAA,cAA5BU,QAA4B;;AAClCA,mBAAS9X,QAAT,CAAkB,IAAlB;AACD;AAHuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIzB;;;gDAE2BgY,U,EAAY,CAEvC;;;sDAEiC;AAChC,aAAO,KAAKC,eAAL,EAAP;AACD;;;sCAEiB;AAChB;AACD;;;sCAEiB;AAChB,aAAO,EAACC,YAAY,KAAKC,eAAL,EAAb,EAAP;AACD;;;0CAEqBC,I,EAAM;AAC1B;AACD;;;6CAEwBA,I,EAAM;AAC7B;AACD;;;6CAEwB;AACvB;AACD;;;0CAEqBA,I,EAAM;AAC1B1X,QAAEC,KAAF,CAAQ,IAAR,EAAcD,EAAE2X,IAAF,CAAOD,IAAP,EAAa,CAAC,SAAD,CAAb,CAAd;AACD;;;2CAEsB;AACrB;AACA,aAAO,IAAP;AACD;;;wDAEmC;AAClC;AACA,aAAO,IAAP;AACD;;;+BAEU;AACT,aAAO,KAAK9M,iBAAZ;AACD;;;kCAEa;AACZ,aAAO,KAAKiF,iBAAL,MAA4B,KAAKkH,OAAL,CAAaxY,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,MAAiC,KAA7D,GAAqE,IAArE,GAA4E,KAAnF;AACD;;;wCAEmB;AAClB,aAAO,KAAKqZ,YAAZ;AACD;;;sCAEiB;AAChB,aAAO,KAAKC,gBAAZ;AACD;;;wBAjHmB;AAClB,UAAG,CAAC,KAAKd,OAAT,EAAkB;AAChB,eAAO,EAAP;AACD;;AAED,UAAG,KAAKA,OAAL,KAAiB,IAAjB,IAAyB,QAAO,KAAKA,OAAZ,MAAwB,QAApD,EAA8D;AAC5D;AACA,eAAO,KAAKA,OAAZ;AACD;;AAED,aAAOlG,KAAK3T,KAAL,CAAW,KAAK6Z,OAAhB,CAAP;AACD;;;oCAjBsBe,K,EAAO;AAC5BA,YAAMC,IAAN,CAAW,UAASzM,CAAT,EAAW0M,CAAX,EAAa;AACtB,eAAO,IAAI1b,IAAJ,CAAS0b,EAAEnB,UAAX,IAAyB,IAAIva,IAAJ,CAASgP,EAAEuL,UAAX,CAAhC;AACD,OAFD;AAGD;;;;;;AAsHH;IAAOoB,M;AACL,kBAAYrB,IAAZ,EAAkB;AAAA;;AACd5W,MAAEC,KAAF,CAAQ,IAAR,EAAc2W,IAAd;AACA,SAAKrJ,OAAL,GAAe,KAAf,CAFc,CAEQ;AACtB,SAAKtL,KAAL,GAAa,KAAb;AACA,QAAG,KAAKiW,YAAR,EAAsB;AACpB;AACA,WAAKA,YAAL,GAAoB,IAAI5b,IAAJ,CAAS,KAAK4b,YAAd,CAApB;AACD;AACJ;;;;wBAEuB;AACtB,UAAG,CAAC,KAAKC,WAAT,EAAsB;AACpB,eAAO,EAAP;AACD;AACD,UAAIC,aAAa,KAAKD,WAAL,CAAiBE,MAAjB,CAAwB,CAAxB,EAA2BxW,WAA3B,KAA2C,KAAKsW,WAAL,CAAiBrX,KAAjB,CAAuB,CAAvB,CAA5D,CAJsB,CAIiE;AACvFsX,oBAAc,IAAd;AALsB;AAAA;AAAA;;AAAA;AAMtB,8BAAuB,KAAKE,aAA5B,mIAA2C;AAAA,cAAnCC,WAAmC;;AACzC,cAAGA,eAAe,GAAlB,EAAuB;AACrBH,0BAAc,WAAd;AACD,WAFD,MAEO;AACLA,0BAAcG,WAAd;AACD;;AAEDH,wBAAc,GAAd;AACD;AAdqB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAgBtB,aAAOA,UAAP;AACD;;;wBAE0B;AACzB,UAAG,KAAKI,IAAL,IAAa,MAAhB,EAAwB;AACtB,eAAO,IAAP;AACD;AACD,UAAIC,iBAAiB,2BAArB;AACA,UAAG,KAAKC,iBAAL,IAA0B,KAAKC,iBAAlC,EAAqD;AACnDF,0BAAkB,yBAAlB;AACD,OAFD,MAEO;AACL,YAAG,KAAKC,iBAAR,EAA2B;AACzBD,4BAAkB,YAAlB;AACD,SAFD,MAEO;AACLA,4BAAkB,YAAlB;AACD;AACF;AACD,aAAOA,cAAP;AACD;;;;;;IAIGG,S;;;AACJ,qBAAYhC,IAAZ,EAAkB;AAAA;;AAAA,uHACRA,IADQ;;AAEd5W,MAAEC,KAAF,SAAc2W,IAAd;;AAEA,WAAK7Y,SAAL,GAAiB,IAAjB;AACA,WAAK8W,YAAL,GAAoB,WAApB;AALc;AAMjB;;;;6CAEwB;AACvB,aAAO,KAAKgE,OAAL,CAAanE,MAAb,CAAoB,UAASrH,MAAT,EAAgB;AACzC,eAAOA,OAAOyL,OAAP,IAAkB,QAAzB;AACD,OAFM,CAAP;AAGD;;;8CAEyBpB,I,EAAM;AAC9B,aAAO,KAAKmB,OAAL,CAAanE,MAAb,CAAoB,UAASrH,MAAT,EAAgB;AACzC,eAAOA,OAAOyL,OAAP,IAAkBpB,KAAK7C,YAAvB,IAAuCxH,OAAOyL,OAAP,IAAkB,MAAhE;AACD,OAFM,CAAP;AAGD;;;gDAE2B7B,a,EAAe;AACzC,wIAAkCA,aAAlC;AACA,WAAKrV,IAAL,GAAYqV,cAAcrV,IAA1B;AACA,WAAK2B,GAAL,GAAW0T,cAAc1T,GAAzB;AACA,WAAKsV,OAAL,GAAe5B,cAAc4B,OAAd,CAAsBE,GAAtB,CAA0B,UAAS1L,MAAT,EAAgB;AACvD,eAAO,IAAI4K,MAAJ,CAAW5K,MAAX,CAAP;AACD,OAFc,CAAf;AAGD;;;mDAE8B2L,oB,EAAsB;AACnDhZ,QAAEC,KAAF,CAAQ,IAAR,EAAc+Y,oBAAd;AACA,WAAKH,OAAL,GAAeG,qBAAqBH,OAArB,CAA6BE,GAA7B,CAAiC,UAAS1L,MAAT,EAAgB;AAC9D,eAAO,IAAI4K,MAAJ,CAAW5K,MAAX,CAAP;AACD,OAFc,CAAf;AAGD;;;sCAEiB;AAChB,aAAO,IAAP;AACD;;;sCAEiB;AAChB,UAAItJ,SAAS;AACXnC,cAAM,KAAKA,IADA;AAEX2B,aAAK,KAAKA,GAFC;AAGXsV,iBAAS,KAAKA;AAHH,OAAb;;AAMA7Y,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;;EAlDqBwS,I;;AAqDxB;IAAOtD,I;;;AAEL,gBAAYuD,QAAZ,EAAsB;AAAA;;AAAA,6GACdA,QADc;;AAGpB,QAAG,CAAC,OAAK7E,IAAT,EAAe;AACb,aAAKA,IAAL,GAAY,EAAZ;AACD;AALmB;AAMrB;;;;gDAE2BsF,a,EAAe;AACzC,8HAAkCA,aAAlC;AACA,WAAKvF,KAAL,GAAauF,cAAcvF,KAA3B;AACA,WAAK5T,IAAL,GAAYmZ,cAAcnZ,IAA1B;AACD;;;sCAEiB;AAChB,UAAI0Z,aAAaxX,EAAE+Y,GAAF,CAAM,KAAKpH,IAAX,EAAiB,UAASK,GAAT,EAAa;AAC7C,eAAO,EAACtV,MAAMsV,IAAItV,IAAX,EAAiBmY,cAAc7C,IAAI6C,YAAnC,EAAP;AACD,OAFgB,CAAjB;;AAIA,aAAO2C,UAAP;AACD;;;sCAEiB;AAChB,UAAIzT,SAAS;AACX2N,eAAO,KAAKA,KADD;AAEX5T,cAAM,KAAKA;AAFA,OAAb;;AAKAkC,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;0CAEqB2T,I,EAAM;AAC1B,UAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7B,YAAG,CAAC7U,EAAE6S,IAAF,CAAO,KAAKlB,IAAZ,EAAkB+F,IAAlB,CAAJ,EAA6B;AAC3B,eAAK/F,IAAL,CAAU0F,IAAV,CAAeK,IAAf;AACD;AACF;AACD,wHAA4BA,IAA5B;AACD;;;6CAEwBA,I,EAAM;AAC7B,UAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7B7U,UAAEiZ,IAAF,CAAO,KAAKtH,IAAZ,EAAkB+F,IAAlB;AACD;AACD,2HAA+BA,IAA/B;AACD;;;6CAEwB;AACvB,WAAK/F,IAAL,CAAU/B,OAAV,CAAkB,UAASoC,GAAT,EAAa;AAC7BhS,UAAEiZ,IAAF,CAAOjH,IAAIJ,KAAX,EAAkB,IAAlB;AACAI,YAAIhH,QAAJ,CAAa,IAAb;AACD,OAHiB,CAGhBxJ,IAHgB,CAGX,IAHW,CAAlB;AAIA,WAAKmQ,IAAL,GAAY,EAAZ;AACD;;;2CAOsB;AACrB,aAAO,KAAKA,IAAZ;AACD;;;wDAEmC;AAClC;AACD;;;+BAWU;AACT,aAAO,KAAK7T,IAAL,IAAa,EAApB;AACD;;;gCAEW;AACV,aAAO,KAAK4T,KAAL,IAAc,EAArB;AACD;;;6BAEQ;AACP,aAAO,EAAChV,MAAM,KAAKA,IAAZ,EAAP;AACD;;;2CAEsB;AACrB,aAAO,KAAKkO,iBAAZ;AACD;;;+BAEU;AACT,aAAO,wGAAoB,KAAKsO,eAAhC;AACD;;;wBA3BqB;AAAA;AAAA;AAAA;;AAAA;AACpB,8BAAgB,KAAKvH,IAArB,mIAA2B;AAAA,cAAlBK,GAAkB;;AACzB,cAAGA,IAAImH,QAAJ,EAAH,EAAmB;AACjB,mBAAO,IAAP;AACD;AACF;AALmB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAMpB,aAAO,KAAP;AACD;;;wBAsBkB;AACjB,aAAO,MAAP;AACD;;;qCA5CuBvH,K,EAAO;AAC7B,UAAIwH,WAAWxH,MAAM8C,MAAN,CAAa,UAASxO,IAAT,EAAc;AAAC,eAAOA,KAAK+B,KAAL,IAAc,KAAd,IAAuB/B,KAAK+B,KAAL,IAAc,IAA5C;AAAiD,OAA7E,CAAf;AACA,aAAOmR,QAAP;AACD;;;;EA7DiB7C,I;;AAwGpB;IAAO/E,G;;;AAEL,eAAYgF,QAAZ,EAAsB;AAAA;;AAAA,2GACdA,QADc;;AAGpB,QAAG,CAAC,OAAK5E,KAAT,EAAgB;AACd,aAAKA,KAAL,GAAa,EAAb;AACD;AALmB;AAMrB;;;;gDAE2BqF,a,EAAe;AACzC,4HAAkCA,aAAlC;AACA,WAAKvF,KAAL,GAAauF,cAAcvF,KAA3B;AACD;;;sCAEiB;AAChB,UAAI8F,aAAaxX,EAAE+Y,GAAF,CAAM,KAAKnH,KAAX,EAAkB,UAAS1L,IAAT,EAAc;AAC/C,eAAO,EAACxJ,MAAMwJ,KAAKxJ,IAAZ,EAAkBmY,cAAc3O,KAAK2O,YAArC,EAAP;AACD,OAFgB,CAAjB;;AAIA,aAAO2C,UAAP;AACD;;;sCAEiB;AAChB,UAAIzT,SAAS;AACX2N,eAAO,KAAKA;AADD,OAAb;;AAIA1R,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;0CAEqB2T,I,EAAM;AAC1B,UAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AAC9B,YAAG,CAAC7U,EAAE6S,IAAF,CAAO,KAAKjB,KAAZ,EAAmB8F,IAAnB,CAAJ,EAA8B;AAC5B,eAAK9F,KAAL,CAAWyH,OAAX,CAAmB3B,IAAnB;AACD;AACF;AACD,sHAA4BA,IAA5B;AACD;;;6CAEwBA,I,EAAM;AAC7B,UAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AAC9B7U,UAAEiZ,IAAF,CAAO,KAAKrH,KAAZ,EAAmB8F,IAAnB;AACD;AACD,yHAA+BA,IAA/B;AACD;;;6CAEwB;AACvB,WAAK9F,KAAL,CAAWhC,OAAX,CAAmB,UAAS1J,IAAT,EAAc;AAC/BlG,UAAEiZ,IAAF,CAAO/S,KAAKyL,IAAZ,EAAkB,IAAlB;AACAzL,aAAK8E,QAAL,CAAc,IAAd;AACD,OAHkB,CAGjBxJ,IAHiB,CAGZ,IAHY,CAAnB;;AAKA,WAAKoQ,KAAL,GAAa,EAAb;AACD;;;2CAMsB;AACrB,aAAO,KAAKA,KAAZ;AACD;;;wDAEmC;AAClC,aAAO,KAAKA,KAAZ;AACD;;;wBAVkB;AACjB,aAAO,KAAP;AACD;;;;EA3DgB2E,I;;AAqEnB,CAACtT,QAAQC,MAAR,CAAe,cAAf,EACEoW,QADF,CACW,eADX,EAC4B,YAAY;;AAErC,WAASC,UAAT,GAAuB;AACrB,QAAIC,eAAevL,SAASwL,QAAT,CAAkBC,KAAlB,CAAwB,GAAxB,CAAnB;AACA,QAAIC,SAASH,aAAaA,aAAahb,MAAb,GAAsB,CAAnC,IAAwC,GAAxC,GAA8Cgb,aAAaA,aAAahb,MAAb,GAAsB,CAAnC,CAA3D;AACA,WAAOmb,MAAP;AACD;;AAED,MAAIpW,GAAJ;;AAEA,OAAKC,gBAAL,GAAwB,YAAW;AACjC,QAAG,CAACD,GAAJ,EAAS;AACPA,YAAMW,aAAaC,OAAb,CAAqB,QAArB,CAAN;AACA,UAAG,CAACZ,GAAJ,EAAS;AACPA,cAAM,8BAAN;AACD;AACF;AACD,WAAOA,GAAP;AACD,GARD;;AAWA,OAAKqW,IAAL,GAAY,UAASpU,UAAT,EAAqByQ,WAArB,EAAkCxQ,YAAlC,EAAgDoU,QAAhD,EAA0D;AAClE,WAAO,IAAIC,aAAJ,CAAkBtU,UAAlB,EAA8ByQ,WAA9B,EAA2CxQ,YAA3C,EAAyDoU,QAAzD,CAAP;AACH,GAFD;;AAIA,WAASC,aAAT,CAAuBtU,UAAvB,EAAmCyQ,WAAnC,EAAgDxQ,YAAhD,EAA8DoU,QAA9D,EAAwE;;AAEtE,SAAKxN,IAAL,GAAY,EAAZ;AACA,SAAK0N,SAAL,GAAiB7V,aAAaC,OAAb,CAAqB,WAArB,CAAjB;;AAEA;;;;AAIA,SAAKuI,SAAL,GAAiB,YAAW;AAC1B,UAAG,CAACnJ,GAAJ,EAAS;AACPA,cAAMW,aAAaC,OAAb,CAAqB,QAArB,CAAN;AACA,YAAG,CAACZ,GAAJ,EAAS;AACPA,gBAAM,8BAAN;AACA,eAAKuK,SAAL,CAAevK,GAAf;AACD;AACF;AACD,aAAOA,GAAP;AACD,KATD;;AAWA,SAAKuK,SAAL,GAAiB,UAASvK,GAAT,EAAcyW,OAAd,EAAuB;AACtC9V,mBAAa+V,OAAb,CAAqB,QAArB,EAA+B1W,GAA/B;AACA,UAAGyW,OAAH,EAAY;AACVre,eAAOsS,QAAP,CAAgBC,MAAhB;AACD;AACF,KALD;;AAQA;;;;AAIA,SAAKgM,aAAL,GAAqB,YAAW;AAC9B,aAAOrJ,KAAK3T,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,aAArB,CAAX,CAAP;AACD,KAFD;;AAIA,SAAK0F,cAAL,GAAsB,YAAW;AAC/B,aAAO3F,aAAaC,OAAb,CAAqB,KAArB,CAAP;AACD,KAFD;;AAIA,SAAKgW,MAAL,GAAc,YAAW;AACvB,aAAOjW,aAAaC,OAAb,CAAqB,MAArB,CAAP;AACD,KAFD;;AAIA,SAAKiW,qBAAL,GAA6B,UAASza,KAAT,EAAgBL,QAAhB,EAA0B;AACrD,UAAI+a,UAAUpE,YAAYqE,GAAZ,CAAgB,MAAhB,EAAwB,QAAxB,CAAd;AACAD,cAAQlV,GAAR,CAAY,EAACxF,OAAOA,KAAR,EAAZ,EAA4BmC,IAA5B,CAAiC,UAASoJ,QAAT,EAAkB;AACjD5L,iBAAS4L,SAASqP,KAAT,EAAT;AACD,OAFD,EAGCxY,KAHD,CAGO,UAASmJ,QAAT,EAAkB;AACvB7J,gBAAQC,GAAR,CAAY,4BAAZ,EAA0C4J,QAA1C;AACA5L,iBAAS4L,SAASoD,IAAlB;AACD,OAND;AAOD,KATD;;AAWA,SAAK3I,cAAL,GAAsB,UAASrG,QAAT,EAAmB;AACvC,UAAG,CAAC4E,aAAaC,OAAb,CAAqB,KAArB,CAAJ,EAAiC;AAC/B7E,iBAAS,IAAT;AACA;AACD;AACD2W,kBAAYqE,GAAZ,CAAgB,eAAhB,EAAiCnV,GAAjC,GAAuCrD,IAAvC,CAA4C,UAASoJ,QAAT,EAAkB;AAC5D,YAAImB,OAAOnB,SAASqP,KAAT,EAAX;AACAva,UAAEC,KAAF,CAAQ,KAAKoM,IAAb,EAAmBA,IAAnB;AACA/M;AACD,OAJ2C,CAI1CkC,IAJ0C,CAIrC,IAJqC,CAA5C,EAKCO,KALD,CAKO,UAASmJ,QAAT,EAAkB;AACvB7J,gBAAQC,GAAR,CAAY,4BAAZ,EAA0C4J,QAA1C;AACA5L,iBAAS4L,SAASoD,IAAlB;AACD,OARD;AASD,KAdD;;AAgBA,SAAKc,KAAL,GAAa,UAASzP,KAAT,EAAgBX,QAAhB,EAA0BM,QAA1B,EAAoC;AAC/C,WAAK8a,qBAAL,CAA2Bza,KAA3B,EAAkC,UAAS6a,UAAT,EAAoB;AACpD,YAAG,CAACA,UAAJ,EAAgB;AACdlb,mBAAS,IAAT;AACA;AACD;AACDpB,cAAMxC,MAAN,CAAa+e,4BAAb,CAA0Cza,EAAEC,KAAF,CAAQ,EAACjB,UAAUA,QAAX,EAAR,EAA8Bwb,UAA9B,CAA1C,EAAqF,UAAShb,IAAT,EAAc;AACjG,eAAKkb,KAAL,CAAWlb,KAAKE,EAAhB;AACA,cAAI2a,UAAUpE,YAAYqE,GAAZ,CAAgB,cAAhB,CAAd;AACA,cAAIvW,SAAS,EAAC/E,UAAUQ,KAAKC,EAAhB,EAAoBE,OAAOA,KAA3B,EAAb;AACAK,YAAEC,KAAF,CAAQoa,OAAR,EAAiBtW,MAAjB;AACAsW,kBAAQM,IAAR,GAAe7Y,IAAf,CAAoB,UAASoJ,QAAT,EAAkB;AACpChH,yBAAa+V,OAAb,CAAqB,KAArB,EAA4B/O,SAASjH,KAArC;AACAC,yBAAa+V,OAAb,CAAqB,MAArB,EAA6B/O,SAASxO,IAAtC;AACAwH,yBAAa+V,OAAb,CAAqB,aAArB,EAAoCpJ,KAAK+J,SAAL,CAAeJ,UAAf,CAApC;AACAlb,qBAAS4L,QAAT;AACD,WALD,EAMCnJ,KAND,CAMO,UAASmJ,QAAT,EAAkB;AACvB5L,qBAAS4L,SAASoD,IAAlB;AACD,WARD;AASD,SAdoF,CAcnF9M,IAdmF,CAc9E,IAd8E,CAArF;AAeD,OApBiC,CAoBhCA,IApBgC,CAoB3B,IApB2B,CAAlC;AAqBD,KAtBD;;AAwBA,SAAKgO,QAAL,GAAgB,UAAS7P,KAAT,EAAgBX,QAAhB,EAA0BM,QAA1B,EAAoC;AAClDpB,YAAMxC,MAAN,CAAamf,oCAAb,CAAkD,EAAC7b,UAAUA,QAAX,EAAqBW,OAAOA,KAA5B,EAAlD,EAAsF,UAASH,IAAT,EAAegb,UAAf,EAA0B;AAC9G,aAAKE,KAAL,CAAWlb,KAAKE,EAAhB;AACAF,aAAKE,EAAL,GAAU,IAAV;AACA,YAAI2a,UAAUpE,YAAYqE,GAAZ,CAAgB,MAAhB,CAAd;AACA,YAAIvW,SAAS/D,EAAEC,KAAF,CAAQ,EAACjB,UAAUQ,KAAKC,EAAhB,EAAoBE,OAAOA,KAA3B,EAAR,EAA2C6a,UAA3C,CAAb;AACAxa,UAAEC,KAAF,CAAQoa,OAAR,EAAiBtW,MAAjB;AACAsW,gBAAQM,IAAR,GAAe7Y,IAAf,CAAoB,UAASoJ,QAAT,EAAkB;AACpChH,uBAAa+V,OAAb,CAAqB,KAArB,EAA4B/O,SAASjH,KAArC;AACAC,uBAAa+V,OAAb,CAAqB,MAArB,EAA6B/O,SAASxO,IAAtC;AACAwH,uBAAa+V,OAAb,CAAqB,aAArB,EAAoCpJ,KAAK+J,SAAL,CAAe5a,EAAE2X,IAAF,CAAO6C,UAAP,EAAmB,CAAC,UAAD,CAAnB,CAAf,CAApC;AACAlb,mBAAS4L,QAAT;AACD,SALD,EAMCnJ,KAND,CAMO,UAASmJ,QAAT,EAAkB;AACvB5L,mBAAS4L,SAASoD,IAAlB;AACD,SARD;AASD,OAfqF,CAepF9M,IAfoF,CAe/E,IAf+E,CAAtF;AAgBD,KAjBD;;AAmBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAAKsZ,sBAAL,GAA8B,UAASnb,KAAT,EAAgBob,YAAhB,EAA8BC,QAA9B,EAAwC1b,QAAxC,EAAkD;AAC9E,UAAI+a,UAAUpE,YAAYqE,GAAZ,CAAgB,MAAhB,CAAd;AACA,UAAIvW,SAAS,EAAC/E,UAAUgc,SAASvb,EAApB,EAAwB8O,uBAAuByM,SAASvb,EAAxD,EAA4DgP,kBAAkBsM,aAAatb,EAA3F,EAA+FE,OAAOA,KAAtG,EAAb;AACAK,QAAEC,KAAF,CAAQoa,OAAR,EAAiBtW,MAAjB;AACAsW,cAAQY,KAAR,GAAgBnZ,IAAhB,CAAqB,UAASoJ,QAAT,EAAkB;AACrC5L,iBAAS4L,QAAT;AACD,OAFD;AAGD,KAPD;;AAUA;;;;AAIA,SAAKkL,WAAL,GAAmB,UAASC,QAAT,EAAmB/W,QAAnB,EAA6B;AAC9C,UAAI+a,UAAUpE,YAAYqE,GAAZ,CAAgB,OAAhB,EAAyB,KAAKH,MAAL,EAAzB,CAAd;AACAE,cAAQhE,QAAR,GAAmBA,QAAnB;AACAgE,cAAQY,KAAR,GAAgBnZ,IAAhB,CAAqB,UAASoJ,QAAT,EAAkB;AACrC,aAAKmB,IAAL,CAAUgK,QAAV,GAAqBnL,SAASmL,QAA9B;AACA/W,iBAAS4L,SAASqP,KAAT,EAAT;AACD,OAHoB,CAGnB/Y,IAHmB,CAGd,IAHc,CAArB;AAID,KAPD;;AAUA;;;;AAIA,SAAK0Z,YAAL,GAAoB,UAASnB,SAAT,EAAoB;AACtC,WAAKA,SAAL,GAAiBA,SAAjB;AACA7V,mBAAa+V,OAAb,CAAqB,WAArB,EAAkC,KAAKF,SAAvC;AACD,KAHD;;AAKA,SAAKoB,eAAL,GAAuB,UAAS7b,QAAT,EAAiC;AAAA,UAAd8b,OAAc,uEAAJ,EAAI;;AACtD,WAAKC,2BAAL,CAAiC,UAASC,aAAT,EAAuB;AACtD,YAAG,CAAC,KAAKzR,cAAL,EAAJ,EAA2B;AACzB;AACA,cAAI0R,aAAa9V,aAAa+V,aAAb,EAAjB;AACA;AACAD,qBAAW3L,OAAX,CAAmB,UAAS8H,IAAT,EAAc;AAC/B,gBAAGA,KAAK+D,OAAR,EAAiB;AACfhW,2BAAa2M,iBAAb,CAA+BsF,IAA/B;AACD;AACF,WAJkB,CAIjBlW,IAJiB,CAIZ,IAJY,CAAnB;AAKAiE,uBAAaiW,eAAb;AACA,cAAGpc,QAAH,EAAa;AACXA;AACD;AACF;AACF,OAfgC,CAe/BkC,IAf+B,CAe1B,IAf0B,CAAjC;;AAiBA,UAAG,CAAC,KAAKqI,cAAL,EAAJ,EAA2B;AACzB;AACD;;AAED,UAAI0R,aAAa9V,aAAa+V,aAAb,EAAjB;AACA,UAAInB,UAAUpE,YAAYqE,GAAZ,CAAgB,YAAhB,CAAd;AACAD,cAAQvC,KAAR,GAAgB9X,EAAE+Y,GAAF,CAAMwC,UAAN,EAAkB,UAAS7D,IAAT,EAAc;AAC9C,eAAO,KAAKiE,0BAAL,CAAgCjE,IAAhC,EAAsC0D,QAAQQ,gBAA9C,CAAP;AACD,OAFiC,CAEhCpa,IAFgC,CAE3B,IAF2B,CAAlB,CAAhB;;AAIA;;AAEA,UAAG,KAAKuY,SAAR,EAAmB;AACjBM,gBAAQwB,UAAR,GAAqB,KAAK9B,SAA1B;AACD;;AAEDM,cAAQM,IAAR,GAAe7Y,IAAf,CAAoB,UAASoJ,QAAT,EAAmB;AACrCzF,qBAAaiW,eAAb;AACA,aAAKR,YAAL,CAAkBhQ,SAAS2Q,UAA3B;AACArW,mBAAW6E,UAAX,CAAsB,oBAAtB,EAA4C,KAAK0P,SAAjD;;AAEA,aAAK+B,mBAAL,CAAyB5Q,SAAS6Q,eAAlC,EAAmD,IAAnD;AACA;AACA,YAAIC,aAAa,CAAC,SAAD,EAAY,cAAZ,EAA4B,WAA5B,CAAjB;AACA,aAAKF,mBAAL,CAAyB5Q,SAAS+Q,WAAlC,EAA+CD,UAA/C;;AAEA,aAAKE,0BAAL,CAAgChR,SAASiR,OAAzC;;AAEA,aAAKd,2BAAL;;AAEA,YAAG/b,QAAH,EAAa;AACXA,mBAAS4L,QAAT;AACD;AACF,OAjBmB,CAiBlB1J,IAjBkB,CAiBb,IAjBa,CAApB,EAkBCO,KAlBD,CAkBO,UAASmJ,QAAT,EAAkB;AACvB7J,gBAAQC,GAAR,CAAY,cAAZ,EAA4B4J,QAA5B;AACA,YAAG5L,QAAH,EAAa;AACXA,mBAAS,EAAC2C,OAAO,YAAR,EAAT;AACD;AACF,OAvBD;AAwBD,KA1DD;;AA4DA,SAAKgJ,IAAL,GAAY,UAAS3L,QAAT,EAAmB;AAC7B,WAAK6b,eAAL,CAAqB7b,QAArB,EAA+B8c,SAA/B;AACD,KAFD;;AAIA,SAAKF,0BAAL,GAAkC,UAASC,OAAT,EAAkB;AAClD,UAAGA,QAAQ3d,MAAR,IAAkB,CAArB,EAAwB;AACtB;AACD;;AAED6C,cAAQC,GAAR,CAAY,gBAAZ,EAA8B6a,OAA9B;AALkD;AAAA;AAAA;;AAAA;AAMlD,8BAAmBA,OAAnB,mIAA4B;AAAA,cAApBE,OAAoB;;AAC1B,cAAIC,eAAeD,QAAQ3E,IAA3B;AACA,cAAIA,OAAOjS,aAAa8W,QAAb,CAAsBD,aAAa5f,IAAnC,CAAX;AACA,cAAIuF,QAAQoa,QAAQpa,KAApB;AACA,cAAGA,MAAM+P,GAAN,IAAa,eAAhB,EAAiC;AAC7B0F,iBAAK8E,aAAL;AACA9E,iBAAK1M,QAAL,CAAc,IAAd;AACA0M,iBAAK+E,oBAAL,GAA4B7M,OAA5B,CAAoC,UAAS8M,SAAT,EAAmB;AACrDA,wBAAU1R,QAAV,CAAmB,IAAnB;AACD,aAFD;AAGH;AACF;AAjBiD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAmBlD,WAAKC,IAAL,CAAU,IAAV;AACD,KApBD;;AAsBA,SAAK6Q,mBAAL,GAA2B,UAASR,aAAT,EAAwBU,UAAxB,EAAoC;AAC7D,WAAKW,YAAL,CAAkBrB,aAAlB;AACA,aAAO7V,aAAamX,2CAAb,CAAyDtB,aAAzD,EAAwEU,UAAxE,CAAP;AACD,KAHD;;AAKA,SAAKL,0BAAL,GAAkC,UAASjE,IAAT,EAAekE,gBAAf,EAAiC;AACjE,aAAO,KAAKiB,aAAL,CAAmBnF,IAAnB,EAAyB,CAACA,KAAKyB,QAAL,EAA1B,EAA2CyC,gBAA3C,EAA6D,KAA7D,CAAP;AACD,KAFD;;AAIA,SAAKkB,mBAAL,GAA2B,UAASpF,IAAT,EAAe3Z,SAAf,EAA0B;AACnD,aAAOiC,EAAE2X,IAAF,CAAO,KAAKkF,aAAL,CAAmBnF,IAAnB,EAAyB3Z,SAAzB,EAAoC,CAAC,YAAD,EAAe,YAAf,CAApC,EAAkE,IAAlE,CAAP,EAAgF,CAAC,SAAD,CAAhF,CAAP;AACD,KAFD;;AAIA,SAAKgf,kBAAL,GAA0B,UAASrF,IAAT,EAAe3Z,SAAf,EAA0B;AAClD,aAAOiC,EAAE2X,IAAF,CAAO,KAAKkF,aAAL,CAAmBnF,IAAnB,EAAyB3Z,SAAzB,EAAoC,CAAC,YAAD,EAAe,YAAf,CAApC,EAAkE,IAAlE,CAAP,EAAgF,CAAC,SAAD,CAAhF,CAAP;AACD,KAFD;;AAIA,SAAK8e,aAAL,GAAqB,UAASnF,IAAT,EAAe3Z,SAAf,EAA0B6d,gBAA1B,EAA4CoB,aAA5C,EAA2D;AAC9E,UAAIC,WAAWjd,EAAEkd,SAAF,CAAYxF,IAAZ,CAAf;;AAEArW,cAAQ8b,MAAR,CAAe,CAACzF,KAAKzP,KAArB,EAA4B,6CAA5B,EAA2EyP,KAAKzP,KAAhF;;AAEA,UAAIlE,SAAS,EAACrH,MAAMgb,KAAKhb,IAAZ,EAAkBmY,cAAc6C,KAAK7C,YAArC;AACXjK,2BAAmB8M,KAAK9M,iBADb,EACgC6Q,SAAS/D,KAAK+D,OAD9C,EAAb;;AAGA,UAAG1d,SAAH,EAAc;AACZ,aAAKqf,iBAAL,CAAuBH,QAAvB,EAAiC,KAAKI,UAAL,EAAjC;AACAtZ,eAAOgT,OAAP,GAAiBkG,SAASlG,OAA1B;AACAhT,eAAO6T,YAAP,GAAsBqF,SAASrF,YAA/B;AACA7T,eAAOuZ,SAAP,GAAmBL,SAASK,SAA5B;AACD,OALD,MAMK;AACHvZ,eAAOgT,OAAP,GAAiBiG,gBAAgBC,SAASM,+BAAT,EAAhB,GAA6D,QAAQrf,MAAMxC,MAAN,CAAa8hB,MAAb,CAAoB3M,KAAK+J,SAAL,CAAeqC,SAASM,+BAAT,EAAf,CAApB,CAAtF;AACA,YAAG,CAACP,aAAJ,EAAmB;AACjBjZ,iBAAO6T,YAAP,GAAsB,IAAtB;AACA7T,iBAAOuZ,SAAP,GAAmB,IAAnB;AACD;AACF;;AAED,UAAG1B,gBAAH,EAAqB;AACnB5b,UAAEC,KAAF,CAAQ8D,MAAR,EAAgB/D,EAAEyd,IAAF,CAAO/F,IAAP,EAAakE,gBAAb,CAAhB;AACD;;AAED,aAAO7X,MAAP;AACD,KA3BD;;AA6BA,SAAK2H,SAAL,GAAiB,UAASgM,IAAT,EAAepY,QAAf,EAAyB;AACxC,UAAG,CAAC,KAAKuK,cAAL,EAAJ,EAA2B;AACzBsB,cAAM,iCAAN;AACA;AACD;;AAED,UAAIuS,UAAU,YAAW;AACvBhG,aAAK9M,iBAAL,GAAyB,QAAzB;AACA,YAAI+S,cAAc,CAACjG,IAAD,EAAOkG,MAAP,CAAclG,KAAKmG,iCAAL,MAA4C,EAA1D,CAAlB;AACAF,oBAAY/N,OAAZ,CAAoB,UAASkO,aAAT,EAAuB;AACzCA,wBAAc9S,QAAd,CAAuB,IAAvB;AACD,SAFD;AAGA,aAAKC,IAAL;AACD,OAPa,CAOZzJ,IAPY,CAOP,IAPO,CAAd;;AASA,UAAG,CAAC,KAAK6K,IAAL,CAAUgK,QAAd,EAAwB;AACtBwD,iBAASkE,IAAT,CAAc;AACZC,oBAAU,+BADE;AAEZjZ,sBAAY,mBAFA;AAGZkZ,mBAAS;AACP3e,sBAAU,oBAAW;AACnB,qBAAOoe,OAAP;AACD;AAHM,WAHG;AAQZQ,qBAAW,wBARC;AASZC,4BAAkB;AATN,SAAd;AAWD,OAZD,MAYO;AACLT;AACD;AACF,KA9BD;;AAgCA,SAAK9R,WAAL,GAAmB,UAAS8L,IAAT,EAAepY,QAAf,EAAyB;AAC1CoY,WAAK9M,iBAAL,GAAyB,IAAzB;AACA,UAAI+S,cAAc,CAACjG,IAAD,EAAOkG,MAAP,CAAclG,KAAKmG,iCAAL,MAA4C,EAA1D,CAAlB;AACAF,kBAAY/N,OAAZ,CAAoB,UAASkO,aAAT,EAAuB;AACzCA,sBAAc9S,QAAd,CAAuB,IAAvB;AACD,OAFD;AAGA,WAAKC,IAAL,CAAU,IAAV;AACD,KAPD;;AASA;;;;AAIA,SAAKkF,cAAL,GAAsB,UAAS7B,IAAT,EAAetP,QAAf,EAAyBM,QAAzB,EAAmC;AACvD+B,cAAQC,GAAR,CAAY,gBAAZ,EAA8BgN,IAA9B;;AAEA,UAAI8P,cAAc,YAAW;AAC3B3Y,qBAAa4Y,6BAAb,CAA2C/P,KAAKwJ,KAAhD;AACArS,qBAAa6Y,QAAb,CAAsB1O,OAAtB,CAA8B,UAAS8H,IAAT,EAAc;AAC1CA,eAAK1M,QAAL,CAAc,IAAd;AACD,SAFD;AAGA,aAAKmQ,eAAL,CAAqB7b,QAArB,EAA+B,EAACsc,kBAAkB,CAAC,YAAD,EAAe,YAAf,CAAnB,EAA/B;AACD,OANiB,CAMhBpa,IANgB,CAMX,IANW,CAAlB;;AAQA,UAAG8M,KAAKyC,WAAR,EAAqB;AACnB7S,cAAMxC,MAAN,CAAa+e,4BAAb,CAA0Cza,EAAEC,KAAF,CAAQ,EAACjB,UAAUA,QAAX,EAAR,EAA8BsP,KAAKyC,WAAnC,CAA1C,EAA2F,UAASvR,IAAT,EAAc;AACvG,cAAIE,KAAKF,KAAKE,EAAd;AACA,cAAI;AACF,iBAAK6e,mBAAL,CAAyBjQ,KAAKwJ,KAA9B,EAAqCpY,EAArC;AACA;AACA4O,iBAAKwJ,KAAL,CAAWlI,OAAX,CAAmB,UAAS8H,IAAT,EAAc;AAC/BA,mBAAKE,YAAL,GAAoB,IAApB;AACAF,mBAAK4F,SAAL,GAAiB,IAAjB;AACD,aAHD;AAIAc;AACD,WARD,CASA,OAAOxN,CAAP,EAAU;AACRvP,oBAAQC,GAAR,CAAY,kBAAZ,EAAgCsP,CAAhC;AACAzF,kBAAM,wGAAN;AACA7L,qBAAS,KAAT,EAAgB,IAAhB;AACA;AACD;AACF,SAjB0F,CAiBzFkC,IAjByF,CAiBpF,IAjBoF,CAA3F;AAkBD,OAnBD,MAmBO;AACL4c;AACD;AACF,KAjCD;;AAmCA;;;;AAIA,SAAKnO,aAAL,GAAqB,UAASlS,SAAT,EAAoB;AACvC,UAAIygB,WAAW,IAAf;AACA,UAAIC,eAAe,UAAU3gB,IAAV,EAAgB;AACjC,YAAIwQ,OAAO,IAAIoQ,IAAJ,CAAS,CAAC5gB,IAAD,CAAT,EAAiB,EAAC6gB,MAAM,WAAP,EAAjB,CAAX;;AAEA;AACA;AACA,YAAIH,aAAa,IAAjB,EAAuB;AACrB7iB,iBAAOijB,GAAP,CAAWC,eAAX,CAA2BL,QAA3B;AACD;;AAEDA,mBAAW7iB,OAAOijB,GAAP,CAAWE,eAAX,CAA2BxQ,IAA3B,CAAX;;AAEA;AACA,eAAOkQ,QAAP;AACD,OAbkB,CAajBhd,IAbiB,CAaZ,IAbY,CAAnB;;AAeA,UAAIsW,QAAQ9X,EAAE+Y,GAAF,CAAMtT,aAAasZ,qBAAb,CAAmC,CAAC,KAAD,EAAQ,MAAR,CAAnC,CAAN,EAA2D,UAASrH,IAAT,EAAc;AACnF,eAAO,KAAKoF,mBAAL,CAAyBpF,IAAzB,EAA+B3Z,SAA/B,CAAP;AACD,OAFsE,CAErEyD,IAFqE,CAEhE,IAFgE,CAA3D,CAAZ;;AAIA,UAAI8M,OAAO;AACTwJ,eAAOA;AADE,OAAX;;AAIA,UAAG/Z,SAAH,EAAc;AACZuQ,aAAK,aAAL,IAAsB,KAAK4L,aAAL,EAAtB;AACD;;AAED,aAAOuE,aAAa5N,KAAK+J,SAAL,CAAetM,IAAf,EAAqB,IAArB,EAA2B,CAA3B,CAA6B,kBAA7B,CAAb,CAAP;AACD,KA9BD;;AAkCA;;;AAGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AAKA,SAAKkF,iBAAL,GAAyB,YAAW;AAClCtP,mBAAa8a,UAAb,CAAwB,OAAxB;AACA9a,mBAAa8a,UAAb,CAAwB,IAAxB;AACA9a,mBAAa8a,UAAb,CAAwB,KAAxB;AACA9a,mBAAa8a,UAAb,CAAwB,MAAxB;AACA9a,mBAAa8a,UAAb,CAAwB,WAAxB;AACA9a,mBAAa8a,UAAb,CAAwB,aAAxB;AACD,KAPD;;AASA,SAAKC,eAAL,GAAuB,UAASC,MAAT,EAAiB;AACtC,aAAOrO,KAAK3T,KAAL,CAAW2T,KAAK+J,SAAL,CAAesE,MAAf,CAAX,CAAP;AACD,KAFD;;AAIA,SAAK7D,2BAAL,GAAmC,UAAS/b,QAAT,EAAmB;AACpD,UAAIwY,QAAQ9X,EAAE+Y,GAAF,CAAMtT,aAAa6Y,QAAnB,EAA6B,UAAS5G,IAAT,EAAc;AACrD,eAAO,KAAKmF,aAAL,CAAmBnF,IAAnB,EAAyB,KAAK7N,cAAL,EAAzB,EAAgD,CAAC,YAAD,EAAe,YAAf,CAAhD,EAA8E,KAA9E,CAAP;AACD,OAFwC,CAEvCrI,IAFuC,CAElC,IAFkC,CAA7B,CAAZ;AAGA;AACA,WAAK2d,mBAAL,CAAyB,OAAzB,EAAkCrH,KAAlC;AACA,UAAGxY,QAAH,EAAa;AACXA,iBAASwY,KAAT;AACD;AACF,KATD;;AAWA,SAAKqH,mBAAL,GAA2B,UAASriB,GAAT,EAAcsiB,KAAd,EAAqB;AAC9Clb,mBAAa+V,OAAb,CAAqBnd,GAArB,EAA0BmG,QAAQoc,MAAR,CAAeD,KAAf,CAA1B;AACD,KAFD;;AAIA,SAAK9N,cAAL,GAAsB,YAAW;AAC/B,UAAIwG,QAAQjH,KAAK3T,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,OAArB,CAAX,KAA6C,EAAzD;AACA2T,cAAQ,KAAKgE,mBAAL,CAAyBhE,KAAzB,EAAgC,IAAhC,CAAR;AACAvB,WAAK+I,eAAL,CAAqBxH,KAArB;AACD,KAJD;;AAMA;;;;AAIA,SAAKhO,eAAL,GAAuB,UAASmK,KAAT,EAAgB;AACrC/P,mBAAa+V,OAAb,CAAqB,OAArB,EAA8BpJ,KAAK+J,SAAL,CAAe3G,KAAf,CAA9B;AACD,KAFD;;AAIA,SAAK5K,UAAL,GAAkB,YAAW;AAC3BnF,mBAAa8a,UAAb,CAAwB,OAAxB;AACD,KAFD;;AAIA,SAAK9K,QAAL,GAAgB,YAAW;AACzB,UAAIqL,cAAcrb,aAAaC,OAAb,CAAqB,OAArB,CAAlB;AACA,UAAG,CAACob,WAAD,IAAgBA,eAAe,WAAlC,EAA+C;AAC7C,eAAO,IAAP;AACD;AACD,UAAIC,UAAUxf,EAAEC,KAAF,CAAQ,EAAC4U,cAAc,MAAf,EAAR,EAAgChE,KAAK3T,KAAL,CAAWqiB,WAAX,CAAhC,CAAd;AACA,aAAO9Z,aAAamP,UAAb,CAAwB4K,OAAxB,CAAP;AACD,KAPD;;AAUA;;;;AAIA,SAAKnC,UAAL,GAAkB,YAAW;AAC3B,UAAG,CAAC,KAAK3d,EAAT,EAAa;AACX,aAAKA,EAAL,GAAUwE,aAAaC,OAAb,CAAqB,IAArB,CAAV;AACD;AACD,aAAO,KAAKzE,EAAZ;AACD,KALD;;AAOA,SAAKgb,KAAL,GAAa,UAAShb,EAAT,EAAa;AACxBwE,mBAAa+V,OAAb,CAAqB,IAArB,EAA2Bva,EAA3B;AACD,KAFD;;AAIA,SAAKsO,OAAL,GAAe,YAAW;AACxB9J,mBAAa8a,UAAb,CAAwB,KAAxB;AACA9a,mBAAa8a,UAAb,CAAwB,IAAxB;AACD,KAHD;;AAKA,SAAK5B,iBAAL,GAAyB,UAAS1F,IAAT,EAAe+H,SAAf,EAA0B;AACjD,UAAIC,WAAW,IAAf;AACA,UAAGhI,KAAKE,YAAR,EAAsB;AACpB8H,mBAAWxhB,MAAMxC,MAAN,CAAaikB,WAAb,CAAyBjI,KAAKE,YAA9B,EAA4C6H,SAA5C,CAAX;AACD,OAFD,MAEO;AACLC,mBAAWxhB,MAAMxC,MAAN,CAAakkB,2BAAb,EAAX;AACAlI,aAAKE,YAAL,GAAoB1Z,MAAMxC,MAAN,CAAamkB,WAAb,CAAyBH,QAAzB,EAAmCD,SAAnC,CAApB;AACD;;AAED,UAAIK,KAAK5hB,MAAMxC,MAAN,CAAaqkB,cAAb,CAA4BL,QAA5B,CAAT;AACA,UAAIM,KAAK9hB,MAAMxC,MAAN,CAAaukB,eAAb,CAA6BP,QAA7B,CAAT;AACA,UAAIQ,mBAAmB,QAAQhiB,MAAMxC,MAAN,CAAamkB,WAAb,CAAyBhP,KAAK+J,SAAL,CAAelD,KAAK6F,+BAAL,EAAf,CAAzB,EAAiFuC,EAAjF,CAA/B;AACA,UAAIK,WAAWjiB,MAAMxC,MAAN,CAAa0kB,OAAb,CAAqBF,gBAArB,EAAuCF,EAAvC,CAAf;;AAEAtI,WAAKX,OAAL,GAAemJ,gBAAf;AACAxI,WAAK4F,SAAL,GAAiB6C,QAAjB;AACAzI,WAAK2I,uBAAL,GAA+B,KAA/B;AACD,KAjBD;;AAmBC,SAAKC,iBAAL,GAAyB,UAAS5I,IAAT,EAAe+H,SAAf,EAA0B;AACjD,UAAIC,WAAWxhB,MAAMxC,MAAN,CAAaikB,WAAb,CAAyBjI,KAAKE,YAA9B,EAA4C6H,SAA5C,CAAf;;AAEA,UAAIK,KAAK5hB,MAAMxC,MAAN,CAAaqkB,cAAb,CAA4BL,QAA5B,CAAT;AACA,UAAIM,KAAK9hB,MAAMxC,MAAN,CAAaukB,eAAb,CAA6BP,QAA7B,CAAT;AACA,UAAIS,WAAWjiB,MAAMxC,MAAN,CAAa0kB,OAAb,CAAqB1I,KAAKX,OAA1B,EAAmCiJ,EAAnC,CAAf;AACA,UAAGG,aAAazI,KAAK4F,SAAlB,IAA+B,CAAC5F,KAAK4F,SAAxC,EAAmD;AACjDjc,gBAAQC,GAAR,CAAY,qCAAZ;AACA;AACD;;AAED,UAAIyV,UAAU7Y,MAAMxC,MAAN,CAAaikB,WAAb,CAAyBjI,KAAKX,OAAL,CAAaxY,SAAb,CAAuB,CAAvB,EAA0BmZ,KAAKX,OAAL,CAAavY,MAAvC,CAAzB,EAAyEshB,EAAzE,CAAd;AACApI,WAAKX,OAAL,GAAeA,OAAf;AACD,KAbD;;AAeA,SAAK4F,YAAL,GAAoB,UAAS7E,KAAT,EAAgB;AAClC,UAAI2H,YAAY,KAAKpC,UAAL,EAAhB;AACA,WAAKkB,mBAAL,CAAyBzG,KAAzB,EAAgC2H,SAAhC;AACD,KAHD;;AAKA,SAAKlB,mBAAL,GAA2B,UAASzG,KAAT,EAAgBhb,GAAhB,EAAqB;AAAA;AAAA;AAAA;;AAAA;AAC9C,8BAAiBgb,KAAjB,mIAAwB;AAAA,cAAfJ,IAAe;;AACtB,cAAGA,KAAK+D,OAAL,IAAgB,IAAnB,EAAyB;AACvB;AACD;AACD,cAAI8E,WAAW,OAAO7I,KAAKX,OAAZ,KAAwB,QAAxB,IAAoCW,KAAKX,OAAL,YAAwBlQ,MAA3E;AACA,cAAG0Z,QAAH,EAAa;AACX,gBAAG7I,KAAKX,OAAL,CAAaxY,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,KAAgC,KAAhC,IAAyCmZ,KAAKE,YAAjD,EAA+D;AAC7D;AACA,mBAAK0I,iBAAL,CAAuB5I,IAAvB,EAA6B5a,GAA7B;AACD,aAHD,MAGO;AACL;AACA4a,mBAAKX,OAAL,GAAe7Y,MAAMxC,MAAN,CAAa8kB,YAAb,CAA0B9I,KAAKX,OAAL,CAAaxY,SAAb,CAAuB,CAAvB,EAA0BmZ,KAAKX,OAAL,CAAavY,MAAvC,CAA1B,CAAf;AACD;AACF;AACF;AAf6C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB/C,KAhBD;;AAkBA,SAAKiiB,wBAAL,GAAgC,UAASpU,IAAT,EAAeqU,YAAf,EAA6BC,YAA7B,EAA2CrhB,QAA3C,EAAqD;AACnF,UAAIwY,QAAQrS,aAAa6Y,QAAb,EAAZ;AACAxG,YAAMlI,OAAN,CAAc,UAAS8H,IAAT,EAAc;AAC1B,YAAGA,KAAKX,OAAL,CAAaxY,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,KAAgC,KAAhC,IAAyCmZ,KAAKE,YAAjD,EAA+D;AAC7D;AACA,cAAI8H,WAAWxhB,MAAMxC,MAAN,CAAaikB,WAAb,CAAyBjI,KAAKE,YAA9B,EAA4C+I,YAA5C,CAAf;AACA;AACAjJ,eAAKE,YAAL,GAAoB1Z,MAAMxC,MAAN,CAAamkB,WAAb,CAAyBH,QAAzB,EAAmCgB,YAAnC,CAApB;AACD;AACF,OAPD;;AASA,WAAKE,cAAL,CAAoBvU,IAApB,EAA0ByL,KAA1B,EAAiC,UAAS1O,OAAT,EAAkB;AACjD9J,iBAAS8J,OAAT;AACD,OAFgC,CAE/B5H,IAF+B,CAE1B,IAF0B,CAAjC;AAGD,KAdD;AAeD;AACL,CA3nBA;AA4nBD,CAACyB,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,aAFZ,EAE2B,CAAC,UAAD,EAAa,UAASC,QAAT,EAAmB;AACxD,SAAO;AACLC,cAAU,GADL;AAELC,WAAO;AACL8a,mBAAa;AADR,KAFF;AAKLxa,UAAO,cAAS+K,MAAT,EAAiB0P,QAAjB,EAA2B;AAChCjb,eAAS,YAAW;AAClB,YAAGuL,OAAOyP,WAAV,EAAuB;AACrBC,mBAAS,CAAT,EAAYlY,KAAZ;AACD;AACF,OAJD;AAKD;AAXI,GAAP;AAaD,CAdyB,CAF3B;AAiBD;IAAOmY,wB;AAEL,sCAAc;AAAA;;AACZ,SAAKjb,QAAL,GAAgB,GAAhB;AACA,SAAKhB,WAAL,GAAmB,0CAAnB;AACA,SAAKiB,KAAL,GAAa;AACX2R,YAAM;AADK,KAAb;AAGD;;;;+BAEUtG,M,EAAQ3L,Y,EAAcqC,gB,EAAkB;AACjDsJ,aAAO4P,UAAP,GAAoBlZ,iBAAiBO,yBAAjB,CAA2C+I,OAAOsG,IAAlD,CAApB;;AAEAtG,aAAO5D,aAAP,GAAuB,UAASH,MAAT,EAAiBC,SAAjB,EAA4B;AACjDD,eAAOE,OAAP,GAAiB,IAAjB;AACAzF,yBAAiB0F,aAAjB,CAA+BH,MAA/B,EAAuCC,SAAvC,EAAkD8D,OAAOsG,IAAzD,EAA+D,UAASxM,QAAT,EAAkB;AAC/EmC,iBAAOE,OAAP,GAAiB,KAAjB;AACD,SAFD;AAGD,OALD;;AAOA6D,aAAO6P,sBAAP,GAAgC,UAAS3T,SAAT,EAAoB;AAClD,eAAOxF,iBAAiBoZ,0BAAjB,CAA4C5T,SAA5C,IAAyD,WAAzD,GAAuE,WAA9E;AACD,OAFD;AAID;;;;;;AAKHrK,QAAQC,MAAR,CAAe,cAAf,EAA+B0C,SAA/B,CAAyC,0BAAzC,EAAqE;AAAA,SAAM,IAAImb,wBAAJ,EAAN;AAAA,CAArE;AACA,CAAC9d,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,WAFZ,EAEyB,YAAW;AACnC,SAAQ;AACNG,WAAO;AACLG,YAAM;AADD,KADD;AAING,UAAM,cAASN,KAAT,EAAgBpC,OAAhB,EAAyB;AAC7B;AACA,UAAIwd,KAAKxd,QAAQ,CAAR,CAAT;;AAEAwd,SAAGC,SAAH,GAAe,IAAf;;AAEAD,SAAG7Z,gBAAH,CACE,WADF,EAEE,UAASsJ,CAAT,EAAY;AACVA,UAAEyQ,YAAF,CAAeC,aAAf,GAA+B,MAA/B;AACA1Q,UAAEyQ,YAAF,CAAeE,OAAf,CAAuB,MAAvB,EAA+B1Q,KAAK+J,SAAL,CAAe7U,MAAMG,IAArB,CAA/B;AACA,aAAKsb,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OAPH,EAQE,KARF;;AAWAN,SAAG7Z,gBAAH,CACE,SADF,EAEE,UAASsJ,CAAT,EAAY;AACV,aAAK4Q,SAAL,CAAevb,MAAf,CAAsB,MAAtB;AACA,eAAO,KAAP;AACD,OALH,EAME,KANF;AAQD;AA7BK,GAAR;AA+BD,CAlCA;;AAoCDhD,QACGC,MADH,CACU,cADV,EAEG0C,SAFH,CAEa,WAFb,EAE0B,YAAW;AACnC,SAAO;AACLG,WAAO;AACL2b,YAAM,GADD;AAELC,WAAK,GAFA;AAGL3P,WAAK;AAHA,KADF;AAML3L,UAAM,cAASN,KAAT,EAAgBpC,OAAhB,EAAyB;AAC7B;AACA,UAAIwd,KAAKxd,QAAQ,CAAR,CAAT;;AAEAwd,SAAG7Z,gBAAH,CACE,UADF,EAEE,UAASsJ,CAAT,EAAY;AACVA,UAAEyQ,YAAF,CAAeO,UAAf,GAA4B,MAA5B;AACA;AACA,YAAIhR,EAAE3J,cAAN,EAAsB2J,EAAE3J,cAAF;AACtB,aAAKua,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OARH,EASE,KATF;;AAYA,UAAII,UAAU,CAAd;;AAEAV,SAAG7Z,gBAAH,CACE,WADF,EAEE,UAASsJ,CAAT,EAAY;AACViR;AACA,aAAKL,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OANH,EAOE,KAPF;;AAUAN,SAAG7Z,gBAAH,CACE,WADF,EAEE,UAASsJ,CAAT,EAAY;AACViR;AACC,YAAIA,YAAY,CAAhB,EAAmB;AACjB,eAAKL,SAAL,CAAevb,MAAf,CAAsB,MAAtB;AACD;AACF,eAAO,KAAP;AACD,OARH,EASE,KATF;;AAYAkb,SAAG7Z,gBAAH,CACE,MADF,EAEE,UAASsJ,CAAT,EAAY;AACV;AACA,YAAIA,EAAEkR,eAAN,EAAuBlR,EAAEkR,eAAF;;AAEvB,aAAKN,SAAL,CAAevb,MAAf,CAAsB,MAAtB;;AAEA,YAAI8b,QAAQ,KAAKrlB,IAAjB;AACA,YAAIwJ,OAAO,IAAI+M,IAAJ,CAASpC,KAAK3T,KAAL,CAAW0T,EAAEyQ,YAAF,CAAeW,OAAf,CAAuB,MAAvB,CAAX,CAAT,CAAX;AACAjc,cAAMkc,MAAN,CAAa,UAASlc,KAAT,EAAgB;AAC3B,cAAImc,KAAKnc,MAAM2b,IAAN,EAAT;AACA,cAAI,gBAAgB,OAAOQ,EAA3B,EAA+B;AAC7BA,eAAGtR,CAAH,EAAM7K,MAAMiM,GAAZ,EAAiB9L,IAAjB;AACD;AACF,SALD;;AAOA,eAAO,KAAP;AACD,OAlBH,EAmBE,KAnBF;AAqBD;AAnEI,GAAP;AAqED,CAxED;AAyEA,CAACjD,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,YAFZ,EAE0B,YAAW;AAClC,SAAO;AACNE,cAAU,GADJ;AAENC,WAAO;AACLU,eAAS;AADJ,KAFD;AAKNJ,UAAM,cAAUN,KAAV,EAAiBpC,OAAjB,EAA0B;AAC/BA,cAAQwe,EAAR,CAAW,QAAX,EAAqB,UAAUzb,KAAV,EAAiB;AACpCX,cAAMkc,MAAN,CAAa,YAAU;AACrBlc,gBAAMU,OAAN,CAAc,EAAC8J,OAAO7J,MAAM+C,MAAN,CAAa8G,KAArB,EAAd;AACD,SAFD;AAGD,OAJD;AAKA;AAXK,GAAP;AAaH,CAhBA;AAiBD,CAACtN,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,WAFZ,EAEyB,YAAW;AACjC,SAAO;AACLwc,aAAS,SADJ;AAEL/b,UAAM,cAASN,KAAT,EAAgBpC,OAAhB,EAAyB4C,KAAzB,EAAgC8b,SAAhC,EAA2C;AAC/C,UAAIC,YAAY,SAAZA,SAAY,CAASC,UAAT,EAAqB;AACnC,YAAIA,cAAcnG,SAAlB,EAA6BmG,aAAa,EAAb;AAC7B,YAAIC,aAAaD,WAAWvb,WAAX,EAAjB;AACA,YAAIwb,eAAeD,UAAnB,EAA+B;AAC7BF,oBAAUI,aAAV,CAAwBD,UAAxB;AACAH,oBAAUK,OAAV;AACD;AACD,eAAOF,UAAP;AACD,OARD;AASAH,gBAAUM,QAAV,CAAmBtL,IAAnB,CAAwBiL,SAAxB;AACAA,gBAAUvc,MAAMQ,MAAMqc,OAAZ,CAAV;AACD;AAdI,GAAP;AAgBD,CAnBF;AAoBD,CAAC3f,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,eAFZ,EAE6B,CAAC,SAAD,EAAY,UAAUid,OAAV,EAAmB;AACzD,SAAO;AACH/c,cAAU,GADP;AAEHO,UAAM,cAAUN,KAAV,EAAiBpC,OAAjB,EAA0B4C,KAA1B,EAAiC;AACnC5C,cAAQwe,EAAR,CAAW,OAAX,EAAoB,YAAY;AAC5B,YAAI,CAACU,QAAQC,YAAR,GAAuBrnB,QAAvB,EAAL,EAAwC;AACpC;AACA,eAAKsnB,iBAAL,CAAuB,CAAvB,EAA0B,KAAK3D,KAAL,CAAW5gB,MAArC;AACH;AACJ,OALD;AAMH;AATE,GAAP;AAWH,CAZ6B,CAF7B;AAeD,CAACyE,QACEC,MADF,CACS,cADT,EAEE0C,SAFF,CAEY,MAFZ,EAEoB,UAASC,QAAT,EAAmB;AACpC,SAAO;AACLC,cAAU,GADL;AAELf,gBAAY,gBAFP;AAGLD,iBAAa,+BAHR;AAILiB,WAAO;AACLG,YAAM;AADD;AAJF,GAAP;AAQD,CAXF,EAYEnB,UAZF,CAYa,gBAZb,EAY+B,UAAUS,UAAV,EAAsB4L,MAAtB,EAA8BjF,MAA9B,EAAsCtE,gBAAtC,EAAwD;AACpFuJ,SAAOrI,eAAP,GAAyB,YAAW;AAClC,WAAOlB,iBAAiBmB,UAAjB,CAA4BnB,iBAAiBoB,sBAAjB,CAAwCmI,OAAOlL,IAAP,CAAYpI,IAApD,CAA5B,CAAP;AACD,GAFD;AAGD,CAhBF;AAiBD,C,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+BDmF,QACKC,MADL,CACY,cADZ,EAC4B0C,SAD5B,CACsC,WADtC,EACmD,CAAC,UAAD,EAAa,UAAUC,QAAV,EAAoB;AAC5E,WAASmd,YAAT,CAAsB5R,MAAtB,EAA8B0P,QAA9B,EAAwCmC,MAAxC,EAAgD;AAC5C,QAAIC,QAAQ,IAAZ;AAAA,QACIC,eAAeF,OAAOE,YAAP,GAAsBC,aAAaH,OAAOE,YAApB,CAAtB,GAA0D,GAD7E;AAAA,QAEIE,YAAYJ,OAAOI,SAAP,IAAoB,GAFpC;AAAA,QAGIC,aAAaL,OAAOK,UAAP,IAAqBD,YAAY,CAHlD;AAAA,QAIIE,aAAaN,OAAOM,UAAP,GAAoBC,kBAAkBP,OAAOM,UAAzB,CAApB,GAA2D,KAJ5E;AAAA,QAKIE,SAASR,OAAOQ,MAAP,IAAiB,GAL9B;AAAA,QAMIC,cAAc,OAAOT,OAAOS,WAAd,KAA8B,WAA9B,GAA4CT,OAAOS,WAAP,KAAuB,MAAnE,GAA4E,IAN9F;AAAA,QAOIC,WAPJ;AAAA,QAQIC,SARJ;AAAA,QASIrW,OATJ;AAAA,QAUIsW,QAVJ;;AAcA,QAAIzS,OAAOtT,IAAX,EAAiB;AACb,UAAIsT,OAAOtT,IAAP,YAAuBgmB,KAA3B,EAAkC;AAC9BF,oBAAYxS,OAAOtT,IAAnB;AACA6lB,sBAAcC,UAAU,CAAV,CAAd;AACH,OAHD,MAGO;AACHD,sBAAcvS,OAAOtT,IAArB;AACH;AACJ;AACD,QAAI,OAAOsT,OAAO2S,KAAd,KAAwB,WAAxB,IAAuC3S,OAAO2S,KAAlD,EAAyD;AACrDC;AACH;;AAED,aAASA,SAAT,GAAqB;AACjBd,cAAQrd,SAAS,YAAY;AACzBoe,iBAASnD,QAAT,EAAmB,CAAnB,EAAsB,CAAtB,EAAyB6C,WAAzB;AACH,OAFO,EAELR,YAFK,CAAR;AAGH;;AAED,aAASc,QAAT,CAAkBtgB,OAAlB,EAA2BugB,SAA3B,EAAsCC,QAAtC,EAAgDrmB,IAAhD,EAAsD;AAClD,UAAIomB,aAAapmB,KAAKU,MAAtB,EAA8B;AAC1B4lB,oBAAYzgB,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkB2lB,SAAlB,IAA+BT,MAApD;AACAS;AACAhB,gBAAQrd,SAAS,YAAY;AACzBoe,mBAAStgB,OAAT,EAAkBugB,SAAlB,EAA6BC,QAA7B,EAAuCrmB,IAAvC;AACH,SAFO,EAELulB,SAFK,CAAR;AAGA;AACH,OAPD,MAOO;AACHa;;AAEA,YAAG9S,OAAOiT,iBAAV,EAA6B;AAC3BjT,iBAAOiT,iBAAP,GAA2BF,QAA3B;AACD;;AAED;AACA,YAAIP,aAAaO,WAAWP,UAAUplB,MAAV,GAAmB,CAA/C,EAAkD;AAC9C0kB,kBAAQrd,SAAS,YAAY;AACzBye,4BAAgB3gB,OAAhB,EAAyBugB,SAAzB,EAAoCC,QAApC,EAA8CP,UAAUO,QAAV,CAA9C;AACH,WAFO,EAEL/S,OAAOmT,cAFF,CAAR;AAGH,SAJD,MAIO;AACH,cAAInT,OAAOoT,UAAX,EAAuB;AACnBpT,mBAAOoT,UAAP;AACH;AACDC,kBAAQ9gB,OAAR,EAAiBugB,SAAjB,EAA4BP,WAA5B;AACH;AACJ;AACJ;;AAED,aAASc,OAAT,CAAiB9gB,OAAjB,EAA0BugB,SAA1B,EAAqC;AACjC,UAAIpmB,OAAO6F,QAAQ7F,IAAR,GAAeS,SAAf,CAAyB,CAAzB,EAA4BoF,QAAQ7F,IAAR,GAAeU,MAAf,GAAwB,CAApD,CAAX;AACA,UAAIklB,WAAJ,EAAiB;AACb,YAAIH,UAAJ,EAAgB;AACZM,qBAAW,yCAAyCN,UAAzC,GAAsD,6CAAtD,GAAsGA,UAAtG,GAAmH,YAAnH,GACP,kCADO,GAC8BA,UAD9B,GAC2C,2CAD3C,GACyFA,UADzF,GACsG,aADtG,GAEP,8BAFO,GAE0BA,UAF1B,GAEuC,YAFlD;AAGAa,sBAAYzgB,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkB2lB,SAAlB,IAA+B,6BAA/B,GAA+DL,QAA/D,GAA0E,IAA1E,GAAiFJ,MAAjF,GAA0F,SAA/G;AACH,SALD,MAKO;AACHW,sBAAYzgB,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkB2lB,SAAlB,IAA+B,sBAA/B,GAAwDT,MAAxD,GAAiE,SAAtF;AACH;AACJ,OATD,MASO;AACHW,oBAAYzgB,OAAZ,EAAqB7F,KAAKS,SAAL,CAAe,CAAf,EAAkB2lB,SAAlB,CAArB;AACH;AACJ;;AAED,aAASI,eAAT,CAAyB3gB,OAAzB,EAAkCugB,SAAlC,EAA6CC,QAA7C,EAAuDR,WAAvD,EAAoE;AAClE,UAAGO,aAAa,CAAhB,EAAmB;AACjB,YAAG9S,OAAOsT,UAAV,EAAsB;AACpBtT,iBAAOsT,UAAP;AACD;AACF;AACC,UAAIR,YAAY,CAAhB,EAAmB;AACfP,sBAAcA,YAAY7iB,KAAZ,CAAkB,CAAlB,EAAqB,CAAC,CAAtB,CAAd;AACA;AACAsjB,oBAAYzgB,OAAZ,EAAqBggB,cAAcF,MAAnC;AACAS;AACAhB,gBAAQrd,SAAS,YAAY;AACzBye,0BAAgB3gB,OAAhB,EAAyBugB,SAAzB,EAAoCC,QAApC,EAA8CR,WAA9C;AACH,SAFO,EAELL,UAFK,CAAR;AAGA;AACH,OATD,MASO;AACHa;AACAR,sBAAcC,UAAUO,QAAV,CAAd;AACAjB,gBAAQrd,SAAS,YAAY;AACzBoe,mBAAStgB,OAAT,EAAkB,CAAlB,EAAqBwgB,QAArB,EAA+BR,WAA/B;AACH,SAFO,EAELN,SAFK,CAAR;AAGH;AACJ;;AAED,aAASD,YAAT,CAAsB5a,KAAtB,EAA6B;AACzB,UAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;AAC3B,eAAOA,MAAM6P,MAAN,CAAa7P,MAAMhK,MAAN,GAAe,CAA5B,MAAmC,GAAnC,GAAyCmmB,SAASnc,MAAMjK,SAAN,CAAgB,CAAhB,EAAmBiK,MAAMhK,MAAN,GAAe,CAAlC,CAAT,EAA+C,EAA/C,IAAqD,IAA9F,GAAqG,CAACgK,KAA7G;AACH,OAFD,MAEO;AACH,eAAO,KAAP;AACH;AACJ;;AAED,aAASgb,iBAAT,CAA2Bhb,KAA3B,EAAkC;AAC9B,UAAI,OAAOA,KAAP,KAAiB,QAArB,EAA+B;AAC3B,eAAOA,MAAM6P,MAAN,CAAa7P,MAAMhK,MAAN,GAAe,CAA5B,MAAmC,GAAnC,GAAyCgK,KAAzC,GAAiDmc,SAASnc,MAAMjK,SAAN,CAAgB,CAAhB,EAAmBiK,MAAMhK,MAAN,GAAe,CAAlC,CAAT,EAA+C,EAA/C,IAAqD,IAA7G;AACH;AACJ;;AAED,aAAS4lB,WAAT,CAAqBzgB,OAArB,EAA8Byb,KAA9B,EAAqC;AACjC,UAAIzb,QAAQihB,IAAR,CAAa,UAAb,EAAyB/iB,WAAzB,OAA2C,OAA/C,EAAwD;AACpD,eAAO8B,QAAQkhB,GAAR,CAAYzF,KAAZ,CAAP;AACH;AACD,aAAOzb,QAAQmhB,IAAR,CAAa1F,KAAb,CAAP;AACH;;AAEDhO,WAAO7J,GAAP,CAAW,UAAX,EAAuB,YAAY;AAC/B,UAAI2b,KAAJ,EAAW;AACPrd,iBAASyD,MAAT,CAAgB4Z,KAAhB;AACH;AACJ,KAJD;;AAMA9R,WAAO3J,MAAP,CAAc,OAAd,EAAuB,UAAUsd,MAAV,EAAkB;AACrC,UAAI,CAACxX,OAAD,IAAYwX,MAAhB,EAAwB;AACpBxX,kBAAU,CAACA,OAAX;AACAyW;AACH;AACJ,KALD;;AAOA5S,WAAO3J,MAAP,CAAc,MAAd,EAAsB,UAAUsd,MAAV,EAAkBC,MAAlB,EAA0B;AAC9C,UAAG,EAAED,kBAAkBjB,KAApB,CAAH,EAA+B;AAC7BH,sBAAcoB,MAAd;AACAf;AACD;AACF,KALD;AAMH;;AAED,SAAO;AACHle,cAAU,GADP;AAEHO,UAAM2c,YAFH;AAGH/mB,aAAS,IAHN;AAIH8J,WAAO;AACHjI,YAAM,GADH;AAEH0mB,kBAAY,GAFT;AAGHH,yBAAmB,GAHhB;AAIHE,sBAAgB,GAJb;AAKHG,kBAAY,GALT;AAMHX,aAAO;AANJ;AAJJ,GAAP;AAcH,CA/J8C,CADnD;AAiKA;IAAOkB,gB;AAEL,4BAAYhP,WAAZ,EAAyBxQ,YAAzB,EAAuCC,aAAvC,EAAsD;AAAA;;AAClD,SAAKuQ,WAAL,GAAmBA,WAAnB;AACA,SAAKxQ,YAAL,GAAoBA,YAApB;AACA,SAAKC,aAAL,GAAqBA,aAArB;AACA,SAAKwf,uBAAL,GAA+BrU,KAAK3T,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,yBAArB,CAAX,KAA+D,EAA9F;AACA,SAAKghB,mBAAL,GAA2BtU,KAAK3T,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,qBAArB,CAAX,KAA2D,EAAtF;;AAEAsB,iBAAa2f,mBAAb,CAAiC,kBAAjC,EAAqD,WAArD,EAAkE,UAAStN,KAAT,EAAe;AAAA;AAAA;AAAA;;AAAA;AAC/E,8BAAgBA,KAAhB,mIAAuB;AAAA,cAAduN,GAAc;;;AAErBA,cAAItnB,SAAJ,GAAgB,KAAKmjB,0BAAL,CAAgCmE,GAAhC,CAAhB;;AAFqB;AAAA;AAAA;;AAAA;AAIrB,kCAAmBA,IAAIxM,OAAvB,mIAAgC;AAAA,kBAAvBxL,MAAuB;;AAC9B,kBAAG,KAAK6X,uBAAL,CAA6BnQ,QAA7B,CAAsC1H,OAAO9J,GAA7C,CAAH,EAAsD;AACpD,qBAAK+hB,kBAAL,CAAwBjY,MAAxB,EAAgCgY,GAAhC;AACD;AACF;AARoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAStB;AAV8E;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWhF,KAXiE,CAWhE7jB,IAXgE,CAW3D,IAX2D,CAAlE;AAYH;;;;8CAMyBkW,I,EAAM;AAC9B,aAAO,KAAKsJ,UAAL,CAAgBtM,MAAhB,CAAuB,UAAS2Q,GAAT,EAAa;AACzC,eAAOA,IAAIE,yBAAJ,CAA8B7N,IAA9B,EAAoClZ,MAApC,GAA6C,CAApD;AACD,OAFM,CAAP;AAGD;;;kCAEa+E,G,EAAK;AAAA;AAAA;AAAA;;AAAA;AACjB,8BAAsB,KAAKyd,UAA3B,mIAAuC;AAAA,cAA9B1T,SAA8B;;AACrC,iBAAOtN,EAAE6S,IAAF,CAAOvF,UAAUuL,OAAjB,EAA0B,EAACtV,KAAKA,GAAN,EAA1B,CAAP;AACD;AAHgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIlB;;;+CAE0B+J,S,EAAW;AACpC,aAAO,CAAC,KAAK6X,mBAAL,CAAyBpQ,QAAzB,CAAkCzH,UAAU/J,GAA5C,CAAR;AACD;;;oDAE+BxF,S,EAAWuP,S,EAAW;AACpD,UAAGvP,SAAH,EAAc;AACZiC,UAAEiZ,IAAF,CAAO,KAAKkM,mBAAZ,EAAiC7X,UAAU/J,GAA3C;AACD,OAFD,MAEO;AACL,aAAK4hB,mBAAL,CAAyB9N,IAAzB,CAA8B/J,UAAU/J,GAAxC;AACD;;AAEDW,mBAAa+V,OAAb,CAAqB,qBAArB,EAA4CpJ,KAAK+J,SAAL,CAAe,KAAKuK,mBAApB,CAA5C;;AAEA7X,gBAAUvP,SAAV,GAAsB,KAAKmjB,0BAAL,CAAgC5T,SAAhC,CAAtB;AACD;;;iCAEY/J,G,EAAKjE,Q,EAAU;AAC1B,WAAKkmB,2BAAL,CAAiCjiB,GAAjC,EAAsCjE,QAAtC;AACD;;;oCAEegO,S,EAAW;AAAA;AAAA;AAAA;;AAAA;AACzB,8BAAkBA,UAAUuL,OAA5B,mIAAqC;AAAA,cAA7BxL,MAA6B;;AACnCrN,YAAEiZ,IAAF,CAAO,KAAKkM,mBAAZ,EAAiC7X,SAAjC;AACA,cAAGD,OAAOoY,WAAV,EAAuB;AACrB,gBAAG,KAAKC,qBAAL,CAA2BrY,MAA3B,CAAH,EAAuC;AACrC,mBAAKsY,mBAAL,CAAyBtY,MAAzB;AACD;AACF;AACF;AARwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAUzB,WAAK5H,YAAL,CAAkB0N,kBAAlB,CAAqC7F,SAArC;AACA,WAAK5H,aAAL,CAAmBuF,IAAnB,CAAwB,IAAxB;AACD;;;gDAE2B1H,G,EAAKjE,Q,EAAU;AACzC,WAAK2W,WAAL,CAAiB2P,MAAjB,CAAwBriB,GAAxB,EAA6BA,GAA7B,EAAkC4B,GAAlC,GAAwCrD,IAAxC,CAA6C,UAASoJ,QAAT,EAAkB;AAC7D,YAAIma,MAAM,KAAKQ,uCAAL,CAA6CtiB,GAA7C,EAAkD2H,SAASqP,KAAT,EAAlD,CAAV;AACA,YAAGjb,QAAH,EAAa;AACXA,mBAAS+lB,GAAT;AACD;AACF,OAL4C,CAK3C7jB,IAL2C,CAKtC,IALsC,CAA7C,EAMCO,KAND,CAMO,UAASmJ,QAAT,EAAkB;AACvB7J,gBAAQC,GAAR,CAAY,6BAAZ,EAA2C4J,QAA3C;AACA5L,iBAAS,IAAT;AACD,OATD;AAUD;;;4DAEuCiE,G,EAAKyV,oB,EAAsB;AACjE,UAAI1L,YAAYtN,EAAE6S,IAAF,CAAO,KAAKmO,UAAZ,EAAwB,EAACzd,KAAKA,GAAN,EAAxB,CAAhB;AACA,UAAG+J,SAAH,EAAc;AACZA,kBAAUwY,8BAAV,CAAyC9M,oBAAzC;AACD,OAFD,MAEO;AACL1L,oBAAY,IAAIsL,SAAJ,CAAcI,oBAAd,CAAZ;AACA1L,kBAAU/J,GAAV,GAAgBA,GAAhB;AACA+J,kBAAUtC,QAAV,CAAmB,IAAnB;AACA,aAAKvF,YAAL,CAAkB6M,OAAlB,CAA0BhF,SAA1B;AACA,aAAK5H,aAAL,CAAmBuF,IAAnB,CAAwB,IAAxB;AACD;;AAED,aAAOqC,SAAP;AACD;;;kDAE6B;AAAA;AAAA;AAAA;;AAAA;AAC5B,+BAAgB,KAAK4X,uBAArB,wIAA8C;AAAA,cAArC3hB,GAAqC;;AAC5C,cAAI8J,SAAS,KAAK0Y,aAAL,CAAmBxiB,GAAnB,CAAb;AACA,cAAG8J,MAAH,EAAW;AACT,iBAAKsY,mBAAL,CAAyBtY,MAAzB;AACD;AACF;AAN2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAQ5B,+BAAe,KAAK2T,UAApB,wIAAgC;AAAA,cAAxBqE,GAAwB;;AAC9B,eAAKG,2BAAL,CAAiCH,IAAI9hB,GAArC,EAA0C,UAAS+J,SAAT,EAAmB;AAC3DA,sBAAUtC,QAAV,CAAmB,IAAnB;AACD,WAFD;AAGD;AAZ2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAa7B;;;kCAEaqC,M,EAAQC,S,EAAWoK,I,EAAMpY,Q,EAAU;;AAE/C,UAAG,KAAK4hB,0BAAL,CAAgC5T,SAAhC,KAA8C,CAAC,KAAK5H,aAAL,CAAmBmE,cAAnB,EAAlD,EAAuF;AACrFsB,cAAM,2FAAN;AACA7L,iBAAS,IAAT;AACA;AACD;;AAED,cAAQ+N,OAAOmL,IAAf;AACE,aAAK,KAAL;AAAY;AACV,iBAAKvC,WAAL,CAAiB2P,MAAjB,CAAwBvY,OAAO9J,GAA/B,EAAoC8J,OAAO9J,GAA3C,EAAgD4B,GAAhD,GAAsDrD,IAAtD,CAA2D,UAASoJ,QAAT,EAAkB;AAC3EmC,qBAAOpL,KAAP,GAAe,KAAf;AACA,kBAAI6V,QAAQ5M,SAAS4M,KAArB;AACA,mBAAKrS,YAAL,CAAkB4Y,6BAAlB,CAAgDvG,KAAhD;AACAxY,uBAASwY,KAAT;AACD,aAL0D,CAKzDtW,IALyD,CAKpD,IALoD,CAA3D,EAMCO,KAND,CAMO,UAASmJ,QAAT,EAAkB;AACvBmC,qBAAOpL,KAAP,GAAe,IAAf;AACD,aARD;;AAUA;AACD;;AAED,aAAK,MAAL;AAAa;AACX,gBAAI+jB,MAAMrqB,OAAOoiB,IAAP,CAAY1Q,OAAO9J,GAAnB,EAAwB,QAAxB,CAAV;AACAyiB,gBAAIpd,KAAJ;AACAtJ;AACA;AACD;;AAED,aAAK,MAAL;AAAa;AACX,gBAAIyE,SAAS,EAAb;;AAEA,gBAAGsJ,OAAOoE,GAAV,EAAe;AACb,kBAAIqG,QAAQ,KAAKrS,YAAL,CAAkBsZ,qBAAlB,CAAwC1R,OAAOiL,aAA/C,CAAZ;AACAvU,qBAAO+T,KAAP,GAAeA,MAAMiB,GAAN,CAAU,UAASrB,IAAT,EAAc;AACrC,oBAAI3T,SAAS,KAAKkiB,qBAAL,CAA2BvO,IAA3B,EAAiCpK,SAAjC,CAAb;AACA,uBAAOvJ,MAAP;AACD,eAHwB,CAGvBvC,IAHuB,CAGlB,IAHkB,CAAV,CAAf;AAKD,aAPD,MAOO;AACLuC,qBAAO2T,IAAP,GAAc,KAAKuO,qBAAL,CAA2BvO,IAA3B,EAAiCpK,SAAjC,CAAd;AACD;;AAED,iBAAK4Y,WAAL,CAAiB7Y,MAAjB,EAAyBC,SAAzB,EAAoCvJ,MAApC,EAA4C,UAASmH,QAAT,EAAkB;AAC5D5L,uBAAS4L,QAAT;AACD,aAFD;;AAIA;AACD;;AAED;AAAS,WAER;AA7CH;;AAgDAmC,aAAO6K,YAAP,GAAsB,IAAI5b,IAAJ,EAAtB;AACD;;;0CAEqB+Q,M,EAAQ;AAC5B,aAAO,KAAK6X,uBAAL,CAA6BnQ,QAA7B,CAAsC1H,OAAO9J,GAA7C,CAAP;AACD;;;wCAEmB8J,M,EAAQC,S,EAAW;AACrCtN,QAAEiZ,IAAF,CAAO,KAAKiM,uBAAZ,EAAqC7X,OAAO9J,GAA5C;AACAW,mBAAa+V,OAAb,CAAqB,yBAArB,EAAgDpJ,KAAK+J,SAAL,CAAe,KAAKsK,uBAApB,CAAhD;AACA,WAAKzf,YAAL,CAAkB0gB,wBAAlB,CAA2C9Y,OAAO9J,GAAlD;;AAEAlC,cAAQ8b,MAAR,CAAe,KAAKuI,qBAAL,CAA2BrY,MAA3B,KAAsC,KAArD;AACD;;;uCAEkBA,M,EAAQC,S,EAAW;AACpC,UAAG,CAACtN,EAAE6S,IAAF,CAAO,KAAKqS,uBAAZ,EAAqC7X,OAAO9J,GAA5C,CAAJ,EAAsD;AACpD,aAAK2hB,uBAAL,CAA6B7N,IAA7B,CAAkChK,OAAO9J,GAAzC;AACAW,qBAAa+V,OAAb,CAAqB,yBAArB,EAAgDpJ,KAAK+J,SAAL,CAAe,KAAKsK,uBAApB,CAAhD;AACD;;AAED,UAAG7X,OAAOoY,WAAV,EAAuB;;AAErB,YAAGpY,OAAOoY,WAAP,IAAsB,OAAzB,EAAkC;AAChC,eAAKhgB,YAAL,CAAkB2gB,qBAAlB,CAAwC/Y,OAAO9J,GAA/C,EAAoD8J,OAAOiL,aAA3D,EAA0E,UAAS+N,YAAT,EAAsB;AAC9F,iBAAKC,kBAAL,CAAwBjZ,MAAxB,EAAgCC,SAAhC,EAA2C+Y,YAA3C;AACD,WAFyE,CAExE7kB,IAFwE,CAEnE,IAFmE,CAA1E;AAGD;;AAED,YAAG6L,OAAOoY,WAAP,IAAsB,MAAzB,EAAiC;AAC/B;AACD;AAEF;AACF;;;gCAEWpY,M,EAAQC,S,EAAW9E,K,EAAO6d,Y,EAAc;AAClD,WAAKE,WAAL,GAAmB,KAAKA,WAAL,IAAoB,EAAvC;AACA,UAAGvmB,EAAE6S,IAAF,CAAO,KAAK0T,WAAZ,EAAyB,EAAChjB,KAAK8J,OAAO9J,GAAb,EAAzB,CAAH,EAAgD;AAC9C;AACD;;AAED;AACA,WAAKgjB,WAAL,CAAiBlP,IAAjB,CAAsBhK,MAAtB;;AAEA5E,iBAAW,YAAY;AACrB;AACA,aAAK6d,kBAAL,CAAwBjZ,MAAxB,EAAgCC,SAAhC,EAA2C+Y,YAA3C;AACArmB,UAAEiZ,IAAF,CAAO,KAAKsN,WAAZ,EAAyBlZ,MAAzB;AACD,OAJU,CAIT7L,IAJS,CAIJ,IAJI,CAAX,EAIcgH,QAAQ,IAJtB;AAKD;;;uCAEkB6E,M,EAAQC,S,EAAW+Y,Y,EAAc;AAClD,UAAGhZ,OAAOmZ,cAAP,GAAwB,CAA3B,EAA8B;AAC5B,YAAItO,eAAe7K,OAAO6K,YAA1B;AACA,YAAIuO,gBAAgB,CAAC,IAAInqB,IAAJ,KAAa4b,YAAd,IAA4B,IAAhD;AACA,YAAGuO,gBAAgBpZ,OAAOmZ,cAA1B,EAA0C;AACxC,cAAIhe,QAAQ6E,OAAOmZ,cAAP,GAAwBC,aAApC;AACA,eAAKC,WAAL,CAAiBrZ,MAAjB,EAAyBC,SAAzB,EAAoC9E,KAApC,EAA2C6d,YAA3C;AACA;AACD;AACF;;AAEDhZ,aAAO6K,YAAP,GAAsB,IAAI5b,IAAJ,EAAtB;;AAEA+E,cAAQC,GAAR,CAAY,oBAAZ;;AAEA,UAAG+L,OAAOmL,IAAP,IAAe,MAAlB,EAA0B;AACxB,YAAIzU,SAAS,EAAb;AACAA,eAAO+T,KAAP,GAAeuO,aAAatN,GAAb,CAAiB,UAASrB,IAAT,EAAc;AAC5C,cAAI3T,SAAS,KAAKkiB,qBAAL,CAA2BvO,IAA3B,EAAiCpK,SAAjC,CAAb;AACA,iBAAOvJ,MAAP;AACD,SAH+B,CAG9BvC,IAH8B,CAGzB,IAHyB,CAAjB,CAAf;AAIA,aAAK0kB,WAAL,CAAiB7Y,MAAjB,EAAyBC,SAAzB,EAAoCvJ,MAApC,EAA4C,IAA5C;AACD,OAPD,MAOO;AACL;AACD;AACF;;;0CAEqB2T,I,EAAMpK,S,EAAW;AACrC,aAAO,KAAK5H,aAAL,CAAmBqX,kBAAnB,CAAsCrF,IAAtC,EAA4C,KAAKwJ,0BAAL,CAAgC5T,SAAhC,CAA5C,CAAP;AACD;;;gCAEWD,M,EAAQC,S,EAAWvJ,M,EAAQzE,Q,EAAU;AAC/C,UAAI+a,UAAU,KAAKpE,WAAL,CAAiB2P,MAAjB,CAAwBvY,OAAO9J,GAA/B,EAAoC8J,OAAO9J,GAA3C,CAAd;AACA,UAAG,KAAK2d,0BAAL,CAAgC5T,SAAhC,CAAH,EAA+C;AAC7C+M,gBAAQtJ,WAAR,GAAsB,KAAKrL,aAAL,CAAmBwU,aAAnB,EAAtB;AACD;AACDla,QAAEC,KAAF,CAAQoa,OAAR,EAAiBtW,MAAjB;;AAEAsW,cAAQM,IAAR,GAAe7Y,IAAf,CAAoB,UAASoJ,QAAT,EAAkB;AACpCmC,eAAOpL,KAAP,GAAe,KAAf;AACA,YAAG3C,QAAH,EAAa;AACXA,mBAAS4L,SAASqP,KAAT,EAAT;AACD;AACF,OALD,EAMCxY,KAND,CAMO,UAASmJ,QAAT,EAAkB;AACvBmC,eAAOpL,KAAP,GAAe,IAAf;AACAZ,gBAAQC,GAAR,CAAY,wBAAZ,EAAsC4J,QAAtC;AACA,YAAG5L,QAAH,EAAa;AACXA,mBAAS,EAAC2C,OAAO,eAAR,EAAT;AACD;AACF,OAZD;AAaD;;;wBA5PgB;AACf,aAAO,KAAKwD,YAAL,CAAkBub,UAAzB;AACD;;;;;;AA8PH/d,QAAQC,MAAR,CAAe,cAAf,EAA+ByjB,OAA/B,CAAuC,kBAAvC,EAA2D1B,gBAA3D;AACA,CAAChiB,QAAQC,MAAR,CAAe,cAAf,EACEwR,MADF,CACS,SADT,EACoB,UAAUkS,OAAV,EAAmB;AAClC,SAAO,UAAUnlB,KAAV,EAAiB;AACpB,WAAOA,QAAQmlB,QAAQ,MAAR,EAAgB,IAAItqB,IAAJ,CAASmF,KAAT,CAAhB,EAAiC,YAAjC,EAA+C,KAA/C,CAAR,GAAgE,EAAvE;AACH,GAFD;AAGH,CALF,EAMEiT,MANF,CAMS,aANT,EAMwB,UAAUkS,OAAV,EAAmB;AACtC,SAAO,UAAUnlB,KAAV,EAAiB;AACpB,WAAOA,QAAQmlB,QAAQ,MAAR,EAAgB,IAAItqB,IAAJ,CAASmF,KAAT,CAAhB,EAAiC,mBAAjC,CAAR,GAAgE,EAAvE;AACH,GAFD;AAGH,CAVF;AAWD,CAACwB,QAAQC,MAAR,CAAe,cAAf,EACEyjB,OADF,CACU,kBADV,EAC8B,UAAU/e,IAAV,EAAgB;;AAE3Cif,SAAOC,UAAP,CAAkB;AAChBC,YAAQ,IADQ;AAEhBC,cAAU;AAFM,GAAlB;;AAKA,OAAK/d,sBAAL,GAA8B,UAASnL,IAAT,EAAe;AAC3C,QAAG,CAACA,IAAD,IAASA,KAAKU,MAAL,IAAe,CAA3B,EAA8B;AAC5B,aAAO,EAAP;AACD;AACD,WAAOqoB,OAAO/oB,IAAP,CAAP;AACD,GALD;;AAOA,OAAKkL,UAAL,GAAkB,UAASie,SAAT,EAAoB;AACpC,WAAOrf,KAAKsf,WAAL,CAAiBD,SAAjB,CAAP;AACD,GAFD;AAKD,CApBF;AAqBD;IAAOE,Y;AAEL,0BAAc;AAAA;;AACZ,SAAKvV,KAAL,GAAa,EAAb;AACA,SAAKD,IAAL,GAAY,EAAZ;AACA,SAAKyV,iBAAL,GAAyB,EAAzB;AACA,SAAKC,mBAAL,GAA2B,EAA3B;AACA,SAAKvP,KAAL,GAAa,EAAb;AACA,SAAKwP,WAAL,GAAmB,EAAnB;AACD;;;;0CAcqBC,Y,EAAc;AAClC,aAAO,KAAKzP,KAAL,CAAWpD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AACrC,eAAO,CAAC6P,aAAaxS,QAAb,CAAsB2C,KAAK7C,YAA3B,KAA4C0S,aAAaxS,QAAb,CAAsB,GAAtB,CAA7C,KAA4E,CAAC2C,KAAKzP,KAAzF;AACD,OAFM,CAAP;AAGD;;;6BAEQuf,M,EAAQ;AACf,aAAOxnB,EAAE6S,IAAF,CAAO,KAAKiF,KAAZ,EAAmB,EAACpb,MAAM8qB,MAAP,EAAnB,CAAP;AACD;;;kDAE6B1P,K,EAAO;AACnC,aAAO,KAAK8E,2CAAL,CAAiD9E,KAAjD,EAAwD,IAAxD,CAAP;AACD;;;gEAE2CA,K,EAAOkE,U,EAAY;AAC7D,UAAIyL,SAAS,EAAb;AAD6D;AAAA;AAAA;;AAAA;AAE7D,+BAAqB3P,KAArB,wIAA4B;AAAA,cAAnBtB,QAAmB;;AAC1BA,qBAAWxW,EAAE2X,IAAF,CAAOnB,QAAP,EAAiBwF,cAAc,EAA/B,CAAX;AACA,cAAItE,OAAO,KAAK6E,QAAL,CAAc/F,SAAS,MAAT,CAAd,CAAX;AACA,cAAGA,SAAS,SAAT,KAAuB,IAA1B,EAAgC;AAC5B,gBAAGkB,IAAH,EAAS;AACP,mBAAKtF,iBAAL,CAAuBsF,IAAvB;AACD;AACD;AACH;;AAED1X,YAAE2X,IAAF,CAAOnB,QAAP,EAAiBwF,UAAjB;;AAEA,cAAG,CAACtE,IAAJ,EAAU;AACRA,mBAAO,KAAK9C,UAAL,CAAgB4B,QAAhB,CAAP;AACD,WAFD,MAEO;AACLkB,iBAAKjB,cAAL,CAAoBD,QAApB;AACD;;AAED,eAAKlE,OAAL,CAAaoF,IAAb;;AAEA,cAAGlB,SAASO,OAAZ,EAAqB;AACnB,iBAAK2Q,wBAAL,CAA8BhQ,IAA9B;AACD;;AAED+P,iBAAOpQ,IAAP,CAAYK,IAAZ;AACD;AA3B4D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AA6B7D,WAAKiQ,2BAAL,CAAiCF,MAAjC;;AAEA,WAAKG,SAAL;AACA,aAAOH,MAAP;AACD;;;gDAE2BA,M,EAAQ;AAAA;AAAA;AAAA;;AAAA;AAClC,+BAAoB,KAAKL,iBAAzB,wIAA4C;AAAA,cAApChQ,QAAoC;;AAC1C,cAAIyQ,gBAAgBJ,OAAO/S,MAAP,CAAc,UAASgD,IAAT,EAAc;AAAC,mBAAOA,KAAK7C,YAAL,IAAqBuC,SAASuH,IAArC;AAA0C,WAAvE,CAApB;AACA,cAAGkJ,cAAcrpB,MAAd,GAAuB,CAA1B,EAA6B;AAC3B4Y,qBAAS9X,QAAT,CAAkBuoB,aAAlB;AACD;AACF;AANiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAOnC;;;sDAEiCJ,M,EAAQ;AAAA;AAAA;AAAA;;AAAA;AACxC,+BAAoB,KAAKJ,mBAAzB,wIAA8C;AAAA,cAAtCjQ,QAAsC;;AAC5C,cAAIyQ,gBAAgBJ,OAAO/S,MAAP,CAAc,UAASgD,IAAT,EAAc;AAC9C,mBAAON,SAASkB,aAAT,CAAuBvD,QAAvB,CAAgC2C,KAAK7C,YAArC,KAAsDuC,SAASkB,aAAT,CAAuBvD,QAAvB,CAAgC,GAAhC,CAA7D;AACD,WAFmB,CAApB;;AAIA,cAAG8S,cAAcrpB,MAAd,GAAuB,CAA1B,EAA6B;AAC3B4Y,qBAAS9X,QAAT,CAAkBuoB,aAAlB;AACD;AACF;AATuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUzC;;;+BAEUrR,Q,EAAU;AACnB,UAAIkB,IAAJ;AACA,UAAGlB,SAAS3B,YAAT,IAAyB,MAA5B,EAAoC;AAClC6C,eAAO,IAAIzE,IAAJ,CAASuD,QAAT,CAAP;AACD,OAFD,MAEO,IAAGA,SAAS3B,YAAT,IAAyB,KAA5B,EAAmC;AACxC6C,eAAO,IAAIlG,GAAJ,CAAQgF,QAAR,CAAP;AACD,OAFM,MAEA,IAAGA,SAAS3B,YAAT,IAAyB,WAA5B,EAAyC;AAC9C6C,eAAO,IAAIkB,SAAJ,CAAcpC,QAAd,CAAP;AACD,OAFM,MAEA;AACLkB,eAAO,IAAInB,IAAJ,CAASC,QAAT,CAAP;AACD;;AAEDkB,WAAKoQ,WAAL,CAAiB,IAAjB,EAAuB,UAASC,WAAT,EAAqB;AAC1C,aAAKC,iCAAL,CAAuC,CAACD,WAAD,CAAvC;AACD,OAFsB,CAErBvmB,IAFqB,CAEhB,IAFgB,CAAvB;;AAIA,aAAOkW,IAAP;AACD;;;6BAEQI,K,EAAO;AACd,WAAKA,KAAL,GAAa9X,EAAEioB,IAAF,CAAO,KAAKnQ,KAAL,CAAW8F,MAAX,CAAkB9F,KAAlB,CAAP,CAAb;;AAEAA,YAAMlI,OAAN,CAAc,UAAS8H,IAAT,EAAc;AAC1B,YAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7B,cAAG,CAAC7U,EAAE6S,IAAF,CAAO,KAAKlB,IAAZ,EAAkB,EAACjV,MAAMgb,KAAKhb,IAAZ,EAAlB,CAAJ,EAA0C;AACxC,iBAAKiV,IAAL,CAAU0H,OAAV,CAAkB3B,IAAlB;AACD;AACF,SAJD,MAIO,IAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AACrC,cAAG,CAAC7U,EAAE6S,IAAF,CAAO,KAAKjB,KAAZ,EAAmB,EAAClV,MAAMgb,KAAKhb,IAAZ,EAAnB,CAAJ,EAA2C;AACzC,iBAAKkV,KAAL,CAAWyH,OAAX,CAAmB3B,IAAnB;AACD;AACF,SAJM,MAIA,IAAGA,KAAK7C,YAAL,IAAqB,WAAxB,EAAqC;AAC1C,cAAG,CAAC7U,EAAE6S,IAAF,CAAO,KAAKyU,WAAZ,EAAyB,EAAC5qB,MAAMgb,KAAKhb,IAAZ,EAAzB,CAAJ,EAAiD;AAC/C,iBAAK4qB,WAAL,CAAiBjO,OAAjB,CAAyB3B,IAAzB;AACD;AACF;AACF,OAda,CAcZlW,IAdY,CAcP,IAdO,CAAd;AAeD;;;4BAEOkW,I,EAAM;AACZ,WAAKwQ,QAAL,CAAc,CAACxQ,IAAD,CAAd;AACD;;;wCAEmBa,W,EAAa;AAC/B,aAAO,KAAKT,KAAL,CAAWpD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AACrC,eAAOA,KAAK7C,YAAL,IAAqB0D,WAA5B;AACD,OAFM,CAAP;AAGD;;;6CAEwBb,I,EAAM;AAC7B,UAAIT,gBAAgBS,KAAKT,aAAzB;AACA,UAAG,CAACA,cAAcO,UAAlB,EAA8B;AAC5B;AACD;;AAJ4B;AAAA;AAAA;;AAAA;AAM7B,+BAAqBP,cAAcO,UAAnC,wIAA+C;AAAA,cAAvCkF,SAAuC;;AAC7C,cAAIyL,iBAAiB,KAAK5L,QAAL,CAAcG,UAAUhgB,IAAxB,CAArB;AACA,cAAGyrB,cAAH,EAAmB;AACjBzQ,iBAAK0Q,qBAAL,CAA2BD,cAA3B;AACAA,2BAAeC,qBAAf,CAAqC1Q,IAArC;AACD,WAHD,MAGO;AACL;AACD;AACF;AAd4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe9B;;;gCAEW;AACVnB,WAAK+I,eAAL,CAAqB,KAAK1N,KAA1B;;AAEA,WAAKD,IAAL,CAAU/B,OAAV,CAAkB,UAASoC,GAAT,EAAa;AAC7BuE,aAAK+I,eAAL,CAAqBtN,IAAIJ,KAAzB;AACD,OAFD;AAGD;;;wCAEmByW,E,EAAI1J,I,EAAMrf,Q,EAAU;AACtC,WAAK8nB,iBAAL,CAAuB/P,IAAvB,CAA4B,EAACgR,IAAIA,EAAL,EAAS1J,MAAMA,IAAf,EAAqBrf,UAAUA,QAA/B,EAA5B;AACD;;;2CAEsB+oB,E,EAAI;AACzBroB,QAAEiG,MAAF,CAAS,KAAKmhB,iBAAd,EAAiCpnB,EAAE6S,IAAF,CAAO,KAAKuU,iBAAZ,EAA+B,EAACiB,IAAIA,EAAL,EAA/B,CAAjC;AACD;;;0CAEqBA,E,EAAI/P,a,EAAehZ,Q,EAAU;AACjD,WAAK+nB,mBAAL,CAAyBhQ,IAAzB,CAA8B,EAACgR,IAAIA,EAAL,EAAS/P,eAAeA,aAAxB,EAAuChZ,UAAUA,QAAjD,EAA9B;AACD;;;6CAEwB+oB,E,EAAI;AAC3BroB,QAAEiG,MAAF,CAAS,KAAKohB,mBAAd,EAAmCrnB,EAAE6S,IAAF,CAAO,KAAKwU,mBAAZ,EAAiC,EAACgB,IAAIA,EAAL,EAAjC,CAAnC;AACD;;;oCAMe;AACd,aAAO,KAAKvQ,KAAL,CAAWpD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AAAC,eAAOA,KAAKR,KAAL,IAAc,IAAd,IAAsB,CAACQ,KAAKzP,KAAnC;AAAyC,OAA1E,CAAP;AACD;;;sCAEiB;AAChB,WAAKuT,aAAL,GAAqB5L,OAArB,CAA6B,UAAS8H,IAAT,EAAc;AACzCA,aAAK1M,QAAL,CAAc,KAAd;AACD,OAFD;AAGD;;;uCAEkB0M,I,EAAM;AACvBA,WAAK+D,OAAL,GAAe,IAAf;AACA,UAAG,CAAC/D,KAAKzP,KAAT,EAAgB;AACdyP,aAAK1M,QAAL,CAAc,IAAd;AACD;AACD0M,WAAK4Q,sBAAL;AACD;;;sCAEiB5Q,I,EAAM;AACtB1X,QAAEiZ,IAAF,CAAO,KAAKnB,KAAZ,EAAmBJ,IAAnB;;AAEA,UAAGA,KAAK7C,YAAL,IAAqB,KAAxB,EAA+B;AAC7B7U,UAAEiZ,IAAF,CAAO,KAAKtH,IAAZ,EAAkB+F,IAAlB;AACD,OAFD,MAEO,IAAGA,KAAK7C,YAAL,IAAqB,MAAxB,EAAgC;AACrC7U,UAAEiZ,IAAF,CAAO,KAAKrH,KAAZ,EAAmB8F,IAAnB;AACD,OAFM,MAEA,IAAGA,KAAK7C,YAAL,IAAqB,WAAxB,EAAqC;AAC1C7U,UAAEiZ,IAAF,CAAO,KAAKqO,WAAZ,EAAyB5P,IAAzB;AACD;AACF;;AAED;;;;;;mDAI+B6Q,O,EAASC,O,EAAS;AAC/CD,cAAQH,qBAAR,CAA8BI,OAA9B;AACAA,cAAQJ,qBAAR,CAA8BG,OAA9B;;AAEAA,cAAQvd,QAAR,CAAiB,IAAjB;AACAwd,cAAQxd,QAAR,CAAiB,IAAjB;AACD;;;mDAE8Bud,O,EAASC,O,EAAS;AAC/CD,cAAQE,wBAAR,CAAiCD,OAAjC;AACAA,cAAQC,wBAAR,CAAiCF,OAAjC;;AAEAA,cAAQvd,QAAR,CAAiB,IAAjB;AACAwd,cAAQxd,QAAR,CAAiB,IAAjB;AACD;;;wBAhOc;AACb,aAAO,KAAK8M,KAAL,CAAWpD,MAAX,CAAkB,UAASgD,IAAT,EAAc;AACrC,eAAO,CAACA,KAAKzP,KAAb;AACD,OAFM,CAAP;AAGD;;;wBAEgB;AACf,aAAO,KAAKqf,WAAL,CAAiB5S,MAAjB,CAAwB,UAAS2Q,GAAT,EAAa;AAC1C,eAAO,CAACA,IAAI5J,OAAZ;AACD,OAFM,CAAP;AAGD;;;wBAkKmB;AAClB,aAAOxI,KAAKC,gBAAL,CAAsB,KAAKtB,KAA3B,CAAP;AACD;;;;;;AAqDH3O,QAAQC,MAAR,CAAe,cAAf,EAA+ByjB,OAA/B,CAAuC,cAAvC,EAAuDQ,YAAvD;AACA,CAAClkB,QAAQC,MAAR,CAAe,cAAf,EACEyjB,OADF,CACU,sBADV,EACkC,UAAU/e,IAAV,EAAgB;AAC/C;AACA,OAAK8gB,UAAL,GAAkB,UAAUC,UAAV,EAAsBC,IAAtB,EAA4B;AAC5C3lB,YAAQ2M,OAAR,CAAgB+Y,UAAhB,EAA4B,UAAUE,MAAV,EAAkB/rB,GAAlB,EAAuB;AACjD,UAAI,OAAO8rB,KAAK9rB,GAAL,CAAP,KAAqB,WAAzB,EAAsC;AACpC8rB,aAAK9rB,GAAL,EAAUgsB,SAAV;AACAF,aAAK9rB,GAAL,EAAUisB,YAAV,CAAuB,QAAvB,EAAiC,KAAjC;AACAH,aAAK9rB,GAAL,EAAUksB,MAAV,CAAiBC,MAAjB,GAA0BrhB,KAAKsf,WAAL,CAAiB2B,OAAOK,IAAP,CAAY,IAAZ,CAAjB,CAA1B;AACD;AACF,KAND;AAOD,GARD;;AAUA;AACA,OAAKC,WAAL,GAAmB,UAAUje,QAAV,EAAoB0d,IAApB,EAA0B;AAC3C,QAAI1d,SAASmD,MAAT,KAAoB,GAAxB,EAA6B;AAC3B,WAAKqa,UAAL,CAAgBxd,SAASoD,IAAzB,EAA+Bsa,IAA/B;AACD;AACF,GAJD;AAKH,CAnBA","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n _.merge(defaults, {pw_salt: pw_salt, pw_nonce: pw_nonce})\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk}, defaults);\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText()));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n } else {\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"(Offline) — All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n if(apiController.isUserSignedIn()) {\n // signed out users have local autosave, dont need draft saving\n apiController.saveDraftToDisk(this.note);\n }\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n this.note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(apiController, extensionManager){\n return {\n restrict: 'E',\n scope: {\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$on(\"sync:updated_token\", function(){\n ctrl.syncUpdated();\n })\n }\n }\n })\n .controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) {\n\n this.user = apiController.user;\n this.extensionManager = extensionManager;\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n this.showExtensionsMenu = false;\n }\n\n this.toggleExtensions = function() {\n this.showAccountMenu = false;\n this.showExtensionsMenu = !this.showExtensionsMenu;\n }\n\n this.toggleExtensionForm = function() {\n this.newExtensionData = {};\n this.showNewExtensionForm = !this.showNewExtensionForm;\n }\n\n this.submitNewExtensionForm = function() {\n if(this.newExtensionData.url) {\n extensionManager.addExtension(this.newExtensionData.url, function(response){\n if(!response) {\n alert(\"Unable to register this extension. Make sure the link is valid and try again.\");\n } else {\n this.newExtensionData.url = \"\";\n this.showNewExtensionForm = false;\n }\n }.bind(this))\n }\n }\n\n this.selectedAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, null, function(response){\n action.running = false;\n if(response && response.error) {\n action.error = true;\n alert(\"There was an error performing this action. Please try again.\");\n } else {\n action.error = false;\n apiController.sync(null);\n }\n })\n }\n\n this.deleteExtension = function(extension) {\n if(confirm(\"Are you sure you want to delete this extension?\")) {\n extensionManager.deleteExtension(extension);\n }\n }\n\n this.reloadExtensionsPressed = function() {\n if(confirm(\"For your security, reloading extensions will disable any currently enabled repeat actions.\")) {\n extensionManager.refreshExtensionsFromServer();\n }\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(response && response.error) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.archiveEncryptionFormat = {encrypted: true};\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile(this.archiveEncryptionFormat.encrypted);\n link.click();\n }\n\n this.performImport = function(data, password) {\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n this.importData = null;\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n }.bind(this))\n }\n\n this.submitImportPassword = function() {\n this.performImport(this.importData.data, this.importData.password);\n }\n\n this.importFileSelected = function(files) {\n this.importData = {};\n\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n var data = JSON.parse(e.target.result);\n $timeout(function(){\n if(data.auth_params) {\n // request password\n this.importData.requestPassword = true;\n this.importData.data = data;\n } else {\n this.performImport(data, null);\n }\n }.bind(this))\n }.bind(this)\n\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n apiController.loadLocalItems();\n $scope.allTag = new Tag({all: true});\n $scope.allTag.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n\n if($scope.selectedNote && $scope.selectedNote.dummy) {\n modelManager.removeItemLocally($scope.selectedNote);\n }\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addItem(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n tag.setDirty(true);\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.createRelationshipBetweenItems(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.setItemToBeDeleted(tag);\n // if no more notes, delete tag\n apiController.sync(function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addItem(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.createRelationshipBetweenItems($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n if(!$scope.didShowErrorAlert) {\n $scope.didShowErrorAlert = true;\n alert(\"There was an error saving your note. Please try again.\");\n }\n callback(false);\n } else {\n note.hasChanges = false;\n if(callback) {\n callback(true);\n }\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.setItemToBeDeleted(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n modelManager.removeItemLocally(note);\n return;\n }\n\n apiController.sync(null);\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n apiController.clearLocalStorage();\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!apiController.isUserSignedIn()) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = modelManager.createItem({content_type: \"Note\", dummy: true, text: \"\"});\n this.newNote.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function (modelManager) {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = modelManager.createItem({content_type: \"Tag\"});\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.title.length == 0) {\n tag.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.title || tag.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername($scope.formData.username, function(response){\n var username = response.username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n\n constructor(json_obj) {\n\n this.updateFromJSON(json_obj);\n\n this.observers = [];\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n get contentObject() {\n if(!this.content) {\n return {};\n }\n\n if(this.content !== null && typeof this.content === 'object') {\n // this is the case when mapping localStorage content, in which case the content is already parsed\n return this.content;\n }\n\n return JSON.parse(this.content);\n }\n\n updateFromJSON(json) {\n _.merge(this, json);\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(json.content) {\n this.mapContentToLocalProperties(this.contentObject);\n }\n }\n\n alternateUUID() {\n this.uuid = Neeto.crypto.generateUUID();\n console.log(\"Generating new UUID\", this.uuid);\n }\n\n setDirty(dirty) {\n this.dirty = dirty;\n\n if(dirty) {\n this.notifyObserversOfChange();\n }\n }\n\n addObserver(observer, callback) {\n if(!_.find(this.observers, observer)) {\n this.observers.push({observer: observer, callback: callback});\n }\n }\n\n removeObserver(observer) {\n _.remove(this.observers, {observer: observer})\n }\n\n notifyObserversOfChange() {\n for(var observer of this.observers) {\n observer.callback(this);\n }\n }\n\n mapContentToLocalProperties(contentObj) {\n\n }\n\n createContentJSONFromProperties() {\n return this.structureParams();\n }\n\n referenceParams() {\n // must override\n }\n\n structureParams() {\n return {references: this.referenceParams()}\n }\n\n addItemAsRelationship(item) {\n // must override\n }\n\n removeItemAsRelationship(item) {\n // must override\n }\n\n removeAllRelationships() {\n // must override\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n allReferencedObjects() {\n // must override\n return null;\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return null;\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Action {\n constructor(json) {\n _.merge(this, json);\n this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory\n this.error = false;\n if(this.lastExecuted) {\n // is string\n this.lastExecuted = new Date(this.lastExecuted);\n }\n }\n\n get permissionsString() {\n if(!this.permissions) {\n return \"\";\n }\n var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter\n permission += \": \";\n for(var contentType of this.content_types) {\n if(contentType == \"*\") {\n permission += \"All items\";\n } else {\n permission += contentType;\n }\n\n permission += \" \";\n }\n\n return permission;\n }\n\n get encryptionModeString() {\n if(this.verb != \"post\") {\n return null;\n }\n var encryptionMode = \"This action accepts data \";\n if(this.accepts_encrypted && this.accepts_decrypted) {\n encryptionMode += \"encrypted or decrypted.\";\n } else {\n if(this.accepts_encrypted) {\n encryptionMode += \"encrypted.\";\n } else {\n encryptionMode += \"decrypted.\";\n }\n }\n return encryptionMode;\n }\n\n}\n\nclass Extension extends Item {\n constructor(json) {\n super(json);\n _.merge(this, json);\n\n this.encrypted = true;\n this.content_type = \"Extension\";\n }\n\n actionsInGlobalContext() {\n return this.actions.filter(function(action){\n return action.context == \"global\";\n })\n }\n\n actionsWithContextForItem(item) {\n return this.actions.filter(function(action){\n return action.context == item.content_type || action.context == \"Item\";\n })\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.name = contentObject.name;\n this.url = contentObject.url;\n this.actions = contentObject.actions.map(function(action){\n return new Action(action);\n })\n }\n\n updateFromExternalResponseItem(externalResponseItem) {\n _.merge(this, externalResponseItem);\n this.actions = externalResponseItem.actions.map(function(action){\n return new Action(action);\n })\n }\n\n referenceParams() {\n return null;\n }\n\n structureParams() {\n var params = {\n name: this.name,\n url: this.url,\n actions: this.actions\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n this.text = contentObject.text;\n }\n\n referenceParams() {\n var references = _.map(this.tags, function(tag){\n return {uuid: tag.uuid, content_type: tag.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title,\n text: this.text\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, item)) {\n this.tags.push(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.tags.forEach(function(tag){\n _.pull(tag.notes, this);\n tag.setDirty(true);\n }.bind(this))\n this.tags = [];\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n allReferencedObjects() {\n return this.tags;\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n safeText() {\n return this.text || \"\";\n }\n\n safeTitle() {\n return this.title || \"\";\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n }\n\n referenceParams() {\n var references = _.map(this.notes, function(note){\n return {uuid: note.uuid, content_type: note.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n if(!_.find(this.notes, item)) {\n this.notes.unshift(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.notes.forEach(function(note){\n _.pull(note.tags, this);\n note.setDirty(true);\n }.bind(this))\n\n this.notes = [];\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n allReferencedObjects() {\n return this.notes;\n }\n\n referencesAffectedBySharingChange() {\n return this.notes;\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.user = {};\n this.syncToken = localStorage.getItem(\"syncToken\");\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.getAuthParams = function() {\n return JSON.parse(localStorage.getItem(\"auth_params\"));\n }\n\n this.isUserSignedIn = function() {\n return localStorage.getItem(\"jwt\");\n }\n\n this.userId = function() {\n return localStorage.getItem(\"uuid\");\n }\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n _.merge(this.user, user);\n callback();\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(authParams));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys, authParams){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, authParams);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(_.omit(authParams, [\"pw_nonce\"])));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n // this.changePassword = function(current_password, new_password) {\n // this.getAuthParamsForEmail(email, function(authParams){\n // if(!authParams) {\n // callback(null);\n // return;\n // }\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n // var data = {};\n // data.current_password = currentKeys.pw;\n // data.password = newKeys.pw;\n // data.password_confirmation = newKeys.pw;\n //\n // var user = this.user;\n //\n // this._performPasswordChange(currentKeys, newKeys, function(response){\n // if(response && !response.error) {\n // // this.showNewPasswordForm = false;\n // // reencrypt data with new mk\n // this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n // if(success) {\n // this.setMk(newKeys.mk);\n // alert(\"Your password has been changed and your data re-encrypted.\");\n // } else {\n // // rollback password\n // this._performPasswordChange(newKeys, currentKeys, function(response){\n // alert(\"There was an error changing your password. Your password has been rolled back.\");\n // window.location.reload();\n // })\n // }\n // }.bind(this));\n // } else {\n // // this.showNewPasswordForm = false;\n // alert(\"There was an error changing your password. Please try again.\");\n // }\n // }.bind(this))\n // }.bind(this));\n // }.bind(this));\n // }.bind(this));\n // }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(username, callback) {\n var request = Restangular.one(\"users\", this.userId());\n request.username = username;\n request.patch().then(function(response){\n this.user.username = response.username;\n callback(response.plain());\n }.bind(this))\n }\n\n\n /*\n Items\n */\n\n this.setSyncToken = function(syncToken) {\n this.syncToken = syncToken;\n localStorage.setItem(\"syncToken\", this.syncToken);\n }\n\n this.syncWithOptions = function(callback, options = {}) {\n this.writeAllItemsToLocalStorage(function(responseItems){\n if(!this.isUserSignedIn()) {\n // is not signed in\n var dirtyItems = modelManager.getDirtyItems();\n // delete anything needing to be deleted\n dirtyItems.forEach(function(item){\n if(item.deleted) {\n modelManager.removeItemLocally(item);\n }\n }.bind(this))\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n }\n }.bind(this))\n\n if(!this.isUserSignedIn()) {\n return;\n }\n\n var dirtyItems = modelManager.getDirtyItems();\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n // console.log(\"syncing items\", request.items);\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n this.handleUnsavedItemsResponse(response.unsaved)\n\n this.writeAllItemsToLocalStorage();\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n if(callback) {\n callback({error: \"Sync error\"});\n }\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleUnsavedItemsResponse = function(unsaved) {\n if(unsaved.length == 0) {\n return;\n }\n\n console.log(\"handle unsaved\", unsaved);\n for(var mapping of unsaved) {\n var itemResponse = mapping.item;\n var item = modelManager.findItem(itemResponse.uuid);\n var error = mapping.error;\n if(error.tag == \"uuid_conflict\") {\n item.alternateUUID();\n item.setDirty(true);\n item.allReferencedObjects().forEach(function(reference){\n reference.setDirty(true);\n })\n }\n }\n\n this.sync(null);\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForExportFile = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForExtension = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n console.assert(!item.dummy, \"Item is dummy, should not have gotten here.\", item.dummy)\n\n var params = {uuid: item.uuid, content_type: item.content_type,\n presentation_name: item.presentation_name, deleted: item.deleted};\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.createContentJSONFromProperties() : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties()));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n this.shareItem = function(item, callback) {\n if(!this.isUserSignedIn()) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.allItems.forEach(function(item){\n item.setDirty(true);\n })\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }.bind(this)\n\n if(data.auth_params) {\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, data.auth_params), function(keys){\n var mk = keys.mk;\n try {\n this.decryptItemsWithKey(data.items, mk);\n // delete items enc_item_key since the user's actually key will do the encrypting once its passed off\n data.items.forEach(function(item){\n item.enc_item_key = null;\n item.auth_hash = null;\n })\n onDataReady();\n }\n catch (e) {\n console.log(\"Error decrypting\", e);\n alert(\"There was an error decrypting your items. Make sure the password you entered is correct and try again.\");\n callback(false, null);\n return;\n }\n }.bind(this));\n } else {\n onDataReady();\n }\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(encrypted) {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.allItemsMatchingTypes([\"Tag\", \"Note\"]), function(item){\n return this.paramsForExportFile(item, encrypted);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n if(encrypted) {\n data[\"auth_params\"] = this.getAuthParams();\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n // this.mergeLocalDataRemotely = function(user, callback) {\n // var request = Restangular.one(\"users\", this.userId()).one(\"merge\");\n // var tags = user.tags;\n // request.items = user.items;\n // request.items.forEach(function(item){\n // if(item.tag_id) {\n // var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n // item.tag_name = tag.title;\n // }\n // })\n // request.post().then(function(response){\n // callback();\n // localStorage.removeItem('user');\n // })\n // }\n\n\n\n\n this.clearLocalStorage = function() {\n localStorage.removeItem(\"items\");\n localStorage.removeItem(\"mk\");\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"uuid\");\n localStorage.removeItem(\"syncToken\");\n localStorage.removeItem(\"auth_params\");\n }\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeAllItemsToLocalStorage = function(callback) {\n var items = _.map(modelManager.allItems, function(item){\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\"], false)\n }.bind(this));\n // console.log(\"Writing items to local\", items);\n this.writeToLocalStorage('items', items);\n if(callback) {\n callback(items);\n }\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItems = function() {\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n var jsonObj = _.merge({content_type: \"Note\"}, JSON.parse(draftString));\n return modelManager.createItem(jsonObj);\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n this.decryptItemsWithKey(items, masterKey);\n }\n\n this.decryptItemsWithKey = function(items, key) {\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n var isString = typeof item.content === 'string' || item.content instanceof String;\n if(isString) {\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, key);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = modelManager.allItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;class ContextualExtensionsMenu {\n\n constructor() {\n this.restrict = \"E\";\n this.templateUrl = \"frontend/directives/contextual-menu.html\";\n this.scope = {\n item: \"=\"\n };\n }\n\n controller($scope, modelManager, extensionManager) {\n $scope.extensions = extensionManager.extensionsInContextOfItem($scope.item);\n\n $scope.executeAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, $scope.item, function(response){\n action.running = false;\n })\n }\n\n $scope.accessTypeForExtension = function(extension) {\n return extensionManager.extensionUsesEncryptedData(extension) ? \"encrypted\" : \"decrypted\";\n }\n\n }\n\n\n}\n\nangular.module('app.frontend').directive('contextualExtensionsMenu', () => new ContextualExtensionsMenu);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager, apiController) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.apiController = apiController;\n this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem(\"enabledRepeatActionUrls\")) || [];\n this.decryptedExtensions = JSON.parse(localStorage.getItem(\"decryptedExtensions\")) || [];\n\n modelManager.addItemSyncObserver(\"extensionManager\", \"Extension\", function(items){\n for (var ext of items) {\n\n ext.encrypted = this.extensionUsesEncryptedData(ext);\n\n for (var action of ext.actions) {\n if(this.enabledRepeatActionUrls.includes(action.url)) {\n this.enableRepeatAction(action, ext);\n }\n }\n }\n }.bind(this))\n }\n\n get extensions() {\n return this.modelManager.extensions;\n }\n\n extensionsInContextOfItem(item) {\n return this.extensions.filter(function(ext){\n return ext.actionsWithContextForItem(item).length > 0;\n })\n }\n\n actionWithURL(url) {\n for (var extension of this.extensions) {\n return _.find(extension.actions, {url: url})\n }\n }\n\n extensionUsesEncryptedData(extension) {\n return !this.decryptedExtensions.includes(extension.url);\n }\n\n changeExtensionEncryptionFormat(encrypted, extension) {\n if(encrypted) {\n _.pull(this.decryptedExtensions, extension.url);\n } else {\n this.decryptedExtensions.push(extension.url);\n }\n\n localStorage.setItem(\"decryptedExtensions\", JSON.stringify(this.decryptedExtensions))\n\n extension.encrypted = this.extensionUsesEncryptedData(extension);\n }\n\n addExtension(url, callback) {\n this.retrieveExtensionFromServer(url, callback);\n }\n\n deleteExtension(extension) {\n for(var action of extension.actions) {\n _.pull(this.decryptedExtensions, extension);\n if(action.repeat_mode) {\n if(this.isRepeatActionEnabled(action)) {\n this.disableRepeatAction(action);\n }\n }\n }\n\n this.modelManager.setItemToBeDeleted(extension);\n this.apiController.sync(null);\n }\n\n retrieveExtensionFromServer(url, callback) {\n this.Restangular.oneUrl(url, url).get().then(function(response){\n var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());\n if(callback) {\n callback(ext);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n callback(null);\n })\n }\n\n handleExtensionLoadExternalResponseItem(url, externalResponseItem) {\n var extension = _.find(this.extensions, {url: url});\n if(extension) {\n extension.updateFromExternalResponseItem(externalResponseItem);\n } else {\n extension = new Extension(externalResponseItem);\n extension.url = url;\n extension.setDirty(true);\n this.modelManager.addItem(extension);\n this.apiController.sync(null);\n }\n\n return extension;\n }\n\n refreshExtensionsFromServer() {\n for (var url of this.enabledRepeatActionUrls) {\n var action = this.actionWithURL(url);\n if(action) {\n this.disableRepeatAction(action);\n }\n }\n\n for(var ext of this.extensions) {\n this.retrieveExtensionFromServer(ext.url, function(extension){\n extension.setDirty(true);\n });\n }\n }\n\n executeAction(action, extension, item, callback) {\n\n if(this.extensionUsesEncryptedData(extension) && !this.apiController.isUserSignedIn()) {\n alert(\"To send data encrypted, you must have an encryption key, and must therefore be signed in.\");\n callback(null);\n return;\n }\n\n switch (action.verb) {\n case \"get\": {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n action.error = false;\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n .catch(function(response){\n action.error = true;\n })\n\n break;\n }\n\n case \"show\": {\n var win = window.open(action.url, '_blank');\n win.focus();\n callback();\n break;\n }\n\n case \"post\": {\n var params = {};\n\n if(action.all) {\n var items = this.modelManager.allItemsMatchingTypes(action.content_types);\n params.items = items.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n\n } else {\n params.item = this.outgoingParamsForItem(item, extension);\n }\n\n this.performPost(action, extension, params, function(response){\n callback(response);\n });\n\n break;\n }\n\n default: {\n\n }\n }\n\n action.lastExecuted = new Date();\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n _.pull(this.enabledRepeatActionUrls, action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n this.modelManager.removeItemChangeObserver(action.url);\n\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n if(!_.find(this.enabledRepeatActionUrls, action.url)) {\n this.enabledRepeatActionUrls.push(action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n }\n\n if(action.repeat_mode) {\n\n if(action.repeat_mode == \"watch\") {\n this.modelManager.addItemChangeObserver(action.url, action.content_types, function(changedItems){\n this.triggerWatchAction(action, extension, changedItems);\n }.bind(this))\n }\n\n if(action.repeat_mode == \"loop\") {\n // todo\n }\n\n }\n }\n\n queueAction(action, extension, delay, changedItems) {\n this.actionQueue = this.actionQueue || [];\n if(_.find(this.actionQueue, {url: action.url})) {\n return;\n }\n\n // console.log(\"Successfully queued\", action, this.actionQueue.length);\n this.actionQueue.push(action);\n\n setTimeout(function () {\n // console.log(\"Performing queued action\", action);\n this.triggerWatchAction(action, extension, changedItems);\n _.pull(this.actionQueue, action);\n }.bind(this), delay * 1000);\n }\n\n triggerWatchAction(action, extension, changedItems) {\n if(action.repeat_timeout > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeat_timeout) {\n var delay = action.repeat_timeout - diffInSeconds;\n this.queueAction(action, extension, delay, changedItems);\n return;\n }\n }\n\n action.lastExecuted = new Date();\n\n console.log(\"Performing action.\");\n\n if(action.verb == \"post\") {\n var params = {};\n params.items = changedItems.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n this.performPost(action, extension, params, null);\n } else {\n // todo\n }\n }\n\n outgoingParamsForItem(item, extension) {\n return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));\n }\n\n performPost(action, extension, params, callback) {\n var request = this.Restangular.oneUrl(action.url, action.url);\n if(this.extensionUsesEncryptedData(extension)) {\n request.auth_params = this.apiController.getAuthParams();\n }\n _.merge(request, params);\n\n request.post().then(function(response){\n action.error = false;\n if(callback) {\n callback(response.plain());\n }\n })\n .catch(function(response){\n action.error = true;\n console.log(\"Action error response:\", response);\n if(callback) {\n callback({error: \"Request error\"});\n }\n })\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager {\n\n constructor() {\n this.notes = [];\n this.tags = [];\n this.itemSyncObservers = [];\n this.itemChangeObservers = [];\n this.items = [];\n this._extensions = [];\n }\n\n get allItems() {\n return this.items.filter(function(item){\n return !item.dummy;\n })\n }\n\n get extensions() {\n return this._extensions.filter(function(ext){\n return !ext.deleted;\n })\n }\n\n allItemsMatchingTypes(contentTypes) {\n return this.items.filter(function(item){\n return (contentTypes.includes(item.content_type) || contentTypes.includes(\"*\")) && !item.dummy;\n })\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null);\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.removeItemLocally(item)\n }\n continue;\n }\n\n _.omit(json_obj, omitFields);\n\n if(!item) {\n item = this.createItem(json_obj);\n } else {\n item.updateFromJSON(json_obj);\n }\n\n this.addItem(item);\n\n if(json_obj.content) {\n this.resolveReferencesForItem(item)\n }\n\n models.push(item)\n }\n\n this.notifySyncObserversOfModels(models);\n\n this.sortItems();\n return models;\n }\n\n notifySyncObserversOfModels(models) {\n for(var observer of this.itemSyncObservers) {\n var relevantItems = models.filter(function(item){return item.content_type == observer.type});\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n notifyItemChangeObserversOfModels(models) {\n for(var observer of this.itemChangeObservers) {\n var relevantItems = models.filter(function(item){\n return observer.content_types.includes(item.content_type) || observer.content_types.includes(\"*\");\n });\n\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n createItem(json_obj) {\n var item;\n if(json_obj.content_type == \"Note\") {\n item = new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n item = new Tag(json_obj);\n } else if(json_obj.content_type == \"Extension\") {\n item = new Extension(json_obj);\n } else {\n item = new Item(json_obj);\n }\n\n item.addObserver(this, function(changedItem){\n this.notifyItemChangeObserversOfModels([changedItem]);\n }.bind(this));\n\n return item;\n }\n\n addItems(items) {\n this.items = _.uniq(this.items.concat(items));\n\n items.forEach(function(item){\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, {uuid: item.uuid})) {\n this.tags.unshift(item);\n }\n } else if(item.content_type == \"Note\") {\n if(!_.find(this.notes, {uuid: item.uuid})) {\n this.notes.unshift(item);\n }\n } else if(item.content_type == \"Extension\") {\n if(!_.find(this._extensions, {uuid: item.uuid})) {\n this._extensions.unshift(item);\n }\n }\n }.bind(this))\n }\n\n addItem(item) {\n this.addItems([item])\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n resolveReferencesForItem(item) {\n var contentObject = item.contentObject;\n if(!contentObject.references) {\n return;\n }\n\n for(var reference of contentObject.references) {\n var referencedItem = this.findItem(reference.uuid);\n if(referencedItem) {\n item.addItemAsRelationship(referencedItem);\n referencedItem.addItemAsRelationship(item);\n } else {\n // console.log(\"Unable to find item:\", reference.uuid);\n }\n }\n }\n\n sortItems() {\n Item.sortItemsByDate(this.notes);\n\n this.tags.forEach(function(tag){\n Item.sortItemsByDate(tag.notes);\n })\n }\n\n addItemSyncObserver(id, type, callback) {\n this.itemSyncObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemSyncObserver(id) {\n _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));\n }\n\n addItemChangeObserver(id, content_types, callback) {\n this.itemChangeObservers.push({id: id, content_types: content_types, callback: callback});\n }\n\n removeItemChangeObserver(id) {\n _.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, {id: id}));\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n getDirtyItems() {\n return this.items.filter(function(item){return item.dirty == true && !item.dummy})\n }\n\n clearDirtyItems() {\n this.getDirtyItems().forEach(function(item){\n item.setDirty(false);\n })\n }\n\n setItemToBeDeleted(item) {\n item.deleted = true;\n if(!item.dummy) {\n item.setDirty(true);\n }\n item.removeAllRelationships();\n }\n\n removeItemLocally(item) {\n _.pull(this.items, item);\n\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n } else if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n } else if(item.content_type == \"Extension\") {\n _.pull(this._extensions, item);\n }\n }\n\n /*\n Relationships\n */\n\n createRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.addItemAsRelationship(itemTwo);\n itemTwo.addItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n\n removeRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.removeItemAsRelationship(itemTwo);\n itemTwo.removeItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file From 1bc2486f0e71d489029f593d45a023eea87fccaa Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Sun, 8 Jan 2017 22:11:55 -0600 Subject: [PATCH 4/5] sync with date --- app/assets/javascripts/app/frontend/models/api/item.js | 5 ++--- app/assets/javascripts/app/services/apiController.js | 4 ++-- vendor/assets/javascripts/transpiled.js | 9 ++++----- vendor/assets/javascripts/transpiled.js.map | 2 +- 4 files changed, 9 insertions(+), 11 deletions(-) diff --git a/app/assets/javascripts/app/frontend/models/api/item.js b/app/assets/javascripts/app/frontend/models/api/item.js index bf55ac013..8fa6aaabc 100644 --- a/app/assets/javascripts/app/frontend/models/api/item.js +++ b/app/assets/javascripts/app/frontend/models/api/item.js @@ -47,7 +47,6 @@ class Item { alternateUUID() { this.uuid = Neeto.crypto.generateUUID(); - console.log("Generating new UUID", this.uuid); } setDirty(dirty) { @@ -108,12 +107,12 @@ class Item { allReferencedObjects() { // must override - return null; + return []; } referencesAffectedBySharingChange() { // should be overriden to determine which references should be decrypted/encrypted - return null; + return []; } isPublic() { diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index 61bf1b22f..e57879343 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -281,7 +281,7 @@ angular.module('app.frontend') return; } - console.log("handle unsaved", unsaved); + console.log("Handle unsaved", unsaved); for(var mapping of unsaved) { var itemResponse = mapping.item; var item = modelManager.findItem(itemResponse.uuid); @@ -295,7 +295,7 @@ angular.module('app.frontend') } } - this.sync(null); + this.syncWithOptions(null, {additionalFields: ["created_at", "updated_at"]}); } this.handleItemsResponse = function(responseItems, omitFields) { diff --git a/vendor/assets/javascripts/transpiled.js b/vendor/assets/javascripts/transpiled.js index f7886e136..44b2a3c14 100644 --- a/vendor/assets/javascripts/transpiled.js +++ b/vendor/assets/javascripts/transpiled.js @@ -1377,7 +1377,6 @@ var Item = function () { key: 'alternateUUID', value: function alternateUUID() { this.uuid = Neeto.crypto.generateUUID(); - console.log("Generating new UUID", this.uuid); } }, { key: 'setDirty', @@ -1470,13 +1469,13 @@ var Item = function () { key: 'allReferencedObjects', value: function allReferencedObjects() { // must override - return null; + return []; } }, { key: 'referencesAffectedBySharingChange', value: function referencesAffectedBySharingChange() { // should be overriden to determine which references should be decrypted/encrypted - return null; + return []; } }, { key: 'isPublic', @@ -2188,7 +2187,7 @@ var Tag = function (_Item3) { return; } - console.log("handle unsaved", unsaved); + console.log("Handle unsaved", unsaved); var _iteratorNormalCompletion4 = true; var _didIteratorError4 = false; var _iteratorError4 = undefined; @@ -2223,7 +2222,7 @@ var Tag = function (_Item3) { } } - this.sync(null); + this.syncWithOptions(null, { additionalFields: ["created_at", "updated_at"] }); }; this.handleItemsResponse = function (responseItems, omitFields) { diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index f49667c21..946b97248 100644 --- a/vendor/assets/javascripts/transpiled.js.map +++ b/vendor/assets/javascripts/transpiled.js.map @@ -1 +1 @@ -{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","email","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","getCurrentUser","directive","$timeout","restrict","scope","save","remove","note","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","markdownRenderer","extensionManager","editorMode","safeText","dummy","focusTitle","hasChanges","hasAvailableExtensions","extensionsInContextOfItem","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","isUserSignedIn","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","setDirty","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","syncUpdated","$state","serverSideValidation","user","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","showExtensionsMenu","toggleExtensions","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","running","executeAction","deleteExtension","confirm","reloadExtensionsPressed","refreshExtensionsFromServer","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","archiveEncryptionFormat","downloadDataArchive","setAttribute","itemsDataFile","performImport","importJSONData","importData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","allTag","Tag","all","title","tags","notes","setInterval","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","selectedNote","removeItemLocally","tagsAddNew","addItem","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","createRelationshipBetweenItems","notesRemoveTag","validNotes","Note","filterDummyNotes","setItemToBeDeleted","notesSelectionMade","notesAddNew","didShowErrorAlert","headerLogout","clearLocalStorage","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","updateFromJSON","observers","generateUUID","json","created_at","updated_at","content","mapContentToLocalProperties","contentObject","dirty","notifyObserversOfChange","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","items","sort","b","Action","lastExecuted","permissions","permission","charAt","content_types","contentType","verb","encryptionMode","accepts_encrypted","accepts_decrypted","Extension","actions","context","map","externalResponseItem","pull","hasOnePublicTag","isPublic","filtered","unshift","provider","domainName","domain_comps","hostname","split","domain","$get","ngDialog","ApiController","syncToken","refresh","setItem","getAuthParams","userId","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","stringify","generateInitialEncryptionKeysForUser","_performPasswordChange","current_keys","new_keys","patch","setSyncToken","syncWithOptions","options","writeAllItemsToLocalStorage","responseItems","dirtyItems","getDirtyItems","deleted","clearDirtyItems","createRequestParamsForItem","additionalFields","sync_token","handleItemsResponse","retrieved_items","omitFields","saved_items","handleUnsavedItemsResponse","unsaved","undefined","mapping","itemResponse","findItem","alternateUUID","allReferencedObjects","reference","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","paramsForExportFile","paramsForExtension","forExportFile","itemCopy","cloneDeep","assert","encryptSingleItem","retrieveMk","auth_hash","createContentJSONFromProperties","base64","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","needingUpdate","open","template","resolve","className","disableAnimation","onDataReady","mapResponseItemsToLocalModels","allItems","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","removeItem","staticifyObject","object","writeToLocalStorage","value","toJson","sortItemsByDate","draftString","jsonObj","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","saveBatchItems","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","enabledRepeatActionUrls","decryptedExtensions","addItemSyncObserver","ext","enableRepeatAction","actionsWithContextForItem","retrieveExtensionFromServer","repeat_mode","isRepeatActionEnabled","disableRepeatAction","oneUrl","handleExtensionLoadExternalResponseItem","updateFromExternalResponseItem","actionWithURL","win","outgoingParamsForItem","performPost","removeItemChangeObserver","addItemChangeObserver","changedItems","triggerWatchAction","actionQueue","repeat_timeout","diffInSeconds","queueAction","service","$filter","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","itemSyncObservers","itemChangeObservers","_extensions","contentTypes","itemId","models","resolveReferencesForItem","notifySyncObserversOfModels","sortItems","relevantItems","addObserver","changedItem","notifyItemChangeObserversOfModels","uniq","addItems","referencedItem","addItemAsRelationship","id","removeAllRelationships","itemOne","itemTwo","removeItemAsRelationship","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":"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","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n _.merge(defaults, {pw_salt: pw_salt, pw_nonce: pw_nonce})\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk}, defaults);\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText()));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n } else {\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"(Offline) — All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n if(apiController.isUserSignedIn()) {\n // signed out users have local autosave, dont need draft saving\n apiController.saveDraftToDisk(this.note);\n }\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n this.note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(apiController, extensionManager){\n return {\n restrict: 'E',\n scope: {\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$on(\"sync:updated_token\", function(){\n ctrl.syncUpdated();\n })\n }\n }\n })\n .controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) {\n\n this.user = apiController.user;\n this.extensionManager = extensionManager;\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n this.showExtensionsMenu = false;\n }\n\n this.toggleExtensions = function() {\n this.showAccountMenu = false;\n this.showExtensionsMenu = !this.showExtensionsMenu;\n }\n\n this.toggleExtensionForm = function() {\n this.newExtensionData = {};\n this.showNewExtensionForm = !this.showNewExtensionForm;\n }\n\n this.submitNewExtensionForm = function() {\n if(this.newExtensionData.url) {\n extensionManager.addExtension(this.newExtensionData.url, function(response){\n if(!response) {\n alert(\"Unable to register this extension. Make sure the link is valid and try again.\");\n } else {\n this.newExtensionData.url = \"\";\n this.showNewExtensionForm = false;\n }\n }.bind(this))\n }\n }\n\n this.selectedAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, null, function(response){\n action.running = false;\n if(response && response.error) {\n action.error = true;\n alert(\"There was an error performing this action. Please try again.\");\n } else {\n action.error = false;\n apiController.sync(null);\n }\n })\n }\n\n this.deleteExtension = function(extension) {\n if(confirm(\"Are you sure you want to delete this extension?\")) {\n extensionManager.deleteExtension(extension);\n }\n }\n\n this.reloadExtensionsPressed = function() {\n if(confirm(\"For your security, reloading extensions will disable any currently enabled repeat actions.\")) {\n extensionManager.refreshExtensionsFromServer();\n }\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(response && response.error) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.archiveEncryptionFormat = {encrypted: true};\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile(this.archiveEncryptionFormat.encrypted);\n link.click();\n }\n\n this.performImport = function(data, password) {\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n this.importData = null;\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n }.bind(this))\n }\n\n this.submitImportPassword = function() {\n this.performImport(this.importData.data, this.importData.password);\n }\n\n this.importFileSelected = function(files) {\n this.importData = {};\n\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n var data = JSON.parse(e.target.result);\n $timeout(function(){\n if(data.auth_params) {\n // request password\n this.importData.requestPassword = true;\n this.importData.data = data;\n } else {\n this.performImport(data, null);\n }\n }.bind(this))\n }.bind(this)\n\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n apiController.loadLocalItems();\n $scope.allTag = new Tag({all: true});\n $scope.allTag.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n\n if($scope.selectedNote && $scope.selectedNote.dummy) {\n modelManager.removeItemLocally($scope.selectedNote);\n }\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addItem(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n tag.setDirty(true);\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.createRelationshipBetweenItems(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.setItemToBeDeleted(tag);\n // if no more notes, delete tag\n apiController.sync(function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addItem(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.createRelationshipBetweenItems($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n if(!$scope.didShowErrorAlert) {\n $scope.didShowErrorAlert = true;\n alert(\"There was an error saving your note. Please try again.\");\n }\n callback(false);\n } else {\n note.hasChanges = false;\n if(callback) {\n callback(true);\n }\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.setItemToBeDeleted(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n modelManager.removeItemLocally(note);\n return;\n }\n\n apiController.sync(null);\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n apiController.clearLocalStorage();\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!apiController.isUserSignedIn()) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = modelManager.createItem({content_type: \"Note\", dummy: true, text: \"\"});\n this.newNote.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function (modelManager) {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = modelManager.createItem({content_type: \"Tag\"});\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.title.length == 0) {\n tag.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.title || tag.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername($scope.formData.username, function(response){\n var username = response.username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n\n constructor(json_obj) {\n\n this.updateFromJSON(json_obj);\n\n this.observers = [];\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n get contentObject() {\n if(!this.content) {\n return {};\n }\n\n if(this.content !== null && typeof this.content === 'object') {\n // this is the case when mapping localStorage content, in which case the content is already parsed\n return this.content;\n }\n\n return JSON.parse(this.content);\n }\n\n updateFromJSON(json) {\n _.merge(this, json);\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(json.content) {\n this.mapContentToLocalProperties(this.contentObject);\n }\n }\n\n alternateUUID() {\n this.uuid = Neeto.crypto.generateUUID();\n console.log(\"Generating new UUID\", this.uuid);\n }\n\n setDirty(dirty) {\n this.dirty = dirty;\n\n if(dirty) {\n this.notifyObserversOfChange();\n }\n }\n\n addObserver(observer, callback) {\n if(!_.find(this.observers, observer)) {\n this.observers.push({observer: observer, callback: callback});\n }\n }\n\n removeObserver(observer) {\n _.remove(this.observers, {observer: observer})\n }\n\n notifyObserversOfChange() {\n for(var observer of this.observers) {\n observer.callback(this);\n }\n }\n\n mapContentToLocalProperties(contentObj) {\n\n }\n\n createContentJSONFromProperties() {\n return this.structureParams();\n }\n\n referenceParams() {\n // must override\n }\n\n structureParams() {\n return {references: this.referenceParams()}\n }\n\n addItemAsRelationship(item) {\n // must override\n }\n\n removeItemAsRelationship(item) {\n // must override\n }\n\n removeAllRelationships() {\n // must override\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n allReferencedObjects() {\n // must override\n return null;\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return null;\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Action {\n constructor(json) {\n _.merge(this, json);\n this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory\n this.error = false;\n if(this.lastExecuted) {\n // is string\n this.lastExecuted = new Date(this.lastExecuted);\n }\n }\n\n get permissionsString() {\n if(!this.permissions) {\n return \"\";\n }\n var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter\n permission += \": \";\n for(var contentType of this.content_types) {\n if(contentType == \"*\") {\n permission += \"All items\";\n } else {\n permission += contentType;\n }\n\n permission += \" \";\n }\n\n return permission;\n }\n\n get encryptionModeString() {\n if(this.verb != \"post\") {\n return null;\n }\n var encryptionMode = \"This action accepts data \";\n if(this.accepts_encrypted && this.accepts_decrypted) {\n encryptionMode += \"encrypted or decrypted.\";\n } else {\n if(this.accepts_encrypted) {\n encryptionMode += \"encrypted.\";\n } else {\n encryptionMode += \"decrypted.\";\n }\n }\n return encryptionMode;\n }\n\n}\n\nclass Extension extends Item {\n constructor(json) {\n super(json);\n _.merge(this, json);\n\n this.encrypted = true;\n this.content_type = \"Extension\";\n }\n\n actionsInGlobalContext() {\n return this.actions.filter(function(action){\n return action.context == \"global\";\n })\n }\n\n actionsWithContextForItem(item) {\n return this.actions.filter(function(action){\n return action.context == item.content_type || action.context == \"Item\";\n })\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.name = contentObject.name;\n this.url = contentObject.url;\n this.actions = contentObject.actions.map(function(action){\n return new Action(action);\n })\n }\n\n updateFromExternalResponseItem(externalResponseItem) {\n _.merge(this, externalResponseItem);\n this.actions = externalResponseItem.actions.map(function(action){\n return new Action(action);\n })\n }\n\n referenceParams() {\n return null;\n }\n\n structureParams() {\n var params = {\n name: this.name,\n url: this.url,\n actions: this.actions\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n this.text = contentObject.text;\n }\n\n referenceParams() {\n var references = _.map(this.tags, function(tag){\n return {uuid: tag.uuid, content_type: tag.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title,\n text: this.text\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, item)) {\n this.tags.push(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.tags.forEach(function(tag){\n _.pull(tag.notes, this);\n tag.setDirty(true);\n }.bind(this))\n this.tags = [];\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n allReferencedObjects() {\n return this.tags;\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n safeText() {\n return this.text || \"\";\n }\n\n safeTitle() {\n return this.title || \"\";\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n }\n\n referenceParams() {\n var references = _.map(this.notes, function(note){\n return {uuid: note.uuid, content_type: note.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n if(!_.find(this.notes, item)) {\n this.notes.unshift(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.notes.forEach(function(note){\n _.pull(note.tags, this);\n note.setDirty(true);\n }.bind(this))\n\n this.notes = [];\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n allReferencedObjects() {\n return this.notes;\n }\n\n referencesAffectedBySharingChange() {\n return this.notes;\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.user = {};\n this.syncToken = localStorage.getItem(\"syncToken\");\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.getAuthParams = function() {\n return JSON.parse(localStorage.getItem(\"auth_params\"));\n }\n\n this.isUserSignedIn = function() {\n return localStorage.getItem(\"jwt\");\n }\n\n this.userId = function() {\n return localStorage.getItem(\"uuid\");\n }\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n _.merge(this.user, user);\n callback();\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(authParams));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys, authParams){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, authParams);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(_.omit(authParams, [\"pw_nonce\"])));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n // this.changePassword = function(current_password, new_password) {\n // this.getAuthParamsForEmail(email, function(authParams){\n // if(!authParams) {\n // callback(null);\n // return;\n // }\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n // var data = {};\n // data.current_password = currentKeys.pw;\n // data.password = newKeys.pw;\n // data.password_confirmation = newKeys.pw;\n //\n // var user = this.user;\n //\n // this._performPasswordChange(currentKeys, newKeys, function(response){\n // if(response && !response.error) {\n // // this.showNewPasswordForm = false;\n // // reencrypt data with new mk\n // this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n // if(success) {\n // this.setMk(newKeys.mk);\n // alert(\"Your password has been changed and your data re-encrypted.\");\n // } else {\n // // rollback password\n // this._performPasswordChange(newKeys, currentKeys, function(response){\n // alert(\"There was an error changing your password. Your password has been rolled back.\");\n // window.location.reload();\n // })\n // }\n // }.bind(this));\n // } else {\n // // this.showNewPasswordForm = false;\n // alert(\"There was an error changing your password. Please try again.\");\n // }\n // }.bind(this))\n // }.bind(this));\n // }.bind(this));\n // }.bind(this));\n // }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(username, callback) {\n var request = Restangular.one(\"users\", this.userId());\n request.username = username;\n request.patch().then(function(response){\n this.user.username = response.username;\n callback(response.plain());\n }.bind(this))\n }\n\n\n /*\n Items\n */\n\n this.setSyncToken = function(syncToken) {\n this.syncToken = syncToken;\n localStorage.setItem(\"syncToken\", this.syncToken);\n }\n\n this.syncWithOptions = function(callback, options = {}) {\n this.writeAllItemsToLocalStorage(function(responseItems){\n if(!this.isUserSignedIn()) {\n // is not signed in\n var dirtyItems = modelManager.getDirtyItems();\n // delete anything needing to be deleted\n dirtyItems.forEach(function(item){\n if(item.deleted) {\n modelManager.removeItemLocally(item);\n }\n }.bind(this))\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n }\n }.bind(this))\n\n if(!this.isUserSignedIn()) {\n return;\n }\n\n var dirtyItems = modelManager.getDirtyItems();\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n // console.log(\"syncing items\", request.items);\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n this.handleUnsavedItemsResponse(response.unsaved)\n\n this.writeAllItemsToLocalStorage();\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n if(callback) {\n callback({error: \"Sync error\"});\n }\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleUnsavedItemsResponse = function(unsaved) {\n if(unsaved.length == 0) {\n return;\n }\n\n console.log(\"handle unsaved\", unsaved);\n for(var mapping of unsaved) {\n var itemResponse = mapping.item;\n var item = modelManager.findItem(itemResponse.uuid);\n var error = mapping.error;\n if(error.tag == \"uuid_conflict\") {\n item.alternateUUID();\n item.setDirty(true);\n item.allReferencedObjects().forEach(function(reference){\n reference.setDirty(true);\n })\n }\n }\n\n this.sync(null);\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForExportFile = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForExtension = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n console.assert(!item.dummy, \"Item is dummy, should not have gotten here.\", item.dummy)\n\n var params = {uuid: item.uuid, content_type: item.content_type,\n presentation_name: item.presentation_name, deleted: item.deleted};\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.createContentJSONFromProperties() : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties()));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n this.shareItem = function(item, callback) {\n if(!this.isUserSignedIn()) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.allItems.forEach(function(item){\n item.setDirty(true);\n })\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }.bind(this)\n\n if(data.auth_params) {\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, data.auth_params), function(keys){\n var mk = keys.mk;\n try {\n this.decryptItemsWithKey(data.items, mk);\n // delete items enc_item_key since the user's actually key will do the encrypting once its passed off\n data.items.forEach(function(item){\n item.enc_item_key = null;\n item.auth_hash = null;\n })\n onDataReady();\n }\n catch (e) {\n console.log(\"Error decrypting\", e);\n alert(\"There was an error decrypting your items. Make sure the password you entered is correct and try again.\");\n callback(false, null);\n return;\n }\n }.bind(this));\n } else {\n onDataReady();\n }\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(encrypted) {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.allItemsMatchingTypes([\"Tag\", \"Note\"]), function(item){\n return this.paramsForExportFile(item, encrypted);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n if(encrypted) {\n data[\"auth_params\"] = this.getAuthParams();\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n // this.mergeLocalDataRemotely = function(user, callback) {\n // var request = Restangular.one(\"users\", this.userId()).one(\"merge\");\n // var tags = user.tags;\n // request.items = user.items;\n // request.items.forEach(function(item){\n // if(item.tag_id) {\n // var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n // item.tag_name = tag.title;\n // }\n // })\n // request.post().then(function(response){\n // callback();\n // localStorage.removeItem('user');\n // })\n // }\n\n\n\n\n this.clearLocalStorage = function() {\n localStorage.removeItem(\"items\");\n localStorage.removeItem(\"mk\");\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"uuid\");\n localStorage.removeItem(\"syncToken\");\n localStorage.removeItem(\"auth_params\");\n }\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeAllItemsToLocalStorage = function(callback) {\n var items = _.map(modelManager.allItems, function(item){\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\"], false)\n }.bind(this));\n // console.log(\"Writing items to local\", items);\n this.writeToLocalStorage('items', items);\n if(callback) {\n callback(items);\n }\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItems = function() {\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n var jsonObj = _.merge({content_type: \"Note\"}, JSON.parse(draftString));\n return modelManager.createItem(jsonObj);\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n this.decryptItemsWithKey(items, masterKey);\n }\n\n this.decryptItemsWithKey = function(items, key) {\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n var isString = typeof item.content === 'string' || item.content instanceof String;\n if(isString) {\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, key);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = modelManager.allItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;class ContextualExtensionsMenu {\n\n constructor() {\n this.restrict = \"E\";\n this.templateUrl = \"frontend/directives/contextual-menu.html\";\n this.scope = {\n item: \"=\"\n };\n }\n\n controller($scope, modelManager, extensionManager) {\n $scope.extensions = extensionManager.extensionsInContextOfItem($scope.item);\n\n $scope.executeAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, $scope.item, function(response){\n action.running = false;\n })\n }\n\n $scope.accessTypeForExtension = function(extension) {\n return extensionManager.extensionUsesEncryptedData(extension) ? \"encrypted\" : \"decrypted\";\n }\n\n }\n\n\n}\n\nangular.module('app.frontend').directive('contextualExtensionsMenu', () => new ContextualExtensionsMenu);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager, apiController) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.apiController = apiController;\n this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem(\"enabledRepeatActionUrls\")) || [];\n this.decryptedExtensions = JSON.parse(localStorage.getItem(\"decryptedExtensions\")) || [];\n\n modelManager.addItemSyncObserver(\"extensionManager\", \"Extension\", function(items){\n for (var ext of items) {\n\n ext.encrypted = this.extensionUsesEncryptedData(ext);\n\n for (var action of ext.actions) {\n if(this.enabledRepeatActionUrls.includes(action.url)) {\n this.enableRepeatAction(action, ext);\n }\n }\n }\n }.bind(this))\n }\n\n get extensions() {\n return this.modelManager.extensions;\n }\n\n extensionsInContextOfItem(item) {\n return this.extensions.filter(function(ext){\n return ext.actionsWithContextForItem(item).length > 0;\n })\n }\n\n actionWithURL(url) {\n for (var extension of this.extensions) {\n return _.find(extension.actions, {url: url})\n }\n }\n\n extensionUsesEncryptedData(extension) {\n return !this.decryptedExtensions.includes(extension.url);\n }\n\n changeExtensionEncryptionFormat(encrypted, extension) {\n if(encrypted) {\n _.pull(this.decryptedExtensions, extension.url);\n } else {\n this.decryptedExtensions.push(extension.url);\n }\n\n localStorage.setItem(\"decryptedExtensions\", JSON.stringify(this.decryptedExtensions))\n\n extension.encrypted = this.extensionUsesEncryptedData(extension);\n }\n\n addExtension(url, callback) {\n this.retrieveExtensionFromServer(url, callback);\n }\n\n deleteExtension(extension) {\n for(var action of extension.actions) {\n _.pull(this.decryptedExtensions, extension);\n if(action.repeat_mode) {\n if(this.isRepeatActionEnabled(action)) {\n this.disableRepeatAction(action);\n }\n }\n }\n\n this.modelManager.setItemToBeDeleted(extension);\n this.apiController.sync(null);\n }\n\n retrieveExtensionFromServer(url, callback) {\n this.Restangular.oneUrl(url, url).get().then(function(response){\n var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());\n if(callback) {\n callback(ext);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n callback(null);\n })\n }\n\n handleExtensionLoadExternalResponseItem(url, externalResponseItem) {\n var extension = _.find(this.extensions, {url: url});\n if(extension) {\n extension.updateFromExternalResponseItem(externalResponseItem);\n } else {\n extension = new Extension(externalResponseItem);\n extension.url = url;\n extension.setDirty(true);\n this.modelManager.addItem(extension);\n this.apiController.sync(null);\n }\n\n return extension;\n }\n\n refreshExtensionsFromServer() {\n for (var url of this.enabledRepeatActionUrls) {\n var action = this.actionWithURL(url);\n if(action) {\n this.disableRepeatAction(action);\n }\n }\n\n for(var ext of this.extensions) {\n this.retrieveExtensionFromServer(ext.url, function(extension){\n extension.setDirty(true);\n });\n }\n }\n\n executeAction(action, extension, item, callback) {\n\n if(this.extensionUsesEncryptedData(extension) && !this.apiController.isUserSignedIn()) {\n alert(\"To send data encrypted, you must have an encryption key, and must therefore be signed in.\");\n callback(null);\n return;\n }\n\n switch (action.verb) {\n case \"get\": {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n action.error = false;\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n .catch(function(response){\n action.error = true;\n })\n\n break;\n }\n\n case \"show\": {\n var win = window.open(action.url, '_blank');\n win.focus();\n callback();\n break;\n }\n\n case \"post\": {\n var params = {};\n\n if(action.all) {\n var items = this.modelManager.allItemsMatchingTypes(action.content_types);\n params.items = items.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n\n } else {\n params.item = this.outgoingParamsForItem(item, extension);\n }\n\n this.performPost(action, extension, params, function(response){\n callback(response);\n });\n\n break;\n }\n\n default: {\n\n }\n }\n\n action.lastExecuted = new Date();\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n _.pull(this.enabledRepeatActionUrls, action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n this.modelManager.removeItemChangeObserver(action.url);\n\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n if(!_.find(this.enabledRepeatActionUrls, action.url)) {\n this.enabledRepeatActionUrls.push(action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n }\n\n if(action.repeat_mode) {\n\n if(action.repeat_mode == \"watch\") {\n this.modelManager.addItemChangeObserver(action.url, action.content_types, function(changedItems){\n this.triggerWatchAction(action, extension, changedItems);\n }.bind(this))\n }\n\n if(action.repeat_mode == \"loop\") {\n // todo\n }\n\n }\n }\n\n queueAction(action, extension, delay, changedItems) {\n this.actionQueue = this.actionQueue || [];\n if(_.find(this.actionQueue, {url: action.url})) {\n return;\n }\n\n // console.log(\"Successfully queued\", action, this.actionQueue.length);\n this.actionQueue.push(action);\n\n setTimeout(function () {\n // console.log(\"Performing queued action\", action);\n this.triggerWatchAction(action, extension, changedItems);\n _.pull(this.actionQueue, action);\n }.bind(this), delay * 1000);\n }\n\n triggerWatchAction(action, extension, changedItems) {\n if(action.repeat_timeout > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeat_timeout) {\n var delay = action.repeat_timeout - diffInSeconds;\n this.queueAction(action, extension, delay, changedItems);\n return;\n }\n }\n\n action.lastExecuted = new Date();\n\n console.log(\"Performing action.\");\n\n if(action.verb == \"post\") {\n var params = {};\n params.items = changedItems.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n this.performPost(action, extension, params, null);\n } else {\n // todo\n }\n }\n\n outgoingParamsForItem(item, extension) {\n return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));\n }\n\n performPost(action, extension, params, callback) {\n var request = this.Restangular.oneUrl(action.url, action.url);\n if(this.extensionUsesEncryptedData(extension)) {\n request.auth_params = this.apiController.getAuthParams();\n }\n _.merge(request, params);\n\n request.post().then(function(response){\n action.error = false;\n if(callback) {\n callback(response.plain());\n }\n })\n .catch(function(response){\n action.error = true;\n console.log(\"Action error response:\", response);\n if(callback) {\n callback({error: \"Request error\"});\n }\n })\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager {\n\n constructor() {\n this.notes = [];\n this.tags = [];\n this.itemSyncObservers = [];\n this.itemChangeObservers = [];\n this.items = [];\n this._extensions = [];\n }\n\n get allItems() {\n return this.items.filter(function(item){\n return !item.dummy;\n })\n }\n\n get extensions() {\n return this._extensions.filter(function(ext){\n return !ext.deleted;\n })\n }\n\n allItemsMatchingTypes(contentTypes) {\n return this.items.filter(function(item){\n return (contentTypes.includes(item.content_type) || contentTypes.includes(\"*\")) && !item.dummy;\n })\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null);\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.removeItemLocally(item)\n }\n continue;\n }\n\n _.omit(json_obj, omitFields);\n\n if(!item) {\n item = this.createItem(json_obj);\n } else {\n item.updateFromJSON(json_obj);\n }\n\n this.addItem(item);\n\n if(json_obj.content) {\n this.resolveReferencesForItem(item)\n }\n\n models.push(item)\n }\n\n this.notifySyncObserversOfModels(models);\n\n this.sortItems();\n return models;\n }\n\n notifySyncObserversOfModels(models) {\n for(var observer of this.itemSyncObservers) {\n var relevantItems = models.filter(function(item){return item.content_type == observer.type});\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n notifyItemChangeObserversOfModels(models) {\n for(var observer of this.itemChangeObservers) {\n var relevantItems = models.filter(function(item){\n return observer.content_types.includes(item.content_type) || observer.content_types.includes(\"*\");\n });\n\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n createItem(json_obj) {\n var item;\n if(json_obj.content_type == \"Note\") {\n item = new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n item = new Tag(json_obj);\n } else if(json_obj.content_type == \"Extension\") {\n item = new Extension(json_obj);\n } else {\n item = new Item(json_obj);\n }\n\n item.addObserver(this, function(changedItem){\n this.notifyItemChangeObserversOfModels([changedItem]);\n }.bind(this));\n\n return item;\n }\n\n addItems(items) {\n this.items = _.uniq(this.items.concat(items));\n\n items.forEach(function(item){\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, {uuid: item.uuid})) {\n this.tags.unshift(item);\n }\n } else if(item.content_type == \"Note\") {\n if(!_.find(this.notes, {uuid: item.uuid})) {\n this.notes.unshift(item);\n }\n } else if(item.content_type == \"Extension\") {\n if(!_.find(this._extensions, {uuid: item.uuid})) {\n this._extensions.unshift(item);\n }\n }\n }.bind(this))\n }\n\n addItem(item) {\n this.addItems([item])\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n resolveReferencesForItem(item) {\n var contentObject = item.contentObject;\n if(!contentObject.references) {\n return;\n }\n\n for(var reference of contentObject.references) {\n var referencedItem = this.findItem(reference.uuid);\n if(referencedItem) {\n item.addItemAsRelationship(referencedItem);\n referencedItem.addItemAsRelationship(item);\n } else {\n // console.log(\"Unable to find item:\", reference.uuid);\n }\n }\n }\n\n sortItems() {\n Item.sortItemsByDate(this.notes);\n\n this.tags.forEach(function(tag){\n Item.sortItemsByDate(tag.notes);\n })\n }\n\n addItemSyncObserver(id, type, callback) {\n this.itemSyncObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemSyncObserver(id) {\n _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));\n }\n\n addItemChangeObserver(id, content_types, callback) {\n this.itemChangeObservers.push({id: id, content_types: content_types, callback: callback});\n }\n\n removeItemChangeObserver(id) {\n _.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, {id: id}));\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n getDirtyItems() {\n return this.items.filter(function(item){return item.dirty == true && !item.dummy})\n }\n\n clearDirtyItems() {\n this.getDirtyItems().forEach(function(item){\n item.setDirty(false);\n })\n }\n\n setItemToBeDeleted(item) {\n item.deleted = true;\n if(!item.dummy) {\n item.setDirty(true);\n }\n item.removeAllRelationships();\n }\n\n removeItemLocally(item) {\n _.pull(this.items, item);\n\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n } else if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n } else if(item.content_type == \"Extension\") {\n _.pull(this._extensions, item);\n }\n }\n\n /*\n Relationships\n */\n\n createRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.addItemAsRelationship(itemTwo);\n itemTwo.addItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n\n removeRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.removeItemAsRelationship(itemTwo);\n itemTwo.removeItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file +{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","email","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","getCurrentUser","directive","$timeout","restrict","scope","save","remove","note","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","markdownRenderer","extensionManager","editorMode","safeText","dummy","focusTitle","hasChanges","hasAvailableExtensions","extensionsInContextOfItem","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","isUserSignedIn","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","setDirty","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","syncUpdated","$state","serverSideValidation","user","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","showExtensionsMenu","toggleExtensions","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","running","executeAction","deleteExtension","confirm","reloadExtensionsPressed","refreshExtensionsFromServer","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","archiveEncryptionFormat","downloadDataArchive","setAttribute","itemsDataFile","performImport","importJSONData","importData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","allTag","Tag","all","title","tags","notes","setInterval","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","selectedNote","removeItemLocally","tagsAddNew","addItem","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","createRelationshipBetweenItems","notesRemoveTag","validNotes","Note","filterDummyNotes","setItemToBeDeleted","notesSelectionMade","notesAddNew","didShowErrorAlert","headerLogout","clearLocalStorage","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","updateFromJSON","observers","generateUUID","json","created_at","updated_at","content","mapContentToLocalProperties","contentObject","dirty","notifyObserversOfChange","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","items","sort","b","Action","lastExecuted","permissions","permission","charAt","content_types","contentType","verb","encryptionMode","accepts_encrypted","accepts_decrypted","Extension","actions","context","map","externalResponseItem","pull","hasOnePublicTag","isPublic","filtered","unshift","provider","domainName","domain_comps","hostname","split","domain","$get","ngDialog","ApiController","syncToken","refresh","setItem","getAuthParams","userId","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","stringify","generateInitialEncryptionKeysForUser","_performPasswordChange","current_keys","new_keys","patch","setSyncToken","syncWithOptions","options","writeAllItemsToLocalStorage","responseItems","dirtyItems","getDirtyItems","deleted","clearDirtyItems","createRequestParamsForItem","additionalFields","sync_token","handleItemsResponse","retrieved_items","omitFields","saved_items","handleUnsavedItemsResponse","unsaved","undefined","mapping","itemResponse","findItem","alternateUUID","allReferencedObjects","reference","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","paramsForExportFile","paramsForExtension","forExportFile","itemCopy","cloneDeep","assert","encryptSingleItem","retrieveMk","auth_hash","createContentJSONFromProperties","base64","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","needingUpdate","open","template","resolve","className","disableAnimation","onDataReady","mapResponseItemsToLocalModels","allItems","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","removeItem","staticifyObject","object","writeToLocalStorage","value","toJson","sortItemsByDate","draftString","jsonObj","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","saveBatchItems","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","enabledRepeatActionUrls","decryptedExtensions","addItemSyncObserver","ext","enableRepeatAction","actionsWithContextForItem","retrieveExtensionFromServer","repeat_mode","isRepeatActionEnabled","disableRepeatAction","oneUrl","handleExtensionLoadExternalResponseItem","updateFromExternalResponseItem","actionWithURL","win","outgoingParamsForItem","performPost","removeItemChangeObserver","addItemChangeObserver","changedItems","triggerWatchAction","actionQueue","repeat_timeout","diffInSeconds","queueAction","service","$filter","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","itemSyncObservers","itemChangeObservers","_extensions","contentTypes","itemId","models","resolveReferencesForItem","notifySyncObserversOfModels","sortItems","relevantItems","addObserver","changedItem","notifyItemChangeObserversOfModels","uniq","addItems","referencedItem","addItemAsRelationship","id","removeAllRelationships","itemOne","itemTwo","removeItemAsRelationship","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":"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","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n _.merge(defaults, {pw_salt: pw_salt, pw_nonce: pw_nonce})\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk}, defaults);\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText()));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n } else {\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"(Offline) — All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n if(apiController.isUserSignedIn()) {\n // signed out users have local autosave, dont need draft saving\n apiController.saveDraftToDisk(this.note);\n }\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n this.note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(apiController, extensionManager){\n return {\n restrict: 'E',\n scope: {\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$on(\"sync:updated_token\", function(){\n ctrl.syncUpdated();\n })\n }\n }\n })\n .controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) {\n\n this.user = apiController.user;\n this.extensionManager = extensionManager;\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n this.showExtensionsMenu = false;\n }\n\n this.toggleExtensions = function() {\n this.showAccountMenu = false;\n this.showExtensionsMenu = !this.showExtensionsMenu;\n }\n\n this.toggleExtensionForm = function() {\n this.newExtensionData = {};\n this.showNewExtensionForm = !this.showNewExtensionForm;\n }\n\n this.submitNewExtensionForm = function() {\n if(this.newExtensionData.url) {\n extensionManager.addExtension(this.newExtensionData.url, function(response){\n if(!response) {\n alert(\"Unable to register this extension. Make sure the link is valid and try again.\");\n } else {\n this.newExtensionData.url = \"\";\n this.showNewExtensionForm = false;\n }\n }.bind(this))\n }\n }\n\n this.selectedAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, null, function(response){\n action.running = false;\n if(response && response.error) {\n action.error = true;\n alert(\"There was an error performing this action. Please try again.\");\n } else {\n action.error = false;\n apiController.sync(null);\n }\n })\n }\n\n this.deleteExtension = function(extension) {\n if(confirm(\"Are you sure you want to delete this extension?\")) {\n extensionManager.deleteExtension(extension);\n }\n }\n\n this.reloadExtensionsPressed = function() {\n if(confirm(\"For your security, reloading extensions will disable any currently enabled repeat actions.\")) {\n extensionManager.refreshExtensionsFromServer();\n }\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(response && response.error) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.archiveEncryptionFormat = {encrypted: true};\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile(this.archiveEncryptionFormat.encrypted);\n link.click();\n }\n\n this.performImport = function(data, password) {\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n this.importData = null;\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n }.bind(this))\n }\n\n this.submitImportPassword = function() {\n this.performImport(this.importData.data, this.importData.password);\n }\n\n this.importFileSelected = function(files) {\n this.importData = {};\n\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n var data = JSON.parse(e.target.result);\n $timeout(function(){\n if(data.auth_params) {\n // request password\n this.importData.requestPassword = true;\n this.importData.data = data;\n } else {\n this.performImport(data, null);\n }\n }.bind(this))\n }.bind(this)\n\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n apiController.loadLocalItems();\n $scope.allTag = new Tag({all: true});\n $scope.allTag.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n\n if($scope.selectedNote && $scope.selectedNote.dummy) {\n modelManager.removeItemLocally($scope.selectedNote);\n }\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addItem(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n tag.setDirty(true);\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.createRelationshipBetweenItems(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.setItemToBeDeleted(tag);\n // if no more notes, delete tag\n apiController.sync(function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addItem(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.createRelationshipBetweenItems($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n if(!$scope.didShowErrorAlert) {\n $scope.didShowErrorAlert = true;\n alert(\"There was an error saving your note. Please try again.\");\n }\n callback(false);\n } else {\n note.hasChanges = false;\n if(callback) {\n callback(true);\n }\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.setItemToBeDeleted(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n modelManager.removeItemLocally(note);\n return;\n }\n\n apiController.sync(null);\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n apiController.clearLocalStorage();\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!apiController.isUserSignedIn()) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = modelManager.createItem({content_type: \"Note\", dummy: true, text: \"\"});\n this.newNote.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function (modelManager) {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = modelManager.createItem({content_type: \"Tag\"});\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.title.length == 0) {\n tag.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.title || tag.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername($scope.formData.username, function(response){\n var username = response.username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n\n constructor(json_obj) {\n\n this.updateFromJSON(json_obj);\n\n this.observers = [];\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n get contentObject() {\n if(!this.content) {\n return {};\n }\n\n if(this.content !== null && typeof this.content === 'object') {\n // this is the case when mapping localStorage content, in which case the content is already parsed\n return this.content;\n }\n\n return JSON.parse(this.content);\n }\n\n updateFromJSON(json) {\n _.merge(this, json);\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(json.content) {\n this.mapContentToLocalProperties(this.contentObject);\n }\n }\n\n alternateUUID() {\n this.uuid = Neeto.crypto.generateUUID();\n }\n\n setDirty(dirty) {\n this.dirty = dirty;\n\n if(dirty) {\n this.notifyObserversOfChange();\n }\n }\n\n addObserver(observer, callback) {\n if(!_.find(this.observers, observer)) {\n this.observers.push({observer: observer, callback: callback});\n }\n }\n\n removeObserver(observer) {\n _.remove(this.observers, {observer: observer})\n }\n\n notifyObserversOfChange() {\n for(var observer of this.observers) {\n observer.callback(this);\n }\n }\n\n mapContentToLocalProperties(contentObj) {\n\n }\n\n createContentJSONFromProperties() {\n return this.structureParams();\n }\n\n referenceParams() {\n // must override\n }\n\n structureParams() {\n return {references: this.referenceParams()}\n }\n\n addItemAsRelationship(item) {\n // must override\n }\n\n removeItemAsRelationship(item) {\n // must override\n }\n\n removeAllRelationships() {\n // must override\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n allReferencedObjects() {\n // must override\n return [];\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return [];\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Action {\n constructor(json) {\n _.merge(this, json);\n this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory\n this.error = false;\n if(this.lastExecuted) {\n // is string\n this.lastExecuted = new Date(this.lastExecuted);\n }\n }\n\n get permissionsString() {\n if(!this.permissions) {\n return \"\";\n }\n var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter\n permission += \": \";\n for(var contentType of this.content_types) {\n if(contentType == \"*\") {\n permission += \"All items\";\n } else {\n permission += contentType;\n }\n\n permission += \" \";\n }\n\n return permission;\n }\n\n get encryptionModeString() {\n if(this.verb != \"post\") {\n return null;\n }\n var encryptionMode = \"This action accepts data \";\n if(this.accepts_encrypted && this.accepts_decrypted) {\n encryptionMode += \"encrypted or decrypted.\";\n } else {\n if(this.accepts_encrypted) {\n encryptionMode += \"encrypted.\";\n } else {\n encryptionMode += \"decrypted.\";\n }\n }\n return encryptionMode;\n }\n\n}\n\nclass Extension extends Item {\n constructor(json) {\n super(json);\n _.merge(this, json);\n\n this.encrypted = true;\n this.content_type = \"Extension\";\n }\n\n actionsInGlobalContext() {\n return this.actions.filter(function(action){\n return action.context == \"global\";\n })\n }\n\n actionsWithContextForItem(item) {\n return this.actions.filter(function(action){\n return action.context == item.content_type || action.context == \"Item\";\n })\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.name = contentObject.name;\n this.url = contentObject.url;\n this.actions = contentObject.actions.map(function(action){\n return new Action(action);\n })\n }\n\n updateFromExternalResponseItem(externalResponseItem) {\n _.merge(this, externalResponseItem);\n this.actions = externalResponseItem.actions.map(function(action){\n return new Action(action);\n })\n }\n\n referenceParams() {\n return null;\n }\n\n structureParams() {\n var params = {\n name: this.name,\n url: this.url,\n actions: this.actions\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n this.text = contentObject.text;\n }\n\n referenceParams() {\n var references = _.map(this.tags, function(tag){\n return {uuid: tag.uuid, content_type: tag.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title,\n text: this.text\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, item)) {\n this.tags.push(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.tags.forEach(function(tag){\n _.pull(tag.notes, this);\n tag.setDirty(true);\n }.bind(this))\n this.tags = [];\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n allReferencedObjects() {\n return this.tags;\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n safeText() {\n return this.text || \"\";\n }\n\n safeTitle() {\n return this.title || \"\";\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n }\n\n referenceParams() {\n var references = _.map(this.notes, function(note){\n return {uuid: note.uuid, content_type: note.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n if(!_.find(this.notes, item)) {\n this.notes.unshift(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.notes.forEach(function(note){\n _.pull(note.tags, this);\n note.setDirty(true);\n }.bind(this))\n\n this.notes = [];\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n allReferencedObjects() {\n return this.notes;\n }\n\n referencesAffectedBySharingChange() {\n return this.notes;\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.user = {};\n this.syncToken = localStorage.getItem(\"syncToken\");\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.getAuthParams = function() {\n return JSON.parse(localStorage.getItem(\"auth_params\"));\n }\n\n this.isUserSignedIn = function() {\n return localStorage.getItem(\"jwt\");\n }\n\n this.userId = function() {\n return localStorage.getItem(\"uuid\");\n }\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n _.merge(this.user, user);\n callback();\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(authParams));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys, authParams){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, authParams);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(_.omit(authParams, [\"pw_nonce\"])));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n // this.changePassword = function(current_password, new_password) {\n // this.getAuthParamsForEmail(email, function(authParams){\n // if(!authParams) {\n // callback(null);\n // return;\n // }\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n // var data = {};\n // data.current_password = currentKeys.pw;\n // data.password = newKeys.pw;\n // data.password_confirmation = newKeys.pw;\n //\n // var user = this.user;\n //\n // this._performPasswordChange(currentKeys, newKeys, function(response){\n // if(response && !response.error) {\n // // this.showNewPasswordForm = false;\n // // reencrypt data with new mk\n // this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n // if(success) {\n // this.setMk(newKeys.mk);\n // alert(\"Your password has been changed and your data re-encrypted.\");\n // } else {\n // // rollback password\n // this._performPasswordChange(newKeys, currentKeys, function(response){\n // alert(\"There was an error changing your password. Your password has been rolled back.\");\n // window.location.reload();\n // })\n // }\n // }.bind(this));\n // } else {\n // // this.showNewPasswordForm = false;\n // alert(\"There was an error changing your password. Please try again.\");\n // }\n // }.bind(this))\n // }.bind(this));\n // }.bind(this));\n // }.bind(this));\n // }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(username, callback) {\n var request = Restangular.one(\"users\", this.userId());\n request.username = username;\n request.patch().then(function(response){\n this.user.username = response.username;\n callback(response.plain());\n }.bind(this))\n }\n\n\n /*\n Items\n */\n\n this.setSyncToken = function(syncToken) {\n this.syncToken = syncToken;\n localStorage.setItem(\"syncToken\", this.syncToken);\n }\n\n this.syncWithOptions = function(callback, options = {}) {\n this.writeAllItemsToLocalStorage(function(responseItems){\n if(!this.isUserSignedIn()) {\n // is not signed in\n var dirtyItems = modelManager.getDirtyItems();\n // delete anything needing to be deleted\n dirtyItems.forEach(function(item){\n if(item.deleted) {\n modelManager.removeItemLocally(item);\n }\n }.bind(this))\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n }\n }.bind(this))\n\n if(!this.isUserSignedIn()) {\n return;\n }\n\n var dirtyItems = modelManager.getDirtyItems();\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n // console.log(\"syncing items\", request.items);\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n this.handleUnsavedItemsResponse(response.unsaved)\n\n this.writeAllItemsToLocalStorage();\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n if(callback) {\n callback({error: \"Sync error\"});\n }\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleUnsavedItemsResponse = function(unsaved) {\n if(unsaved.length == 0) {\n return;\n }\n\n console.log(\"Handle unsaved\", unsaved);\n for(var mapping of unsaved) {\n var itemResponse = mapping.item;\n var item = modelManager.findItem(itemResponse.uuid);\n var error = mapping.error;\n if(error.tag == \"uuid_conflict\") {\n item.alternateUUID();\n item.setDirty(true);\n item.allReferencedObjects().forEach(function(reference){\n reference.setDirty(true);\n })\n }\n }\n\n this.syncWithOptions(null, {additionalFields: [\"created_at\", \"updated_at\"]});\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForExportFile = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForExtension = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n console.assert(!item.dummy, \"Item is dummy, should not have gotten here.\", item.dummy)\n\n var params = {uuid: item.uuid, content_type: item.content_type,\n presentation_name: item.presentation_name, deleted: item.deleted};\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.createContentJSONFromProperties() : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties()));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n this.shareItem = function(item, callback) {\n if(!this.isUserSignedIn()) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.allItems.forEach(function(item){\n item.setDirty(true);\n })\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }.bind(this)\n\n if(data.auth_params) {\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, data.auth_params), function(keys){\n var mk = keys.mk;\n try {\n this.decryptItemsWithKey(data.items, mk);\n // delete items enc_item_key since the user's actually key will do the encrypting once its passed off\n data.items.forEach(function(item){\n item.enc_item_key = null;\n item.auth_hash = null;\n })\n onDataReady();\n }\n catch (e) {\n console.log(\"Error decrypting\", e);\n alert(\"There was an error decrypting your items. Make sure the password you entered is correct and try again.\");\n callback(false, null);\n return;\n }\n }.bind(this));\n } else {\n onDataReady();\n }\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(encrypted) {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.allItemsMatchingTypes([\"Tag\", \"Note\"]), function(item){\n return this.paramsForExportFile(item, encrypted);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n if(encrypted) {\n data[\"auth_params\"] = this.getAuthParams();\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n // this.mergeLocalDataRemotely = function(user, callback) {\n // var request = Restangular.one(\"users\", this.userId()).one(\"merge\");\n // var tags = user.tags;\n // request.items = user.items;\n // request.items.forEach(function(item){\n // if(item.tag_id) {\n // var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n // item.tag_name = tag.title;\n // }\n // })\n // request.post().then(function(response){\n // callback();\n // localStorage.removeItem('user');\n // })\n // }\n\n\n\n\n this.clearLocalStorage = function() {\n localStorage.removeItem(\"items\");\n localStorage.removeItem(\"mk\");\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"uuid\");\n localStorage.removeItem(\"syncToken\");\n localStorage.removeItem(\"auth_params\");\n }\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeAllItemsToLocalStorage = function(callback) {\n var items = _.map(modelManager.allItems, function(item){\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\"], false)\n }.bind(this));\n // console.log(\"Writing items to local\", items);\n this.writeToLocalStorage('items', items);\n if(callback) {\n callback(items);\n }\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItems = function() {\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n var jsonObj = _.merge({content_type: \"Note\"}, JSON.parse(draftString));\n return modelManager.createItem(jsonObj);\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n this.decryptItemsWithKey(items, masterKey);\n }\n\n this.decryptItemsWithKey = function(items, key) {\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n var isString = typeof item.content === 'string' || item.content instanceof String;\n if(isString) {\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, key);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = modelManager.allItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;class ContextualExtensionsMenu {\n\n constructor() {\n this.restrict = \"E\";\n this.templateUrl = \"frontend/directives/contextual-menu.html\";\n this.scope = {\n item: \"=\"\n };\n }\n\n controller($scope, modelManager, extensionManager) {\n $scope.extensions = extensionManager.extensionsInContextOfItem($scope.item);\n\n $scope.executeAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, $scope.item, function(response){\n action.running = false;\n })\n }\n\n $scope.accessTypeForExtension = function(extension) {\n return extensionManager.extensionUsesEncryptedData(extension) ? \"encrypted\" : \"decrypted\";\n }\n\n }\n\n\n}\n\nangular.module('app.frontend').directive('contextualExtensionsMenu', () => new ContextualExtensionsMenu);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager, apiController) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.apiController = apiController;\n this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem(\"enabledRepeatActionUrls\")) || [];\n this.decryptedExtensions = JSON.parse(localStorage.getItem(\"decryptedExtensions\")) || [];\n\n modelManager.addItemSyncObserver(\"extensionManager\", \"Extension\", function(items){\n for (var ext of items) {\n\n ext.encrypted = this.extensionUsesEncryptedData(ext);\n\n for (var action of ext.actions) {\n if(this.enabledRepeatActionUrls.includes(action.url)) {\n this.enableRepeatAction(action, ext);\n }\n }\n }\n }.bind(this))\n }\n\n get extensions() {\n return this.modelManager.extensions;\n }\n\n extensionsInContextOfItem(item) {\n return this.extensions.filter(function(ext){\n return ext.actionsWithContextForItem(item).length > 0;\n })\n }\n\n actionWithURL(url) {\n for (var extension of this.extensions) {\n return _.find(extension.actions, {url: url})\n }\n }\n\n extensionUsesEncryptedData(extension) {\n return !this.decryptedExtensions.includes(extension.url);\n }\n\n changeExtensionEncryptionFormat(encrypted, extension) {\n if(encrypted) {\n _.pull(this.decryptedExtensions, extension.url);\n } else {\n this.decryptedExtensions.push(extension.url);\n }\n\n localStorage.setItem(\"decryptedExtensions\", JSON.stringify(this.decryptedExtensions))\n\n extension.encrypted = this.extensionUsesEncryptedData(extension);\n }\n\n addExtension(url, callback) {\n this.retrieveExtensionFromServer(url, callback);\n }\n\n deleteExtension(extension) {\n for(var action of extension.actions) {\n _.pull(this.decryptedExtensions, extension);\n if(action.repeat_mode) {\n if(this.isRepeatActionEnabled(action)) {\n this.disableRepeatAction(action);\n }\n }\n }\n\n this.modelManager.setItemToBeDeleted(extension);\n this.apiController.sync(null);\n }\n\n retrieveExtensionFromServer(url, callback) {\n this.Restangular.oneUrl(url, url).get().then(function(response){\n var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());\n if(callback) {\n callback(ext);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n callback(null);\n })\n }\n\n handleExtensionLoadExternalResponseItem(url, externalResponseItem) {\n var extension = _.find(this.extensions, {url: url});\n if(extension) {\n extension.updateFromExternalResponseItem(externalResponseItem);\n } else {\n extension = new Extension(externalResponseItem);\n extension.url = url;\n extension.setDirty(true);\n this.modelManager.addItem(extension);\n this.apiController.sync(null);\n }\n\n return extension;\n }\n\n refreshExtensionsFromServer() {\n for (var url of this.enabledRepeatActionUrls) {\n var action = this.actionWithURL(url);\n if(action) {\n this.disableRepeatAction(action);\n }\n }\n\n for(var ext of this.extensions) {\n this.retrieveExtensionFromServer(ext.url, function(extension){\n extension.setDirty(true);\n });\n }\n }\n\n executeAction(action, extension, item, callback) {\n\n if(this.extensionUsesEncryptedData(extension) && !this.apiController.isUserSignedIn()) {\n alert(\"To send data encrypted, you must have an encryption key, and must therefore be signed in.\");\n callback(null);\n return;\n }\n\n switch (action.verb) {\n case \"get\": {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n action.error = false;\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n .catch(function(response){\n action.error = true;\n })\n\n break;\n }\n\n case \"show\": {\n var win = window.open(action.url, '_blank');\n win.focus();\n callback();\n break;\n }\n\n case \"post\": {\n var params = {};\n\n if(action.all) {\n var items = this.modelManager.allItemsMatchingTypes(action.content_types);\n params.items = items.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n\n } else {\n params.item = this.outgoingParamsForItem(item, extension);\n }\n\n this.performPost(action, extension, params, function(response){\n callback(response);\n });\n\n break;\n }\n\n default: {\n\n }\n }\n\n action.lastExecuted = new Date();\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n _.pull(this.enabledRepeatActionUrls, action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n this.modelManager.removeItemChangeObserver(action.url);\n\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n if(!_.find(this.enabledRepeatActionUrls, action.url)) {\n this.enabledRepeatActionUrls.push(action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n }\n\n if(action.repeat_mode) {\n\n if(action.repeat_mode == \"watch\") {\n this.modelManager.addItemChangeObserver(action.url, action.content_types, function(changedItems){\n this.triggerWatchAction(action, extension, changedItems);\n }.bind(this))\n }\n\n if(action.repeat_mode == \"loop\") {\n // todo\n }\n\n }\n }\n\n queueAction(action, extension, delay, changedItems) {\n this.actionQueue = this.actionQueue || [];\n if(_.find(this.actionQueue, {url: action.url})) {\n return;\n }\n\n // console.log(\"Successfully queued\", action, this.actionQueue.length);\n this.actionQueue.push(action);\n\n setTimeout(function () {\n // console.log(\"Performing queued action\", action);\n this.triggerWatchAction(action, extension, changedItems);\n _.pull(this.actionQueue, action);\n }.bind(this), delay * 1000);\n }\n\n triggerWatchAction(action, extension, changedItems) {\n if(action.repeat_timeout > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeat_timeout) {\n var delay = action.repeat_timeout - diffInSeconds;\n this.queueAction(action, extension, delay, changedItems);\n return;\n }\n }\n\n action.lastExecuted = new Date();\n\n console.log(\"Performing action.\");\n\n if(action.verb == \"post\") {\n var params = {};\n params.items = changedItems.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n this.performPost(action, extension, params, null);\n } else {\n // todo\n }\n }\n\n outgoingParamsForItem(item, extension) {\n return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));\n }\n\n performPost(action, extension, params, callback) {\n var request = this.Restangular.oneUrl(action.url, action.url);\n if(this.extensionUsesEncryptedData(extension)) {\n request.auth_params = this.apiController.getAuthParams();\n }\n _.merge(request, params);\n\n request.post().then(function(response){\n action.error = false;\n if(callback) {\n callback(response.plain());\n }\n })\n .catch(function(response){\n action.error = true;\n console.log(\"Action error response:\", response);\n if(callback) {\n callback({error: \"Request error\"});\n }\n })\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager {\n\n constructor() {\n this.notes = [];\n this.tags = [];\n this.itemSyncObservers = [];\n this.itemChangeObservers = [];\n this.items = [];\n this._extensions = [];\n }\n\n get allItems() {\n return this.items.filter(function(item){\n return !item.dummy;\n })\n }\n\n get extensions() {\n return this._extensions.filter(function(ext){\n return !ext.deleted;\n })\n }\n\n allItemsMatchingTypes(contentTypes) {\n return this.items.filter(function(item){\n return (contentTypes.includes(item.content_type) || contentTypes.includes(\"*\")) && !item.dummy;\n })\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null);\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.removeItemLocally(item)\n }\n continue;\n }\n\n _.omit(json_obj, omitFields);\n\n if(!item) {\n item = this.createItem(json_obj);\n } else {\n item.updateFromJSON(json_obj);\n }\n\n this.addItem(item);\n\n if(json_obj.content) {\n this.resolveReferencesForItem(item)\n }\n\n models.push(item)\n }\n\n this.notifySyncObserversOfModels(models);\n\n this.sortItems();\n return models;\n }\n\n notifySyncObserversOfModels(models) {\n for(var observer of this.itemSyncObservers) {\n var relevantItems = models.filter(function(item){return item.content_type == observer.type});\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n notifyItemChangeObserversOfModels(models) {\n for(var observer of this.itemChangeObservers) {\n var relevantItems = models.filter(function(item){\n return observer.content_types.includes(item.content_type) || observer.content_types.includes(\"*\");\n });\n\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n createItem(json_obj) {\n var item;\n if(json_obj.content_type == \"Note\") {\n item = new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n item = new Tag(json_obj);\n } else if(json_obj.content_type == \"Extension\") {\n item = new Extension(json_obj);\n } else {\n item = new Item(json_obj);\n }\n\n item.addObserver(this, function(changedItem){\n this.notifyItemChangeObserversOfModels([changedItem]);\n }.bind(this));\n\n return item;\n }\n\n addItems(items) {\n this.items = _.uniq(this.items.concat(items));\n\n items.forEach(function(item){\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, {uuid: item.uuid})) {\n this.tags.unshift(item);\n }\n } else if(item.content_type == \"Note\") {\n if(!_.find(this.notes, {uuid: item.uuid})) {\n this.notes.unshift(item);\n }\n } else if(item.content_type == \"Extension\") {\n if(!_.find(this._extensions, {uuid: item.uuid})) {\n this._extensions.unshift(item);\n }\n }\n }.bind(this))\n }\n\n addItem(item) {\n this.addItems([item])\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n resolveReferencesForItem(item) {\n var contentObject = item.contentObject;\n if(!contentObject.references) {\n return;\n }\n\n for(var reference of contentObject.references) {\n var referencedItem = this.findItem(reference.uuid);\n if(referencedItem) {\n item.addItemAsRelationship(referencedItem);\n referencedItem.addItemAsRelationship(item);\n } else {\n // console.log(\"Unable to find item:\", reference.uuid);\n }\n }\n }\n\n sortItems() {\n Item.sortItemsByDate(this.notes);\n\n this.tags.forEach(function(tag){\n Item.sortItemsByDate(tag.notes);\n })\n }\n\n addItemSyncObserver(id, type, callback) {\n this.itemSyncObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemSyncObserver(id) {\n _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));\n }\n\n addItemChangeObserver(id, content_types, callback) {\n this.itemChangeObservers.push({id: id, content_types: content_types, callback: callback});\n }\n\n removeItemChangeObserver(id) {\n _.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, {id: id}));\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n getDirtyItems() {\n return this.items.filter(function(item){return item.dirty == true && !item.dummy})\n }\n\n clearDirtyItems() {\n this.getDirtyItems().forEach(function(item){\n item.setDirty(false);\n })\n }\n\n setItemToBeDeleted(item) {\n item.deleted = true;\n if(!item.dummy) {\n item.setDirty(true);\n }\n item.removeAllRelationships();\n }\n\n removeItemLocally(item) {\n _.pull(this.items, item);\n\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n } else if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n } else if(item.content_type == \"Extension\") {\n _.pull(this._extensions, item);\n }\n }\n\n /*\n Relationships\n */\n\n createRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.addItemAsRelationship(itemTwo);\n itemTwo.addItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n\n removeRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.removeItemAsRelationship(itemTwo);\n itemTwo.removeItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file From 12a6152fa1dda5d5dbd1ddb93dc365f82415242f Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Sun, 8 Jan 2017 22:19:49 -0600 Subject: [PATCH 5/5] save url to local storage --- app/assets/javascripts/app/services/apiController.js | 2 +- vendor/assets/javascripts/transpiled.js | 2 +- vendor/assets/javascripts/transpiled.js.map | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index e57879343..b030305c6 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -499,7 +499,7 @@ angular.module('app.frontend') this.writeAllItemsToLocalStorage = function(callback) { var items = _.map(modelManager.allItems, function(item){ - return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at"], false) + return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false) }.bind(this)); // console.log("Writing items to local", items); this.writeToLocalStorage('items', items); diff --git a/vendor/assets/javascripts/transpiled.js b/vendor/assets/javascripts/transpiled.js index 44b2a3c14..148158b4c 100644 --- a/vendor/assets/javascripts/transpiled.js +++ b/vendor/assets/javascripts/transpiled.js @@ -2420,7 +2420,7 @@ var Tag = function (_Item3) { this.writeAllItemsToLocalStorage = function (callback) { var items = _.map(modelManager.allItems, function (item) { - return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at"], false); + return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false); }.bind(this)); // console.log("Writing items to local", items); this.writeToLocalStorage('items', items); diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index 946b97248..6b6e070b3 100644 --- a/vendor/assets/javascripts/transpiled.js.map +++ b/vendor/assets/javascripts/transpiled.js.map @@ -1 +1 @@ -{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","email","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","getCurrentUser","directive","$timeout","restrict","scope","save","remove","note","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","markdownRenderer","extensionManager","editorMode","safeText","dummy","focusTitle","hasChanges","hasAvailableExtensions","extensionsInContextOfItem","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","isUserSignedIn","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","setDirty","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","syncUpdated","$state","serverSideValidation","user","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","showExtensionsMenu","toggleExtensions","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","running","executeAction","deleteExtension","confirm","reloadExtensionsPressed","refreshExtensionsFromServer","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","archiveEncryptionFormat","downloadDataArchive","setAttribute","itemsDataFile","performImport","importJSONData","importData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","allTag","Tag","all","title","tags","notes","setInterval","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","selectedNote","removeItemLocally","tagsAddNew","addItem","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","createRelationshipBetweenItems","notesRemoveTag","validNotes","Note","filterDummyNotes","setItemToBeDeleted","notesSelectionMade","notesAddNew","didShowErrorAlert","headerLogout","clearLocalStorage","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","updateFromJSON","observers","generateUUID","json","created_at","updated_at","content","mapContentToLocalProperties","contentObject","dirty","notifyObserversOfChange","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","items","sort","b","Action","lastExecuted","permissions","permission","charAt","content_types","contentType","verb","encryptionMode","accepts_encrypted","accepts_decrypted","Extension","actions","context","map","externalResponseItem","pull","hasOnePublicTag","isPublic","filtered","unshift","provider","domainName","domain_comps","hostname","split","domain","$get","ngDialog","ApiController","syncToken","refresh","setItem","getAuthParams","userId","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","stringify","generateInitialEncryptionKeysForUser","_performPasswordChange","current_keys","new_keys","patch","setSyncToken","syncWithOptions","options","writeAllItemsToLocalStorage","responseItems","dirtyItems","getDirtyItems","deleted","clearDirtyItems","createRequestParamsForItem","additionalFields","sync_token","handleItemsResponse","retrieved_items","omitFields","saved_items","handleUnsavedItemsResponse","unsaved","undefined","mapping","itemResponse","findItem","alternateUUID","allReferencedObjects","reference","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","paramsForExportFile","paramsForExtension","forExportFile","itemCopy","cloneDeep","assert","encryptSingleItem","retrieveMk","auth_hash","createContentJSONFromProperties","base64","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","needingUpdate","open","template","resolve","className","disableAnimation","onDataReady","mapResponseItemsToLocalModels","allItems","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","removeItem","staticifyObject","object","writeToLocalStorage","value","toJson","sortItemsByDate","draftString","jsonObj","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","saveBatchItems","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","enabledRepeatActionUrls","decryptedExtensions","addItemSyncObserver","ext","enableRepeatAction","actionsWithContextForItem","retrieveExtensionFromServer","repeat_mode","isRepeatActionEnabled","disableRepeatAction","oneUrl","handleExtensionLoadExternalResponseItem","updateFromExternalResponseItem","actionWithURL","win","outgoingParamsForItem","performPost","removeItemChangeObserver","addItemChangeObserver","changedItems","triggerWatchAction","actionQueue","repeat_timeout","diffInSeconds","queueAction","service","$filter","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","itemSyncObservers","itemChangeObservers","_extensions","contentTypes","itemId","models","resolveReferencesForItem","notifySyncObserversOfModels","sortItems","relevantItems","addObserver","changedItem","notifyItemChangeObserversOfModels","uniq","addItems","referencedItem","addItemAsRelationship","id","removeAllRelationships","itemOne","itemTwo","removeItemAsRelationship","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":"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","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n _.merge(defaults, {pw_salt: pw_salt, pw_nonce: pw_nonce})\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk}, defaults);\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText()));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n } else {\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"(Offline) — All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n if(apiController.isUserSignedIn()) {\n // signed out users have local autosave, dont need draft saving\n apiController.saveDraftToDisk(this.note);\n }\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n this.note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(apiController, extensionManager){\n return {\n restrict: 'E',\n scope: {\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$on(\"sync:updated_token\", function(){\n ctrl.syncUpdated();\n })\n }\n }\n })\n .controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) {\n\n this.user = apiController.user;\n this.extensionManager = extensionManager;\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n this.showExtensionsMenu = false;\n }\n\n this.toggleExtensions = function() {\n this.showAccountMenu = false;\n this.showExtensionsMenu = !this.showExtensionsMenu;\n }\n\n this.toggleExtensionForm = function() {\n this.newExtensionData = {};\n this.showNewExtensionForm = !this.showNewExtensionForm;\n }\n\n this.submitNewExtensionForm = function() {\n if(this.newExtensionData.url) {\n extensionManager.addExtension(this.newExtensionData.url, function(response){\n if(!response) {\n alert(\"Unable to register this extension. Make sure the link is valid and try again.\");\n } else {\n this.newExtensionData.url = \"\";\n this.showNewExtensionForm = false;\n }\n }.bind(this))\n }\n }\n\n this.selectedAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, null, function(response){\n action.running = false;\n if(response && response.error) {\n action.error = true;\n alert(\"There was an error performing this action. Please try again.\");\n } else {\n action.error = false;\n apiController.sync(null);\n }\n })\n }\n\n this.deleteExtension = function(extension) {\n if(confirm(\"Are you sure you want to delete this extension?\")) {\n extensionManager.deleteExtension(extension);\n }\n }\n\n this.reloadExtensionsPressed = function() {\n if(confirm(\"For your security, reloading extensions will disable any currently enabled repeat actions.\")) {\n extensionManager.refreshExtensionsFromServer();\n }\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(response && response.error) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.archiveEncryptionFormat = {encrypted: true};\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile(this.archiveEncryptionFormat.encrypted);\n link.click();\n }\n\n this.performImport = function(data, password) {\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n this.importData = null;\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n }.bind(this))\n }\n\n this.submitImportPassword = function() {\n this.performImport(this.importData.data, this.importData.password);\n }\n\n this.importFileSelected = function(files) {\n this.importData = {};\n\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n var data = JSON.parse(e.target.result);\n $timeout(function(){\n if(data.auth_params) {\n // request password\n this.importData.requestPassword = true;\n this.importData.data = data;\n } else {\n this.performImport(data, null);\n }\n }.bind(this))\n }.bind(this)\n\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n apiController.loadLocalItems();\n $scope.allTag = new Tag({all: true});\n $scope.allTag.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n\n if($scope.selectedNote && $scope.selectedNote.dummy) {\n modelManager.removeItemLocally($scope.selectedNote);\n }\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addItem(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n tag.setDirty(true);\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.createRelationshipBetweenItems(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.setItemToBeDeleted(tag);\n // if no more notes, delete tag\n apiController.sync(function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addItem(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.createRelationshipBetweenItems($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n if(!$scope.didShowErrorAlert) {\n $scope.didShowErrorAlert = true;\n alert(\"There was an error saving your note. Please try again.\");\n }\n callback(false);\n } else {\n note.hasChanges = false;\n if(callback) {\n callback(true);\n }\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.setItemToBeDeleted(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n modelManager.removeItemLocally(note);\n return;\n }\n\n apiController.sync(null);\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n apiController.clearLocalStorage();\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!apiController.isUserSignedIn()) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = modelManager.createItem({content_type: \"Note\", dummy: true, text: \"\"});\n this.newNote.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function (modelManager) {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = modelManager.createItem({content_type: \"Tag\"});\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.title.length == 0) {\n tag.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.title || tag.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername($scope.formData.username, function(response){\n var username = response.username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n\n constructor(json_obj) {\n\n this.updateFromJSON(json_obj);\n\n this.observers = [];\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n get contentObject() {\n if(!this.content) {\n return {};\n }\n\n if(this.content !== null && typeof this.content === 'object') {\n // this is the case when mapping localStorage content, in which case the content is already parsed\n return this.content;\n }\n\n return JSON.parse(this.content);\n }\n\n updateFromJSON(json) {\n _.merge(this, json);\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(json.content) {\n this.mapContentToLocalProperties(this.contentObject);\n }\n }\n\n alternateUUID() {\n this.uuid = Neeto.crypto.generateUUID();\n }\n\n setDirty(dirty) {\n this.dirty = dirty;\n\n if(dirty) {\n this.notifyObserversOfChange();\n }\n }\n\n addObserver(observer, callback) {\n if(!_.find(this.observers, observer)) {\n this.observers.push({observer: observer, callback: callback});\n }\n }\n\n removeObserver(observer) {\n _.remove(this.observers, {observer: observer})\n }\n\n notifyObserversOfChange() {\n for(var observer of this.observers) {\n observer.callback(this);\n }\n }\n\n mapContentToLocalProperties(contentObj) {\n\n }\n\n createContentJSONFromProperties() {\n return this.structureParams();\n }\n\n referenceParams() {\n // must override\n }\n\n structureParams() {\n return {references: this.referenceParams()}\n }\n\n addItemAsRelationship(item) {\n // must override\n }\n\n removeItemAsRelationship(item) {\n // must override\n }\n\n removeAllRelationships() {\n // must override\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n allReferencedObjects() {\n // must override\n return [];\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return [];\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Action {\n constructor(json) {\n _.merge(this, json);\n this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory\n this.error = false;\n if(this.lastExecuted) {\n // is string\n this.lastExecuted = new Date(this.lastExecuted);\n }\n }\n\n get permissionsString() {\n if(!this.permissions) {\n return \"\";\n }\n var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter\n permission += \": \";\n for(var contentType of this.content_types) {\n if(contentType == \"*\") {\n permission += \"All items\";\n } else {\n permission += contentType;\n }\n\n permission += \" \";\n }\n\n return permission;\n }\n\n get encryptionModeString() {\n if(this.verb != \"post\") {\n return null;\n }\n var encryptionMode = \"This action accepts data \";\n if(this.accepts_encrypted && this.accepts_decrypted) {\n encryptionMode += \"encrypted or decrypted.\";\n } else {\n if(this.accepts_encrypted) {\n encryptionMode += \"encrypted.\";\n } else {\n encryptionMode += \"decrypted.\";\n }\n }\n return encryptionMode;\n }\n\n}\n\nclass Extension extends Item {\n constructor(json) {\n super(json);\n _.merge(this, json);\n\n this.encrypted = true;\n this.content_type = \"Extension\";\n }\n\n actionsInGlobalContext() {\n return this.actions.filter(function(action){\n return action.context == \"global\";\n })\n }\n\n actionsWithContextForItem(item) {\n return this.actions.filter(function(action){\n return action.context == item.content_type || action.context == \"Item\";\n })\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.name = contentObject.name;\n this.url = contentObject.url;\n this.actions = contentObject.actions.map(function(action){\n return new Action(action);\n })\n }\n\n updateFromExternalResponseItem(externalResponseItem) {\n _.merge(this, externalResponseItem);\n this.actions = externalResponseItem.actions.map(function(action){\n return new Action(action);\n })\n }\n\n referenceParams() {\n return null;\n }\n\n structureParams() {\n var params = {\n name: this.name,\n url: this.url,\n actions: this.actions\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n this.text = contentObject.text;\n }\n\n referenceParams() {\n var references = _.map(this.tags, function(tag){\n return {uuid: tag.uuid, content_type: tag.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title,\n text: this.text\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, item)) {\n this.tags.push(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.tags.forEach(function(tag){\n _.pull(tag.notes, this);\n tag.setDirty(true);\n }.bind(this))\n this.tags = [];\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n allReferencedObjects() {\n return this.tags;\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n safeText() {\n return this.text || \"\";\n }\n\n safeTitle() {\n return this.title || \"\";\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n }\n\n referenceParams() {\n var references = _.map(this.notes, function(note){\n return {uuid: note.uuid, content_type: note.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n if(!_.find(this.notes, item)) {\n this.notes.unshift(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.notes.forEach(function(note){\n _.pull(note.tags, this);\n note.setDirty(true);\n }.bind(this))\n\n this.notes = [];\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n allReferencedObjects() {\n return this.notes;\n }\n\n referencesAffectedBySharingChange() {\n return this.notes;\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.user = {};\n this.syncToken = localStorage.getItem(\"syncToken\");\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.getAuthParams = function() {\n return JSON.parse(localStorage.getItem(\"auth_params\"));\n }\n\n this.isUserSignedIn = function() {\n return localStorage.getItem(\"jwt\");\n }\n\n this.userId = function() {\n return localStorage.getItem(\"uuid\");\n }\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n _.merge(this.user, user);\n callback();\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(authParams));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys, authParams){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, authParams);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(_.omit(authParams, [\"pw_nonce\"])));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n // this.changePassword = function(current_password, new_password) {\n // this.getAuthParamsForEmail(email, function(authParams){\n // if(!authParams) {\n // callback(null);\n // return;\n // }\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n // var data = {};\n // data.current_password = currentKeys.pw;\n // data.password = newKeys.pw;\n // data.password_confirmation = newKeys.pw;\n //\n // var user = this.user;\n //\n // this._performPasswordChange(currentKeys, newKeys, function(response){\n // if(response && !response.error) {\n // // this.showNewPasswordForm = false;\n // // reencrypt data with new mk\n // this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n // if(success) {\n // this.setMk(newKeys.mk);\n // alert(\"Your password has been changed and your data re-encrypted.\");\n // } else {\n // // rollback password\n // this._performPasswordChange(newKeys, currentKeys, function(response){\n // alert(\"There was an error changing your password. Your password has been rolled back.\");\n // window.location.reload();\n // })\n // }\n // }.bind(this));\n // } else {\n // // this.showNewPasswordForm = false;\n // alert(\"There was an error changing your password. Please try again.\");\n // }\n // }.bind(this))\n // }.bind(this));\n // }.bind(this));\n // }.bind(this));\n // }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(username, callback) {\n var request = Restangular.one(\"users\", this.userId());\n request.username = username;\n request.patch().then(function(response){\n this.user.username = response.username;\n callback(response.plain());\n }.bind(this))\n }\n\n\n /*\n Items\n */\n\n this.setSyncToken = function(syncToken) {\n this.syncToken = syncToken;\n localStorage.setItem(\"syncToken\", this.syncToken);\n }\n\n this.syncWithOptions = function(callback, options = {}) {\n this.writeAllItemsToLocalStorage(function(responseItems){\n if(!this.isUserSignedIn()) {\n // is not signed in\n var dirtyItems = modelManager.getDirtyItems();\n // delete anything needing to be deleted\n dirtyItems.forEach(function(item){\n if(item.deleted) {\n modelManager.removeItemLocally(item);\n }\n }.bind(this))\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n }\n }.bind(this))\n\n if(!this.isUserSignedIn()) {\n return;\n }\n\n var dirtyItems = modelManager.getDirtyItems();\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n // console.log(\"syncing items\", request.items);\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n this.handleUnsavedItemsResponse(response.unsaved)\n\n this.writeAllItemsToLocalStorage();\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n if(callback) {\n callback({error: \"Sync error\"});\n }\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleUnsavedItemsResponse = function(unsaved) {\n if(unsaved.length == 0) {\n return;\n }\n\n console.log(\"Handle unsaved\", unsaved);\n for(var mapping of unsaved) {\n var itemResponse = mapping.item;\n var item = modelManager.findItem(itemResponse.uuid);\n var error = mapping.error;\n if(error.tag == \"uuid_conflict\") {\n item.alternateUUID();\n item.setDirty(true);\n item.allReferencedObjects().forEach(function(reference){\n reference.setDirty(true);\n })\n }\n }\n\n this.syncWithOptions(null, {additionalFields: [\"created_at\", \"updated_at\"]});\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForExportFile = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForExtension = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n console.assert(!item.dummy, \"Item is dummy, should not have gotten here.\", item.dummy)\n\n var params = {uuid: item.uuid, content_type: item.content_type,\n presentation_name: item.presentation_name, deleted: item.deleted};\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.createContentJSONFromProperties() : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties()));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n this.shareItem = function(item, callback) {\n if(!this.isUserSignedIn()) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.allItems.forEach(function(item){\n item.setDirty(true);\n })\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }.bind(this)\n\n if(data.auth_params) {\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, data.auth_params), function(keys){\n var mk = keys.mk;\n try {\n this.decryptItemsWithKey(data.items, mk);\n // delete items enc_item_key since the user's actually key will do the encrypting once its passed off\n data.items.forEach(function(item){\n item.enc_item_key = null;\n item.auth_hash = null;\n })\n onDataReady();\n }\n catch (e) {\n console.log(\"Error decrypting\", e);\n alert(\"There was an error decrypting your items. Make sure the password you entered is correct and try again.\");\n callback(false, null);\n return;\n }\n }.bind(this));\n } else {\n onDataReady();\n }\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(encrypted) {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.allItemsMatchingTypes([\"Tag\", \"Note\"]), function(item){\n return this.paramsForExportFile(item, encrypted);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n if(encrypted) {\n data[\"auth_params\"] = this.getAuthParams();\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n // this.mergeLocalDataRemotely = function(user, callback) {\n // var request = Restangular.one(\"users\", this.userId()).one(\"merge\");\n // var tags = user.tags;\n // request.items = user.items;\n // request.items.forEach(function(item){\n // if(item.tag_id) {\n // var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n // item.tag_name = tag.title;\n // }\n // })\n // request.post().then(function(response){\n // callback();\n // localStorage.removeItem('user');\n // })\n // }\n\n\n\n\n this.clearLocalStorage = function() {\n localStorage.removeItem(\"items\");\n localStorage.removeItem(\"mk\");\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"uuid\");\n localStorage.removeItem(\"syncToken\");\n localStorage.removeItem(\"auth_params\");\n }\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeAllItemsToLocalStorage = function(callback) {\n var items = _.map(modelManager.allItems, function(item){\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\"], false)\n }.bind(this));\n // console.log(\"Writing items to local\", items);\n this.writeToLocalStorage('items', items);\n if(callback) {\n callback(items);\n }\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItems = function() {\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n var jsonObj = _.merge({content_type: \"Note\"}, JSON.parse(draftString));\n return modelManager.createItem(jsonObj);\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n this.decryptItemsWithKey(items, masterKey);\n }\n\n this.decryptItemsWithKey = function(items, key) {\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n var isString = typeof item.content === 'string' || item.content instanceof String;\n if(isString) {\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, key);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = modelManager.allItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;class ContextualExtensionsMenu {\n\n constructor() {\n this.restrict = \"E\";\n this.templateUrl = \"frontend/directives/contextual-menu.html\";\n this.scope = {\n item: \"=\"\n };\n }\n\n controller($scope, modelManager, extensionManager) {\n $scope.extensions = extensionManager.extensionsInContextOfItem($scope.item);\n\n $scope.executeAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, $scope.item, function(response){\n action.running = false;\n })\n }\n\n $scope.accessTypeForExtension = function(extension) {\n return extensionManager.extensionUsesEncryptedData(extension) ? \"encrypted\" : \"decrypted\";\n }\n\n }\n\n\n}\n\nangular.module('app.frontend').directive('contextualExtensionsMenu', () => new ContextualExtensionsMenu);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager, apiController) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.apiController = apiController;\n this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem(\"enabledRepeatActionUrls\")) || [];\n this.decryptedExtensions = JSON.parse(localStorage.getItem(\"decryptedExtensions\")) || [];\n\n modelManager.addItemSyncObserver(\"extensionManager\", \"Extension\", function(items){\n for (var ext of items) {\n\n ext.encrypted = this.extensionUsesEncryptedData(ext);\n\n for (var action of ext.actions) {\n if(this.enabledRepeatActionUrls.includes(action.url)) {\n this.enableRepeatAction(action, ext);\n }\n }\n }\n }.bind(this))\n }\n\n get extensions() {\n return this.modelManager.extensions;\n }\n\n extensionsInContextOfItem(item) {\n return this.extensions.filter(function(ext){\n return ext.actionsWithContextForItem(item).length > 0;\n })\n }\n\n actionWithURL(url) {\n for (var extension of this.extensions) {\n return _.find(extension.actions, {url: url})\n }\n }\n\n extensionUsesEncryptedData(extension) {\n return !this.decryptedExtensions.includes(extension.url);\n }\n\n changeExtensionEncryptionFormat(encrypted, extension) {\n if(encrypted) {\n _.pull(this.decryptedExtensions, extension.url);\n } else {\n this.decryptedExtensions.push(extension.url);\n }\n\n localStorage.setItem(\"decryptedExtensions\", JSON.stringify(this.decryptedExtensions))\n\n extension.encrypted = this.extensionUsesEncryptedData(extension);\n }\n\n addExtension(url, callback) {\n this.retrieveExtensionFromServer(url, callback);\n }\n\n deleteExtension(extension) {\n for(var action of extension.actions) {\n _.pull(this.decryptedExtensions, extension);\n if(action.repeat_mode) {\n if(this.isRepeatActionEnabled(action)) {\n this.disableRepeatAction(action);\n }\n }\n }\n\n this.modelManager.setItemToBeDeleted(extension);\n this.apiController.sync(null);\n }\n\n retrieveExtensionFromServer(url, callback) {\n this.Restangular.oneUrl(url, url).get().then(function(response){\n var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());\n if(callback) {\n callback(ext);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n callback(null);\n })\n }\n\n handleExtensionLoadExternalResponseItem(url, externalResponseItem) {\n var extension = _.find(this.extensions, {url: url});\n if(extension) {\n extension.updateFromExternalResponseItem(externalResponseItem);\n } else {\n extension = new Extension(externalResponseItem);\n extension.url = url;\n extension.setDirty(true);\n this.modelManager.addItem(extension);\n this.apiController.sync(null);\n }\n\n return extension;\n }\n\n refreshExtensionsFromServer() {\n for (var url of this.enabledRepeatActionUrls) {\n var action = this.actionWithURL(url);\n if(action) {\n this.disableRepeatAction(action);\n }\n }\n\n for(var ext of this.extensions) {\n this.retrieveExtensionFromServer(ext.url, function(extension){\n extension.setDirty(true);\n });\n }\n }\n\n executeAction(action, extension, item, callback) {\n\n if(this.extensionUsesEncryptedData(extension) && !this.apiController.isUserSignedIn()) {\n alert(\"To send data encrypted, you must have an encryption key, and must therefore be signed in.\");\n callback(null);\n return;\n }\n\n switch (action.verb) {\n case \"get\": {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n action.error = false;\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n .catch(function(response){\n action.error = true;\n })\n\n break;\n }\n\n case \"show\": {\n var win = window.open(action.url, '_blank');\n win.focus();\n callback();\n break;\n }\n\n case \"post\": {\n var params = {};\n\n if(action.all) {\n var items = this.modelManager.allItemsMatchingTypes(action.content_types);\n params.items = items.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n\n } else {\n params.item = this.outgoingParamsForItem(item, extension);\n }\n\n this.performPost(action, extension, params, function(response){\n callback(response);\n });\n\n break;\n }\n\n default: {\n\n }\n }\n\n action.lastExecuted = new Date();\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n _.pull(this.enabledRepeatActionUrls, action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n this.modelManager.removeItemChangeObserver(action.url);\n\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n if(!_.find(this.enabledRepeatActionUrls, action.url)) {\n this.enabledRepeatActionUrls.push(action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n }\n\n if(action.repeat_mode) {\n\n if(action.repeat_mode == \"watch\") {\n this.modelManager.addItemChangeObserver(action.url, action.content_types, function(changedItems){\n this.triggerWatchAction(action, extension, changedItems);\n }.bind(this))\n }\n\n if(action.repeat_mode == \"loop\") {\n // todo\n }\n\n }\n }\n\n queueAction(action, extension, delay, changedItems) {\n this.actionQueue = this.actionQueue || [];\n if(_.find(this.actionQueue, {url: action.url})) {\n return;\n }\n\n // console.log(\"Successfully queued\", action, this.actionQueue.length);\n this.actionQueue.push(action);\n\n setTimeout(function () {\n // console.log(\"Performing queued action\", action);\n this.triggerWatchAction(action, extension, changedItems);\n _.pull(this.actionQueue, action);\n }.bind(this), delay * 1000);\n }\n\n triggerWatchAction(action, extension, changedItems) {\n if(action.repeat_timeout > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeat_timeout) {\n var delay = action.repeat_timeout - diffInSeconds;\n this.queueAction(action, extension, delay, changedItems);\n return;\n }\n }\n\n action.lastExecuted = new Date();\n\n console.log(\"Performing action.\");\n\n if(action.verb == \"post\") {\n var params = {};\n params.items = changedItems.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n this.performPost(action, extension, params, null);\n } else {\n // todo\n }\n }\n\n outgoingParamsForItem(item, extension) {\n return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));\n }\n\n performPost(action, extension, params, callback) {\n var request = this.Restangular.oneUrl(action.url, action.url);\n if(this.extensionUsesEncryptedData(extension)) {\n request.auth_params = this.apiController.getAuthParams();\n }\n _.merge(request, params);\n\n request.post().then(function(response){\n action.error = false;\n if(callback) {\n callback(response.plain());\n }\n })\n .catch(function(response){\n action.error = true;\n console.log(\"Action error response:\", response);\n if(callback) {\n callback({error: \"Request error\"});\n }\n })\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager {\n\n constructor() {\n this.notes = [];\n this.tags = [];\n this.itemSyncObservers = [];\n this.itemChangeObservers = [];\n this.items = [];\n this._extensions = [];\n }\n\n get allItems() {\n return this.items.filter(function(item){\n return !item.dummy;\n })\n }\n\n get extensions() {\n return this._extensions.filter(function(ext){\n return !ext.deleted;\n })\n }\n\n allItemsMatchingTypes(contentTypes) {\n return this.items.filter(function(item){\n return (contentTypes.includes(item.content_type) || contentTypes.includes(\"*\")) && !item.dummy;\n })\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null);\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.removeItemLocally(item)\n }\n continue;\n }\n\n _.omit(json_obj, omitFields);\n\n if(!item) {\n item = this.createItem(json_obj);\n } else {\n item.updateFromJSON(json_obj);\n }\n\n this.addItem(item);\n\n if(json_obj.content) {\n this.resolveReferencesForItem(item)\n }\n\n models.push(item)\n }\n\n this.notifySyncObserversOfModels(models);\n\n this.sortItems();\n return models;\n }\n\n notifySyncObserversOfModels(models) {\n for(var observer of this.itemSyncObservers) {\n var relevantItems = models.filter(function(item){return item.content_type == observer.type});\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n notifyItemChangeObserversOfModels(models) {\n for(var observer of this.itemChangeObservers) {\n var relevantItems = models.filter(function(item){\n return observer.content_types.includes(item.content_type) || observer.content_types.includes(\"*\");\n });\n\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n createItem(json_obj) {\n var item;\n if(json_obj.content_type == \"Note\") {\n item = new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n item = new Tag(json_obj);\n } else if(json_obj.content_type == \"Extension\") {\n item = new Extension(json_obj);\n } else {\n item = new Item(json_obj);\n }\n\n item.addObserver(this, function(changedItem){\n this.notifyItemChangeObserversOfModels([changedItem]);\n }.bind(this));\n\n return item;\n }\n\n addItems(items) {\n this.items = _.uniq(this.items.concat(items));\n\n items.forEach(function(item){\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, {uuid: item.uuid})) {\n this.tags.unshift(item);\n }\n } else if(item.content_type == \"Note\") {\n if(!_.find(this.notes, {uuid: item.uuid})) {\n this.notes.unshift(item);\n }\n } else if(item.content_type == \"Extension\") {\n if(!_.find(this._extensions, {uuid: item.uuid})) {\n this._extensions.unshift(item);\n }\n }\n }.bind(this))\n }\n\n addItem(item) {\n this.addItems([item])\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n resolveReferencesForItem(item) {\n var contentObject = item.contentObject;\n if(!contentObject.references) {\n return;\n }\n\n for(var reference of contentObject.references) {\n var referencedItem = this.findItem(reference.uuid);\n if(referencedItem) {\n item.addItemAsRelationship(referencedItem);\n referencedItem.addItemAsRelationship(item);\n } else {\n // console.log(\"Unable to find item:\", reference.uuid);\n }\n }\n }\n\n sortItems() {\n Item.sortItemsByDate(this.notes);\n\n this.tags.forEach(function(tag){\n Item.sortItemsByDate(tag.notes);\n })\n }\n\n addItemSyncObserver(id, type, callback) {\n this.itemSyncObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemSyncObserver(id) {\n _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));\n }\n\n addItemChangeObserver(id, content_types, callback) {\n this.itemChangeObservers.push({id: id, content_types: content_types, callback: callback});\n }\n\n removeItemChangeObserver(id) {\n _.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, {id: id}));\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n getDirtyItems() {\n return this.items.filter(function(item){return item.dirty == true && !item.dummy})\n }\n\n clearDirtyItems() {\n this.getDirtyItems().forEach(function(item){\n item.setDirty(false);\n })\n }\n\n setItemToBeDeleted(item) {\n item.deleted = true;\n if(!item.dummy) {\n item.setDirty(true);\n }\n item.removeAllRelationships();\n }\n\n removeItemLocally(item) {\n _.pull(this.items, item);\n\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n } else if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n } else if(item.content_type == \"Extension\") {\n _.pull(this._extensions, item);\n }\n }\n\n /*\n Relationships\n */\n\n createRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.addItemAsRelationship(itemTwo);\n itemTwo.addItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n\n removeRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.removeItemAsRelationship(itemTwo);\n itemTwo.removeItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file +{"version":3,"sources":["app.js"],"names":["SNCrypto","CryptoJS","lib","WordArray","random","toString","crypto","window","msCrypto","buf","Uint32Array","getRandomValues","idx","replace","c","r","v","d","Date","getTime","performance","now","uuid","Math","floor","encrypted_content","key","keyData","enc","Hex","parse","ivData","decrypted","AES","decrypt","iv","mode","CBC","padding","pad","Pkcs7","Utf8","text","encrypted","encrypt","salt","Neeto","generateRandomKey","passphrase","PBKDF2","keySize","substring","length","Base64","base64String","SHA256","SHA1","message","messageData","HmacSHA256","password","pw_salt","pw_func","pw_alg","pw_cost","pw_key_size","callback","generateSymmetricKeyPair","keys","pw","mk","email","defaults","defaultPasswordGenerationParams","pw_nonce","sha1","_","merge","SNCryptoJS","algMapping","algo","SHA512","fnMapping","alg","kdf","output","hasher","iterations","outputLength","firstHalf","slice","secondHalf","subtleCrypto","subtle","SNCryptoWeb","stretchPassword","webCryptoImportKey","console","log","webCryptoDeriveBits","bind","input","importKey","stringToArrayBuffer","name","toUpperCase","then","catch","err","error","deriveBits","hash","bits","arrayBufferToHexString","Uint8Array","string","encoder","TextEncoder","encode","arrayBuffer","byteArray","hexString","nextHexByte","i","byteLength","angular","module","config","RestangularProvider","apiControllerProvider","setDefaultHeaders","url","defaultServerURL","setBaseUrl","setFullRequestInterceptor","element","operation","route","headers","params","httpConfig","token","localStorage","getItem","extend","Authorization","$qProvider","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","getCurrentUser","directive","$timeout","restrict","scope","save","remove","note","controllerAs","bindToController","link","elem","attrs","ctrl","handler","event","ctrlKey","metaKey","String","fromCharCode","which","toLowerCase","preventDefault","saveNote","clickedEditNote","toggleMarkdown","toggleFullScreen","addEventListener","$on","removeEventListener","$watch","oldNote","setNote","$sce","markdownRenderer","extensionManager","editorMode","safeText","dummy","focusTitle","hasChanges","hasAvailableExtensions","extensionsInContextOfItem","onPreviewDoubleClick","focusEditor","delay","setTimeout","document","getElementById","focus","clickedTextArea","showMenu","renderedContent","renderHtml","renderedContentForText","statusTimeout","$event","success","clearDraft","cancel","noteStatus","saveTitle","target","blur","saveTimeout","changesMade","isUserSignedIn","saveDraftToDisk","contentChanged","nameChanged","onNameFocus","editingName","onContentFocus","showSampler","$broadcast","editingUrl","onNameBlur","fullscreen","selectedMenuItem","editUrlPressed","publicUrlForNote","presentation_name","base","saveUrl","original","setDirty","sync","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","logout","syncUpdated","$state","serverSideValidation","user","changePasswordPressed","showNewPasswordForm","accountMenuPressed","serverData","getServer","showAccountMenu","showFaq","showExtensionsMenu","toggleExtensions","toggleExtensionForm","newExtensionData","showNewExtensionForm","submitNewExtensionForm","addExtension","selectedAction","action","extension","running","executeAction","deleteExtension","confirm","reloadExtensionsPressed","refreshExtensionsFromServer","changeServer","setServer","signOutPressed","signout","location","reload","submitPasswordChange","passwordChangeData","status","data","password_confirmation","changePassword","current_password","new_password","hasLocalData","filteredNotes","mergeLocalChanged","shouldMerge","refreshData","isRefreshing","lastSyncDate","loginSubmitPressed","loginData","login","user_password","onAuthSuccess","submitRegistrationForm","register","encryptionStatusForNotes","allNotes","countEncrypted","forEach","encryptionEnabled","archiveEncryptionFormat","downloadDataArchive","setAttribute","itemsDataFile","performImport","importJSONData","importData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","allTag","Tag","all","title","tags","notes","setInterval","updateAllTag","tagsWillMakeSelection","tag","tagsSelectionMade","selectedTag","selectedNote","removeItemLocally","tagsAddNew","addItem","tagsSave","tagsUpdateNoteTag","noteCopy","newTag","oldTag","originalNote","find","createRelationshipBetweenItems","notesRemoveTag","validNotes","Note","filterDummyNotes","setItemToBeDeleted","notesSelectionMade","notesAddNew","didShowErrorAlert","headerLogout","clearLocalStorage","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","includes","filterTextChanged","willSelect","updateNoteTag","newTags","setTags","setAllTag","initialLoad","selectTag","clickedAddNewTag","editingTag","originalTagName","onTagTitleFocus","tagTitleDidChange","saveTag","savedTag","noteCount","handleDrop","Restangular","formData","saveUsername","setUsername","username","closeThisDialog","Item","json_obj","updateFromJSON","observers","generateUUID","json","created_at","updated_at","content","mapContentToLocalProperties","contentObject","dirty","notifyObserversOfChange","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","items","sort","b","Action","lastExecuted","permissions","permission","charAt","content_types","contentType","verb","encryptionMode","accepts_encrypted","accepts_decrypted","Extension","actions","context","map","externalResponseItem","pull","hasOnePublicTag","isPublic","filtered","unshift","provider","domainName","domain_comps","hostname","split","domain","$get","ngDialog","ApiController","syncToken","refresh","setItem","getAuthParams","userId","getAuthParamsForEmail","request","one","plain","authParams","computeEncryptionKeysForUser","setMk","post","stringify","generateInitialEncryptionKeysForUser","_performPasswordChange","current_keys","new_keys","patch","setSyncToken","syncWithOptions","options","writeAllItemsToLocalStorage","responseItems","dirtyItems","getDirtyItems","deleted","clearDirtyItems","createRequestParamsForItem","additionalFields","sync_token","handleItemsResponse","retrieved_items","omitFields","saved_items","handleUnsavedItemsResponse","unsaved","undefined","mapping","itemResponse","findItem","alternateUUID","allReferencedObjects","reference","decryptItems","mapResponseItemsToLocalModelsOmittingFields","paramsForItem","paramsForExportFile","paramsForExtension","forExportFile","itemCopy","cloneDeep","assert","encryptSingleItem","retrieveMk","auth_hash","createContentJSONFromProperties","base64","pick","shareFn","needsUpdate","concat","referencesAffectedBySharingChange","needingUpdate","open","template","resolve","className","disableAnimation","onDataReady","mapResponseItemsToLocalModels","allItems","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","removeItem","staticifyObject","object","writeToLocalStorage","value","toJson","sortItemsByDate","draftString","jsonObj","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","saveBatchItems","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","$apply","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","linkFunction","$attrs","timer","initialDelay","getTypeDelay","typeDelay","eraseDelay","blinkDelay","getAnimationDelay","cursor","blinkCursor","currentText","textArray","auxStyle","Array","start","typewrite","updateIt","charIndex","arrIndex","updateValue","iterationCallback","cleanAndRestart","iterationDelay","callbackFn","blinkIt","prebeginFn","parseInt","prop","val","html","newVal","oldVal","ExtensionManager","enabledRepeatActionUrls","decryptedExtensions","addItemSyncObserver","ext","enableRepeatAction","actionsWithContextForItem","retrieveExtensionFromServer","repeat_mode","isRepeatActionEnabled","disableRepeatAction","oneUrl","handleExtensionLoadExternalResponseItem","updateFromExternalResponseItem","actionWithURL","win","outgoingParamsForItem","performPost","removeItemChangeObserver","addItemChangeObserver","changedItems","triggerWatchAction","actionQueue","repeat_timeout","diffInSeconds","queueAction","service","$filter","marked","setOptions","breaks","sanitize","html_code","trustAsHtml","ModelManager","itemSyncObservers","itemChangeObservers","_extensions","contentTypes","itemId","models","resolveReferencesForItem","notifySyncObserversOfModels","sortItems","relevantItems","addObserver","changedItem","notifyItemChangeObserversOfModels","uniq","addItems","referencedItem","addItemAsRelationship","id","removeAllRelationships","itemOne","itemTwo","removeItemAsRelationship","showErrors","formErrors","form","errors","$setDirty","$setValidity","$error","server","join","parseErrors"],"mappings":"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","file":"transpiled.js","sourcesContent":["class SNCrypto {\n\n generateRandomKey() {\n return CryptoJS.lib.WordArray.random(512/8).toString();\n }\n\n generateUUID() {\n var crypto = window.crypto || window.msCrypto;\n if(crypto) {\n var buf = new Uint32Array(4);\n crypto.getRandomValues(buf);\n var idx = -1;\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n idx++;\n var r = (buf[idx>>3] >> ((idx%8)*4))&15;\n var v = c == 'x' ? r : (r&0x3|0x8);\n return v.toString(16);\n });\n } else {\n var d = new Date().getTime();\n if(window.performance && typeof window.performance.now === \"function\"){\n d += performance.now(); //use high-precision timer if available\n }\n var uuid = 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {\n var r = (d + Math.random()*16)%16 | 0;\n d = Math.floor(d/16);\n return (c=='x' ? r : (r&0x3|0x8)).toString(16);\n });\n return uuid;\n }\n }\n\n decryptText(encrypted_content, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var decrypted = CryptoJS.AES.decrypt(encrypted_content, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return decrypted.toString(CryptoJS.enc.Utf8);\n }\n\n encryptText(text, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var ivData = CryptoJS.enc.Hex.parse(\"\");\n var encrypted = CryptoJS.AES.encrypt(text, keyData, { iv: ivData, mode: CryptoJS.mode.CBC, padding: CryptoJS.pad.Pkcs7 });\n return encrypted.toString();\n }\n\n generateRandomEncryptionKey() {\n var salt = Neeto.crypto.generateRandomKey();\n var passphrase = Neeto.crypto.generateRandomKey();\n return CryptoJS.PBKDF2(passphrase, salt, { keySize: 512/32 }).toString();\n }\n\n firstHalfOfKey(key) {\n return key.substring(0, key.length/2);\n }\n\n secondHalfOfKey(key) {\n return key.substring(key.length/2, key.length);\n }\n\n base64(text) {\n return CryptoJS.enc.Utf8.parse(text).toString(CryptoJS.enc.Base64)\n }\n\n base64Decode(base64String) {\n return CryptoJS.enc.Base64.parse(base64String).toString(CryptoJS.enc.Utf8)\n }\n\n sha256(text) {\n return CryptoJS.SHA256(text).toString();\n }\n\n sha1(text) {\n return CryptoJS.SHA1(text).toString();\n }\n\n hmac256(message, key) {\n var keyData = CryptoJS.enc.Hex.parse(key);\n var messageData = CryptoJS.enc.Utf8.parse(message);\n return CryptoJS.HmacSHA256(messageData, keyData).toString();\n }\n\n computeEncryptionKeysForUser({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.generateSymmetricKeyPair({password: password, pw_salt: pw_salt,\n pw_func: pw_func, pw_alg: pw_alg, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk});\n });\n }\n\n generateInitialEncryptionKeysForUser({email, password} = {}, callback) {\n var defaults = this.defaultPasswordGenerationParams();\n var {pw_func, pw_alg, pw_key_size, pw_cost} = defaults;\n var pw_nonce = this.generateRandomKey();\n var pw_salt = this.sha1(email + \"SN\" + pw_nonce);\n _.merge(defaults, {pw_salt: pw_salt, pw_nonce: pw_nonce})\n this.generateSymmetricKeyPair(_.merge({email: email, password: password, pw_salt: pw_salt}, defaults), function(keys){\n var pw = keys[0];\n var mk = keys[1];\n\n callback({pw: pw, mk: mk}, defaults);\n });\n }\n}\n\nexport { SNCrypto }\n;class SNCryptoJS extends SNCrypto {\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : CryptoJS.algo.SHA256,\n \"sha512\" : CryptoJS.algo.SHA512\n }\n var fnMapping = {\n \"pbkdf2\" : CryptoJS.PBKDF2\n }\n\n var alg = algMapping[pw_alg];\n var kdf = fnMapping[pw_func];\n var output = kdf(password, pw_salt, { keySize: pw_key_size/32, hasher: alg, iterations: pw_cost }).toString();\n\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf])\n }\n\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 3000};\n }\n }\n\n\nexport { SNCryptoJS }\n;var subtleCrypto = window.crypto.subtle;\n\nclass SNCryptoWeb extends SNCrypto {\n\n /**\n Overrides\n */\n defaultPasswordGenerationParams() {\n return {pw_func: \"pbkdf2\", pw_alg: \"sha512\", pw_key_size: 512, pw_cost: 5000};\n }\n\n /** Generates two deterministic keys based on one input */\n generateSymmetricKeyPair({password, pw_salt, pw_func, pw_alg, pw_cost, pw_key_size} = {}, callback) {\n this.stretchPassword({password: password, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(output){\n var outputLength = output.length;\n var firstHalf = output.slice(0, outputLength/2);\n var secondHalf = output.slice(outputLength/2, outputLength);\n callback([firstHalf, secondHalf]);\n })\n }\n\n /**\n Internal\n */\n\n stretchPassword({password, pw_salt, pw_cost, pw_func, pw_alg, pw_key_size} = {}, callback) {\n\n this.webCryptoImportKey(password, pw_func, function(key){\n\n if(!key) {\n console.log(\"Key is null, unable to continue\");\n callback(null);\n return;\n }\n\n this.webCryptoDeriveBits({key: key, pw_func: pw_func, pw_alg: pw_alg, pw_salt: pw_salt, pw_cost: pw_cost, pw_key_size: pw_key_size}, function(key){\n if(!key) {\n callback(null);\n return;\n }\n\n callback(key);\n\n }.bind(this))\n }.bind(this))\n }\n\n webCryptoImportKey(input, pw_func, callback) {\n subtleCrypto.importKey(\n \"raw\",\n this.stringToArrayBuffer(input),\n {name: pw_func.toUpperCase()},\n false,\n [\"deriveBits\"]\n )\n .then(function(key){\n callback(key);\n })\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n webCryptoDeriveBits({key, pw_func, pw_alg, pw_salt, pw_cost, pw_key_size} = {}, callback) {\n var algMapping = {\n \"sha256\" : \"SHA-256\",\n \"sha512\" : \"SHA-512\",\n }\n var alg = algMapping[pw_alg];\n subtleCrypto.deriveBits(\n {\n \"name\": pw_func.toUpperCase(),\n salt: this.stringToArrayBuffer(pw_salt),\n iterations: pw_cost,\n hash: {name: alg},\n },\n key,\n pw_key_size\n )\n .then(function(bits){\n var key = this.arrayBufferToHexString(new Uint8Array(bits));\n callback(key);\n }.bind(this))\n .catch(function(err){\n console.error(err);\n callback(null);\n });\n }\n\n stringToArrayBuffer(string) {\n var encoder = new TextEncoder(\"utf-8\");\n return encoder.encode(string);\n }\n\n arrayBufferToHexString(arrayBuffer) {\n var byteArray = new Uint8Array(arrayBuffer);\n var hexString = \"\";\n var nextHexByte;\n\n for (var i=0; i 0;\n }\n\n this.onPreviewDoubleClick = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n this.focusEditor = function(delay) {\n setTimeout(function(){\n var element = document.getElementById(\"note-text-editor\");\n element.focus();\n }, delay)\n }\n\n this.focusTitle = function(delay) {\n setTimeout(function(){\n document.getElementById(\"note-title-editor\").focus();\n }, delay)\n }\n\n this.clickedTextArea = function() {\n this.showMenu = false;\n }\n\n this.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText(this.note.safeText()));\n }\n\n var statusTimeout;\n\n this.saveNote = function($event) {\n var note = this.note;\n note.dummy = false;\n this.save()(note, function(success){\n if(success) {\n apiController.clearDraft();\n\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"All changes saved\"\n }.bind(this), 200)\n } else {\n if(statusTimeout) $timeout.cancel(statusTimeout);\n statusTimeout = $timeout(function(){\n this.noteStatus = \"(Offline) — All changes saved\"\n }.bind(this), 200)\n }\n }.bind(this));\n }\n\n this.saveTitle = function($event) {\n $event.target.blur();\n this.saveNote($event);\n this.focusEditor();\n }\n\n var saveTimeout;\n this.changesMade = function() {\n this.note.hasChanges = true;\n this.note.dummy = false;\n if(apiController.isUserSignedIn()) {\n // signed out users have local autosave, dont need draft saving\n apiController.saveDraftToDisk(this.note);\n }\n\n if(saveTimeout) $timeout.cancel(saveTimeout);\n if(statusTimeout) $timeout.cancel(statusTimeout);\n saveTimeout = $timeout(function(){\n this.noteStatus = \"Saving...\";\n this.saveNote();\n }.bind(this), 150)\n }\n\n\n this.contentChanged = function() {\n this.changesMade();\n }\n\n this.nameChanged = function() {\n this.changesMade();\n }\n\n this.onNameFocus = function() {\n this.editingName = true;\n }\n\n this.onContentFocus = function() {\n this.showSampler = false;\n $rootScope.$broadcast(\"editorFocused\");\n this.editingUrl = false;\n }\n\n this.onNameBlur = function() {\n this.editingName = false;\n }\n\n this.toggleFullScreen = function() {\n this.fullscreen = !this.fullscreen;\n if(this.fullscreen) {\n if(this.editorMode == 'edit') {\n // refocus\n this.focusEditor(0);\n }\n } else {\n\n }\n }\n\n this.selectedMenuItem = function() {\n this.showMenu = false;\n }\n\n this.toggleMarkdown = function() {\n if(this.editorMode == 'preview') {\n this.editorMode = 'edit';\n } else {\n this.editorMode = 'preview';\n }\n }\n\n this.editUrlPressed = function() {\n this.showMenu = false;\n var url = this.publicUrlForNote(this.note);\n url = url.replace(this.note.presentation_name, \"\");\n this.url = {base: url, token : this.note.presentation_name};\n this.editingUrl = true;\n }\n\n this.saveUrl = function($event) {\n $event.target.blur();\n\n var original = this.note.presentation_name;\n this.note.presentation_name = this.url.token;\n this.note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n this.note.presentation_name = original;\n this.url.token = original;\n alert(\"This URL is not available.\");\n } else {\n this.editingUrl = false;\n }\n }.bind(this))\n }\n\n this.shareNote = function() {\n\n function openInNewTab(url) {\n var a = document.createElement(\"a\");\n a.target = \"_blank\";\n a.href = url;\n a.click();\n }\n\n apiController.shareItem(this.note, function(note){\n openInNewTab(this.publicUrlForNote(note));\n }.bind(this))\n this.showMenu = false;\n }\n\n this.unshareNote = function() {\n apiController.unshareItem(this.note, function(note){\n\n })\n this.showMenu = false;\n }\n\n this.publicUrlForNote = function() {\n return this.note.presentationURL();\n }\n\n this.clickedMenu = function() {\n if(this.note.locked) {\n alert(\"This note has been shared without an account, and can therefore not be changed.\")\n } else {\n this.showMenu = !this.showMenu;\n }\n }\n\n this.deleteNote = function() {\n apiController.clearDraft();\n this.remove()(this.note);\n this.showMenu = false;\n }\n\n this.clickedEditNote = function() {\n this.editorMode = 'edit';\n this.focusEditor(100);\n }\n\n });\n;angular.module('app.frontend')\n .directive(\"header\", function(apiController, extensionManager){\n return {\n restrict: 'E',\n scope: {\n logout: \"&\"\n },\n templateUrl: 'frontend/header.html',\n replace: true,\n controller: 'HeaderCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$on(\"sync:updated_token\", function(){\n ctrl.syncUpdated();\n })\n }\n }\n })\n .controller('HeaderCtrl', function ($state, apiController, modelManager, serverSideValidation, $timeout, extensionManager) {\n\n this.user = apiController.user;\n this.extensionManager = extensionManager;\n\n this.changePasswordPressed = function() {\n this.showNewPasswordForm = !this.showNewPasswordForm;\n }\n\n this.accountMenuPressed = function() {\n this.serverData = {url: apiController.getServer()};\n this.showAccountMenu = !this.showAccountMenu;\n this.showFaq = false;\n this.showNewPasswordForm = false;\n this.showExtensionsMenu = false;\n }\n\n this.toggleExtensions = function() {\n this.showAccountMenu = false;\n this.showExtensionsMenu = !this.showExtensionsMenu;\n }\n\n this.toggleExtensionForm = function() {\n this.newExtensionData = {};\n this.showNewExtensionForm = !this.showNewExtensionForm;\n }\n\n this.submitNewExtensionForm = function() {\n if(this.newExtensionData.url) {\n extensionManager.addExtension(this.newExtensionData.url, function(response){\n if(!response) {\n alert(\"Unable to register this extension. Make sure the link is valid and try again.\");\n } else {\n this.newExtensionData.url = \"\";\n this.showNewExtensionForm = false;\n }\n }.bind(this))\n }\n }\n\n this.selectedAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, null, function(response){\n action.running = false;\n if(response && response.error) {\n action.error = true;\n alert(\"There was an error performing this action. Please try again.\");\n } else {\n action.error = false;\n apiController.sync(null);\n }\n })\n }\n\n this.deleteExtension = function(extension) {\n if(confirm(\"Are you sure you want to delete this extension?\")) {\n extensionManager.deleteExtension(extension);\n }\n }\n\n this.reloadExtensionsPressed = function() {\n if(confirm(\"For your security, reloading extensions will disable any currently enabled repeat actions.\")) {\n extensionManager.refreshExtensionsFromServer();\n }\n }\n\n this.changeServer = function() {\n apiController.setServer(this.serverData.url, true);\n }\n\n this.signOutPressed = function() {\n this.showAccountMenu = false;\n this.logout()();\n apiController.signout();\n window.location.reload();\n }\n\n this.submitPasswordChange = function() {\n this.passwordChangeData.status = \"Generating New Keys...\";\n\n $timeout(function(){\n if(data.password != data.password_confirmation) {\n alert(\"Your new password does not match its confirmation.\");\n return;\n }\n\n apiController.changePassword(this.passwordChangeData.current_password, this.passwordChangeData.new_password, function(response){\n\n })\n\n }.bind(this))\n }\n\n this.hasLocalData = function() {\n return modelManager.filteredNotes.length > 0;\n }\n\n this.mergeLocalChanged = function() {\n if(!this.user.shouldMerge) {\n if(!confirm(\"Unchecking this option means any locally stored tags and notes you have now will be deleted. Are you sure you want to continue?\")) {\n this.user.shouldMerge = true;\n }\n }\n }\n\n this.refreshData = function() {\n this.isRefreshing = true;\n apiController.sync(function(response){\n $timeout(function(){\n this.isRefreshing = false;\n }.bind(this), 200)\n if(response && response.error) {\n alert(\"There was an error syncing. Please try again. If all else fails, log out and log back in.\");\n } else {\n this.syncUpdated();\n }\n }.bind(this));\n }\n\n this.syncUpdated = function() {\n this.lastSyncDate = new Date();\n }\n\n this.loginSubmitPressed = function() {\n this.loginData.status = \"Generating Login Keys...\";\n $timeout(function(){\n apiController.login(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.submitRegistrationForm = function() {\n this.loginData.status = \"Generating Account Keys...\";\n\n $timeout(function(){\n apiController.register(this.loginData.email, this.loginData.user_password, function(response){\n if(!response || response.error) {\n var error = response ? response.error : {message: \"An unknown error occured.\"}\n this.loginData.status = null;\n alert(error.message);\n } else {\n this.onAuthSuccess(response.user);\n }\n }.bind(this));\n }.bind(this))\n }\n\n this.encryptionStatusForNotes = function() {\n var allNotes = modelManager.filteredNotes;\n var countEncrypted = 0;\n allNotes.forEach(function(note){\n if(note.encryptionEnabled()) {\n countEncrypted++;\n }\n }.bind(this))\n\n return countEncrypted + \"/\" + allNotes.length + \" notes encrypted\";\n }\n\n this.archiveEncryptionFormat = {encrypted: true};\n\n this.downloadDataArchive = function() {\n var link = document.createElement('a');\n link.setAttribute('download', 'notes.json');\n link.href = apiController.itemsDataFile(this.archiveEncryptionFormat.encrypted);\n link.click();\n }\n\n this.performImport = function(data, password) {\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"import response\", success, response);\n if(success) {\n this.importData = null;\n } else {\n alert(\"There was an error importing your data. Please try again.\");\n }\n }.bind(this))\n }\n\n this.submitImportPassword = function() {\n this.performImport(this.importData.data, this.importData.password);\n }\n\n this.importFileSelected = function(files) {\n this.importData = {};\n\n var file = files[0];\n var reader = new FileReader();\n reader.onload = function(e) {\n var data = JSON.parse(e.target.result);\n $timeout(function(){\n if(data.auth_params) {\n // request password\n this.importData.requestPassword = true;\n this.importData.data = data;\n } else {\n this.performImport(data, null);\n }\n }.bind(this))\n }.bind(this)\n\n reader.readAsText(file);\n }\n\n this.onAuthSuccess = function(user) {\n\n // if(this.user.shouldMerge && this.hasLocalData()) {\n // apiController.mergeLocalDataRemotely(this.user, function(){\n // window.location.reload();\n // });\n // } else {\n window.location.reload();\n // }\n\n this.showLogin = false;\n this.showRegistration = false;\n }\n\n });\n;angular.module('app.frontend')\n.controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) {\n $rootScope.bodyClass = \"app-body-class\";\n\n apiController.loadLocalItems();\n $scope.allTag = new Tag({all: true});\n $scope.allTag.title = \"All\";\n $scope.tags = modelManager.tags;\n $scope.allTag.notes = modelManager.notes;\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n\n /*\n Tags Ctrl Callbacks\n */\n\n $scope.updateAllTag = function() {\n // $scope.allTag.notes = modelManager.notes;\n }\n\n $scope.tagsWillMakeSelection = function(tag) {\n if(tag.all) {\n $scope.updateAllTag();\n }\n }\n\n $scope.tagsSelectionMade = function(tag) {\n $scope.selectedTag = tag;\n\n if($scope.selectedNote && $scope.selectedNote.dummy) {\n modelManager.removeItemLocally($scope.selectedNote);\n }\n }\n\n $scope.tagsAddNew = function(tag) {\n modelManager.addItem(tag);\n }\n\n $scope.tagsSave = function(tag, callback) {\n tag.setDirty(true);\n apiController.sync(callback);\n }\n\n /*\n Called to update the tag of a note after drag and drop change\n The note object is a copy of the original\n */\n $scope.tagsUpdateNoteTag = function(noteCopy, newTag, oldTag) {\n\n var originalNote = _.find(modelManager.notes, {uuid: noteCopy.uuid});\n if(!newTag.all) {\n modelManager.createRelationshipBetweenItems(newTag, originalNote);\n }\n\n apiController.sync(function(){});\n }\n\n /*\n Notes Ctrl Callbacks\n */\n\n $scope.notesRemoveTag = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n if(validNotes == 0) {\n modelManager.setItemToBeDeleted(tag);\n // if no more notes, delete tag\n apiController.sync(function(){\n // force scope tags to update on sub directives\n $scope.tags = [];\n $timeout(function(){\n $scope.tags = modelManager.tags;\n })\n });\n } else {\n alert(\"To delete this tag, remove all its notes first.\");\n }\n }\n\n $scope.notesSelectionMade = function(note) {\n $scope.selectedNote = note;\n }\n\n $scope.notesAddNew = function(note) {\n modelManager.addItem(note);\n\n if(!$scope.selectedTag.all) {\n modelManager.createRelationshipBetweenItems($scope.selectedTag, note);\n $scope.updateAllTag();\n }\n }\n\n /*\n Shared Callbacks\n */\n\n $scope.saveNote = function(note, callback) {\n note.setDirty(true);\n\n apiController.sync(function(response){\n if(response && response.error) {\n if(!$scope.didShowErrorAlert) {\n $scope.didShowErrorAlert = true;\n alert(\"There was an error saving your note. Please try again.\");\n }\n callback(false);\n } else {\n note.hasChanges = false;\n if(callback) {\n callback(true);\n }\n }\n })\n }\n\n $scope.deleteNote = function(note) {\n\n modelManager.setItemToBeDeleted(note);\n\n if(note == $scope.selectedNote) {\n $scope.selectedNote = null;\n }\n\n if(note.dummy) {\n modelManager.removeItemLocally(note);\n return;\n }\n\n apiController.sync(null);\n }\n\n /*\n Header Ctrl Callbacks\n */\n\n $scope.headerLogout = function() {\n apiController.clearLocalStorage();\n }\n\n\n});\n;angular.module('app.frontend')\n .directive(\"notesSection\", function(){\n return {\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n remove: \"&\",\n tag: \"=\",\n removeTag: \"&\"\n },\n\n templateUrl: 'frontend/notes.html',\n replace: true,\n controller: 'NotesCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tag', function(tag, oldTag){\n if(tag) {\n ctrl.tagDidChange(tag, oldTag);\n }\n });\n }\n }\n })\n .controller('NotesCtrl', function (apiController, $timeout, $rootScope, modelManager) {\n\n $rootScope.$on(\"editorFocused\", function(){\n this.showMenu = false;\n }.bind(this))\n\n var isFirstLoad = true;\n\n this.tagDidChange = function(tag, oldTag) {\n this.showMenu = false;\n\n if(this.selectedNote && this.selectedNote.dummy) {\n _.remove(oldTag.notes, this.selectedNote);\n }\n\n this.noteFilter.text = \"\";\n\n tag.notes.forEach(function(note){\n note.visible = true;\n })\n this.selectFirstNote(false);\n\n if(isFirstLoad) {\n $timeout(function(){\n var draft = apiController.getDraft();\n if(draft) {\n var note = draft;\n this.selectNote(note);\n } else {\n this.createNewNote();\n isFirstLoad = false;\n }\n }.bind(this))\n } else if(tag.notes.length == 0) {\n this.createNewNote();\n }\n }\n\n this.selectedTagDelete = function() {\n this.showMenu = false;\n this.removeTag()(this.tag);\n }\n\n this.selectedTagShare = function() {\n this.showMenu = false;\n\n if(!apiController.isUserSignedIn()) {\n alert(\"You must be signed in to share a tag.\");\n return;\n }\n\n if(this.tag.all) {\n alert(\"You cannot share the 'All' tag.\");\n return;\n }\n\n apiController.shareItem(this.tag, function(response){})\n }\n\n this.selectedTagUnshare = function() {\n this.showMenu = false;\n apiController.unshareItem(this.tag, function(response){\n\n })\n }\n\n this.selectFirstNote = function(createNew) {\n var visibleNotes = this.tag.notes.filter(function(note){\n return note.visible;\n });\n\n if(visibleNotes.length > 0) {\n this.selectNote(visibleNotes[0]);\n } else if(createNew) {\n this.createNewNote();\n }\n }\n\n this.selectNote = function(note) {\n this.selectedNote = note;\n this.selectionMade()(note);\n }\n\n this.createNewNote = function() {\n var title = \"New Note\" + (this.tag.notes ? (\" \" + (this.tag.notes.length + 1)) : \"\");\n this.newNote = modelManager.createItem({content_type: \"Note\", dummy: true, text: \"\"});\n this.newNote.title = title;\n this.selectNote(this.newNote);\n this.addNew()(this.newNote);\n }\n\n this.noteFilter = {text : ''};\n\n this.filterNotes = function(note) {\n if(this.noteFilter.text.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.title.toLowerCase().includes(this.noteFilter.text) || note.text.toLowerCase().includes(this.noteFilter.text);\n }\n return note.visible;\n }.bind(this)\n\n this.filterTextChanged = function() {\n $timeout(function(){\n if(!this.selectedNote.visible) {\n this.selectFirstNote(false);\n }\n }.bind(this), 100)\n }\n });\n;angular.module('app.frontend')\n .directive(\"tagsSection\", function(){\n return {\n restrict: 'E',\n scope: {\n addNew: \"&\",\n selectionMade: \"&\",\n willSelect: \"&\",\n save: \"&\",\n tags: \"=\",\n allTag: \"=\",\n updateNoteTag: \"&\"\n },\n templateUrl: 'frontend/tags.html',\n replace: true,\n controller: 'TagsCtrl',\n controllerAs: 'ctrl',\n bindToController: true,\n\n link:function(scope, elem, attrs, ctrl) {\n scope.$watch('ctrl.tags', function(newTags){\n if(newTags) {\n ctrl.setTags(newTags);\n }\n });\n\n scope.$watch('ctrl.allTag', function(allTag){\n if(allTag) {\n ctrl.setAllTag(allTag);\n }\n });\n }\n }\n })\n .controller('TagsCtrl', function (modelManager) {\n\n var initialLoad = true;\n\n this.setAllTag = function(allTag) {\n this.selectTag(this.allTag);\n }\n\n this.setTags = function(tags) {\n if(initialLoad) {\n initialLoad = false;\n this.selectTag(this.allTag);\n } else {\n if(tags && tags.length > 0) {\n this.selectTag(tags[0]);\n }\n }\n }\n\n this.selectTag = function(tag) {\n this.willSelect()(tag);\n this.selectedTag = tag;\n this.selectionMade()(tag);\n }\n\n this.clickedAddNewTag = function() {\n if(this.editingTag) {\n return;\n }\n\n this.newTag = modelManager.createItem({content_type: \"Tag\"});\n this.selectedTag = this.newTag;\n this.editingTag = this.newTag;\n this.addNew()(this.newTag);\n }\n\n var originalTagName = \"\";\n this.onTagTitleFocus = function(tag) {\n originalTagName = tag.title;\n }\n\n this.tagTitleDidChange = function(tag) {\n this.editingTag = tag;\n }\n\n this.saveTag = function($event, tag) {\n this.editingTag = null;\n if(tag.title.length == 0) {\n tag.title = originalTagName;\n originalTagName = \"\";\n return;\n }\n\n $event.target.blur();\n if(!tag.title || tag.title.length == 0) {\n return;\n }\n\n this.save()(tag, function(savedTag){\n // _.merge(tag, savedTag);\n this.selectTag(tag);\n this.newTag = null;\n }.bind(this));\n }\n\n this.noteCount = function(tag) {\n var validNotes = Note.filterDummyNotes(tag.notes);\n return validNotes.length;\n }\n\n this.handleDrop = function(e, newTag, note) {\n this.updateNoteTag()(note, newTag, this.selectedTag);\n }.bind(this)\n\n\n });\n;angular.module('app.frontend')\n.controller('UsernameModalCtrl', function ($scope, apiController, Restangular, callback, $timeout) {\n $scope.formData = {};\n\n $scope.saveUsername = function() {\n apiController.setUsername($scope.formData.username, function(response){\n var username = response.username;\n callback(username);\n $scope.closeThisDialog();\n })\n }\n});\n;class Item {\n\n constructor(json_obj) {\n\n this.updateFromJSON(json_obj);\n\n this.observers = [];\n\n if(!this.uuid) {\n this.uuid = Neeto.crypto.generateUUID();\n }\n }\n\n static sortItemsByDate(items) {\n items.sort(function(a,b){\n return new Date(b.created_at) - new Date(a.created_at);\n });\n }\n\n get contentObject() {\n if(!this.content) {\n return {};\n }\n\n if(this.content !== null && typeof this.content === 'object') {\n // this is the case when mapping localStorage content, in which case the content is already parsed\n return this.content;\n }\n\n return JSON.parse(this.content);\n }\n\n updateFromJSON(json) {\n _.merge(this, json);\n if(this.created_at) {\n this.created_at = new Date(this.created_at);\n this.updated_at = new Date(this.updated_at);\n } else {\n this.created_at = new Date();\n this.updated_at = new Date();\n }\n\n if(json.content) {\n this.mapContentToLocalProperties(this.contentObject);\n }\n }\n\n alternateUUID() {\n this.uuid = Neeto.crypto.generateUUID();\n }\n\n setDirty(dirty) {\n this.dirty = dirty;\n\n if(dirty) {\n this.notifyObserversOfChange();\n }\n }\n\n addObserver(observer, callback) {\n if(!_.find(this.observers, observer)) {\n this.observers.push({observer: observer, callback: callback});\n }\n }\n\n removeObserver(observer) {\n _.remove(this.observers, {observer: observer})\n }\n\n notifyObserversOfChange() {\n for(var observer of this.observers) {\n observer.callback(this);\n }\n }\n\n mapContentToLocalProperties(contentObj) {\n\n }\n\n createContentJSONFromProperties() {\n return this.structureParams();\n }\n\n referenceParams() {\n // must override\n }\n\n structureParams() {\n return {references: this.referenceParams()}\n }\n\n addItemAsRelationship(item) {\n // must override\n }\n\n removeItemAsRelationship(item) {\n // must override\n }\n\n removeAllRelationships() {\n // must override\n }\n\n mergeMetadataFromItem(item) {\n _.merge(this, _.omit(item, [\"content\"]));\n }\n\n allReferencedObjects() {\n // must override\n return [];\n }\n\n referencesAffectedBySharingChange() {\n // should be overriden to determine which references should be decrypted/encrypted\n return [];\n }\n\n isPublic() {\n return this.presentation_name;\n }\n\n isEncrypted() {\n return this.encryptionEnabled() && this.content.substring(0, 3) === '001' ? true : false;\n }\n\n encryptionEnabled() {\n return this.enc_item_key;\n }\n\n presentationURL() {\n return this.presentation_url;\n }\n\n}\n;class Action {\n constructor(json) {\n _.merge(this, json);\n this.running = false; // in case running=true was synced with server since model is uploaded nondiscriminatory\n this.error = false;\n if(this.lastExecuted) {\n // is string\n this.lastExecuted = new Date(this.lastExecuted);\n }\n }\n\n get permissionsString() {\n if(!this.permissions) {\n return \"\";\n }\n var permission = this.permissions.charAt(0).toUpperCase() + this.permissions.slice(1); // capitalize first letter\n permission += \": \";\n for(var contentType of this.content_types) {\n if(contentType == \"*\") {\n permission += \"All items\";\n } else {\n permission += contentType;\n }\n\n permission += \" \";\n }\n\n return permission;\n }\n\n get encryptionModeString() {\n if(this.verb != \"post\") {\n return null;\n }\n var encryptionMode = \"This action accepts data \";\n if(this.accepts_encrypted && this.accepts_decrypted) {\n encryptionMode += \"encrypted or decrypted.\";\n } else {\n if(this.accepts_encrypted) {\n encryptionMode += \"encrypted.\";\n } else {\n encryptionMode += \"decrypted.\";\n }\n }\n return encryptionMode;\n }\n\n}\n\nclass Extension extends Item {\n constructor(json) {\n super(json);\n _.merge(this, json);\n\n this.encrypted = true;\n this.content_type = \"Extension\";\n }\n\n actionsInGlobalContext() {\n return this.actions.filter(function(action){\n return action.context == \"global\";\n })\n }\n\n actionsWithContextForItem(item) {\n return this.actions.filter(function(action){\n return action.context == item.content_type || action.context == \"Item\";\n })\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.name = contentObject.name;\n this.url = contentObject.url;\n this.actions = contentObject.actions.map(function(action){\n return new Action(action);\n })\n }\n\n updateFromExternalResponseItem(externalResponseItem) {\n _.merge(this, externalResponseItem);\n this.actions = externalResponseItem.actions.map(function(action){\n return new Action(action);\n })\n }\n\n referenceParams() {\n return null;\n }\n\n structureParams() {\n var params = {\n name: this.name,\n url: this.url,\n actions: this.actions\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n}\n;class Note extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.tags) {\n this.tags = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n this.text = contentObject.text;\n }\n\n referenceParams() {\n var references = _.map(this.tags, function(tag){\n return {uuid: tag.uuid, content_type: tag.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title,\n text: this.text\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, item)) {\n this.tags.push(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.tags.forEach(function(tag){\n _.pull(tag.notes, this);\n tag.setDirty(true);\n }.bind(this))\n this.tags = [];\n }\n\n static filterDummyNotes(notes) {\n var filtered = notes.filter(function(note){return note.dummy == false || note.dummy == null});\n return filtered;\n }\n\n allReferencedObjects() {\n return this.tags;\n }\n\n referencesAffectedBySharingChange() {\n return super.referencesAffectedBySharingChange();\n }\n\n get hasOnePublicTag() {\n for (var tag of this.tags) {\n if(tag.isPublic()) {\n return true\n }\n }\n return false;\n }\n\n safeText() {\n return this.text || \"\";\n }\n\n safeTitle() {\n return this.title || \"\";\n }\n\n toJSON() {\n return {uuid: this.uuid}\n }\n\n isSharedIndividually() {\n return this.presentation_name;\n }\n\n isPublic() {\n return super.isPublic() || this.hasOnePublicTag;\n }\n\n get content_type() {\n return \"Note\";\n }\n}\n;class Tag extends Item {\n\n constructor(json_obj) {\n super(json_obj);\n\n if(!this.notes) {\n this.notes = [];\n }\n }\n\n mapContentToLocalProperties(contentObject) {\n super.mapContentToLocalProperties(contentObject)\n this.title = contentObject.title;\n }\n\n referenceParams() {\n var references = _.map(this.notes, function(note){\n return {uuid: note.uuid, content_type: note.content_type};\n })\n\n return references;\n }\n\n structureParams() {\n var params = {\n title: this.title\n };\n\n _.merge(params, super.structureParams());\n return params;\n }\n\n addItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n if(!_.find(this.notes, item)) {\n this.notes.unshift(item);\n }\n }\n super.addItemAsRelationship(item);\n }\n\n removeItemAsRelationship(item) {\n if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n }\n super.removeItemAsRelationship(item);\n }\n\n removeAllRelationships() {\n this.notes.forEach(function(note){\n _.pull(note.tags, this);\n note.setDirty(true);\n }.bind(this))\n\n this.notes = [];\n }\n\n get content_type() {\n return \"Tag\";\n }\n\n allReferencedObjects() {\n return this.notes;\n }\n\n referencesAffectedBySharingChange() {\n return this.notes;\n }\n}\n;angular.module('app.frontend')\n .provider('apiController', function () {\n\n function domainName() {\n var domain_comps = location.hostname.split(\".\");\n var domain = domain_comps[domain_comps.length - 2] + \".\" + domain_comps[domain_comps.length - 1];\n return domain;\n }\n\n var url;\n\n this.defaultServerURL = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n }\n }\n return url;\n }\n\n\n this.$get = function($rootScope, Restangular, modelManager, ngDialog) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog) {\n\n this.user = {};\n this.syncToken = localStorage.getItem(\"syncToken\");\n\n /*\n Config\n */\n\n this.getServer = function() {\n if(!url) {\n url = localStorage.getItem(\"server\");\n if(!url) {\n url = \"https://n3.standardnotes.org\";\n this.setServer(url);\n }\n }\n return url;\n }\n\n this.setServer = function(url, refresh) {\n localStorage.setItem(\"server\", url);\n if(refresh) {\n window.location.reload();\n }\n }\n\n\n /*\n Auth\n */\n\n this.getAuthParams = function() {\n return JSON.parse(localStorage.getItem(\"auth_params\"));\n }\n\n this.isUserSignedIn = function() {\n return localStorage.getItem(\"jwt\");\n }\n\n this.userId = function() {\n return localStorage.getItem(\"uuid\");\n }\n\n this.getAuthParamsForEmail = function(email, callback) {\n var request = Restangular.one(\"auth\", \"params\");\n request.get({email: email}).then(function(response){\n callback(response.plain());\n })\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.getCurrentUser = function(callback) {\n if(!localStorage.getItem(\"jwt\")) {\n callback(null);\n return;\n }\n Restangular.one(\"users/current\").get().then(function(response){\n var user = response.plain();\n _.merge(this.user, user);\n callback();\n }.bind(this))\n .catch(function(response){\n console.log(\"Error getting current user\", response);\n callback(response.data);\n })\n }\n\n this.login = function(email, password, callback) {\n this.getAuthParamsForEmail(email, function(authParams){\n if(!authParams) {\n callback(null);\n return;\n }\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, authParams), function(keys){\n this.setMk(keys.mk);\n var request = Restangular.one(\"auth/sign_in\");\n var params = {password: keys.pw, email: email};\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(authParams));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }.bind(this))\n }\n\n this.register = function(email, password, callback) {\n Neeto.crypto.generateInitialEncryptionKeysForUser({password: password, email: email}, function(keys, authParams){\n this.setMk(keys.mk);\n keys.mk = null;\n var request = Restangular.one(\"auth\");\n var params = _.merge({password: keys.pw, email: email}, authParams);\n _.merge(request, params);\n request.post().then(function(response){\n localStorage.setItem(\"jwt\", response.token);\n localStorage.setItem(\"uuid\", response.uuid);\n localStorage.setItem(\"auth_params\", JSON.stringify(_.omit(authParams, [\"pw_nonce\"])));\n callback(response);\n })\n .catch(function(response){\n callback(response.data);\n })\n }.bind(this));\n }\n\n // this.changePassword = function(current_password, new_password) {\n // this.getAuthParamsForEmail(email, function(authParams){\n // if(!authParams) {\n // callback(null);\n // return;\n // }\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: current_password, email: user.email}, authParams), function(currentKeys) {\n // Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: new_password, email: user.email}, authParams), function(newKeys){\n // var data = {};\n // data.current_password = currentKeys.pw;\n // data.password = newKeys.pw;\n // data.password_confirmation = newKeys.pw;\n //\n // var user = this.user;\n //\n // this._performPasswordChange(currentKeys, newKeys, function(response){\n // if(response && !response.error) {\n // // this.showNewPasswordForm = false;\n // // reencrypt data with new mk\n // this.reencryptAllItemsAndSave(user, newKeys.mk, currentKeys.mk, function(success){\n // if(success) {\n // this.setMk(newKeys.mk);\n // alert(\"Your password has been changed and your data re-encrypted.\");\n // } else {\n // // rollback password\n // this._performPasswordChange(newKeys, currentKeys, function(response){\n // alert(\"There was an error changing your password. Your password has been rolled back.\");\n // window.location.reload();\n // })\n // }\n // }.bind(this));\n // } else {\n // // this.showNewPasswordForm = false;\n // alert(\"There was an error changing your password. Please try again.\");\n // }\n // }.bind(this))\n // }.bind(this));\n // }.bind(this));\n // }.bind(this));\n // }\n\n this._performPasswordChange = function(email, current_keys, new_keys, callback) {\n var request = Restangular.one(\"auth\");\n var params = {password: new_keys.pw, password_confirmation: new_keys.pw, current_password: current_keys.pw, email: email};\n _.merge(request, params);\n request.patch().then(function(response){\n callback(response);\n })\n }\n\n\n /*\n User\n */\n\n this.setUsername = function(username, callback) {\n var request = Restangular.one(\"users\", this.userId());\n request.username = username;\n request.patch().then(function(response){\n this.user.username = response.username;\n callback(response.plain());\n }.bind(this))\n }\n\n\n /*\n Items\n */\n\n this.setSyncToken = function(syncToken) {\n this.syncToken = syncToken;\n localStorage.setItem(\"syncToken\", this.syncToken);\n }\n\n this.syncWithOptions = function(callback, options = {}) {\n this.writeAllItemsToLocalStorage(function(responseItems){\n if(!this.isUserSignedIn()) {\n // is not signed in\n var dirtyItems = modelManager.getDirtyItems();\n // delete anything needing to be deleted\n dirtyItems.forEach(function(item){\n if(item.deleted) {\n modelManager.removeItemLocally(item);\n }\n }.bind(this))\n modelManager.clearDirtyItems();\n if(callback) {\n callback();\n }\n }\n }.bind(this))\n\n if(!this.isUserSignedIn()) {\n return;\n }\n\n var dirtyItems = modelManager.getDirtyItems();\n var request = Restangular.one(\"items/sync\");\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n // console.log(\"syncing items\", request.items);\n\n if(this.syncToken) {\n request.sync_token = this.syncToken;\n }\n\n request.post().then(function(response) {\n modelManager.clearDirtyItems();\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n this.handleItemsResponse(response.saved_items, omitFields);\n\n this.handleUnsavedItemsResponse(response.unsaved)\n\n this.writeAllItemsToLocalStorage();\n\n if(callback) {\n callback(response);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Sync error: \", response);\n if(callback) {\n callback({error: \"Sync error\"});\n }\n })\n }\n\n this.sync = function(callback) {\n this.syncWithOptions(callback, undefined);\n }\n\n this.handleUnsavedItemsResponse = function(unsaved) {\n if(unsaved.length == 0) {\n return;\n }\n\n console.log(\"Handle unsaved\", unsaved);\n for(var mapping of unsaved) {\n var itemResponse = mapping.item;\n var item = modelManager.findItem(itemResponse.uuid);\n var error = mapping.error;\n if(error.tag == \"uuid_conflict\") {\n item.alternateUUID();\n item.setDirty(true);\n item.allReferencedObjects().forEach(function(reference){\n reference.setDirty(true);\n })\n }\n }\n\n this.syncWithOptions(null, {additionalFields: [\"created_at\", \"updated_at\"]});\n }\n\n this.handleItemsResponse = function(responseItems, omitFields) {\n this.decryptItems(responseItems);\n return modelManager.mapResponseItemsToLocalModelsOmittingFields(responseItems, omitFields);\n }\n\n this.createRequestParamsForItem = function(item, additionalFields) {\n return this.paramsForItem(item, !item.isPublic(), additionalFields, false);\n }\n\n this.paramsForExportFile = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForExtension = function(item, encrypted) {\n return _.omit(this.paramsForItem(item, encrypted, [\"created_at\", \"updated_at\"], true), [\"deleted\"]);\n }\n\n this.paramsForItem = function(item, encrypted, additionalFields, forExportFile) {\n var itemCopy = _.cloneDeep(item);\n\n console.assert(!item.dummy, \"Item is dummy, should not have gotten here.\", item.dummy)\n\n var params = {uuid: item.uuid, content_type: item.content_type,\n presentation_name: item.presentation_name, deleted: item.deleted};\n\n if(encrypted) {\n this.encryptSingleItem(itemCopy, this.retrieveMk());\n params.content = itemCopy.content;\n params.enc_item_key = itemCopy.enc_item_key;\n params.auth_hash = itemCopy.auth_hash;\n }\n else {\n params.content = forExportFile ? itemCopy.createContentJSONFromProperties() : \"000\" + Neeto.crypto.base64(JSON.stringify(itemCopy.createContentJSONFromProperties()));\n if(!forExportFile) {\n params.enc_item_key = null;\n params.auth_hash = null;\n }\n }\n\n if(additionalFields) {\n _.merge(params, _.pick(item, additionalFields));\n }\n\n return params;\n }\n\n this.shareItem = function(item, callback) {\n if(!this.isUserSignedIn()) {\n alert(\"You must be signed in to share.\");\n return;\n }\n\n var shareFn = function() {\n item.presentation_name = \"_auto_\";\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync();\n }.bind(this)\n\n if(!this.user.username) {\n ngDialog.open({\n template: 'frontend/modals/username.html',\n controller: 'UsernameModalCtrl',\n resolve: {\n callback: function() {\n return shareFn;\n }\n },\n className: 'ngdialog-theme-default',\n disableAnimation: true\n });\n } else {\n shareFn();\n }\n }\n\n this.unshareItem = function(item, callback) {\n item.presentation_name = null;\n var needsUpdate = [item].concat(item.referencesAffectedBySharingChange() || []);\n needsUpdate.forEach(function(needingUpdate){\n needingUpdate.setDirty(true);\n })\n this.sync(null);\n }\n\n /*\n Import\n */\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n modelManager.mapResponseItemsToLocalModels(data.items);\n modelManager.allItems.forEach(function(item){\n item.setDirty(true);\n })\n this.syncWithOptions(callback, {additionalFields: [\"created_at\", \"updated_at\"]});\n }.bind(this)\n\n if(data.auth_params) {\n Neeto.crypto.computeEncryptionKeysForUser(_.merge({password: password}, data.auth_params), function(keys){\n var mk = keys.mk;\n try {\n this.decryptItemsWithKey(data.items, mk);\n // delete items enc_item_key since the user's actually key will do the encrypting once its passed off\n data.items.forEach(function(item){\n item.enc_item_key = null;\n item.auth_hash = null;\n })\n onDataReady();\n }\n catch (e) {\n console.log(\"Error decrypting\", e);\n alert(\"There was an error decrypting your items. Make sure the password you entered is correct and try again.\");\n callback(false, null);\n return;\n }\n }.bind(this));\n } else {\n onDataReady();\n }\n }\n\n /*\n Export\n */\n\n this.itemsDataFile = function(encrypted) {\n var textFile = null;\n var makeTextFile = function (text) {\n var data = new Blob([text], {type: 'text/json'});\n\n // If we are replacing a previously generated file we need to\n // manually revoke the object URL to avoid memory leaks.\n if (textFile !== null) {\n window.URL.revokeObjectURL(textFile);\n }\n\n textFile = window.URL.createObjectURL(data);\n\n // returns a URL you can use as a href\n return textFile;\n }.bind(this);\n\n var items = _.map(modelManager.allItemsMatchingTypes([\"Tag\", \"Note\"]), function(item){\n return this.paramsForExportFile(item, encrypted);\n }.bind(this));\n\n var data = {\n items: items\n }\n\n if(encrypted) {\n data[\"auth_params\"] = this.getAuthParams();\n }\n\n return makeTextFile(JSON.stringify(data, null, 2 /* pretty print */));\n }\n\n\n\n /*\n Merging\n */\n // this.mergeLocalDataRemotely = function(user, callback) {\n // var request = Restangular.one(\"users\", this.userId()).one(\"merge\");\n // var tags = user.tags;\n // request.items = user.items;\n // request.items.forEach(function(item){\n // if(item.tag_id) {\n // var tag = tags.filter(function(tag){return tag.uuid == item.tag_id})[0];\n // item.tag_name = tag.title;\n // }\n // })\n // request.post().then(function(response){\n // callback();\n // localStorage.removeItem('user');\n // })\n // }\n\n\n\n\n this.clearLocalStorage = function() {\n localStorage.removeItem(\"items\");\n localStorage.removeItem(\"mk\");\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"uuid\");\n localStorage.removeItem(\"syncToken\");\n localStorage.removeItem(\"auth_params\");\n }\n\n this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeAllItemsToLocalStorage = function(callback) {\n var items = _.map(modelManager.allItems, function(item){\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\", \"presentation_url\"], false)\n }.bind(this));\n // console.log(\"Writing items to local\", items);\n this.writeToLocalStorage('items', items);\n if(callback) {\n callback(items);\n }\n }\n\n this.writeToLocalStorage = function(key, value) {\n localStorage.setItem(key, angular.toJson(value));\n }\n\n this.loadLocalItems = function() {\n var items = JSON.parse(localStorage.getItem('items')) || [];\n items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n }\n\n /*\n Drafts\n */\n\n this.saveDraftToDisk = function(draft) {\n localStorage.setItem(\"draft\", JSON.stringify(draft));\n }\n\n this.clearDraft = function() {\n localStorage.removeItem(\"draft\");\n }\n\n this.getDraft = function() {\n var draftString = localStorage.getItem(\"draft\");\n if(!draftString || draftString == 'undefined') {\n return null;\n }\n var jsonObj = _.merge({content_type: \"Note\"}, JSON.parse(draftString));\n return modelManager.createItem(jsonObj);\n }\n\n\n /*\n Encrpytion\n */\n\n this.retrieveMk = function() {\n if(!this.mk) {\n this.mk = localStorage.getItem(\"mk\");\n }\n return this.mk;\n }\n\n this.setMk = function(mk) {\n localStorage.setItem('mk', mk);\n }\n\n this.signout = function() {\n localStorage.removeItem(\"jwt\");\n localStorage.removeItem(\"mk\");\n }\n\n this.encryptSingleItem = function(item, masterKey) {\n var item_key = null;\n if(item.enc_item_key) {\n item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n } else {\n item_key = Neeto.crypto.generateRandomEncryptionKey();\n item.enc_item_key = Neeto.crypto.encryptText(item_key, masterKey);\n }\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var encryptedContent = \"001\" + Neeto.crypto.encryptText(JSON.stringify(item.createContentJSONFromProperties()), ek);\n var authHash = Neeto.crypto.hmac256(encryptedContent, ak);\n\n item.content = encryptedContent;\n item.auth_hash = authHash;\n item.local_encryption_scheme = \"1.0\";\n }\n\n this.decryptSingleItem = function(item, masterKey) {\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, masterKey);\n\n var ek = Neeto.crypto.firstHalfOfKey(item_key);\n var ak = Neeto.crypto.secondHalfOfKey(item_key);\n var authHash = Neeto.crypto.hmac256(item.content, ak);\n if(authHash !== item.auth_hash || !item.auth_hash) {\n console.log(\"Authentication hash does not match.\")\n return;\n }\n\n var content = Neeto.crypto.decryptText(item.content.substring(3, item.content.length), ek);\n item.content = content;\n }\n\n this.decryptItems = function(items) {\n var masterKey = this.retrieveMk();\n this.decryptItemsWithKey(items, masterKey);\n }\n\n this.decryptItemsWithKey = function(items, key) {\n for (var item of items) {\n if(item.deleted == true) {\n continue;\n }\n var isString = typeof item.content === 'string' || item.content instanceof String;\n if(isString) {\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // is encrypted\n this.decryptSingleItem(item, key);\n } else {\n // is base64 encoded\n item.content = Neeto.crypto.base64Decode(item.content.substring(3, item.content.length))\n }\n }\n }\n }\n\n this.reencryptAllItemsAndSave = function(user, newMasterKey, oldMasterKey, callback) {\n var items = modelManager.allItems();\n items.forEach(function(item){\n if(item.content.substring(0, 3) == \"001\" && item.enc_item_key) {\n // first decrypt item_key with old key\n var item_key = Neeto.crypto.decryptText(item.enc_item_key, oldMasterKey);\n // now encrypt item_key with new key\n item.enc_item_key = Neeto.crypto.encryptText(item_key, newMasterKey);\n }\n });\n\n this.saveBatchItems(user, items, function(success) {\n callback(success);\n }.bind(this));\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('mbAutofocus', ['$timeout', function($timeout) {\n return {\n restrict: 'A',\n scope: {\n shouldFocus: \"=\"\n },\n link : function($scope, $element) {\n $timeout(function() {\n if($scope.shouldFocus) {\n $element[0].focus();\n }\n });\n }\n }\n }]);\n;class ContextualExtensionsMenu {\n\n constructor() {\n this.restrict = \"E\";\n this.templateUrl = \"frontend/directives/contextual-menu.html\";\n this.scope = {\n item: \"=\"\n };\n }\n\n controller($scope, modelManager, extensionManager) {\n $scope.extensions = extensionManager.extensionsInContextOfItem($scope.item);\n\n $scope.executeAction = function(action, extension) {\n action.running = true;\n extensionManager.executeAction(action, extension, $scope.item, function(response){\n action.running = false;\n })\n }\n\n $scope.accessTypeForExtension = function(extension) {\n return extensionManager.extensionUsesEncryptedData(extension) ? \"encrypted\" : \"decrypted\";\n }\n\n }\n\n\n}\n\nangular.module('app.frontend').directive('contextualExtensionsMenu', () => new ContextualExtensionsMenu);\n;angular\n .module('app.frontend')\n .directive('draggable', function() {\n return {\n scope: {\n note: \"=\"\n },\n link: function(scope, element) {\n // this gives us the native JS object\n var el = element[0];\n\n el.draggable = true;\n\n el.addEventListener(\n 'dragstart',\n function(e) {\n e.dataTransfer.effectAllowed = 'move';\n e.dataTransfer.setData('Note', JSON.stringify(scope.note));\n this.classList.add('drag');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragend',\n function(e) {\n this.classList.remove('drag');\n return false;\n },\n false\n );\n }\n }\n});\n\nangular\n .module('app.frontend')\n .directive('droppable', function() {\n return {\n scope: {\n drop: '&',\n bin: '=',\n tag: \"=\"\n },\n link: function(scope, element) {\n // again we need the native object\n var el = element[0];\n\n el.addEventListener(\n 'dragover',\n function(e) {\n e.dataTransfer.dropEffect = 'move';\n // allows us to drop\n if (e.preventDefault) e.preventDefault();\n this.classList.add('over');\n return false;\n },\n false\n );\n\n var counter = 0;\n\n el.addEventListener(\n 'dragenter',\n function(e) {\n counter++;\n this.classList.add('over');\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'dragleave',\n function(e) {\n counter--;\n if (counter === 0) {\n this.classList.remove('over');\n }\n return false;\n },\n false\n );\n\n el.addEventListener(\n 'drop',\n function(e) {\n // Stops some browsers from redirecting.\n if (e.stopPropagation) e.stopPropagation();\n\n this.classList.remove('over');\n\n var binId = this.uuid;\n var note = new Note(JSON.parse(e.dataTransfer.getData('Note')));\n scope.$apply(function(scope) {\n var fn = scope.drop();\n if ('undefined' !== typeof fn) {\n fn(e, scope.tag, note);\n }\n });\n\n return false;\n },\n false\n );\n }\n }\n});\n;angular\n .module('app.frontend')\n .directive('fileChange', function() {\n return {\n restrict: 'A',\n scope: {\n handler: '&'\n },\n link: function (scope, element) {\n element.on('change', function (event) {\n scope.$apply(function(){\n scope.handler({files: event.target.files});\n });\n });\n }\n };\n});\n;angular\n .module('app.frontend')\n .directive('lowercase', function() {\n return {\n require: 'ngModel',\n link: function(scope, element, attrs, modelCtrl) {\n var lowercase = function(inputValue) {\n if (inputValue == undefined) inputValue = '';\n var lowercased = inputValue.toLowerCase();\n if (lowercased !== inputValue) {\n modelCtrl.$setViewValue(lowercased);\n modelCtrl.$render();\n }\n return lowercased;\n }\n modelCtrl.$parsers.push(lowercase);\n lowercase(scope[attrs.ngModel]);\n }\n };\n });\n;angular\n .module('app.frontend')\n .directive('selectOnClick', ['$window', function ($window) {\n return {\n restrict: 'A',\n link: function (scope, element, attrs) {\n element.on('focus', function () {\n if (!$window.getSelection().toString()) {\n // Required for mobile Safari\n this.setSelectionRange(0, this.value.length)\n }\n });\n }\n };\n}]);\n;angular\n .module('app.frontend')\n .directive('note', function($timeout) {\n return {\n restrict: 'E',\n controller: 'SingleNoteCtrl',\n templateUrl: \"frontend/directives/note.html\",\n scope: {\n note: \"=\"\n },\n }\n })\n .controller('SingleNoteCtrl', function ($rootScope, $scope, $state, markdownRenderer) {\n $scope.renderedContent = function() {\n return markdownRenderer.renderHtml(markdownRenderer.renderedContentForText($scope.note.text));\n }\n });\n;/**\n * AngularJS directive that simulates the effect of typing on a text editor - with a blinking cursor.\n * This directive works as an attribute to any HTML element, and it changes the speed/delay of its animation.\n *\n * There's also a simple less file included for basic styling of the dialog, which can be overridden.\n * The config object also lets the user define custom CSS classes for the modal.\n *\n * How to use:\n *\n * Just add the desired text to the 'text' attribute of the element and the directive takes care of the rest.\n * The 'text' attribute can be a single string or an array of string. In case an array is passed, the string\n * on each index is erased so the next item can be printed. When the last index is reached, that string stays\n * on the screen. (So if you want to erase the last string, just push an empty string to the end of the array)\n *\n * These are the optional preferences:\n * - initial delay: set an 'initial-delay' attribute for the element\n * - type delay: set a 'type-delay' attribute for the element\n * - erase delay: set a 'erase-delay' attribute for the element\n * - specify cursor : set a 'cursor' attribute for the element, specifying which cursor to use\n * - turn off cursor blinking: set the 'blink-cursor' attribute to \"false\"\n * - cursor blinking speed: set a 'blink-delay' attribute for the element\n * - scope callback: pass the desired scope callback as the 'callback-fn' attribute of the element\n *\n * Note:\n * Each time/delay value should be set either on seconds (1s) or milliseconds (1000)\n *\n * Dependencies:\n * The directive needs the css file provided in order to replicate the cursor blinking effect.\n */\n\n\nangular\n .module('app.frontend').directive('typewrite', ['$timeout', function ($timeout) {\n function linkFunction($scope, $element, $attrs) {\n var timer = null,\n initialDelay = $attrs.initialDelay ? getTypeDelay($attrs.initialDelay) : 200,\n typeDelay = $attrs.typeDelay || 200,\n eraseDelay = $attrs.eraseDelay || typeDelay / 2,\n blinkDelay = $attrs.blinkDelay ? getAnimationDelay($attrs.blinkDelay) : false,\n cursor = $attrs.cursor || '|',\n blinkCursor = typeof $attrs.blinkCursor !== 'undefined' ? $attrs.blinkCursor === 'true' : true,\n currentText,\n textArray,\n running,\n auxStyle;\n\n\n\n if ($scope.text) {\n if ($scope.text instanceof Array) {\n textArray = $scope.text;\n currentText = textArray[0];\n } else {\n currentText = $scope.text;\n }\n }\n if (typeof $scope.start === 'undefined' || $scope.start) {\n typewrite();\n }\n\n function typewrite() {\n timer = $timeout(function () {\n updateIt($element, 0, 0, currentText);\n }, initialDelay);\n }\n\n function updateIt(element, charIndex, arrIndex, text) {\n if (charIndex <= text.length) {\n updateValue(element, text.substring(0, charIndex) + cursor);\n charIndex++;\n timer = $timeout(function () {\n updateIt(element, charIndex, arrIndex, text);\n }, typeDelay);\n return;\n } else {\n charIndex--;\n\n if($scope.iterationCallback) {\n $scope.iterationCallback()(arrIndex);\n }\n\n // check if it's an array\n if (textArray && arrIndex < textArray.length - 1) {\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, textArray[arrIndex]);\n }, $scope.iterationDelay);\n } else {\n if ($scope.callbackFn) {\n $scope.callbackFn();\n }\n blinkIt(element, charIndex, currentText);\n }\n }\n }\n\n function blinkIt(element, charIndex) {\n var text = element.text().substring(0, element.text().length - 1);\n if (blinkCursor) {\n if (blinkDelay) {\n auxStyle = '-webkit-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-moz-animation:blink-it steps(1) ' + blinkDelay + ' infinite ' +\n '-ms-animation:blink-it steps(1) ' + blinkDelay + ' infinite;-o-animation:blink-it steps(1) ' + blinkDelay + ' infinite; ' +\n 'animation:blink-it steps(1) ' + blinkDelay + ' infinite;';\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n } else {\n updateValue(element, text.substring(0, charIndex) + '' + cursor + '');\n }\n } else {\n updateValue(element, text.substring(0, charIndex));\n }\n }\n\n function cleanAndRestart(element, charIndex, arrIndex, currentText) {\n if(charIndex == 0) {\n if($scope.prebeginFn) {\n $scope.prebeginFn()();\n }\n }\n if (charIndex > 0) {\n currentText = currentText.slice(0, -1);\n // element.html(currentText.substring(0, currentText.length - 1) + cursor);\n updateValue(element, currentText + cursor);\n charIndex--;\n timer = $timeout(function () {\n cleanAndRestart(element, charIndex, arrIndex, currentText);\n }, eraseDelay);\n return;\n } else {\n arrIndex++;\n currentText = textArray[arrIndex];\n timer = $timeout(function () {\n updateIt(element, 0, arrIndex, currentText);\n }, typeDelay);\n }\n }\n\n function getTypeDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? parseInt(delay.substring(0, delay.length - 1), 10) * 1000 : +delay;\n } else {\n return false;\n }\n }\n\n function getAnimationDelay(delay) {\n if (typeof delay === 'string') {\n return delay.charAt(delay.length - 1) === 's' ? delay : parseInt(delay.substring(0, delay.length - 1), 10) / 1000;\n }\n }\n\n function updateValue(element, value) {\n if (element.prop('nodeName').toUpperCase() === 'INPUT') {\n return element.val(value);\n }\n return element.html(value);\n }\n\n $scope.$on('$destroy', function () {\n if (timer) {\n $timeout.cancel(timer);\n }\n });\n\n $scope.$watch('start', function (newVal) {\n if (!running && newVal) {\n running = !running;\n typewrite();\n }\n });\n\n $scope.$watch('text', function (newVal, oldVal) {\n if(!(newVal instanceof Array)) {\n currentText = newVal;\n typewrite();\n }\n });\n }\n\n return {\n restrict: 'A',\n link: linkFunction,\n replace: true,\n scope: {\n text: '=',\n callbackFn: '&',\n iterationCallback: '&',\n iterationDelay: '=',\n prebeginFn: '&',\n start: '='\n }\n };\n\n }]);\n;class ExtensionManager {\n\n constructor(Restangular, modelManager, apiController) {\n this.Restangular = Restangular;\n this.modelManager = modelManager;\n this.apiController = apiController;\n this.enabledRepeatActionUrls = JSON.parse(localStorage.getItem(\"enabledRepeatActionUrls\")) || [];\n this.decryptedExtensions = JSON.parse(localStorage.getItem(\"decryptedExtensions\")) || [];\n\n modelManager.addItemSyncObserver(\"extensionManager\", \"Extension\", function(items){\n for (var ext of items) {\n\n ext.encrypted = this.extensionUsesEncryptedData(ext);\n\n for (var action of ext.actions) {\n if(this.enabledRepeatActionUrls.includes(action.url)) {\n this.enableRepeatAction(action, ext);\n }\n }\n }\n }.bind(this))\n }\n\n get extensions() {\n return this.modelManager.extensions;\n }\n\n extensionsInContextOfItem(item) {\n return this.extensions.filter(function(ext){\n return ext.actionsWithContextForItem(item).length > 0;\n })\n }\n\n actionWithURL(url) {\n for (var extension of this.extensions) {\n return _.find(extension.actions, {url: url})\n }\n }\n\n extensionUsesEncryptedData(extension) {\n return !this.decryptedExtensions.includes(extension.url);\n }\n\n changeExtensionEncryptionFormat(encrypted, extension) {\n if(encrypted) {\n _.pull(this.decryptedExtensions, extension.url);\n } else {\n this.decryptedExtensions.push(extension.url);\n }\n\n localStorage.setItem(\"decryptedExtensions\", JSON.stringify(this.decryptedExtensions))\n\n extension.encrypted = this.extensionUsesEncryptedData(extension);\n }\n\n addExtension(url, callback) {\n this.retrieveExtensionFromServer(url, callback);\n }\n\n deleteExtension(extension) {\n for(var action of extension.actions) {\n _.pull(this.decryptedExtensions, extension);\n if(action.repeat_mode) {\n if(this.isRepeatActionEnabled(action)) {\n this.disableRepeatAction(action);\n }\n }\n }\n\n this.modelManager.setItemToBeDeleted(extension);\n this.apiController.sync(null);\n }\n\n retrieveExtensionFromServer(url, callback) {\n this.Restangular.oneUrl(url, url).get().then(function(response){\n var ext = this.handleExtensionLoadExternalResponseItem(url, response.plain());\n if(callback) {\n callback(ext);\n }\n }.bind(this))\n .catch(function(response){\n console.log(\"Error registering extension\", response);\n callback(null);\n })\n }\n\n handleExtensionLoadExternalResponseItem(url, externalResponseItem) {\n var extension = _.find(this.extensions, {url: url});\n if(extension) {\n extension.updateFromExternalResponseItem(externalResponseItem);\n } else {\n extension = new Extension(externalResponseItem);\n extension.url = url;\n extension.setDirty(true);\n this.modelManager.addItem(extension);\n this.apiController.sync(null);\n }\n\n return extension;\n }\n\n refreshExtensionsFromServer() {\n for (var url of this.enabledRepeatActionUrls) {\n var action = this.actionWithURL(url);\n if(action) {\n this.disableRepeatAction(action);\n }\n }\n\n for(var ext of this.extensions) {\n this.retrieveExtensionFromServer(ext.url, function(extension){\n extension.setDirty(true);\n });\n }\n }\n\n executeAction(action, extension, item, callback) {\n\n if(this.extensionUsesEncryptedData(extension) && !this.apiController.isUserSignedIn()) {\n alert(\"To send data encrypted, you must have an encryption key, and must therefore be signed in.\");\n callback(null);\n return;\n }\n\n switch (action.verb) {\n case \"get\": {\n this.Restangular.oneUrl(action.url, action.url).get().then(function(response){\n action.error = false;\n var items = response.items;\n this.modelManager.mapResponseItemsToLocalModels(items);\n callback(items);\n }.bind(this))\n .catch(function(response){\n action.error = true;\n })\n\n break;\n }\n\n case \"show\": {\n var win = window.open(action.url, '_blank');\n win.focus();\n callback();\n break;\n }\n\n case \"post\": {\n var params = {};\n\n if(action.all) {\n var items = this.modelManager.allItemsMatchingTypes(action.content_types);\n params.items = items.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n\n } else {\n params.item = this.outgoingParamsForItem(item, extension);\n }\n\n this.performPost(action, extension, params, function(response){\n callback(response);\n });\n\n break;\n }\n\n default: {\n\n }\n }\n\n action.lastExecuted = new Date();\n }\n\n isRepeatActionEnabled(action) {\n return this.enabledRepeatActionUrls.includes(action.url);\n }\n\n disableRepeatAction(action, extension) {\n _.pull(this.enabledRepeatActionUrls, action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n this.modelManager.removeItemChangeObserver(action.url);\n\n console.assert(this.isRepeatActionEnabled(action) == false);\n }\n\n enableRepeatAction(action, extension) {\n if(!_.find(this.enabledRepeatActionUrls, action.url)) {\n this.enabledRepeatActionUrls.push(action.url);\n localStorage.setItem(\"enabledRepeatActionUrls\", JSON.stringify(this.enabledRepeatActionUrls));\n }\n\n if(action.repeat_mode) {\n\n if(action.repeat_mode == \"watch\") {\n this.modelManager.addItemChangeObserver(action.url, action.content_types, function(changedItems){\n this.triggerWatchAction(action, extension, changedItems);\n }.bind(this))\n }\n\n if(action.repeat_mode == \"loop\") {\n // todo\n }\n\n }\n }\n\n queueAction(action, extension, delay, changedItems) {\n this.actionQueue = this.actionQueue || [];\n if(_.find(this.actionQueue, {url: action.url})) {\n return;\n }\n\n // console.log(\"Successfully queued\", action, this.actionQueue.length);\n this.actionQueue.push(action);\n\n setTimeout(function () {\n // console.log(\"Performing queued action\", action);\n this.triggerWatchAction(action, extension, changedItems);\n _.pull(this.actionQueue, action);\n }.bind(this), delay * 1000);\n }\n\n triggerWatchAction(action, extension, changedItems) {\n if(action.repeat_timeout > 0) {\n var lastExecuted = action.lastExecuted;\n var diffInSeconds = (new Date() - lastExecuted)/1000;\n if(diffInSeconds < action.repeat_timeout) {\n var delay = action.repeat_timeout - diffInSeconds;\n this.queueAction(action, extension, delay, changedItems);\n return;\n }\n }\n\n action.lastExecuted = new Date();\n\n console.log(\"Performing action.\");\n\n if(action.verb == \"post\") {\n var params = {};\n params.items = changedItems.map(function(item){\n var params = this.outgoingParamsForItem(item, extension);\n return params;\n }.bind(this))\n this.performPost(action, extension, params, null);\n } else {\n // todo\n }\n }\n\n outgoingParamsForItem(item, extension) {\n return this.apiController.paramsForExtension(item, this.extensionUsesEncryptedData(extension));\n }\n\n performPost(action, extension, params, callback) {\n var request = this.Restangular.oneUrl(action.url, action.url);\n if(this.extensionUsesEncryptedData(extension)) {\n request.auth_params = this.apiController.getAuthParams();\n }\n _.merge(request, params);\n\n request.post().then(function(response){\n action.error = false;\n if(callback) {\n callback(response.plain());\n }\n })\n .catch(function(response){\n action.error = true;\n console.log(\"Action error response:\", response);\n if(callback) {\n callback({error: \"Request error\"});\n }\n })\n }\n\n}\n\nangular.module('app.frontend').service('extensionManager', ExtensionManager);\n;angular.module('app.frontend')\n .filter('appDate', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy', 'UTC') : '';\n };\n })\n .filter('appDateTime', function ($filter) {\n return function (input) {\n return input ? $filter('date')(new Date(input), 'MM/dd/yyyy h:mm a') : '';\n };\n });\n;angular.module('app.frontend')\n .service('markdownRenderer', function ($sce) {\n\n marked.setOptions({\n breaks: true,\n sanitize: true\n });\n\n this.renderedContentForText = function(text) {\n if(!text || text.length == 0) {\n return \"\";\n }\n return marked(text);\n }\n\n this.renderHtml = function(html_code) {\n return $sce.trustAsHtml(html_code);\n };\n\n\n });\n;class ModelManager {\n\n constructor() {\n this.notes = [];\n this.tags = [];\n this.itemSyncObservers = [];\n this.itemChangeObservers = [];\n this.items = [];\n this._extensions = [];\n }\n\n get allItems() {\n return this.items.filter(function(item){\n return !item.dummy;\n })\n }\n\n get extensions() {\n return this._extensions.filter(function(ext){\n return !ext.deleted;\n })\n }\n\n allItemsMatchingTypes(contentTypes) {\n return this.items.filter(function(item){\n return (contentTypes.includes(item.content_type) || contentTypes.includes(\"*\")) && !item.dummy;\n })\n }\n\n findItem(itemId) {\n return _.find(this.items, {uuid: itemId});\n }\n\n mapResponseItemsToLocalModels(items) {\n return this.mapResponseItemsToLocalModelsOmittingFields(items, null);\n }\n\n mapResponseItemsToLocalModelsOmittingFields(items, omitFields) {\n var models = []\n for (var json_obj of items) {\n json_obj = _.omit(json_obj, omitFields || [])\n var item = this.findItem(json_obj[\"uuid\"]);\n if(json_obj[\"deleted\"] == true) {\n if(item) {\n this.removeItemLocally(item)\n }\n continue;\n }\n\n _.omit(json_obj, omitFields);\n\n if(!item) {\n item = this.createItem(json_obj);\n } else {\n item.updateFromJSON(json_obj);\n }\n\n this.addItem(item);\n\n if(json_obj.content) {\n this.resolveReferencesForItem(item)\n }\n\n models.push(item)\n }\n\n this.notifySyncObserversOfModels(models);\n\n this.sortItems();\n return models;\n }\n\n notifySyncObserversOfModels(models) {\n for(var observer of this.itemSyncObservers) {\n var relevantItems = models.filter(function(item){return item.content_type == observer.type});\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n notifyItemChangeObserversOfModels(models) {\n for(var observer of this.itemChangeObservers) {\n var relevantItems = models.filter(function(item){\n return observer.content_types.includes(item.content_type) || observer.content_types.includes(\"*\");\n });\n\n if(relevantItems.length > 0) {\n observer.callback(relevantItems);\n }\n }\n }\n\n createItem(json_obj) {\n var item;\n if(json_obj.content_type == \"Note\") {\n item = new Note(json_obj);\n } else if(json_obj.content_type == \"Tag\") {\n item = new Tag(json_obj);\n } else if(json_obj.content_type == \"Extension\") {\n item = new Extension(json_obj);\n } else {\n item = new Item(json_obj);\n }\n\n item.addObserver(this, function(changedItem){\n this.notifyItemChangeObserversOfModels([changedItem]);\n }.bind(this));\n\n return item;\n }\n\n addItems(items) {\n this.items = _.uniq(this.items.concat(items));\n\n items.forEach(function(item){\n if(item.content_type == \"Tag\") {\n if(!_.find(this.tags, {uuid: item.uuid})) {\n this.tags.unshift(item);\n }\n } else if(item.content_type == \"Note\") {\n if(!_.find(this.notes, {uuid: item.uuid})) {\n this.notes.unshift(item);\n }\n } else if(item.content_type == \"Extension\") {\n if(!_.find(this._extensions, {uuid: item.uuid})) {\n this._extensions.unshift(item);\n }\n }\n }.bind(this))\n }\n\n addItem(item) {\n this.addItems([item])\n }\n\n itemsForContentType(contentType) {\n return this.items.filter(function(item){\n return item.content_type == contentType;\n });\n }\n\n resolveReferencesForItem(item) {\n var contentObject = item.contentObject;\n if(!contentObject.references) {\n return;\n }\n\n for(var reference of contentObject.references) {\n var referencedItem = this.findItem(reference.uuid);\n if(referencedItem) {\n item.addItemAsRelationship(referencedItem);\n referencedItem.addItemAsRelationship(item);\n } else {\n // console.log(\"Unable to find item:\", reference.uuid);\n }\n }\n }\n\n sortItems() {\n Item.sortItemsByDate(this.notes);\n\n this.tags.forEach(function(tag){\n Item.sortItemsByDate(tag.notes);\n })\n }\n\n addItemSyncObserver(id, type, callback) {\n this.itemSyncObservers.push({id: id, type: type, callback: callback});\n }\n\n removeItemSyncObserver(id) {\n _.remove(this.itemSyncObservers, _.find(this.itemSyncObservers, {id: id}));\n }\n\n addItemChangeObserver(id, content_types, callback) {\n this.itemChangeObservers.push({id: id, content_types: content_types, callback: callback});\n }\n\n removeItemChangeObserver(id) {\n _.remove(this.itemChangeObservers, _.find(this.itemChangeObservers, {id: id}));\n }\n\n get filteredNotes() {\n return Note.filterDummyNotes(this.notes);\n }\n\n getDirtyItems() {\n return this.items.filter(function(item){return item.dirty == true && !item.dummy})\n }\n\n clearDirtyItems() {\n this.getDirtyItems().forEach(function(item){\n item.setDirty(false);\n })\n }\n\n setItemToBeDeleted(item) {\n item.deleted = true;\n if(!item.dummy) {\n item.setDirty(true);\n }\n item.removeAllRelationships();\n }\n\n removeItemLocally(item) {\n _.pull(this.items, item);\n\n if(item.content_type == \"Tag\") {\n _.pull(this.tags, item);\n } else if(item.content_type == \"Note\") {\n _.pull(this.notes, item);\n } else if(item.content_type == \"Extension\") {\n _.pull(this._extensions, item);\n }\n }\n\n /*\n Relationships\n */\n\n createRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.addItemAsRelationship(itemTwo);\n itemTwo.addItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n\n removeRelationshipBetweenItems(itemOne, itemTwo) {\n itemOne.removeItemAsRelationship(itemTwo);\n itemTwo.removeItemAsRelationship(itemOne);\n\n itemOne.setDirty(true);\n itemTwo.setDirty(true);\n }\n}\n\nangular.module('app.frontend').service('modelManager', ModelManager);\n;angular.module('app.frontend')\n .service('serverSideValidation', function ($sce) {\n // Show validation errors in form.\n this.showErrors = function (formErrors, form) {\n angular.forEach(formErrors, function (errors, key) {\n if (typeof form[key] !== 'undefined') {\n form[key].$setDirty();\n form[key].$setValidity('server', false);\n form[key].$error.server = $sce.trustAsHtml(errors.join(', '));\n }\n });\n };\n\n // Get validation errors from server response and show them in form.\n this.parseErrors = function (response, form) {\n if (response.status === 422) {\n this.showErrors(response.data, form);\n }\n };\n});\n"]} \ No newline at end of file