From 3ffc9ee667f48ee2c173a23810a8142c2c56dcc0 Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Wed, 11 Jan 2017 17:50:47 -0600 Subject: [PATCH 1/4] indexeddb implementation, #15 --- .../app/frontend/controllers/_base.js | 7 +- .../app/frontend/controllers/home.js | 17 +- .../javascripts/app/services/apiController.js | 117 ++-- .../javascripts/app/services/dbManager.js | 120 ++++ .../javascripts/app/services/modelManager.js | 10 +- app/assets/templates/frontend/home.html.haml | 7 +- app/views/application/frontend.html.erb | 2 +- vendor/assets/javascripts/transpiled.js | 599 +++++++++++------- vendor/assets/javascripts/transpiled.js.map | 2 +- 9 files changed, 600 insertions(+), 281 deletions(-) create mode 100644 app/assets/javascripts/app/services/dbManager.js diff --git a/app/assets/javascripts/app/frontend/controllers/_base.js b/app/assets/javascripts/app/frontend/controllers/_base.js index adf3dd555..663419808 100644 --- a/app/assets/javascripts/app/frontend/controllers/_base.js +++ b/app/assets/javascripts/app/frontend/controllers/_base.js @@ -1,6 +1,11 @@ class BaseCtrl { - constructor($rootScope, modelManager, apiController) { + constructor($rootScope, modelManager, apiController, dbManager) { apiController.getCurrentUser(function(){}); + dbManager.openDatabase(null, function(){ + // new database, delete syncToken so that items can be refetched entirely from server + apiController.clearSyncToken(); + apiController.sync(); + }) } } diff --git a/app/assets/javascripts/app/frontend/controllers/home.js b/app/assets/javascripts/app/frontend/controllers/home.js index 7a058e753..abc09d30e 100644 --- a/app/assets/javascripts/app/frontend/controllers/home.js +++ b/app/assets/javascripts/app/frontend/controllers/home.js @@ -2,18 +2,21 @@ angular.module('app.frontend') .controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) { $rootScope.bodyClass = "app-body-class"; - apiController.loadLocalItems(); + apiController.loadLocalItems(function(items){ + $scope.$apply(); + + apiController.sync(null); + // refresh every 30s + setInterval(function () { + apiController.sync(null); + }, 30000); + }); + $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); - }, 30000); - /* Tags Ctrl Callbacks */ diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index 65c36ab88..00e4905ac 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -20,11 +20,11 @@ angular.module('app.frontend') } - this.$get = function($rootScope, Restangular, modelManager, ngDialog) { - return new ApiController($rootScope, Restangular, modelManager, ngDialog); + this.$get = function($rootScope, Restangular, modelManager, ngDialog, dbManager) { + return new ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager); } - function ApiController($rootScope, Restangular, modelManager, ngDialog) { + function ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager) { this.user = {}; this.syncToken = localStorage.getItem("syncToken"); @@ -213,44 +213,62 @@ angular.module('app.frontend') } this.syncWithOptions = function(callback, options = {}) { - var dirtyItems = modelManager.getDirtyItems(); - this.writeItemsToLocalStorage(dirtyItems, function(responseItems){ - if(!this.isUserSignedIn()) { - // delete anything needing to be deleted - dirtyItems.forEach(function(item){ - if(item.deleted) { - modelManager.removeItemLocally(item); - } - }.bind(this)) - modelManager.clearDirtyItems(); - if(callback) { - callback(); - } - } - }.bind(this)) - - if(!this.isUserSignedIn()) { + if(this.syncOpInProgress) { + // will perform anoter sync after current completes + this.repeatSync = true; return; } + this.syncOpInProgress = true; + + var allDirtyItems = modelManager.getDirtyItems(); + + let submitLimit = 100; + var dirtyItems = allDirtyItems.slice(0, submitLimit); + if(dirtyItems.length < allDirtyItems.length) { + // more items left to be synced, repeat + this.repeatSync = true; + } else { + this.repeatSync = false; + } + + if(!this.isUserSignedIn()) { + this.writeItemsToLocalStorage(dirtyItems, function(responseItems){ + // delete anything needing to be deleted + dirtyItems.forEach(function(item){ + if(item.deleted) { + modelManager.removeItemLocally(item); + } + }.bind(this)) + modelManager.clearDirtyItems(dirtyItems); + if(callback) { + callback(); + } + }.bind(this)) + + return; + } var request = Restangular.one("items/sync"); + request.limit = 150; + request.sync_token = this.syncToken; + request.cursor_token = this.cursorToken; request.items = _.map(dirtyItems, function(item){ return this.createRequestParamsForItem(item, options.additionalFields); }.bind(this)); - // console.log("syncing items", request.items); - - if(this.syncToken) { - request.sync_token = this.syncToken; - } - request.post().then(function(response) { - modelManager.clearDirtyItems(); + + modelManager.clearDirtyItems(dirtyItems); + + // handle sync token this.setSyncToken(response.sync_token); $rootScope.$broadcast("sync:updated_token", this.syncToken); + // handle cursor token (more results waiting, perform another sync) + this.cursorToken = response.cursor_token; + var retrieved = this.handleItemsResponse(response.retrieved_items, null); // merge only metadata for saved items var omitFields = ["content", "enc_item_key", "auth_hash"]; @@ -261,9 +279,16 @@ angular.module('app.frontend') this.writeItemsToLocalStorage(saved, null); this.writeItemsToLocalStorage(retrieved, null); - if(callback) { - callback(response); + this.syncOpInProgress = false; + + if(this.cursorToken || this.repeatSync == true) { + this.syncWithOptions(callback, options); + } else { + if(callback) { + callback(response); + } } + }.bind(this)) .catch(function(response){ console.log("Sync error: ", response); @@ -388,6 +413,11 @@ angular.module('app.frontend') Import */ + this.clearSyncToken = function() { + this.syncToken = null; + localStorage.removeItem("syncToken"); + } + this.importJSONData = function(data, password, callback) { console.log("Importing data", data); @@ -488,27 +518,20 @@ angular.module('app.frontend') } this.writeItemsToLocalStorage = function(items, callback) { - for(var item of items) { - var params = this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false) - localStorage.setItem("item-" + item.uuid, JSON.stringify(params)); - } - if(callback) { - callback(items); - } + var params = items.map(function(item) { + return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false) + }.bind(this)); + + dbManager.saveItems(params, callback); } - this.loadLocalItems = function() { - var itemsParams = []; - for (var i = 0; i < localStorage.length; i++){ - var key = localStorage.key(i); - if(key.startsWith("item-")) { - var item = localStorage.getItem(key); - itemsParams.push(JSON.parse(item)); - } - } + this.loadLocalItems = function(callback) { + var params = dbManager.getAllItems(function(items){ + var items = this.handleItemsResponse(items, null); + Item.sortItemsByDate(items); + callback(items); + }.bind(this)) - var items = this.handleItemsResponse(itemsParams, null); - Item.sortItemsByDate(items); } /* diff --git a/app/assets/javascripts/app/services/dbManager.js b/app/assets/javascripts/app/services/dbManager.js new file mode 100644 index 000000000..6385d7348 --- /dev/null +++ b/app/assets/javascripts/app/services/dbManager.js @@ -0,0 +1,120 @@ +class DBManager { + + openDatabase(callback, onUgradeNeeded) { + var request = window.indexedDB.open("standardnotes", 1); + + request.onerror = function(event) { + alert("Please enable permissions for Standard Notes to use IndexedDB for offline mode."); + if(callback) { + callback(null); + } + }; + + request.onsuccess = (event) => { + // console.log("Successfully opened database", event.target.result); + var db = event.target.result; + db.onerror = function(errorEvent) { + console.log("Database error: " + errorEvent.target.errorCode); + } + if(callback) { + callback(db); + } + }; + + request.onupgradeneeded = (event) => { + var db = event.target.result; + if(db.version === 1) { + if(onUgradeNeeded) { + onUgradeNeeded(); + } + } + + // Create an objectStore for this database + var objectStore = db.createObjectStore("items", { keyPath: "uuid" }); + objectStore.createIndex("title", "title", { unique: false }); + objectStore.createIndex("uuid", "uuid", { unique: true }); + objectStore.transaction.oncomplete = function(event) { + // Ready to store values in the newly created objectStore. + }; + }; + } + + getAllItems(callback) { + + this.openDatabase((db) => { + var objectStore = db.transaction("items").objectStore("items"); + var items = []; + objectStore.openCursor().onsuccess = function(event) { + var cursor = event.target.result; + if (cursor) { + items.push(cursor.value); + cursor.continue(); + } + else { + callback(items); + } + }; + }, null) + } + + saveItem(item) { + saveItems([item]); + } + + saveItems(items, callback) { + + if(items.length == 0) { + if(callback) { + callback(); + } + return; + } + + this.openDatabase((db) => { + var transaction = db.transaction("items", "readwrite"); + transaction.oncomplete = function(event) { + + }; + + transaction.onerror = function(event) { + console.log("Transaction error:", event.target.errorCode); + }; + + var itemObjectStore = transaction.objectStore("items"); + var i = 0; + putNext(); + + function putNext() { + if (i < items.length) { + var item = items[i]; + itemObjectStore.put(item).onsuccess = putNext; + ++i; + } else { + if(callback){ + callback(); + } + } + } + }, null) + } + + deleteItem(item) { + this.openDatabase((db) => { + var request = db.transaction("items", "readwrite").objectStore("items").delete(item.uuid); + request.onsuccess = function(event) { + console.log("Successfully deleted item", item.uuid); + }; + }, null) + } + + getItemByUUID(uuid, callback) { + this.openDatabase((db) => { + var request = db.transaction("items", "readonly").objectStore("items").get(uuid); + request.onsuccess = function(event) { + callback(event.result); + }; + }, null); + } +} + +angular.module('app.frontend').service('dbManager', DBManager); diff --git a/app/assets/javascripts/app/services/modelManager.js b/app/assets/javascripts/app/services/modelManager.js index b97d5ab9a..2dea6f4ad 100644 --- a/app/assets/javascripts/app/services/modelManager.js +++ b/app/assets/javascripts/app/services/modelManager.js @@ -189,10 +189,14 @@ class ModelManager { return this.items.filter(function(item){return item.dirty == true && !item.dummy}) } - clearDirtyItems() { - this.getDirtyItems().forEach(function(item){ + clearDirtyItems(items) { + for(var item of items) { item.setDirty(false); - }) + } + } + + clearAllDirtyItems() { + this.clearDirtyItems(this.getDirtyItems()); } setItemToBeDeleted(item) { diff --git a/app/assets/templates/frontend/home.html.haml b/app/assets/templates/frontend/home.html.haml index 6acd10e2f..174ebca06 100644 --- a/app/assets/templates/frontend/home.html.haml +++ b/app/assets/templates/frontend/home.html.haml @@ -2,11 +2,10 @@ .app-container .app %tags-section{"save" => "tagsSave", "add-new" => "tagsAddNew", "will-select" => "tagsWillMakeSelection", "selection-made" => "tagsSelectionMade", "all-tag" => "allTag", - "tags" => "tags", "user" => "defaultUser", "update-note-tag" => "tagsUpdateNoteTag"} + "tags" => "tags", "update-note-tag" => "tagsUpdateNoteTag"} - %notes-section{"remove-tag" => "notesRemoveTag", "user" => "defaultUser", "add-new" => "notesAddNew", "selection-made" => "notesSelectionMade", + %notes-section{"remove-tag" => "notesRemoveTag", "add-new" => "notesAddNew", "selection-made" => "notesSelectionMade", "tag" => "selectedTag", "remove" => "deleteNote"} - %editor-section{"ng-if" => "selectedNote", "note" => "selectedNote", "remove" => "deleteNote", - "user" => "defaultUser", "save" => "saveNote"} + %editor-section{"ng-if" => "selectedNote", "note" => "selectedNote", "remove" => "deleteNote", "save" => "saveNote"} %header{"user" => "defaultUser"} diff --git a/app/views/application/frontend.html.erb b/app/views/application/frontend.html.erb index 5292408e7..429187e7f 100644 --- a/app/views/application/frontend.html.erb +++ b/app/views/application/frontend.html.erb @@ -29,7 +29,7 @@ <% if Rails.env.development? %> - <%= javascript_include_tag "compiled.min.js", debug: true %> + <%= javascript_include_tag "compiled.js", debug: true %> <% else %> <%= javascript_include_tag "compiled.min.js", debug: false %> <% end %> diff --git a/vendor/assets/javascripts/transpiled.js b/vendor/assets/javascripts/transpiled.js index 0e04f1d6d..db5ce0552 100644 --- a/vendor/assets/javascripts/transpiled.js +++ b/vendor/assets/javascripts/transpiled.js @@ -425,10 +425,15 @@ angular.module('app.frontend', ['ui.router', 'restangular', 'ngDialog']).config( $locationProvider.html5Mode(true); }); ; -var BaseCtrl = function BaseCtrl($rootScope, modelManager, apiController) { +var BaseCtrl = function BaseCtrl($rootScope, modelManager, apiController, dbManager) { _classCallCheck(this, BaseCtrl); apiController.getCurrentUser(function () {}); + dbManager.openDatabase(null, function () { + // new database, delete syncToken so that items can be refetched entirely from server + apiController.clearSyncToken(); + apiController.sync(); + }); }; angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); @@ -945,18 +950,21 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); ;angular.module('app.frontend').controller('HomeCtrl', function ($scope, $rootScope, $timeout, apiController, modelManager) { $rootScope.bodyClass = "app-body-class"; - apiController.loadLocalItems(); + apiController.loadLocalItems(function (items) { + $scope.$apply(); + + apiController.sync(null); + // refresh every 30s + setInterval(function () { + apiController.sync(null); + }, 30000); + }); + $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); - }, 30000); - /* Tags Ctrl Callbacks */ @@ -1921,11 +1929,11 @@ var Tag = function (_Item3) { return url; }; - this.$get = function ($rootScope, Restangular, modelManager, ngDialog) { - return new ApiController($rootScope, Restangular, modelManager, ngDialog); + this.$get = function ($rootScope, Restangular, modelManager, ngDialog, dbManager) { + return new ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager); }; - function ApiController($rootScope, Restangular, modelManager, ngDialog) { + function ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager) { this.user = {}; this.syncToken = localStorage.getItem("syncToken"); @@ -2109,43 +2117,62 @@ var Tag = function (_Item3) { this.syncWithOptions = function (callback) { var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}; - var dirtyItems = modelManager.getDirtyItems(); - this.writeItemsToLocalStorage(dirtyItems, function (responseItems) { - if (!this.isUserSignedIn()) { + if (this.syncOpInProgress) { + // will perform anoter sync after current completes + this.repeatSync = true; + return; + } + + this.syncOpInProgress = true; + + var allDirtyItems = modelManager.getDirtyItems(); + + var submitLimit = 100; + var dirtyItems = allDirtyItems.slice(0, submitLimit); + if (dirtyItems.length < allDirtyItems.length) { + // more items left to be synced, repeat + this.repeatSync = true; + } else { + this.repeatSync = false; + } + + if (!this.isUserSignedIn()) { + this.writeItemsToLocalStorage(dirtyItems, function (responseItems) { // delete anything needing to be deleted dirtyItems.forEach(function (item) { if (item.deleted) { modelManager.removeItemLocally(item); } }.bind(this)); - modelManager.clearDirtyItems(); + modelManager.clearDirtyItems(dirtyItems); if (callback) { callback(); } - } - }.bind(this)); + }.bind(this)); - if (!this.isUserSignedIn()) { return; } var request = Restangular.one("items/sync"); + request.limit = 150; + request.sync_token = this.syncToken; + request.cursor_token = this.cursorToken; request.items = _.map(dirtyItems, function (item) { return this.createRequestParamsForItem(item, options.additionalFields); }.bind(this)); - // console.log("syncing items", request.items); - - if (this.syncToken) { - request.sync_token = this.syncToken; - } - request.post().then(function (response) { - modelManager.clearDirtyItems(); + + modelManager.clearDirtyItems(dirtyItems); + + // handle sync token this.setSyncToken(response.sync_token); $rootScope.$broadcast("sync:updated_token", this.syncToken); + // handle cursor token (more results waiting, perform another sync) + this.cursorToken = response.cursor_token; + var retrieved = this.handleItemsResponse(response.retrieved_items, null); // merge only metadata for saved items var omitFields = ["content", "enc_item_key", "auth_hash"]; @@ -2156,8 +2183,14 @@ var Tag = function (_Item3) { this.writeItemsToLocalStorage(saved, null); this.writeItemsToLocalStorage(retrieved, null); - if (callback) { - callback(response); + this.syncOpInProgress = false; + + if (this.cursorToken || this.repeatSync == true) { + this.syncWithOptions(callback, options); + } else { + if (callback) { + callback(response); + } } }.bind(this)).catch(function (response) { console.log("Sync error: ", response); @@ -2302,6 +2335,11 @@ var Tag = function (_Item3) { Import */ + this.clearSyncToken = function () { + this.syncToken = null; + localStorage.removeItem("syncToken"); + }; + this.importJSONData = function (data, password, callback) { console.log("Importing data", data); @@ -2398,49 +2436,19 @@ var Tag = function (_Item3) { }; this.writeItemsToLocalStorage = function (items, callback) { - var _iteratorNormalCompletion5 = true; - var _didIteratorError5 = false; - var _iteratorError5 = undefined; + var params = items.map(function (item) { + return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false); + }.bind(this)); - try { - for (var _iterator5 = items[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { - var item = _step5.value; - - var params = this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false); - localStorage.setItem("item-" + item.uuid, JSON.stringify(params)); - } - } catch (err) { - _didIteratorError5 = true; - _iteratorError5 = err; - } finally { - try { - if (!_iteratorNormalCompletion5 && _iterator5.return) { - _iterator5.return(); - } - } finally { - if (_didIteratorError5) { - throw _iteratorError5; - } - } - } - - if (callback) { - callback(items); - } + dbManager.saveItems(params, callback); }; - this.loadLocalItems = function () { - var itemsParams = []; - for (var i = 0; i < localStorage.length; i++) { - var key = localStorage.key(i); - if (key.startsWith("item-")) { - var item = localStorage.getItem(key); - itemsParams.push(JSON.parse(item)); - } - } - - var items = this.handleItemsResponse(itemsParams, null); - Item.sortItemsByDate(items); + this.loadLocalItems = function (callback) { + var params = dbManager.getAllItems(function (items) { + var items = this.handleItemsResponse(items, null); + Item.sortItemsByDate(items); + callback(items); + }.bind(this)); }; /* @@ -2523,13 +2531,13 @@ var Tag = function (_Item3) { }; this.decryptItemsWithKey = function (items, key) { - var _iteratorNormalCompletion6 = true; - var _didIteratorError6 = false; - var _iteratorError6 = undefined; + var _iteratorNormalCompletion5 = true; + var _didIteratorError5 = false; + var _iteratorError5 = undefined; try { - for (var _iterator6 = items[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) { - var item = _step6.value; + for (var _iterator5 = items[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) { + var item = _step5.value; if (item.deleted == true) { continue; @@ -2546,16 +2554,16 @@ var Tag = function (_Item3) { } } } catch (err) { - _didIteratorError6 = true; - _iteratorError6 = err; + _didIteratorError5 = true; + _iteratorError5 = err; } finally { try { - if (!_iteratorNormalCompletion6 && _iterator6.return) { - _iterator6.return(); + if (!_iteratorNormalCompletion5 && _iterator5.return) { + _iterator5.return(); } } finally { - if (_didIteratorError6) { - throw _iteratorError6; + if (_didIteratorError5) { + throw _iteratorError5; } } } @@ -2578,6 +2586,137 @@ var Tag = function (_Item3) { }; } }); +; +var DBManager = function () { + function DBManager() { + _classCallCheck(this, DBManager); + } + + _createClass(DBManager, [{ + key: 'openDatabase', + value: function openDatabase(callback, onUgradeNeeded) { + var request = window.indexedDB.open("standardnotes", 1); + + request.onerror = function (event) { + alert("Please enable permissions for Standard Notes to use IndexedDB for offline mode."); + if (callback) { + callback(null); + } + }; + + request.onsuccess = function (event) { + // console.log("Successfully opened database", event.target.result); + var db = event.target.result; + db.onerror = function (errorEvent) { + console.log("Database error: " + errorEvent.target.errorCode); + }; + if (callback) { + callback(db); + } + }; + + request.onupgradeneeded = function (event) { + var db = event.target.result; + if (db.version === 1) { + if (onUgradeNeeded) { + onUgradeNeeded(); + } + } + + // Create an objectStore for this database + var objectStore = db.createObjectStore("items", { keyPath: "uuid" }); + objectStore.createIndex("title", "title", { unique: false }); + objectStore.createIndex("uuid", "uuid", { unique: true }); + objectStore.transaction.oncomplete = function (event) { + // Ready to store values in the newly created objectStore. + }; + }; + } + }, { + key: 'getAllItems', + value: function getAllItems(callback) { + + this.openDatabase(function (db) { + var objectStore = db.transaction("items").objectStore("items"); + var items = []; + objectStore.openCursor().onsuccess = function (event) { + var cursor = event.target.result; + if (cursor) { + items.push(cursor.value); + cursor.continue(); + } else { + callback(items); + } + }; + }, null); + } + }, { + key: 'saveItem', + value: function saveItem(item) { + saveItems([item]); + } + }, { + key: 'saveItems', + value: function saveItems(items, callback) { + + if (items.length == 0) { + if (callback) { + callback(); + } + return; + } + + this.openDatabase(function (db) { + var transaction = db.transaction("items", "readwrite"); + transaction.oncomplete = function (event) {}; + + transaction.onerror = function (event) { + console.log("Transaction error:", event.target.errorCode); + }; + + var itemObjectStore = transaction.objectStore("items"); + var i = 0; + putNext(); + + function putNext() { + if (i < items.length) { + var item = items[i]; + itemObjectStore.put(item).onsuccess = putNext; + ++i; + } else { + if (callback) { + callback(); + } + } + } + }, null); + } + }, { + key: 'deleteItem', + value: function deleteItem(item) { + this.openDatabase(function (db) { + var request = db.transaction("items", "readwrite").objectStore("items").delete(item.uuid); + request.onsuccess = function (event) { + console.log("Successfully deleted item", item.uuid); + }; + }, null); + } + }, { + key: 'getItemByUUID', + value: function getItemByUUID(uuid, callback) { + this.openDatabase(function (db) { + var request = db.transaction("items", "readonly").objectStore("items").get(uuid); + request.onsuccess = function (event) { + callback(event.result); + }; + }, null); + } + }]); + + return DBManager; +}(); + +angular.module('app.frontend').service('dbManager', DBManager); ;angular.module('app.frontend').directive('mbAutofocus', ['$timeout', function ($timeout) { return { restrict: 'A', @@ -2770,55 +2909,55 @@ var ExtensionManager = function () { this.decryptedExtensions = JSON.parse(localStorage.getItem("decryptedExtensions")) || []; modelManager.addItemSyncObserver("extensionManager", "Extension", function (items) { - var _iteratorNormalCompletion7 = true; - var _didIteratorError7 = false; - var _iteratorError7 = undefined; + var _iteratorNormalCompletion6 = true; + var _didIteratorError6 = false; + var _iteratorError6 = undefined; try { - for (var _iterator7 = items[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) { - var ext = _step7.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 _iteratorNormalCompletion8 = true; - var _didIteratorError8 = false; - var _iteratorError8 = undefined; + var _iteratorNormalCompletion7 = true; + var _didIteratorError7 = false; + var _iteratorError7 = undefined; try { - for (var _iterator8 = ext.actions[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) { - var action = _step8.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) { - _didIteratorError8 = true; - _iteratorError8 = err; + _didIteratorError7 = true; + _iteratorError7 = err; } finally { try { - if (!_iteratorNormalCompletion8 && _iterator8.return) { - _iterator8.return(); + if (!_iteratorNormalCompletion7 && _iterator7.return) { + _iterator7.return(); } } finally { - if (_didIteratorError8) { - throw _iteratorError8; + if (_didIteratorError7) { + throw _iteratorError7; } } } } } catch (err) { - _didIteratorError7 = true; - _iteratorError7 = err; + _didIteratorError6 = true; + _iteratorError6 = err; } finally { try { - if (!_iteratorNormalCompletion7 && _iterator7.return) { - _iterator7.return(); + if (!_iteratorNormalCompletion6 && _iterator6.return) { + _iterator6.return(); } } finally { - if (_didIteratorError7) { - throw _iteratorError7; + if (_didIteratorError6) { + throw _iteratorError6; } } } @@ -2835,27 +2974,27 @@ var ExtensionManager = function () { }, { key: 'actionWithURL', value: function actionWithURL(url) { - var _iteratorNormalCompletion9 = true; - var _didIteratorError9 = false; - var _iteratorError9 = undefined; + var _iteratorNormalCompletion8 = true; + var _didIteratorError8 = false; + var _iteratorError8 = undefined; try { - for (var _iterator9 = this.extensions[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) { - var extension = _step9.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) { - _didIteratorError9 = true; - _iteratorError9 = err; + _didIteratorError8 = true; + _iteratorError8 = err; } finally { try { - if (!_iteratorNormalCompletion9 && _iterator9.return) { - _iterator9.return(); + if (!_iteratorNormalCompletion8 && _iterator8.return) { + _iterator8.return(); } } finally { - if (_didIteratorError9) { - throw _iteratorError9; + if (_didIteratorError8) { + throw _iteratorError8; } } } @@ -2886,13 +3025,13 @@ var ExtensionManager = function () { }, { key: 'deleteExtension', value: function deleteExtension(extension) { - var _iteratorNormalCompletion10 = true; - var _didIteratorError10 = false; - var _iteratorError10 = undefined; + var _iteratorNormalCompletion9 = true; + var _didIteratorError9 = false; + var _iteratorError9 = undefined; try { - for (var _iterator10 = extension.actions[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { - var action = _step10.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) { @@ -2902,16 +3041,16 @@ var ExtensionManager = function () { } } } catch (err) { - _didIteratorError10 = true; - _iteratorError10 = err; + _didIteratorError9 = true; + _iteratorError9 = err; } finally { try { - if (!_iteratorNormalCompletion10 && _iterator10.return) { - _iterator10.return(); + if (!_iteratorNormalCompletion9 && _iterator9.return) { + _iterator9.return(); } } finally { - if (_didIteratorError10) { - throw _iteratorError10; + if (_didIteratorError9) { + throw _iteratorError9; } } } @@ -2951,19 +3090,46 @@ var ExtensionManager = function () { }, { key: 'refreshExtensionsFromServer', value: function refreshExtensionsFromServer() { - var _iteratorNormalCompletion11 = true; - var _didIteratorError11 = false; - var _iteratorError11 = undefined; + var _iteratorNormalCompletion10 = true; + var _didIteratorError10 = false; + var _iteratorError10 = undefined; try { - for (var _iterator11 = this.enabledRepeatActionUrls[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) { - var url = _step11.value; + for (var _iterator10 = this.enabledRepeatActionUrls[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) { + var url = _step10.value; var action = this.actionWithURL(url); if (action) { this.disableRepeatAction(action); } } + } catch (err) { + _didIteratorError10 = true; + _iteratorError10 = err; + } finally { + try { + if (!_iteratorNormalCompletion10 && _iterator10.return) { + _iterator10.return(); + } + } finally { + if (_didIteratorError10) { + throw _iteratorError10; + } + } + } + + 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; @@ -2978,33 +3144,6 @@ var ExtensionManager = function () { } } } - - var _iteratorNormalCompletion12 = true; - var _didIteratorError12 = false; - var _iteratorError12 = undefined; - - try { - for (var _iterator12 = this.extensions[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) { - var ext = _step12.value; - - this.retrieveExtensionFromServer(ext.url, function (extension) { - extension.setDirty(true); - }); - } - } catch (err) { - _didIteratorError12 = true; - _iteratorError12 = err; - } finally { - try { - if (!_iteratorNormalCompletion12 && _iterator12.return) { - _iterator12.return(); - } - } finally { - if (_didIteratorError12) { - throw _iteratorError12; - } - } - } } }, { key: 'executeAction', @@ -3245,13 +3384,13 @@ var ModelManager = function () { key: 'mapResponseItemsToLocalModelsOmittingFields', value: function mapResponseItemsToLocalModelsOmittingFields(items, omitFields) { var models = []; - var _iteratorNormalCompletion13 = true; - var _didIteratorError13 = false; - var _iteratorError13 = undefined; + var _iteratorNormalCompletion12 = true; + var _didIteratorError12 = false; + var _iteratorError12 = undefined; try { - for (var _iterator13 = items[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) { - var json_obj = _step13.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"]); @@ -3278,6 +3417,44 @@ var ModelManager = function () { models.push(item); } + } catch (err) { + _didIteratorError12 = true; + _iteratorError12 = err; + } finally { + try { + if (!_iteratorNormalCompletion12 && _iterator12.return) { + _iterator12.return(); + } + } finally { + if (_didIteratorError12) { + throw _iteratorError12; + } + } + } + + this.notifySyncObserversOfModels(models); + + this.sortItems(); + return models; + } + }, { + key: 'notifySyncObserversOfModels', + value: function notifySyncObserversOfModels(models) { + var _iteratorNormalCompletion13 = true; + var _didIteratorError13 = false; + var _iteratorError13 = undefined; + + try { + 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 item.content_type == observer.type; + }); + if (relevantItems.length > 0) { + observer.callback(relevantItems); + } + } } catch (err) { _didIteratorError13 = true; _iteratorError13 = err; @@ -3292,26 +3469,22 @@ var ModelManager = function () { } } } - - this.notifySyncObserversOfModels(models); - - this.sortItems(); - return models; } }, { - key: 'notifySyncObserversOfModels', - value: function notifySyncObserversOfModels(models) { + key: 'notifyItemChangeObserversOfModels', + value: function notifyItemChangeObserversOfModels(models) { var _iteratorNormalCompletion14 = true; var _didIteratorError14 = false; var _iteratorError14 = undefined; try { - for (var _iterator14 = this.itemSyncObservers[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) { + 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 item.content_type == observer.type; + return observer.content_types.includes(item.content_type) || observer.content_types.includes("*"); }); + if (relevantItems.length > 0) { observer.callback(relevantItems); } @@ -3331,40 +3504,6 @@ var ModelManager = function () { } } } - }, { - key: 'notifyItemChangeObserversOfModels', - value: function notifyItemChangeObserversOfModels(models) { - var _iteratorNormalCompletion15 = true; - var _didIteratorError15 = false; - var _iteratorError15 = undefined; - - try { - for (var _iterator15 = this.itemChangeObservers[Symbol.iterator](), _step15; !(_iteratorNormalCompletion15 = (_step15 = _iterator15.next()).done); _iteratorNormalCompletion15 = true) { - var observer = _step15.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) { - _didIteratorError15 = true; - _iteratorError15 = err; - } finally { - try { - if (!_iteratorNormalCompletion15 && _iterator15.return) { - _iterator15.return(); - } - } finally { - if (_didIteratorError15) { - throw _iteratorError15; - } - } - } - } }, { key: 'createItem', value: function createItem(json_obj) { @@ -3426,13 +3565,13 @@ var ModelManager = function () { return; } - var _iteratorNormalCompletion16 = true; - var _didIteratorError16 = false; - var _iteratorError16 = undefined; + var _iteratorNormalCompletion15 = true; + var _didIteratorError15 = false; + var _iteratorError15 = undefined; try { - for (var _iterator16 = contentObject.references[Symbol.iterator](), _step16; !(_iteratorNormalCompletion16 = (_step16 = _iterator16.next()).done); _iteratorNormalCompletion16 = true) { - var reference = _step16.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) { @@ -3443,16 +3582,16 @@ var ModelManager = function () { } } } catch (err) { - _didIteratorError16 = true; - _iteratorError16 = err; + _didIteratorError15 = true; + _iteratorError15 = err; } finally { try { - if (!_iteratorNormalCompletion16 && _iterator16.return) { - _iterator16.return(); + if (!_iteratorNormalCompletion15 && _iterator15.return) { + _iterator15.return(); } } finally { - if (_didIteratorError16) { - throw _iteratorError16; + if (_didIteratorError15) { + throw _iteratorError15; } } } @@ -3495,10 +3634,36 @@ var ModelManager = function () { } }, { key: 'clearDirtyItems', - value: function clearDirtyItems() { - this.getDirtyItems().forEach(function (item) { - item.setDirty(false); - }); + value: function clearDirtyItems(items) { + var _iteratorNormalCompletion16 = true; + var _didIteratorError16 = false; + var _iteratorError16 = undefined; + + try { + for (var _iterator16 = items[Symbol.iterator](), _step16; !(_iteratorNormalCompletion16 = (_step16 = _iterator16.next()).done); _iteratorNormalCompletion16 = true) { + var item = _step16.value; + + item.setDirty(false); + } + } catch (err) { + _didIteratorError16 = true; + _iteratorError16 = err; + } finally { + try { + if (!_iteratorNormalCompletion16 && _iterator16.return) { + _iterator16.return(); + } + } finally { + if (_didIteratorError16) { + throw _iteratorError16; + } + } + } + } + }, { + key: 'clearAllDirtyItems', + value: function clearAllDirtyItems() { + this.clearDirtyItems(this.getDirtyItems()); } }, { key: 'setItemToBeDeleted', diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index b634ad1c3..b02c06609 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","$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","syncUpdated","$state","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","importData","loading","importJSONData","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","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","filterText","safeTitle","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","allReferencedObjects","reference","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","dirtyItems","getDirtyItems","writeItemsToLocalStorage","responseItems","deleted","clearDirtyItems","createRequestParamsForItem","additionalFields","sync_token","retrieved","handleItemsResponse","retrieved_items","omitFields","saved","saved_items","handleUnsavedItemsResponse","unsaved","undefined","mapping","itemResponse","findItem","alternateUUID","markAllReferencesDirty","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","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","staticifyObject","object","itemsParams","startsWith","sortItemsByDate","removeItem","draftString","jsonObj","clear","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","allItems","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","value","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"],"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), 275)\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 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, $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 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 this.importData.loading = true;\n // allow loading indicator to come up with timeout\n $timeout(function(){\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"Import response:\", success, response);\n this.importData.loading = false;\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 }.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;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 var filterText = this.noteFilter.text.toLowerCase();\n if(filterText.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.safeTitle().toLowerCase().includes(filterText) || note.safeText().toLowerCase().includes(filterText);\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 markAllReferencesDirty() {\n this.allReferencedObjects().forEach(function(reference){\n reference.setDirty(true);\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 var dirtyItems = modelManager.getDirtyItems();\n\n this.writeItemsToLocalStorage(dirtyItems, function(responseItems){\n if(!this.isUserSignedIn()) {\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\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 var retrieved = this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n var saved = this.handleItemsResponse(response.saved_items, omitFields);\n\n this.handleUnsavedItemsResponse(response.unsaved)\n\n this.writeItemsToLocalStorage(saved, null);\n this.writeItemsToLocalStorage(retrieved, null);\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.markAllReferencesDirty();\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 var items = modelManager.mapResponseItemsToLocalModels(data.items);\n items.forEach(function(item){\n item.setDirty(true);\n item.markAllReferencesDirty();\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 this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeItemsToLocalStorage = function(items, callback) {\n for(var item of items) {\n var params = this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\", \"presentation_url\"], false)\n localStorage.setItem(\"item-\" + item.uuid, JSON.stringify(params));\n }\n if(callback) {\n callback(items);\n }\n }\n\n this.loadLocalItems = function() {\n var itemsParams = [];\n for (var i = 0; i < localStorage.length; i++){\n var key = localStorage.key(i);\n if(key.startsWith(\"item-\")) {\n var item = localStorage.getItem(key);\n itemsParams.push(JSON.parse(item));\n }\n }\n\n var items = this.handleItemsResponse(itemsParams, 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.clear();\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 'ngInject';\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\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;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"]} \ 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","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","dbManager","getCurrentUser","openDatabase","clearSyncToken","sync","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","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","syncUpdated","$state","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","importData","loading","importJSONData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","items","$apply","setInterval","allTag","Tag","all","title","tags","notes","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","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","filterText","safeTitle","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","allReferencedObjects","reference","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","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","syncOpInProgress","repeatSync","allDirtyItems","getDirtyItems","submitLimit","dirtyItems","writeItemsToLocalStorage","responseItems","deleted","clearDirtyItems","limit","sync_token","cursor_token","cursorToken","createRequestParamsForItem","additionalFields","retrieved","handleItemsResponse","retrieved_items","omitFields","saved","saved_items","handleUnsavedItemsResponse","unsaved","undefined","mapping","itemResponse","findItem","alternateUUID","markAllReferencesDirty","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","removeItem","onDataReady","mapResponseItemsToLocalModels","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","staticifyObject","object","saveItems","getAllItems","sortItemsByDate","draftString","jsonObj","clear","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","allItems","saveBatchItems","DBManager","onUgradeNeeded","indexedDB","onerror","onsuccess","db","errorEvent","errorCode","onupgradeneeded","version","objectStore","createObjectStore","keyPath","createIndex","unique","transaction","oncomplete","openCursor","cursor","value","continue","itemObjectStore","putNext","put","delete","service","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","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","$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"],"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,EA0BCf,QAAQC,MAAR,CAAe,cAAf,EACEC,MADF,CACS,UAAUmB,cAAV,EAA0BC,kBAA1B,EAA8CC,iBAA9C,EAAiE;;AAEvEF,iBACGG,KADH,CACS,MADT,EACiB;AACbC,cAAU;AADG,GADjB,EAKGD,KALH,CAKS,MALT,EAKiB;AACblB,SAAK,GADQ;AAEboB,YAAQ,MAFK;AAGbC,WAAO;AACL,kBAAa;AACXC,qBAAa,oBADF;AAEXC,oBAAY;AAFD;AADR;AAHM,GALjB;;AAgBE;AACAP,qBAAmBQ,SAAnB,CAA6B,UAASC,SAAT,EAAoBC,SAApB,EAA8B;AACxD,QAAIR,QAAQO,UAAUE,GAAV,CAAc,QAAd,CAAZ;AACAT,UAAMU,EAAN,CAAS,MAAT;AACA,WAAOF,UAAUG,IAAV,EAAP;AACF,GAJD;;AAMA;AACAZ,oBAAkBa,SAAlB,CAA4B,IAA5B;AAEH,CA7BF;AA8BD;IAAOC,Q,GACL,kBAAYC,UAAZ,EAAwBC,YAAxB,EAAsCC,aAAtC,EAAqDC,SAArD,EAAgE;AAAA;;AAC9DD,gBAAcE,cAAd,CAA6B,YAAU,CAAE,CAAzC;AACAD,YAAUE,YAAV,CAAuB,IAAvB,EAA6B,YAAU;AACrC;AACAH,kBAAcI,cAAd;AACAJ,kBAAcK,IAAd;AACD,GAJD;AAKD,C;;AAGH7C,QAAQC,MAAR,CAAe,cAAf,EAA+B4B,UAA/B,CAA0C,UAA1C,EAAsDQ,QAAtD;AACA,CAACrC,QAAQC,MAAR,CAAe,cAAf,EACE6C,SADF,CACY,eADZ,EAC6B,UAASC,QAAT,EAAkB;AAC5C,SAAO;AACLC,cAAU,GADL;AAELC,WAAO;AACLC,YAAM,GADD;AAELC,cAAQ,GAFH;AAGLC,YAAM;AAHD,KAFF;AAOLxB,iBAAa,sBAPR;AAQL5I,aAAS,IARJ;AASL6I,gBAAY,YATP;AAULwB,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+BA7L,aAAO8L,gBAAP,CAAwB,SAAxB,EAAmCb,OAAnC;;AAEAV,YAAMwB,GAAN,CAAU,UAAV,EAAsB,YAAU;AAC9B/L,eAAOgM,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,EAgEEvB,UAhEF,CAgEa,YAhEb,EAgE2B,UAAUiD,IAAV,EAAgB/B,QAAhB,EAA0BP,aAA1B,EAAyCuC,gBAAzC,EAA2DzC,UAA3D,EAAuE0C,gBAAvE,EAAyF;;AAEjH,OAAKH,OAAL,GAAe,UAASzB,IAAT,EAAewB,OAAf,EAAwB;AACrC,SAAKK,UAAL,GAAkB,MAAlB;;AAEA,QAAG7B,KAAK8B,QAAL,GAAgB3J,MAAhB,IAA0B,CAA1B,IAA+B6H,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,EAAsD7H,MAAtD,GAA+D,CAAtE;AACD,GAFD;;AAIA,OAAKiK,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,UAAIjF,UAAUkF,SAASC,cAAT,CAAwB,kBAAxB,CAAd;AACAnF,cAAQoF,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;AACV9D,sBAAc+D,UAAd;;AAEA,YAAGH,aAAH,EAAkBrD,SAASyD,MAAT,CAAgBJ,aAAhB;AAClBA,wBAAgBrD,SAAS,YAAU;AACjC,eAAK0D,UAAL,GAAkB,mBAAlB;AACD,SAFwB,CAEvBlI,IAFuB,CAElB,IAFkB,CAAT,EAEF,GAFE,CAAhB;AAGD,OAPD,MAOO;AACL,YAAG6H,aAAH,EAAkBrD,SAASyD,MAAT,CAAgBJ,aAAhB;AAClBA,wBAAgBrD,SAAS,YAAU;AACjC,eAAK0D,UAAL,GAAkB,+BAAlB;AACD,SAFwB,CAEvBlI,IAFuB,CAElB,IAFkB,CAAT,EAEF,GAFE,CAAhB;AAGD;AACF,KAdiB,CAchBA,IAdgB,CAcX,IAdW,CAAlB;AAeD,GAlBD;;AAoBA,OAAKmI,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,QAAG3C,cAAcuE,cAAd,EAAH,EAAmC;AACjC;AACAvE,oBAAcwE,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,CAGrB7F,IAHqB,CAGhB,IAHgB,CAAT,EAGA,GAHA,CAAd;AAID,GAdD;;AAiBA,OAAK0I,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;AACAhF,eAAWiF,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,QAAI1F,MAAM,KAAKuH,gBAAL,CAAsB,KAAKzE,IAA3B,CAAV;AACA9C,UAAMA,IAAItH,OAAJ,CAAY,KAAKoK,IAAL,CAAU0E,iBAAtB,EAAyC,EAAzC,CAAN;AACA,SAAKxH,GAAL,GAAW,EAACyH,MAAMzH,GAAP,EAAYU,OAAQ,KAAKoC,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,KAAKxH,GAAL,CAASU,KAAvC;AACA,SAAKoC,IAAL,CAAU8E,QAAV,CAAmB,IAAnB;;AAEA1F,kBAAcK,IAAd,CAAmB,UAASsF,QAAT,EAAkB;AACnC,UAAGA,YAAYA,SAASnJ,KAAxB,EAA+B;AAC7B,aAAKoE,IAAL,CAAU0E,iBAAV,GAA8BG,QAA9B;AACA,aAAK3H,GAAL,CAASU,KAAT,GAAiBiH,QAAjB;AACAG,cAAM,4BAAN;AACD,OAJD,MAIO;AACL,aAAKZ,UAAL,GAAkB,KAAlB;AACD;AACF,KARkB,CAQjBjJ,IARiB,CAQZ,IARY,CAAnB;AASD,GAhBD;;AAkBA,OAAK8J,SAAL,GAAiB,YAAW;;AAE1B,aAASC,YAAT,CAAsBhI,GAAtB,EAA2B;AACzB,UAAIiI,IAAI3C,SAAS4C,aAAT,CAAuB,GAAvB,CAAR;AACAD,QAAE5B,MAAF,GAAW,QAAX;AACA4B,QAAEE,IAAF,GAASnI,GAAT;AACAiI,QAAEG,KAAF;AACH;;AAEClG,kBAAcmG,SAAd,CAAwB,KAAKvF,IAA7B,EAAmC,UAASA,IAAT,EAAc;AAC/CkF,mBAAa,KAAKT,gBAAL,CAAsBzE,IAAtB,CAAb;AACD,KAFkC,CAEjC7E,IAFiC,CAE5B,IAF4B,CAAnC;AAGA,SAAKyH,QAAL,GAAgB,KAAhB;AACD,GAbD;;AAeA,OAAK4C,WAAL,GAAmB,YAAW;AAC5BpG,kBAAcqG,WAAd,CAA0B,KAAKzF,IAA/B,EAAqC,UAASA,IAAT,EAAc,CAElD,CAFD;AAGA,SAAK4C,QAAL,GAAgB,KAAhB;AACD,GALD;;AAOA,OAAK6B,gBAAL,GAAwB,YAAW;AACjC,WAAO,KAAKzE,IAAL,CAAU0F,eAAV,EAAP;AACD,GAFD;;AAIA,OAAKC,WAAL,GAAmB,YAAW;AAC5B,QAAG,KAAK3F,IAAL,CAAU4F,MAAb,EAAqB;AACnBZ,YAAM,iFAAN;AACD,KAFD,MAEO;AACL,WAAKpC,QAAL,GAAgB,CAAC,KAAKA,QAAtB;AACD;AACF,GAND;;AAQA,OAAKiD,UAAL,GAAkB,YAAW;AAC3BzG,kBAAc+D,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,CAACzF,QAAQC,MAAR,CAAe,cAAf,EACE6C,SADF,CACY,QADZ,EACsB,UAASN,aAAT,EAAwBwC,gBAAxB,EAAyC;AAC5D,SAAO;AACLhC,cAAU,GADL;AAELC,WAAO,EAFF;AAGLrB,iBAAa,sBAHR;AAIL5I,aAAS,IAJJ;AAKL6I,gBAAY,YALP;AAMLwB,kBAAc,MANT;AAOLC,sBAAkB,IAPb;;AASLC,UAAK,cAASN,KAAT,EAAgBO,IAAhB,EAAsBC,KAAtB,EAA6BC,IAA7B,EAAmC;AACtCT,YAAMwB,GAAN,CAAU,oBAAV,EAAgC,YAAU;AACxCf,aAAKwF,WAAL;AACD,OAFD;AAGD;AAbI,GAAP;AAeD,CAjBF,EAkBErH,UAlBF,CAkBa,YAlBb,EAkB2B,UAAUsH,MAAV,EAAkB3G,aAAlB,EAAiCD,YAAjC,EAA+CQ,QAA/C,EAAyDiC,gBAAzD,EAA2E;;AAEnG,OAAKoE,IAAL,GAAY5G,cAAc4G,IAA1B;AACA,OAAKpE,gBAAL,GAAwBA,gBAAxB;;AAEA,OAAKqE,qBAAL,GAA6B,YAAW;AACtC,SAAKC,mBAAL,GAA2B,CAAC,KAAKA,mBAAjC;AACD,GAFD;;AAIA,OAAKC,kBAAL,GAA0B,YAAW;AACnC,SAAKC,UAAL,GAAkB,EAAClJ,KAAKkC,cAAciH,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;AAC5B0E,uBAAiBkF,YAAjB,CAA8B,KAAKH,gBAAL,CAAsBzJ,GAApD,EAAyD,UAAS6H,QAAT,EAAkB;AACzE,YAAG,CAACA,QAAJ,EAAc;AACZC,gBAAM,+EAAN;AACD,SAFD,MAEO;AACL,eAAK2B,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;AACAtF,qBAAiBuF,aAAjB,CAA+BH,MAA/B,EAAuCC,SAAvC,EAAkD,IAAlD,EAAwD,UAASlC,QAAT,EAAkB;AACxEiC,aAAOE,OAAP,GAAiB,KAAjB;AACA,UAAGnC,YAAYA,SAASnJ,KAAxB,EAA+B;AAC7BoL,eAAOpL,KAAP,GAAe,IAAf;AACAoJ,cAAM,8DAAN;AACD,OAHD,MAGO;AACLgC,eAAOpL,KAAP,GAAe,KAAf;AACAwD,sBAAcK,IAAd,CAAmB,IAAnB;AACD;AACF,KATD;AAUD,GAZD;;AAcA,OAAK2H,eAAL,GAAuB,UAASH,SAAT,EAAoB;AACzC,QAAGI,QAAQ,iDAAR,CAAH,EAA+D;AAC7DzF,uBAAiBwF,eAAjB,CAAiCH,SAAjC;AACD;AACF,GAJD;;AAMA,OAAKK,uBAAL,GAA+B,YAAW;AACxC,QAAGD,QAAQ,4FAAR,CAAH,EAA0G;AACxGzF,uBAAiB2F,2BAAjB;AACD;AACF,GAJD;;AAMA,OAAKC,YAAL,GAAoB,YAAW;AAC7BpI,kBAAcqI,SAAd,CAAwB,KAAKrB,UAAL,CAAgBlJ,GAAxC,EAA6C,IAA7C;AACD,GAFD;;AAIA,OAAKwK,cAAL,GAAsB,YAAW;AAC/B,SAAKpB,eAAL,GAAuB,KAAvB;AACAlH,kBAAcuI,OAAd;AACArS,WAAOsS,QAAP,CAAgBC,MAAhB;AACD,GAJD;;AAMA,OAAKC,oBAAL,GAA4B,YAAW;AACrC,SAAKC,kBAAL,CAAwBC,MAAxB,GAAiC,wBAAjC;;AAEArI,aAAS,YAAU;AACjB,UAAGsI,KAAKtP,QAAL,IAAiBsP,KAAKC,qBAAzB,EAAgD;AAC9ClD,cAAM,oDAAN;AACA;AACD;;AAED5F,oBAAc+I,cAAd,CAA6B,KAAKJ,kBAAL,CAAwBK,gBAArD,EAAuE,KAAKL,kBAAL,CAAwBM,YAA/F,EAA6G,UAAStD,QAAT,EAAkB,CAE9H,CAFD;AAID,KAVQ,CAUP5J,IAVO,CAUF,IAVE,CAAT;AAWD,GAdD;;AAgBA,OAAKmN,YAAL,GAAoB,YAAW;AAC7B,WAAOnJ,aAAaoJ,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;AACAvJ,kBAAcK,IAAd,CAAmB,UAASsF,QAAT,EAAkB;AACnCpF,eAAS,YAAU;AACjB,aAAKgJ,YAAL,GAAoB,KAApB;AACD,OAFQ,CAEPxN,IAFO,CAEF,IAFE,CAAT,EAEc,GAFd;AAGA,UAAG4J,YAAYA,SAASnJ,KAAxB,EAA+B;AAC7BoJ,cAAM,2FAAN;AACD,OAFD,MAEO;AACL,aAAKc,WAAL;AACD;AACF,KATkB,CASjB3K,IATiB,CASZ,IATY,CAAnB;AAUD,GAZD;;AAcA,OAAK2K,WAAL,GAAmB,YAAW;AAC5B,SAAK8C,YAAL,GAAoB,IAAI3S,IAAJ,EAApB;AACD,GAFD;;AAIA,OAAK4S,kBAAL,GAA0B,YAAW;AACnC,SAAKC,SAAL,CAAed,MAAf,GAAwB,0BAAxB;AACArI,aAAS,YAAU;AACjBP,oBAAc2J,KAAd,CAAoB,KAAKD,SAAL,CAAexP,KAAnC,EAA0C,KAAKwP,SAAL,CAAeE,aAAzD,EAAwE,UAASjE,QAAT,EAAkB;AACxF,YAAG,CAACA,QAAD,IAAaA,SAASnJ,KAAzB,EAAgC;AAC9B,cAAIA,QAAQmJ,WAAWA,SAASnJ,KAApB,GAA4B,EAACpD,SAAS,2BAAV,EAAxC;AACA,eAAKsQ,SAAL,CAAed,MAAf,GAAwB,IAAxB;AACAhD,gBAAMpJ,MAAMpD,OAAZ;AACD,SAJD,MAIO;AACL,eAAKyQ,aAAL,CAAmBlE,SAASiB,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;;AAEArI,aAAS,YAAU;AACjBP,oBAAc+J,QAAd,CAAuB,KAAKL,SAAL,CAAexP,KAAtC,EAA6C,KAAKwP,SAAL,CAAeE,aAA5D,EAA2E,UAASjE,QAAT,EAAkB;AAC3F,YAAG,CAACA,QAAD,IAAaA,SAASnJ,KAAzB,EAAgC;AAC9B,cAAIA,QAAQmJ,WAAWA,SAASnJ,KAApB,GAA4B,EAACpD,SAAS,2BAAV,EAAxC;AACA,eAAKsQ,SAAL,CAAed,MAAf,GAAwB,IAAxB;AACAhD,gBAAMpJ,MAAMpD,OAAZ;AACD,SAJD,MAIO;AACL,eAAKyQ,aAAL,CAAmBlE,SAASiB,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,WAAWlK,aAAaoJ,aAA5B;AACA,QAAIe,iBAAiB,CAArB;AACAD,aAASE,OAAT,CAAiB,UAASvJ,IAAT,EAAc;AAC7B,UAAGA,KAAKwJ,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,QAAIvJ,OAAOqC,SAAS4C,aAAT,CAAuB,GAAvB,CAAX;AACAjF,SAAKwJ,YAAL,CAAkB,UAAlB,EAA8B,YAA9B;AACAxJ,SAAKkF,IAAL,GAAYjG,cAAcwK,aAAd,CAA4B,KAAKH,uBAAL,CAA6B/R,SAAzD,CAAZ;AACAyI,SAAKmF,KAAL;AACD,GALD;;AAOA,OAAKuE,aAAL,GAAqB,UAAS5B,IAAT,EAAetP,QAAf,EAAyB;AAC5C,SAAKmR,UAAL,CAAgBC,OAAhB,GAA0B,IAA1B;AACA;AACApK,aAAS,YAAU;AACjBP,oBAAc4K,cAAd,CAA6B/B,IAA7B,EAAmCtP,QAAnC,EAA6C,UAASuK,OAAT,EAAkB6B,QAAlB,EAA2B;AACtE/J,gBAAQC,GAAR,CAAY,kBAAZ,EAAgCiI,OAAhC,EAAyC6B,QAAzC;AACA,aAAK+E,UAAL,CAAgBC,OAAhB,GAA0B,KAA1B;AACA,YAAG7G,OAAH,EAAY;AACV,eAAK4G,UAAL,GAAkB,IAAlB;AACD,SAFD,MAEO;AACL9E,gBAAM,2DAAN;AACD;AACF,OAR4C,CAQ3C7J,IAR2C,CAQtC,IARsC,CAA7C;AASD,KAVQ,CAUPA,IAVO,CAUF,IAVE,CAAT;AAWD,GAdD;;AAgBA,OAAK8O,oBAAL,GAA4B,YAAW;AACrC,SAAKJ,aAAL,CAAmB,KAAKC,UAAL,CAAgB7B,IAAnC,EAAyC,KAAK6B,UAAL,CAAgBnR,QAAzD;AACD,GAFD;;AAIA,OAAKuR,kBAAL,GAA0B,UAASC,KAAT,EAAgB;AACxC,SAAKL,UAAL,GAAkB,EAAlB;;AAEA,QAAIM,OAAOD,MAAM,CAAN,CAAX;AACA,QAAIE,SAAS,IAAIC,UAAJ,EAAb;AACAD,WAAOE,MAAP,GAAgB,UAASC,CAAT,EAAY;AAC1B,UAAIvC,OAAOwC,KAAK5T,KAAL,CAAW2T,EAAEjH,MAAF,CAASmH,MAApB,CAAX;AACA/K,eAAS,YAAU;AACjB,YAAGsI,KAAK0C,WAAR,EAAqB;AACnB;AACA,eAAKb,UAAL,CAAgBc,eAAhB,GAAkC,IAAlC;AACA,eAAKd,UAAL,CAAgB7B,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;;AAaAkP,WAAOQ,UAAP,CAAkBT,IAAlB;AACD,GAnBD;;AAqBA,OAAKnB,aAAL,GAAqB,UAASjD,IAAT,EAAe;;AAElC;AACE;AACA;AACA;AACF;AACE1Q,WAAOsS,QAAP,CAAgBC,MAAhB;AACF;;AAEA,SAAKiD,SAAL,GAAiB,KAAjB;AACA,SAAKC,gBAAL,GAAwB,KAAxB;AACD,GAZD;AAcD,CAvPF;AAwPD,CAACnO,QAAQC,MAAR,CAAe,cAAf,EACA4B,UADA,CACW,UADX,EACuB,UAAUuM,MAAV,EAAkB9L,UAAlB,EAA8BS,QAA9B,EAAwCP,aAAxC,EAAuDD,YAAvD,EAAqE;AACzFD,aAAW+L,SAAX,GAAuB,gBAAvB;;AAEA7L,gBAAc8L,cAAd,CAA6B,UAASC,KAAT,EAAe;AAC1CH,WAAOI,MAAP;;AAEAhM,kBAAcK,IAAd,CAAmB,IAAnB;AACA;AACA4L,gBAAY,YAAY;AACtBjM,oBAAcK,IAAd,CAAmB,IAAnB;AACD,KAFD,EAEG,KAFH;AAGD,GARD;;AAUAuL,SAAOM,MAAP,GAAgB,IAAIC,GAAJ,CAAQ,EAACC,KAAK,IAAN,EAAR,CAAhB;AACAR,SAAOM,MAAP,CAAcG,KAAd,GAAsB,KAAtB;AACAT,SAAOU,IAAP,GAAcvM,aAAauM,IAA3B;AACAV,SAAOM,MAAP,CAAcK,KAAd,GAAsBxM,aAAawM,KAAnC;;AAEA;;;;AAIAX,SAAOY,YAAP,GAAsB,YAAW;AAC/B;AACD,GAFD;;AAIAZ,SAAOa,qBAAP,GAA+B,UAASC,GAAT,EAAc;AAC3C,QAAGA,IAAIN,GAAP,EAAY;AACVR,aAAOY,YAAP;AACD;AACF,GAJD;;AAMAZ,SAAOe,iBAAP,GAA2B,UAASD,GAAT,EAAc;AACvCd,WAAOgB,WAAP,GAAqBF,GAArB;;AAEA,QAAGd,OAAOiB,YAAP,IAAuBjB,OAAOiB,YAAP,CAAoBlK,KAA9C,EAAqD;AACnD5C,mBAAa+M,iBAAb,CAA+BlB,OAAOiB,YAAtC;AACD;AACF,GAND;;AAQAjB,SAAOmB,UAAP,GAAoB,UAASL,GAAT,EAAc;AAChC3M,iBAAaiN,OAAb,CAAqBN,GAArB;AACD,GAFD;;AAIAd,SAAOqB,QAAP,GAAkB,UAASP,GAAT,EAAc7S,QAAd,EAAwB;AACxC6S,QAAIhH,QAAJ,CAAa,IAAb;AACA1F,kBAAcK,IAAd,CAAmBxG,QAAnB;AACD,GAHD;;AAKA;;;;AAIA+R,SAAOsB,iBAAP,GAA2B,UAASC,QAAT,EAAmBC,MAAnB,EAA2BC,MAA3B,EAAmC;;AAE5D,QAAIC,eAAe/S,EAAEgT,IAAF,CAAOxN,aAAawM,KAApB,EAA2B,EAACtV,MAAMkW,SAASlW,IAAhB,EAA3B,CAAnB;AACA,QAAG,CAACmW,OAAOhB,GAAX,EAAgB;AACdrM,mBAAayN,8BAAb,CAA4CJ,MAA5C,EAAoDE,YAApD;AACD;;AAEDtN,kBAAcK,IAAd,CAAmB,YAAU,CAAE,CAA/B;AACD,GARD;;AAUA;;;;AAIAuL,SAAO6B,cAAP,GAAwB,UAASf,GAAT,EAAc;AACpC,QAAIgB,aAAaC,KAAKC,gBAAL,CAAsBlB,IAAIH,KAA1B,CAAjB;AACA,QAAGmB,cAAc,CAAjB,EAAoB;AAClB3N,mBAAa8N,kBAAb,CAAgCnB,GAAhC;AACA;AACA1M,oBAAcK,IAAd,CAAmB,YAAU;AAC3B;AACAuL,eAAOU,IAAP,GAAc,EAAd;AACA/L,iBAAS,YAAU;AACjBqL,iBAAOU,IAAP,GAAcvM,aAAauM,IAA3B;AACD,SAFD;AAGD,OAND;AAOD,KAVD,MAUO;AACL1G,YAAM,iDAAN;AACD;AACF,GAfD;;AAiBAgG,SAAOkC,kBAAP,GAA4B,UAASlN,IAAT,EAAe;AACzCgL,WAAOiB,YAAP,GAAsBjM,IAAtB;AACD,GAFD;;AAIAgL,SAAOmC,WAAP,GAAqB,UAASnN,IAAT,EAAe;AAClCb,iBAAaiN,OAAb,CAAqBpM,IAArB;;AAEA,QAAG,CAACgL,OAAOgB,WAAP,CAAmBR,GAAvB,EAA4B;AAC1BrM,mBAAayN,8BAAb,CAA4C5B,OAAOgB,WAAnD,EAAgEhM,IAAhE;AACAgL,aAAOY,YAAP;AACD;AACF,GAPD;;AASA;;;;AAIAZ,SAAOhK,QAAP,GAAkB,UAAShB,IAAT,EAAe/G,QAAf,EAAyB;AACzC+G,SAAK8E,QAAL,CAAc,IAAd;;AAEA1F,kBAAcK,IAAd,CAAmB,UAASsF,QAAT,EAAkB;AACnC,UAAGA,YAAYA,SAASnJ,KAAxB,EAA+B;AAC7B,YAAG,CAACoP,OAAOoC,iBAAX,EAA8B;AAC5BpC,iBAAOoC,iBAAP,GAA2B,IAA3B;AACApI,gBAAM,wDAAN;AACD;AACD/L,iBAAS,KAAT;AACD,OAND,MAMO;AACL+G,aAAKiC,UAAL,GAAkB,KAAlB;AACA,YAAGhJ,QAAH,EAAa;AACXA,mBAAS,IAAT;AACD;AACF;AACF,KAbD;AAcD,GAjBD;;AAmBA+R,SAAOnF,UAAP,GAAoB,UAAS7F,IAAT,EAAe;;AAEjCb,iBAAa8N,kBAAb,CAAgCjN,IAAhC;;AAEA,QAAGA,QAAQgL,OAAOiB,YAAlB,EAAgC;AAC9BjB,aAAOiB,YAAP,GAAsB,IAAtB;AACD;;AAED,QAAGjM,KAAK+B,KAAR,EAAe;AACb5C,mBAAa+M,iBAAb,CAA+BlM,IAA/B;AACA;AACD;;AAEDZ,kBAAcK,IAAd,CAAmB,IAAnB;AACD,GAdD;AAeH,CAxIA;AAyID,CAAC7C,QAAQC,MAAR,CAAe,cAAf,EACE6C,SADF,CACY,cADZ,EAC4B,YAAU;AACnC,SAAO;AACLG,WAAO;AACLwN,cAAQ,GADH;AAELC,qBAAe,GAFV;AAGLvN,cAAQ,GAHH;AAIL+L,WAAK,GAJA;AAKLyB,iBAAW;AALN,KADF;;AASL/O,iBAAa,qBATR;AAUL5I,aAAS,IAVJ;AAWL6I,gBAAY,WAXP;AAYLwB,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,eAAKkN,YAAL,CAAkB1B,GAAlB,EAAuBW,MAAvB;AACD;AACF,OAJD;AAKD;AArBI,GAAP;AAuBD,CAzBF,EA0BEhO,UA1BF,CA0Ba,WA1Bb,EA0B0B,UAAUW,aAAV,EAAyBO,QAAzB,EAAmCT,UAAnC,EAA+CC,YAA/C,EAA6D;;AAEpFD,aAAWmC,GAAX,CAAe,eAAf,EAAgC,YAAU;AACxC,SAAKuB,QAAL,GAAgB,KAAhB;AACD,GAF+B,CAE9BzH,IAF8B,CAEzB,IAFyB,CAAhC;;AAIA,MAAIsS,cAAc,IAAlB;;AAEA,OAAKD,YAAL,GAAoB,UAAS1B,GAAT,EAAcW,MAAd,EAAsB;AACxC,SAAK7J,QAAL,GAAgB,KAAhB;;AAEA,QAAG,KAAKqJ,YAAL,IAAqB,KAAKA,YAAL,CAAkBlK,KAA1C,EAAiD;AAC/CpI,QAAEoG,MAAF,CAAS0M,OAAOd,KAAhB,EAAuB,KAAKM,YAA5B;AACD;;AAED,SAAKyB,UAAL,CAAgBjW,IAAhB,GAAuB,EAAvB;;AAEAqU,QAAIH,KAAJ,CAAUpC,OAAV,CAAkB,UAASvJ,IAAT,EAAc;AAC9BA,WAAK2N,OAAL,GAAe,IAAf;AACD,KAFD;AAGA,SAAKC,eAAL,CAAqB,KAArB;;AAEA,QAAGH,WAAH,EAAgB;AACd9N,eAAS,YAAU;AACjB,YAAIkO,QAAQzO,cAAc0O,QAAd,EAAZ;AACA,YAAGD,KAAH,EAAU;AACR,cAAI7N,OAAO6N,KAAX;AACA,eAAKE,UAAL,CAAgB/N,IAAhB;AACD,SAHD,MAGO;AACL,eAAKgO,aAAL;AACAP,wBAAc,KAAd;AACD;AACF,OATQ,CASPtS,IATO,CASF,IATE,CAAT;AAUD,KAXD,MAWO,IAAG2Q,IAAIH,KAAJ,CAAUxT,MAAV,IAAoB,CAAvB,EAA0B;AAC7B,WAAK6V,aAAL;AACH;AACF,GA5BD;;AA8BA,OAAKC,iBAAL,GAAyB,YAAW;AAClC,SAAKrL,QAAL,GAAgB,KAAhB;AACA,SAAK2K,SAAL,GAAiB,KAAKzB,GAAtB;AACD,GAHD;;AAKA,OAAKoC,gBAAL,GAAwB,YAAW;AACjC,SAAKtL,QAAL,GAAgB,KAAhB;;AAEA,QAAG,CAACxD,cAAcuE,cAAd,EAAJ,EAAoC;AAClCqB,YAAM,uCAAN;AACA;AACD;;AAED,QAAG,KAAK8G,GAAL,CAASN,GAAZ,EAAiB;AACfxG,YAAM,iCAAN;AACA;AACD;;AAED5F,kBAAcmG,SAAd,CAAwB,KAAKuG,GAA7B,EAAkC,UAAS/G,QAAT,EAAkB,CAAE,CAAtD;AACD,GAdD;;AAgBA,OAAKoJ,kBAAL,GAA0B,YAAW;AACnC,SAAKvL,QAAL,GAAgB,KAAhB;AACAxD,kBAAcqG,WAAd,CAA0B,KAAKqG,GAA/B,EAAoC,UAAS/G,QAAT,EAAkB,CAErD,CAFD;AAGD,GALD;;AAOA,OAAK6I,eAAL,GAAuB,UAASQ,SAAT,EAAoB;AACzC,QAAIC,eAAe,KAAKvC,GAAL,CAASH,KAAT,CAAe2C,MAAf,CAAsB,UAAStO,IAAT,EAAc;AACrD,aAAOA,KAAK2N,OAAZ;AACD,KAFkB,CAAnB;;AAIA,QAAGU,aAAalW,MAAb,GAAsB,CAAzB,EAA4B;AAC1B,WAAK4V,UAAL,CAAgBM,aAAa,CAAb,CAAhB;AACD,KAFD,MAEO,IAAGD,SAAH,EAAc;AACnB,WAAKJ,aAAL;AACD;AACF,GAVD;;AAYA,OAAKD,UAAL,GAAkB,UAAS/N,IAAT,EAAe;AAC/B,SAAKiM,YAAL,GAAoBjM,IAApB;AACA,SAAKsN,aAAL,GAAqBtN,IAArB;AACD,GAHD;;AAKA,OAAKgO,aAAL,GAAqB,YAAW;AAC9B,QAAIvC,QAAQ,cAAc,KAAKK,GAAL,CAASH,KAAT,GAAkB,OAAO,KAAKG,GAAL,CAASH,KAAT,CAAexT,MAAf,GAAwB,CAA/B,CAAlB,GAAuD,EAArE,CAAZ;AACA,SAAKoW,OAAL,GAAepP,aAAaqP,UAAb,CAAwB,EAACC,cAAc,MAAf,EAAuB1M,OAAO,IAA9B,EAAoCtK,MAAM,EAA1C,EAAxB,CAAf;AACA,SAAK8W,OAAL,CAAa9C,KAAb,GAAqBA,KAArB;AACA,SAAKsC,UAAL,CAAgB,KAAKQ,OAArB;AACA,SAAKlB,MAAL,GAAc,KAAKkB,OAAnB;AACD,GAND;;AAQA,OAAKb,UAAL,GAAkB,EAACjW,MAAO,EAAR,EAAlB;;AAEA,OAAKiX,WAAL,GAAmB,UAAS1O,IAAT,EAAe;AAChC,QAAI2O,aAAa,KAAKjB,UAAL,CAAgBjW,IAAhB,CAAqBqJ,WAArB,EAAjB;AACA,QAAG6N,WAAWxW,MAAX,IAAqB,CAAxB,EAA2B;AACzB6H,WAAK2N,OAAL,GAAe,IAAf;AACD,KAFD,MAEO;AACL3N,WAAK2N,OAAL,GAAe3N,KAAK4O,SAAL,GAAiB9N,WAAjB,GAA+B+N,QAA/B,CAAwCF,UAAxC,KAAuD3O,KAAK8B,QAAL,GAAgBhB,WAAhB,GAA8B+N,QAA9B,CAAuCF,UAAvC,CAAtE;AACD;AACD,WAAO3O,KAAK2N,OAAZ;AACD,GARkB,CAQjBxS,IARiB,CAQZ,IARY,CAAnB;;AAUA,OAAK2T,iBAAL,GAAyB,YAAW;AAClCnP,aAAS,YAAU;AACjB,UAAG,CAAC,KAAKsM,YAAL,CAAkB0B,OAAtB,EAA+B;AAC7B,aAAKC,eAAL,CAAqB,KAArB;AACD;AACF,KAJQ,CAIPzS,IAJO,CAIF,IAJE,CAAT,EAIc,GAJd;AAKD,GAND;AAOD,CAxIF;AAyID,CAACyB,QAAQC,MAAR,CAAe,cAAf,EACE6C,SADF,CACY,aADZ,EAC2B,YAAU;AAClC,SAAO;AACLE,cAAU,GADL;AAELC,WAAO;AACLwN,cAAQ,GADH;AAELC,qBAAe,GAFV;AAGLyB,kBAAY,GAHP;AAILjP,YAAM,GAJD;AAKL4L,YAAM,GALD;AAMLJ,cAAQ,GANH;AAOL0D,qBAAe;AAPV,KAFF;AAWLxQ,iBAAa,oBAXR;AAYL5I,aAAS,IAZJ;AAaL6I,gBAAY,UAbP;AAcLwB,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,UAAS+J,MAAT,EAAgB;AAC1C,YAAGA,MAAH,EAAW;AACThL,eAAK6O,SAAL,CAAe7D,MAAf;AACD;AACF,OAJD;AAKD;AA7BI,GAAP;AA+BD,CAjCF,EAkCE7M,UAlCF,CAkCa,UAlCb,EAkCyB,UAAUU,YAAV,EAAwB;;AAE9C,MAAIiQ,cAAc,IAAlB;;AAEA,OAAKD,SAAL,GAAiB,UAAS7D,MAAT,EAAiB;AAChC,SAAK+D,SAAL,CAAe,KAAK/D,MAApB;AACD,GAFD;;AAIA,OAAK4D,OAAL,GAAe,UAASxD,IAAT,EAAe;AAC5B,QAAG0D,WAAH,EAAgB;AACZA,oBAAc,KAAd;AACA,WAAKC,SAAL,CAAe,KAAK/D,MAApB;AACH,KAHD,MAGO;AACL,UAAGI,QAAQA,KAAKvT,MAAL,GAAc,CAAzB,EAA4B;AAC1B,aAAKkX,SAAL,CAAe3D,KAAK,CAAL,CAAf;AACD;AACF;AACF,GATD;;AAWA,OAAK2D,SAAL,GAAiB,UAASvD,GAAT,EAAc;AAC7B,SAAKiD,UAAL,GAAkBjD,GAAlB;AACA,SAAKE,WAAL,GAAmBF,GAAnB;AACA,SAAKwB,aAAL,GAAqBxB,GAArB;AACD,GAJD;;AAMA,OAAKwD,gBAAL,GAAwB,YAAW;AACjC,QAAG,KAAKC,UAAR,EAAoB;AAClB;AACD;;AAED,SAAK/C,MAAL,GAAcrN,aAAaqP,UAAb,CAAwB,EAACC,cAAc,KAAf,EAAxB,CAAd;AACA,SAAKzC,WAAL,GAAmB,KAAKQ,MAAxB;AACA,SAAK+C,UAAL,GAAkB,KAAK/C,MAAvB;AACA,SAAKa,MAAL,GAAc,KAAKb,MAAnB;AACD,GATD;;AAWA,MAAIgD,kBAAkB,EAAtB;AACA,OAAKC,eAAL,GAAuB,UAAS3D,GAAT,EAAc;AACnC0D,sBAAkB1D,IAAIL,KAAtB;AACD,GAFD;;AAIA,OAAKiE,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,IAAIL,KAAJ,CAAUtT,MAAV,IAAoB,CAAvB,EAA0B;AACxB2T,UAAIL,KAAJ,GAAY+D,eAAZ;AACAA,wBAAkB,EAAlB;AACA;AACD;;AAEDvM,WAAOM,MAAP,CAAcC,IAAd;AACA,QAAG,CAACsI,IAAIL,KAAL,IAAcK,IAAIL,KAAJ,CAAUtT,MAAV,IAAoB,CAArC,EAAwC;AACpC;AACH;;AAED,SAAK2H,IAAL,GAAYgM,GAAZ,EAAiB,UAAS8D,QAAT,EAAkB;AACjC;AACA,WAAKP,SAAL,CAAevD,GAAf;AACA,WAAKU,MAAL,GAAc,IAAd;AACD,KAJgB,CAIfrR,IAJe,CAIV,IAJU,CAAjB;AAKD,GAlBD;;AAoBA,OAAK0U,SAAL,GAAiB,UAAS/D,GAAT,EAAc;AAC7B,QAAIgB,aAAaC,KAAKC,gBAAL,CAAsBlB,IAAIH,KAA1B,CAAjB;AACA,WAAOmB,WAAW3U,MAAlB;AACD,GAHD;;AAKA,OAAK2X,UAAL,GAAkB,UAAStF,CAAT,EAAYgC,MAAZ,EAAoBxM,IAApB,EAA0B;AAC1C,SAAKgP,aAAL,GAAqBhP,IAArB,EAA2BwM,MAA3B,EAAmC,KAAKR,WAAxC;AACD,GAFiB,CAEhB7Q,IAFgB,CAEX,IAFW,CAAlB;AAKD,CA7GF;AA8GD,CAACyB,QAAQC,MAAR,CAAe,cAAf,EACA4B,UADA,CACW,mBADX,EACgC,UAAUuM,MAAV,EAAkB5L,aAAlB,EAAiC2Q,WAAjC,EAA8C9W,QAA9C,EAAwD0G,QAAxD,EAAkE;AACjGqL,SAAOgF,QAAP,GAAkB,EAAlB;;AAEAhF,SAAOiF,YAAP,GAAsB,YAAW;AAC/B7Q,kBAAc8Q,WAAd,CAA0BlF,OAAOgF,QAAP,CAAgBG,QAA1C,EAAoD,UAASpL,QAAT,EAAkB;AACpE,UAAIoL,WAAWpL,SAASoL,QAAxB;AACAlX,eAASkX,QAAT;AACAnF,aAAOoF,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,KAAKna,IAAT,EAAe;AACb,WAAKA,IAAL,GAAYwB,MAAMxC,MAAN,CAAaob,YAAb,EAAZ;AACD;AACF;;;;mCAqBcC,I,EAAM;AACnB/W,QAAEC,KAAF,CAAQ,IAAR,EAAc8W,IAAd;AACA,UAAG,KAAKC,UAAR,EAAoB;AAClB,aAAKA,UAAL,GAAkB,IAAI1a,IAAJ,CAAS,KAAK0a,UAAd,CAAlB;AACA,aAAKC,UAAL,GAAkB,IAAI3a,IAAJ,CAAS,KAAK2a,UAAd,CAAlB;AACD,OAHD,MAGO;AACL,aAAKD,UAAL,GAAkB,IAAI1a,IAAJ,EAAlB;AACA,aAAK2a,UAAL,GAAkB,IAAI3a,IAAJ,EAAlB;AACD;;AAED,UAAGya,KAAKG,OAAR,EAAiB;AACf,aAAKC,2BAAL,CAAiC,KAAKC,aAAtC;AACD;AACF;;;oCAEe;AACZ,WAAK1a,IAAL,GAAYwB,MAAMxC,MAAN,CAAaob,YAAb,EAAZ;AACH;;;6BAEQO,K,EAAO;AACd,WAAKA,KAAL,GAAaA,KAAb;;AAEA,UAAGA,KAAH,EAAU;AACR,aAAKC,uBAAL;AACD;AACF;;;6CAEwB;AACvB,WAAKC,oBAAL,GAA4B3H,OAA5B,CAAoC,UAAS4H,SAAT,EAAmB;AACrDA,kBAAUrM,QAAV,CAAmB,IAAnB;AACD,OAFD;AAGD;;;gCACWsM,Q,EAAUnY,Q,EAAU;AAC9B,UAAG,CAACU,EAAEgT,IAAF,CAAO,KAAK6D,SAAZ,EAAuBY,QAAvB,CAAJ,EAAsC;AACpC,aAAKZ,SAAL,CAAea,IAAf,CAAoB,EAACD,UAAUA,QAAX,EAAqBnY,UAAUA,QAA/B,EAApB;AACD;AACF;;;mCAEcmY,Q,EAAU;AACvBzX,QAAEoG,MAAF,CAAS,KAAKyQ,SAAd,EAAyB,EAACY,UAAUA,QAAX,EAAzB;AACD;;;8CAEyB;AAAA;AAAA;AAAA;;AAAA;AACxB,6BAAoB,KAAKZ,SAAzB,8HAAoC;AAAA,cAA5BY,QAA4B;;AAClCA,mBAASnY,QAAT,CAAkB,IAAlB;AACD;AAHuB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAIzB;;;gDAE2BqY,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;AAC1B/X,QAAEC,KAAF,CAAQ,IAAR,EAAcD,EAAEgY,IAAF,CAAOD,IAAP,EAAa,CAAC,SAAD,CAAb,CAAd;AACD;;;2CAEsB;AACrB;AACA,aAAO,EAAP;AACD;;;wDAEmC;AAClC;AACA,aAAO,EAAP;AACD;;;+BAEU;AACT,aAAO,KAAKhN,iBAAZ;AACD;;;kCAEa;AACZ,aAAO,KAAK8E,iBAAL,MAA4B,KAAKqH,OAAL,CAAa3Y,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,MAAiC,KAA7D,GAAqE,IAArE,GAA4E,KAAnF;AACD;;;wCAEmB;AAClB,aAAO,KAAK0Z,YAAZ;AACD;;;sCAEiB;AAChB,aAAO,KAAKC,gBAAZ;AACD;;;wBArHmB;AAClB,UAAG,CAAC,KAAKhB,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,aAAOpG,KAAK5T,KAAL,CAAW,KAAKga,OAAhB,CAAP;AACD;;;oCAjBsB1F,K,EAAO;AAC5BA,YAAM2G,IAAN,CAAW,UAAS3M,CAAT,EAAW4M,CAAX,EAAa;AACtB,eAAO,IAAI9b,IAAJ,CAAS8b,EAAEpB,UAAX,IAAyB,IAAI1a,IAAJ,CAASkP,EAAEwL,UAAX,CAAhC;AACD,OAFD;AAGD;;;;;;AA0HH;IAAOqB,M;AACL,kBAAYtB,IAAZ,EAAkB;AAAA;;AACd/W,MAAEC,KAAF,CAAQ,IAAR,EAAc8W,IAAd;AACA,SAAKxJ,OAAL,GAAe,KAAf,CAFc,CAEQ;AACtB,SAAKtL,KAAL,GAAa,KAAb;AACA,QAAG,KAAKqW,YAAR,EAAsB;AACpB;AACA,WAAKA,YAAL,GAAoB,IAAIhc,IAAJ,CAAS,KAAKgc,YAAd,CAApB;AACD;AACJ;;;;wBAEuB;AACtB,UAAG,CAAC,KAAKC,WAAT,EAAsB;AACpB,eAAO,EAAP;AACD;AACD,UAAIC,aAAa,KAAKD,WAAL,CAAiBE,MAAjB,CAAwB,CAAxB,EAA2B5W,WAA3B,KAA2C,KAAK0W,WAAL,CAAiBzX,KAAjB,CAAuB,CAAvB,CAA5D,CAJsB,CAIiE;AACvF0X,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;;AAEd/W,MAAEC,KAAF,SAAc8W,IAAd;;AAEA,WAAKhZ,SAAL,GAAiB,IAAjB;AACA,WAAK+W,YAAL,GAAoB,WAApB;AALc;AAMjB;;;;6CAEwB;AACvB,aAAO,KAAKmE,OAAL,CAAatE,MAAb,CAAoB,UAAStH,MAAT,EAAgB;AACzC,eAAOA,OAAO6L,OAAP,IAAkB,QAAzB;AACD,OAFM,CAAP;AAGD;;;8CAEyBnB,I,EAAM;AAC9B,aAAO,KAAKkB,OAAL,CAAatE,MAAb,CAAoB,UAAStH,MAAT,EAAgB;AACzC,eAAOA,OAAO6L,OAAP,IAAkBnB,KAAKjD,YAAvB,IAAuCzH,OAAO6L,OAAP,IAAkB,MAAhE;AACD,OAFM,CAAP;AAGD;;;gDAE2B9B,a,EAAe;AACzC,wIAAkCA,aAAlC;AACA,WAAKxV,IAAL,GAAYwV,cAAcxV,IAA1B;AACA,WAAK2B,GAAL,GAAW6T,cAAc7T,GAAzB;AACA,WAAK0V,OAAL,GAAe7B,cAAc6B,OAAd,CAAsBE,GAAtB,CAA0B,UAAS9L,MAAT,EAAgB;AACvD,eAAO,IAAIgL,MAAJ,CAAWhL,MAAX,CAAP;AACD,OAFc,CAAf;AAGD;;;mDAE8B+L,oB,EAAsB;AACnDpZ,QAAEC,KAAF,CAAQ,IAAR,EAAcmZ,oBAAd;AACA,WAAKH,OAAL,GAAeG,qBAAqBH,OAArB,CAA6BE,GAA7B,CAAiC,UAAS9L,MAAT,EAAgB;AAC9D,eAAO,IAAIgL,MAAJ,CAAWhL,MAAX,CAAP;AACD,OAFc,CAAf;AAGD;;;sCAEiB;AAChB,aAAO,IAAP;AACD;;;sCAEiB;AAChB,UAAItJ,SAAS;AACXnC,cAAM,KAAKA,IADA;AAEX2B,aAAK,KAAKA,GAFC;AAGX0V,iBAAS,KAAKA;AAHH,OAAb;;AAMAjZ,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;;EAlDqB2S,I;;AAqDxB;IAAOtD,I;;;AAEL,gBAAYuD,QAAZ,EAAsB;AAAA;;AAAA,6GACdA,QADc;;AAGpB,QAAG,CAAC,OAAK5E,IAAT,EAAe;AACb,aAAKA,IAAL,GAAY,EAAZ;AACD;AALmB;AAMrB;;;;gDAE2BqF,a,EAAe;AACzC,8HAAkCA,aAAlC;AACA,WAAKtF,KAAL,GAAasF,cAActF,KAA3B;AACA,WAAKhU,IAAL,GAAYsZ,cAActZ,IAA1B;AACD;;;sCAEiB;AAChB,UAAI+Z,aAAa7X,EAAEmZ,GAAF,CAAM,KAAKpH,IAAX,EAAiB,UAASI,GAAT,EAAa;AAC7C,eAAO,EAACzV,MAAMyV,IAAIzV,IAAX,EAAiBoY,cAAc3C,IAAI2C,YAAnC,EAAP;AACD,OAFgB,CAAjB;;AAIA,aAAO+C,UAAP;AACD;;;sCAEiB;AAChB,UAAI9T,SAAS;AACX+N,eAAO,KAAKA,KADD;AAEXhU,cAAM,KAAKA;AAFA,OAAb;;AAKAkC,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;0CAEqBgU,I,EAAM;AAC1B,UAAGA,KAAKjD,YAAL,IAAqB,KAAxB,EAA+B;AAC7B,YAAG,CAAC9U,EAAEgT,IAAF,CAAO,KAAKjB,IAAZ,EAAkBgG,IAAlB,CAAJ,EAA6B;AAC3B,eAAKhG,IAAL,CAAU2F,IAAV,CAAeK,IAAf;AACD;AACF;AACD,wHAA4BA,IAA5B;AACD;;;6CAEwBA,I,EAAM;AAC7B,UAAGA,KAAKjD,YAAL,IAAqB,KAAxB,EAA+B;AAC7B9U,UAAEqZ,IAAF,CAAO,KAAKtH,IAAZ,EAAkBgG,IAAlB;AACD;AACD,2HAA+BA,IAA/B;AACD;;;6CAEwB;AACvB,WAAKhG,IAAL,CAAUnC,OAAV,CAAkB,UAASuC,GAAT,EAAa;AAC7BnS,UAAEqZ,IAAF,CAAOlH,IAAIH,KAAX,EAAkB,IAAlB;AACAG,YAAIhH,QAAJ,CAAa,IAAb;AACD,OAHiB,CAGhB3J,IAHgB,CAGX,IAHW,CAAlB;AAIA,WAAKuQ,IAAL,GAAY,EAAZ;AACD;;;2CAOsB;AACrB,aAAO,KAAKA,IAAZ;AACD;;;wDAEmC;AAClC;AACD;;;+BAWU;AACT,aAAO,KAAKjU,IAAL,IAAa,EAApB;AACD;;;gCAEW;AACV,aAAO,KAAKgU,KAAL,IAAc,EAArB;AACD;;;6BAEQ;AACP,aAAO,EAACpV,MAAM,KAAKA,IAAZ,EAAP;AACD;;;2CAEsB;AACrB,aAAO,KAAKqO,iBAAZ;AACD;;;+BAEU;AACT,aAAO,wGAAoB,KAAKuO,eAAhC;AACD;;;wBA3BqB;AAAA;AAAA;AAAA;;AAAA;AACpB,8BAAgB,KAAKvH,IAArB,mIAA2B;AAAA,cAAlBI,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;;;qCA5CuBvH,K,EAAO;AAC7B,UAAIwH,WAAWxH,MAAM2C,MAAN,CAAa,UAAStO,IAAT,EAAc;AAAC,eAAOA,KAAK+B,KAAL,IAAc,KAAd,IAAuB/B,KAAK+B,KAAL,IAAc,IAA5C;AAAiD,OAA7E,CAAf;AACA,aAAOoR,QAAP;AACD;;;;EA7DiB9C,I;;AAwGpB;IAAO9E,G;;;AAEL,eAAY+E,QAAZ,EAAsB;AAAA;;AAAA,2GACdA,QADc;;AAGpB,QAAG,CAAC,OAAK3E,KAAT,EAAgB;AACd,aAAKA,KAAL,GAAa,EAAb;AACD;AALmB;AAMrB;;;;gDAE2BoF,a,EAAe;AACzC,4HAAkCA,aAAlC;AACA,WAAKtF,KAAL,GAAasF,cAActF,KAA3B;AACD;;;sCAEiB;AAChB,UAAI+F,aAAa7X,EAAEmZ,GAAF,CAAM,KAAKnH,KAAX,EAAkB,UAAS3L,IAAT,EAAc;AAC/C,eAAO,EAAC3J,MAAM2J,KAAK3J,IAAZ,EAAkBoY,cAAczO,KAAKyO,YAArC,EAAP;AACD,OAFgB,CAAjB;;AAIA,aAAO+C,UAAP;AACD;;;sCAEiB;AAChB,UAAI9T,SAAS;AACX+N,eAAO,KAAKA;AADD,OAAb;;AAIA9R,QAAEC,KAAF,CAAQ8D,MAAR;AACA,aAAOA,MAAP;AACD;;;0CAEqBgU,I,EAAM;AAC1B,UAAGA,KAAKjD,YAAL,IAAqB,MAAxB,EAAgC;AAC9B,YAAG,CAAC9U,EAAEgT,IAAF,CAAO,KAAKhB,KAAZ,EAAmB+F,IAAnB,CAAJ,EAA8B;AAC5B,eAAK/F,KAAL,CAAWyH,OAAX,CAAmB1B,IAAnB;AACD;AACF;AACD,sHAA4BA,IAA5B;AACD;;;6CAEwBA,I,EAAM;AAC7B,UAAGA,KAAKjD,YAAL,IAAqB,MAAxB,EAAgC;AAC9B9U,UAAEqZ,IAAF,CAAO,KAAKrH,KAAZ,EAAmB+F,IAAnB;AACD;AACD,yHAA+BA,IAA/B;AACD;;;6CAEwB;AACvB,WAAK/F,KAAL,CAAWpC,OAAX,CAAmB,UAASvJ,IAAT,EAAc;AAC/BrG,UAAEqZ,IAAF,CAAOhT,KAAK0L,IAAZ,EAAkB,IAAlB;AACA1L,aAAK8E,QAAL,CAAc,IAAd;AACD,OAHkB,CAGjB3J,IAHiB,CAGZ,IAHY,CAAnB;;AAKA,WAAKwQ,KAAL,GAAa,EAAb;AACD;;;2CAMsB;AACrB,aAAO,KAAKA,KAAZ;AACD;;;wDAEmC;AAClC,aAAO,KAAKA,KAAZ;AACD;;;wBAVkB;AACjB,aAAO,KAAP;AACD;;;;EA3DgB0E,I;;AAqEnB,CAACzT,QAAQC,MAAR,CAAe,cAAf,EACEwW,QADF,CACW,eADX,EAC4B,YAAY;;AAErC,WAASC,UAAT,GAAuB;AACrB,QAAIC,eAAe3L,SAAS4L,QAAT,CAAkBC,KAAlB,CAAwB,GAAxB,CAAnB;AACA,QAAIC,SAASH,aAAaA,aAAapb,MAAb,GAAsB,CAAnC,IAAwC,GAAxC,GAA8Cob,aAAaA,aAAapb,MAAb,GAAsB,CAAnC,CAA3D;AACA,WAAOub,MAAP;AACD;;AAED,MAAIxW,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,OAAKyW,IAAL,GAAY,UAASzU,UAAT,EAAqB6Q,WAArB,EAAkC5Q,YAAlC,EAAgDyU,QAAhD,EAA0DvU,SAA1D,EAAqE;AAC7E,WAAO,IAAIwU,aAAJ,CAAkB3U,UAAlB,EAA8B6Q,WAA9B,EAA2C5Q,YAA3C,EAAyDyU,QAAzD,EAAmEvU,SAAnE,CAAP;AACH,GAFD;;AAIA,WAASwU,aAAT,CAAuB3U,UAAvB,EAAmC6Q,WAAnC,EAAgD5Q,YAAhD,EAA8DyU,QAA9D,EAAwEvU,SAAxE,EAAmF;;AAEjF,SAAK2G,IAAL,GAAY,EAAZ;AACA,SAAK8N,SAAL,GAAiBjW,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,EAAc6W,OAAd,EAAuB;AACtClW,mBAAamW,OAAb,CAAqB,QAArB,EAA+B9W,GAA/B;AACA,UAAG6W,OAAH,EAAY;AACVze,eAAOsS,QAAP,CAAgBC,MAAhB;AACD;AACF,KALD;;AAQA;;;;AAIA,SAAKoM,aAAL,GAAqB,YAAW;AAC9B,aAAOxJ,KAAK5T,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,aAArB,CAAX,CAAP;AACD,KAFD;;AAIA,SAAK6F,cAAL,GAAsB,YAAW;AAC/B,aAAO9F,aAAaC,OAAb,CAAqB,KAArB,CAAP;AACD,KAFD;;AAIA,SAAKoW,MAAL,GAAc,YAAW;AACvB,aAAOrW,aAAaC,OAAb,CAAqB,MAArB,CAAP;AACD,KAFD;;AAIA,SAAKqW,qBAAL,GAA6B,UAAS7a,KAAT,EAAgBL,QAAhB,EAA0B;AACrD,UAAImb,UAAUrE,YAAYsE,GAAZ,CAAgB,MAAhB,EAAwB,QAAxB,CAAd;AACAD,cAAQvV,GAAR,CAAY,EAACvF,OAAOA,KAAR,EAAZ,EAA4BmC,IAA5B,CAAiC,UAASsJ,QAAT,EAAkB;AACjD9L,iBAAS8L,SAASuP,KAAT,EAAT;AACD,OAFD,EAGC5Y,KAHD,CAGO,UAASqJ,QAAT,EAAkB;AACvB/J,gBAAQC,GAAR,CAAY,4BAAZ,EAA0C8J,QAA1C;AACA9L,iBAAS8L,SAASkD,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;AACD8W,kBAAYsE,GAAZ,CAAgB,eAAhB,EAAiCxV,GAAjC,GAAuCpD,IAAvC,CAA4C,UAASsJ,QAAT,EAAkB;AAC5D,YAAIiB,OAAOjB,SAASuP,KAAT,EAAX;AACA3a,UAAEC,KAAF,CAAQ,KAAKoM,IAAb,EAAmBA,IAAnB;AACA/M;AACD,OAJ2C,CAI1CkC,IAJ0C,CAIrC,IAJqC,CAA5C,EAKCO,KALD,CAKO,UAASqJ,QAAT,EAAkB;AACvB/J,gBAAQC,GAAR,CAAY,4BAAZ,EAA0C8J,QAA1C;AACA9L,iBAAS8L,SAASkD,IAAlB;AACD,OARD;AASD,KAdD;;AAgBA,SAAKc,KAAL,GAAa,UAASzP,KAAT,EAAgBX,QAAhB,EAA0BM,QAA1B,EAAoC;AAC/C,WAAKkb,qBAAL,CAA2B7a,KAA3B,EAAkC,UAASib,UAAT,EAAoB;AACpD,YAAG,CAACA,UAAJ,EAAgB;AACdtb,mBAAS,IAAT;AACA;AACD;AACDpB,cAAMxC,MAAN,CAAamf,4BAAb,CAA0C7a,EAAEC,KAAF,CAAQ,EAACjB,UAAUA,QAAX,EAAR,EAA8B4b,UAA9B,CAA1C,EAAqF,UAASpb,IAAT,EAAc;AACjG,eAAKsb,KAAL,CAAWtb,KAAKE,EAAhB;AACA,cAAI+a,UAAUrE,YAAYsE,GAAZ,CAAgB,cAAhB,CAAd;AACA,cAAI3W,SAAS,EAAC/E,UAAUQ,KAAKC,EAAhB,EAAoBE,OAAOA,KAA3B,EAAb;AACAK,YAAEC,KAAF,CAAQwa,OAAR,EAAiB1W,MAAjB;AACA0W,kBAAQM,IAAR,GAAejZ,IAAf,CAAoB,UAASsJ,QAAT,EAAkB;AACpClH,yBAAamW,OAAb,CAAqB,KAArB,EAA4BjP,SAASnH,KAArC;AACAC,yBAAamW,OAAb,CAAqB,MAArB,EAA6BjP,SAAS1O,IAAtC;AACAwH,yBAAamW,OAAb,CAAqB,aAArB,EAAoCvJ,KAAKkK,SAAL,CAAeJ,UAAf,CAApC;AACAtb,qBAAS8L,QAAT;AACD,WALD,EAMCrJ,KAND,CAMO,UAASqJ,QAAT,EAAkB;AACvB9L,qBAAS8L,SAASkD,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,CAAauf,oCAAb,CAAkD,EAACjc,UAAUA,QAAX,EAAqBW,OAAOA,KAA5B,EAAlD,EAAsF,UAASH,IAAT,EAAeob,UAAf,EAA0B;AAC9G,aAAKE,KAAL,CAAWtb,KAAKE,EAAhB;AACAF,aAAKE,EAAL,GAAU,IAAV;AACA,YAAI+a,UAAUrE,YAAYsE,GAAZ,CAAgB,MAAhB,CAAd;AACA,YAAI3W,SAAS/D,EAAEC,KAAF,CAAQ,EAACjB,UAAUQ,KAAKC,EAAhB,EAAoBE,OAAOA,KAA3B,EAAR,EAA2Cib,UAA3C,CAAb;AACA5a,UAAEC,KAAF,CAAQwa,OAAR,EAAiB1W,MAAjB;AACA0W,gBAAQM,IAAR,GAAejZ,IAAf,CAAoB,UAASsJ,QAAT,EAAkB;AACpClH,uBAAamW,OAAb,CAAqB,KAArB,EAA4BjP,SAASnH,KAArC;AACAC,uBAAamW,OAAb,CAAqB,MAArB,EAA6BjP,SAAS1O,IAAtC;AACAwH,uBAAamW,OAAb,CAAqB,aAArB,EAAoCvJ,KAAKkK,SAAL,CAAehb,EAAEgY,IAAF,CAAO4C,UAAP,EAAmB,CAAC,UAAD,CAAnB,CAAf,CAApC;AACAtb,mBAAS8L,QAAT;AACD,SALD,EAMCrJ,KAND,CAMO,UAASqJ,QAAT,EAAkB;AACvB9L,mBAAS8L,SAASkD,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,SAAK0Z,sBAAL,GAA8B,UAASvb,KAAT,EAAgBwb,YAAhB,EAA8BC,QAA9B,EAAwC9b,QAAxC,EAAkD;AAC9E,UAAImb,UAAUrE,YAAYsE,GAAZ,CAAgB,MAAhB,CAAd;AACA,UAAI3W,SAAS,EAAC/E,UAAUoc,SAAS3b,EAApB,EAAwB8O,uBAAuB6M,SAAS3b,EAAxD,EAA4DgP,kBAAkB0M,aAAa1b,EAA3F,EAA+FE,OAAOA,KAAtG,EAAb;AACAK,QAAEC,KAAF,CAAQwa,OAAR,EAAiB1W,MAAjB;AACA0W,cAAQY,KAAR,GAAgBvZ,IAAhB,CAAqB,UAASsJ,QAAT,EAAkB;AACrC9L,iBAAS8L,QAAT;AACD,OAFD;AAGD,KAPD;;AAUA;;;;AAIA,SAAKmL,WAAL,GAAmB,UAASC,QAAT,EAAmBlX,QAAnB,EAA6B;AAC9C,UAAImb,UAAUrE,YAAYsE,GAAZ,CAAgB,OAAhB,EAAyB,KAAKH,MAAL,EAAzB,CAAd;AACAE,cAAQjE,QAAR,GAAmBA,QAAnB;AACAiE,cAAQY,KAAR,GAAgBvZ,IAAhB,CAAqB,UAASsJ,QAAT,EAAkB;AACrC,aAAKiB,IAAL,CAAUmK,QAAV,GAAqBpL,SAASoL,QAA9B;AACAlX,iBAAS8L,SAASuP,KAAT,EAAT;AACD,OAHoB,CAGnBnZ,IAHmB,CAGd,IAHc,CAArB;AAID,KAPD;;AAUA;;;;AAIA,SAAK8Z,YAAL,GAAoB,UAASnB,SAAT,EAAoB;AACtC,WAAKA,SAAL,GAAiBA,SAAjB;AACAjW,mBAAamW,OAAb,CAAqB,WAArB,EAAkC,KAAKF,SAAvC;AACD,KAHD;;AAKA,SAAKoB,eAAL,GAAuB,UAASjc,QAAT,EAAiC;AAAA,UAAdkc,OAAc,uEAAJ,EAAI;;;AAEtD,UAAG,KAAKC,gBAAR,EAA0B;AACxB;AACA,aAAKC,UAAL,GAAkB,IAAlB;AACA;AACD;;AAED,WAAKD,gBAAL,GAAwB,IAAxB;;AAEA,UAAIE,gBAAgBnW,aAAaoW,aAAb,EAApB;;AAEA,UAAIC,cAAc,GAAlB;AACA,UAAIC,aAAaH,cAAc7a,KAAd,CAAoB,CAApB,EAAuB+a,WAAvB,CAAjB;AACA,UAAGC,WAAWtd,MAAX,GAAoBmd,cAAcnd,MAArC,EAA6C;AAC3C;AACA,aAAKkd,UAAL,GAAkB,IAAlB;AACD,OAHD,MAGO;AACL,aAAKA,UAAL,GAAkB,KAAlB;AACD;;AAED,UAAG,CAAC,KAAK1R,cAAL,EAAJ,EAA2B;AACzB,aAAK+R,wBAAL,CAA8BD,UAA9B,EAA0C,UAASE,aAAT,EAAuB;AAC7D;AACAF,qBAAWlM,OAAX,CAAmB,UAASmI,IAAT,EAAc;AAC/B,gBAAGA,KAAKkE,OAAR,EAAiB;AACfzW,2BAAa+M,iBAAb,CAA+BwF,IAA/B;AACD;AACF,WAJkB,CAIjBvW,IAJiB,CAIZ,IAJY,CAAnB;AAKAgE,uBAAa0W,eAAb,CAA6BJ,UAA7B;AACA,cAAGxc,QAAH,EAAa;AACXA;AACD;AACJ,SAXyC,CAWxCkC,IAXwC,CAWnC,IAXmC,CAA1C;;AAaA;AACD;;AAED,UAAIiZ,UAAUrE,YAAYsE,GAAZ,CAAgB,YAAhB,CAAd;AACAD,cAAQ0B,KAAR,GAAgB,GAAhB;AACA1B,cAAQ2B,UAAR,GAAqB,KAAKjC,SAA1B;AACAM,cAAQ4B,YAAR,GAAuB,KAAKC,WAA5B;AACA7B,cAAQjJ,KAAR,GAAgBxR,EAAEmZ,GAAF,CAAM2C,UAAN,EAAkB,UAAS/D,IAAT,EAAc;AAC9C,eAAO,KAAKwE,0BAAL,CAAgCxE,IAAhC,EAAsCyD,QAAQgB,gBAA9C,CAAP;AACD,OAFiC,CAEhChb,IAFgC,CAE3B,IAF2B,CAAlB,CAAhB;;AAIAiZ,cAAQM,IAAR,GAAejZ,IAAf,CAAoB,UAASsJ,QAAT,EAAmB;;AAErC5F,qBAAa0W,eAAb,CAA6BJ,UAA7B;;AAEA;AACA,aAAKR,YAAL,CAAkBlQ,SAASgR,UAA3B;AACA7W,mBAAWiF,UAAX,CAAsB,oBAAtB,EAA4C,KAAK2P,SAAjD;;AAEA;AACA,aAAKmC,WAAL,GAAmBlR,SAASiR,YAA5B;;AAEA,YAAII,YAAY,KAAKC,mBAAL,CAAyBtR,SAASuR,eAAlC,EAAmD,IAAnD,CAAhB;AACA;AACA,YAAIC,aAAa,CAAC,SAAD,EAAY,cAAZ,EAA4B,WAA5B,CAAjB;AACA,YAAIC,QAAQ,KAAKH,mBAAL,CAAyBtR,SAAS0R,WAAlC,EAA+CF,UAA/C,CAAZ;;AAEA,aAAKG,0BAAL,CAAgC3R,SAAS4R,OAAzC;;AAEA,aAAKjB,wBAAL,CAA8Bc,KAA9B,EAAqC,IAArC;AACA,aAAKd,wBAAL,CAA8BU,SAA9B,EAAyC,IAAzC;;AAEA,aAAKhB,gBAAL,GAAwB,KAAxB;;AAEA,YAAG,KAAKa,WAAL,IAAoB,KAAKZ,UAAL,IAAmB,IAA1C,EAAgD;AAC9C,eAAKH,eAAL,CAAqBjc,QAArB,EAA+Bkc,OAA/B;AACD,SAFD,MAEO;AACL,cAAGlc,QAAH,EAAa;AACXA,qBAAS8L,QAAT;AACD;AACF;AAEF,OA/BmB,CA+BlB5J,IA/BkB,CA+Bb,IA/Ba,CAApB,EAgCCO,KAhCD,CAgCO,UAASqJ,QAAT,EAAkB;AACvB/J,gBAAQC,GAAR,CAAY,cAAZ,EAA4B8J,QAA5B;AACA,YAAG9L,QAAH,EAAa;AACXA,mBAAS,EAAC2C,OAAO,YAAR,EAAT;AACD;AACF,OArCD;AAsCD,KApFD;;AAsFA,SAAK6D,IAAL,GAAY,UAASxG,QAAT,EAAmB;AAC7B,WAAKic,eAAL,CAAqBjc,QAArB,EAA+B2d,SAA/B;AACD,KAFD;;AAIA,SAAKF,0BAAL,GAAkC,UAASC,OAAT,EAAkB;AAClD,UAAGA,QAAQxe,MAAR,IAAkB,CAArB,EAAwB;AACtB;AACD;;AAED6C,cAAQC,GAAR,CAAY,gBAAZ,EAA8B0b,OAA9B;AALkD;AAAA;AAAA;;AAAA;AAMlD,8BAAmBA,OAAnB,mIAA4B;AAAA,cAApBE,OAAoB;;AAC1B,cAAIC,eAAeD,QAAQnF,IAA3B;AACA,cAAIA,OAAOvS,aAAa4X,QAAb,CAAsBD,aAAazgB,IAAnC,CAAX;AACA,cAAIuF,QAAQib,QAAQjb,KAApB;AACA,cAAGA,MAAMkQ,GAAN,IAAa,eAAhB,EAAiC;AAC7B4F,iBAAKsF,aAAL;AACAtF,iBAAK5M,QAAL,CAAc,IAAd;AACA4M,iBAAKuF,sBAAL;AACH;AACF;AAfiD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAiBlD,WAAK/B,eAAL,CAAqB,IAArB,EAA2B,EAACiB,kBAAkB,CAAC,YAAD,EAAe,YAAf,CAAnB,EAA3B;AACD,KAlBD;;AAoBA,SAAKE,mBAAL,GAA2B,UAASV,aAAT,EAAwBY,UAAxB,EAAoC;AAC7D,WAAKW,YAAL,CAAkBvB,aAAlB;AACA,aAAOxW,aAAagY,2CAAb,CAAyDxB,aAAzD,EAAwEY,UAAxE,CAAP;AACD,KAHD;;AAKA,SAAKL,0BAAL,GAAkC,UAASxE,IAAT,EAAeyE,gBAAf,EAAiC;AACjE,aAAO,KAAKiB,aAAL,CAAmB1F,IAAnB,EAAyB,CAACA,KAAKwB,QAAL,EAA1B,EAA2CiD,gBAA3C,EAA6D,KAA7D,CAAP;AACD,KAFD;;AAIA,SAAKkB,mBAAL,GAA2B,UAAS3F,IAAT,EAAeha,SAAf,EAA0B;AACnD,aAAOiC,EAAEgY,IAAF,CAAO,KAAKyF,aAAL,CAAmB1F,IAAnB,EAAyBha,SAAzB,EAAoC,CAAC,YAAD,EAAe,YAAf,CAApC,EAAkE,IAAlE,CAAP,EAAgF,CAAC,SAAD,CAAhF,CAAP;AACD,KAFD;;AAIA,SAAK4f,kBAAL,GAA0B,UAAS5F,IAAT,EAAeha,SAAf,EAA0B;AAClD,aAAOiC,EAAEgY,IAAF,CAAO,KAAKyF,aAAL,CAAmB1F,IAAnB,EAAyBha,SAAzB,EAAoC,CAAC,YAAD,EAAe,YAAf,CAApC,EAAkE,IAAlE,CAAP,EAAgF,CAAC,SAAD,CAAhF,CAAP;AACD,KAFD;;AAIA,SAAK0f,aAAL,GAAqB,UAAS1F,IAAT,EAAeha,SAAf,EAA0Bye,gBAA1B,EAA4CoB,aAA5C,EAA2D;AAC9E,UAAIC,WAAW7d,EAAE8d,SAAF,CAAY/F,IAAZ,CAAf;;AAEA1W,cAAQ0c,MAAR,CAAe,CAAChG,KAAK3P,KAArB,EAA4B,6CAA5B,EAA2E2P,KAAK3P,KAAhF;;AAEA,UAAIrE,SAAS,EAACrH,MAAMqb,KAAKrb,IAAZ,EAAkBoY,cAAciD,KAAKjD,YAArC;AACX/J,2BAAmBgN,KAAKhN,iBADb,EACgCkR,SAASlE,KAAKkE,OAD9C,EAAb;;AAGA,UAAGle,SAAH,EAAc;AACZ,aAAKigB,iBAAL,CAAuBH,QAAvB,EAAiC,KAAKI,UAAL,EAAjC;AACAla,eAAOmT,OAAP,GAAiB2G,SAAS3G,OAA1B;AACAnT,eAAOkU,YAAP,GAAsB4F,SAAS5F,YAA/B;AACAlU,eAAOma,SAAP,GAAmBL,SAASK,SAA5B;AACD,OALD,MAMK;AACHna,eAAOmT,OAAP,GAAiB0G,gBAAgBC,SAASM,+BAAT,EAAhB,GAA6D,QAAQjgB,MAAMxC,MAAN,CAAa0iB,MAAb,CAAoBtN,KAAKkK,SAAL,CAAe6C,SAASM,+BAAT,EAAf,CAApB,CAAtF;AACA,YAAG,CAACP,aAAJ,EAAmB;AACjB7Z,iBAAOkU,YAAP,GAAsB,IAAtB;AACAlU,iBAAOma,SAAP,GAAmB,IAAnB;AACD;AACF;;AAED,UAAG1B,gBAAH,EAAqB;AACnBxc,UAAEC,KAAF,CAAQ8D,MAAR,EAAgB/D,EAAEqe,IAAF,CAAOtG,IAAP,EAAayE,gBAAb,CAAhB;AACD;;AAED,aAAOzY,MAAP;AACD,KA3BD;;AA6BA,SAAK6H,SAAL,GAAiB,UAASmM,IAAT,EAAezY,QAAf,EAAyB;AACxC,UAAG,CAAC,KAAK0K,cAAL,EAAJ,EAA2B;AACzBqB,cAAM,iCAAN;AACA;AACD;;AAED,UAAIiT,UAAU,YAAW;AACvBvG,aAAKhN,iBAAL,GAAyB,QAAzB;AACA,YAAIwT,cAAc,CAACxG,IAAD,EAAOyG,MAAP,CAAczG,KAAK0G,iCAAL,MAA4C,EAA1D,CAAlB;AACAF,oBAAY3O,OAAZ,CAAoB,UAAS8O,aAAT,EAAuB;AACzCA,wBAAcvT,QAAd,CAAuB,IAAvB;AACD,SAFD;AAGA,aAAKrF,IAAL;AACD,OAPa,CAOZtE,IAPY,CAOP,IAPO,CAAd;;AASA,UAAG,CAAC,KAAK6K,IAAL,CAAUmK,QAAd,EAAwB;AACtByD,iBAAS0E,IAAT,CAAc;AACZC,oBAAU,+BADE;AAEZ9Z,sBAAY,mBAFA;AAGZ+Z,mBAAS;AACPvf,sBAAU,oBAAW;AACnB,qBAAOgf,OAAP;AACD;AAHM,WAHG;AAQZQ,qBAAW,wBARC;AASZC,4BAAkB;AATN,SAAd;AAWD,OAZD,MAYO;AACLT;AACD;AACF,KA9BD;;AAgCA,SAAKxS,WAAL,GAAmB,UAASiM,IAAT,EAAezY,QAAf,EAAyB;AAC1CyY,WAAKhN,iBAAL,GAAyB,IAAzB;AACA,UAAIwT,cAAc,CAACxG,IAAD,EAAOyG,MAAP,CAAczG,KAAK0G,iCAAL,MAA4C,EAA1D,CAAlB;AACAF,kBAAY3O,OAAZ,CAAoB,UAAS8O,aAAT,EAAuB;AACzCA,sBAAcvT,QAAd,CAAuB,IAAvB;AACD,OAFD;AAGA,WAAKrF,IAAL,CAAU,IAAV;AACD,KAPD;;AASA;;;;AAIA,SAAKD,cAAL,GAAsB,YAAW;AAC/B,WAAKsU,SAAL,GAAiB,IAAjB;AACAjW,mBAAa8a,UAAb,CAAwB,WAAxB;AACD,KAHD;;AAKA,SAAK3O,cAAL,GAAsB,UAAS/B,IAAT,EAAetP,QAAf,EAAyBM,QAAzB,EAAmC;AACvD+B,cAAQC,GAAR,CAAY,gBAAZ,EAA8BgN,IAA9B;;AAEA,UAAI2Q,cAAc,YAAW;AAC3B,YAAIzN,QAAQhM,aAAa0Z,6BAAb,CAA2C5Q,KAAKkD,KAAhD,CAAZ;AACAA,cAAM5B,OAAN,CAAc,UAASmI,IAAT,EAAc;AAC1BA,eAAK5M,QAAL,CAAc,IAAd;AACA4M,eAAKuF,sBAAL;AACD,SAHD;AAIA,aAAK/B,eAAL,CAAqBjc,QAArB,EAA+B,EAACkd,kBAAkB,CAAC,YAAD,EAAe,YAAf,CAAnB,EAA/B;AACD,OAPiB,CAOhBhb,IAPgB,CAOX,IAPW,CAAlB;;AASA,UAAG8M,KAAK0C,WAAR,EAAqB;AACnB9S,cAAMxC,MAAN,CAAamf,4BAAb,CAA0C7a,EAAEC,KAAF,CAAQ,EAACjB,UAAUA,QAAX,EAAR,EAA8BsP,KAAK0C,WAAnC,CAA1C,EAA2F,UAASxR,IAAT,EAAc;AACvG,cAAIE,KAAKF,KAAKE,EAAd;AACA,cAAI;AACF,iBAAKyf,mBAAL,CAAyB7Q,KAAKkD,KAA9B,EAAqC9R,EAArC;AACA;AACA4O,iBAAKkD,KAAL,CAAW5B,OAAX,CAAmB,UAASmI,IAAT,EAAc;AAC/BA,mBAAKE,YAAL,GAAoB,IAApB;AACAF,mBAAKmG,SAAL,GAAiB,IAAjB;AACD,aAHD;AAIAe;AACD,WARD,CASA,OAAOpO,CAAP,EAAU;AACRxP,oBAAQC,GAAR,CAAY,kBAAZ,EAAgCuP,CAAhC;AACAxF,kBAAM,wGAAN;AACA/L,qBAAS,KAAT,EAAgB,IAAhB;AACA;AACD;AACF,SAjB0F,CAiBzFkC,IAjByF,CAiBpF,IAjBoF,CAA3F;AAkBD,OAnBD,MAmBO;AACLyd;AACD;AACF,KAlCD;;AAoCA;;;;AAIA,SAAKhP,aAAL,GAAqB,UAASlS,SAAT,EAAoB;AACvC,UAAIqhB,WAAW,IAAf;AACA,UAAIC,eAAe,UAAUvhB,IAAV,EAAgB;AACjC,YAAIwQ,OAAO,IAAIgR,IAAJ,CAAS,CAACxhB,IAAD,CAAT,EAAiB,EAACyhB,MAAM,WAAP,EAAjB,CAAX;;AAEA;AACA;AACA,YAAIH,aAAa,IAAjB,EAAuB;AACrBzjB,iBAAO6jB,GAAP,CAAWC,eAAX,CAA2BL,QAA3B;AACD;;AAEDA,mBAAWzjB,OAAO6jB,GAAP,CAAWE,eAAX,CAA2BpR,IAA3B,CAAX;;AAEA;AACA,eAAO8Q,QAAP;AACD,OAbkB,CAajB5d,IAbiB,CAaZ,IAbY,CAAnB;;AAeA,UAAIgQ,QAAQxR,EAAEmZ,GAAF,CAAM3T,aAAama,qBAAb,CAAmC,CAAC,KAAD,EAAQ,MAAR,CAAnC,CAAN,EAA2D,UAAS5H,IAAT,EAAc;AACnF,eAAO,KAAK2F,mBAAL,CAAyB3F,IAAzB,EAA+Bha,SAA/B,CAAP;AACD,OAFsE,CAErEyD,IAFqE,CAEhE,IAFgE,CAA3D,CAAZ;;AAIA,UAAI8M,OAAO;AACTkD,eAAOA;AADE,OAAX;;AAIA,UAAGzT,SAAH,EAAc;AACZuQ,aAAK,aAAL,IAAsB,KAAKgM,aAAL,EAAtB;AACD;;AAED,aAAO+E,aAAavO,KAAKkK,SAAL,CAAe1M,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;;;AAIA,SAAKsR,eAAL,GAAuB,UAASC,MAAT,EAAiB;AACtC,aAAO/O,KAAK5T,KAAL,CAAW4T,KAAKkK,SAAL,CAAe6E,MAAf,CAAX,CAAP;AACD,KAFD;;AAIA,SAAK9D,wBAAL,GAAgC,UAASvK,KAAT,EAAgBlS,QAAhB,EAA0B;AACxD,UAAIyE,SAASyN,MAAM2H,GAAN,CAAU,UAASpB,IAAT,EAAe;AACpC,eAAO,KAAK0F,aAAL,CAAmB1F,IAAnB,EAAyB,KAAK/N,cAAL,EAAzB,EAAgD,CAAC,YAAD,EAAe,YAAf,EAA6B,kBAA7B,CAAhD,EAAkG,KAAlG,CAAP;AACD,OAFsB,CAErBxI,IAFqB,CAEhB,IAFgB,CAAV,CAAb;;AAIAkE,gBAAUoa,SAAV,CAAoB/b,MAApB,EAA4BzE,QAA5B;AACD,KAND;;AAQA,SAAKiS,cAAL,GAAsB,UAASjS,QAAT,EAAmB;AACvC,UAAIyE,SAAS2B,UAAUqa,WAAV,CAAsB,UAASvO,KAAT,EAAe;AAChD,YAAIA,QAAQ,KAAKkL,mBAAL,CAAyBlL,KAAzB,EAAgC,IAAhC,CAAZ;AACAkF,aAAKsJ,eAAL,CAAqBxO,KAArB;AACAlS,iBAASkS,KAAT;AACD,OAJkC,CAIjChQ,IAJiC,CAI5B,IAJ4B,CAAtB,CAAb;AAMD,KAPD;;AASA;;;;AAIA,SAAKyI,eAAL,GAAuB,UAASiK,KAAT,EAAgB;AACrChQ,mBAAamW,OAAb,CAAqB,OAArB,EAA8BvJ,KAAKkK,SAAL,CAAe9G,KAAf,CAA9B;AACD,KAFD;;AAIA,SAAK1K,UAAL,GAAkB,YAAW;AAC3BtF,mBAAa8a,UAAb,CAAwB,OAAxB;AACD,KAFD;;AAIA,SAAK7K,QAAL,GAAgB,YAAW;AACzB,UAAI8L,cAAc/b,aAAaC,OAAb,CAAqB,OAArB,CAAlB;AACA,UAAG,CAAC8b,WAAD,IAAgBA,eAAe,WAAlC,EAA+C;AAC7C,eAAO,IAAP;AACD;AACD,UAAIC,UAAUlgB,EAAEC,KAAF,CAAQ,EAAC6U,cAAc,MAAf,EAAR,EAAgChE,KAAK5T,KAAL,CAAW+iB,WAAX,CAAhC,CAAd;AACA,aAAOza,aAAaqP,UAAb,CAAwBqL,OAAxB,CAAP;AACD,KAPD;;AAUA;;;;AAIA,SAAKjC,UAAL,GAAkB,YAAW;AAC3B,UAAG,CAAC,KAAKve,EAAT,EAAa;AACX,aAAKA,EAAL,GAAUwE,aAAaC,OAAb,CAAqB,IAArB,CAAV;AACD;AACD,aAAO,KAAKzE,EAAZ;AACD,KALD;;AAOA,SAAKob,KAAL,GAAa,UAASpb,EAAT,EAAa;AACxBwE,mBAAamW,OAAb,CAAqB,IAArB,EAA2B3a,EAA3B;AACD,KAFD;;AAIA,SAAKsO,OAAL,GAAe,YAAW;AACxB9J,mBAAaic,KAAb;AACD,KAFD;;AAIA,SAAKnC,iBAAL,GAAyB,UAASjG,IAAT,EAAeqI,SAAf,EAA0B;AACjD,UAAIC,WAAW,IAAf;AACA,UAAGtI,KAAKE,YAAR,EAAsB;AACpBoI,mBAAWniB,MAAMxC,MAAN,CAAa4kB,WAAb,CAAyBvI,KAAKE,YAA9B,EAA4CmI,SAA5C,CAAX;AACD,OAFD,MAEO;AACLC,mBAAWniB,MAAMxC,MAAN,CAAa6kB,2BAAb,EAAX;AACAxI,aAAKE,YAAL,GAAoB/Z,MAAMxC,MAAN,CAAa8kB,WAAb,CAAyBH,QAAzB,EAAmCD,SAAnC,CAApB;AACD;;AAED,UAAIK,KAAKviB,MAAMxC,MAAN,CAAaglB,cAAb,CAA4BL,QAA5B,CAAT;AACA,UAAIM,KAAKziB,MAAMxC,MAAN,CAAaklB,eAAb,CAA6BP,QAA7B,CAAT;AACA,UAAIQ,mBAAmB,QAAQ3iB,MAAMxC,MAAN,CAAa8kB,WAAb,CAAyB1P,KAAKkK,SAAL,CAAejD,KAAKoG,+BAAL,EAAf,CAAzB,EAAiFsC,EAAjF,CAA/B;AACA,UAAIK,WAAW5iB,MAAMxC,MAAN,CAAaqlB,OAAb,CAAqBF,gBAArB,EAAuCF,EAAvC,CAAf;;AAEA5I,WAAKb,OAAL,GAAe2J,gBAAf;AACA9I,WAAKmG,SAAL,GAAiB4C,QAAjB;AACA/I,WAAKiJ,uBAAL,GAA+B,KAA/B;AACD,KAjBD;;AAmBC,SAAKC,iBAAL,GAAyB,UAASlJ,IAAT,EAAeqI,SAAf,EAA0B;AACjD,UAAIC,WAAWniB,MAAMxC,MAAN,CAAa4kB,WAAb,CAAyBvI,KAAKE,YAA9B,EAA4CmI,SAA5C,CAAf;;AAEA,UAAIK,KAAKviB,MAAMxC,MAAN,CAAaglB,cAAb,CAA4BL,QAA5B,CAAT;AACA,UAAIM,KAAKziB,MAAMxC,MAAN,CAAaklB,eAAb,CAA6BP,QAA7B,CAAT;AACA,UAAIS,WAAW5iB,MAAMxC,MAAN,CAAaqlB,OAAb,CAAqBhJ,KAAKb,OAA1B,EAAmCyJ,EAAnC,CAAf;AACA,UAAGG,aAAa/I,KAAKmG,SAAlB,IAA+B,CAACnG,KAAKmG,SAAxC,EAAmD;AACjD7c,gBAAQC,GAAR,CAAY,qCAAZ;AACA;AACD;;AAED,UAAI4V,UAAUhZ,MAAMxC,MAAN,CAAa4kB,WAAb,CAAyBvI,KAAKb,OAAL,CAAa3Y,SAAb,CAAuB,CAAvB,EAA0BwZ,KAAKb,OAAL,CAAa1Y,MAAvC,CAAzB,EAAyEiiB,EAAzE,CAAd;AACA1I,WAAKb,OAAL,GAAeA,OAAf;AACD,KAbD;;AAeA,SAAKqG,YAAL,GAAoB,UAAS/L,KAAT,EAAgB;AAClC,UAAI4O,YAAY,KAAKnC,UAAL,EAAhB;AACA,WAAKkB,mBAAL,CAAyB3N,KAAzB,EAAgC4O,SAAhC;AACD,KAHD;;AAKA,SAAKjB,mBAAL,GAA2B,UAAS3N,KAAT,EAAgB1U,GAAhB,EAAqB;AAAA;AAAA;AAAA;;AAAA;AAC9C,8BAAiB0U,KAAjB,mIAAwB;AAAA,cAAfuG,IAAe;;AACtB,cAAGA,KAAKkE,OAAL,IAAgB,IAAnB,EAAyB;AACvB;AACD;AACD,cAAIiF,WAAW,OAAOnJ,KAAKb,OAAZ,KAAwB,QAAxB,IAAoCa,KAAKb,OAAL,YAAwBlQ,MAA3E;AACA,cAAGka,QAAH,EAAa;AACX,gBAAGnJ,KAAKb,OAAL,CAAa3Y,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,KAAgC,KAAhC,IAAyCwZ,KAAKE,YAAjD,EAA+D;AAC7D;AACA,mBAAKgJ,iBAAL,CAAuBlJ,IAAvB,EAA6Bjb,GAA7B;AACD,aAHD,MAGO;AACL;AACAib,mBAAKb,OAAL,GAAehZ,MAAMxC,MAAN,CAAaylB,YAAb,CAA0BpJ,KAAKb,OAAL,CAAa3Y,SAAb,CAAuB,CAAvB,EAA0BwZ,KAAKb,OAAL,CAAa1Y,MAAvC,CAA1B,CAAf;AACD;AACF;AACF;AAf6C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAgB/C,KAhBD;;AAkBA,SAAK4iB,wBAAL,GAAgC,UAAS/U,IAAT,EAAegV,YAAf,EAA6BC,YAA7B,EAA2ChiB,QAA3C,EAAqD;AACnF,UAAIkS,QAAQhM,aAAa+b,QAAb,EAAZ;AACA/P,YAAM5B,OAAN,CAAc,UAASmI,IAAT,EAAc;AAC1B,YAAGA,KAAKb,OAAL,CAAa3Y,SAAb,CAAuB,CAAvB,EAA0B,CAA1B,KAAgC,KAAhC,IAAyCwZ,KAAKE,YAAjD,EAA+D;AAC7D;AACA,cAAIoI,WAAWniB,MAAMxC,MAAN,CAAa4kB,WAAb,CAAyBvI,KAAKE,YAA9B,EAA4CqJ,YAA5C,CAAf;AACA;AACAvJ,eAAKE,YAAL,GAAoB/Z,MAAMxC,MAAN,CAAa8kB,WAAb,CAAyBH,QAAzB,EAAmCgB,YAAnC,CAApB;AACD;AACF,OAPD;;AASA,WAAKG,cAAL,CAAoBnV,IAApB,EAA0BmF,KAA1B,EAAiC,UAASjI,OAAT,EAAkB;AACjDjK,iBAASiK,OAAT;AACD,OAFgC,CAE/B/H,IAF+B,CAE1B,IAF0B,CAAjC;AAGD,KAdD;AAeD;AACL,CA1oBA;AA2oBD;IAAOigB,S;;;;;;;iCAEQniB,Q,EAAUoiB,c,EAAgB;AACrC,UAAIjH,UAAU9e,OAAOgmB,SAAP,CAAiBhD,IAAjB,CAAsB,eAAtB,EAAuC,CAAvC,CAAd;;AAEAlE,cAAQmH,OAAR,GAAkB,UAAS/a,KAAT,EAAgB;AAChCwE,cAAM,iFAAN;AACA,YAAG/L,QAAH,EAAa;AACXA,mBAAS,IAAT;AACD;AACF,OALD;;AAOAmb,cAAQoH,SAAR,GAAoB,UAAChb,KAAD,EAAW;AAC7B;AACC,YAAIib,KAAKjb,MAAM+C,MAAN,CAAamH,MAAtB;AACA+Q,WAAGF,OAAH,GAAa,UAASG,UAAT,EAAqB;AAChC1gB,kBAAQC,GAAR,CAAY,qBAAqBygB,WAAWnY,MAAX,CAAkBoY,SAAnD;AACD,SAFD;AAGA,YAAG1iB,QAAH,EAAa;AACXA,mBAASwiB,EAAT;AACD;AACH,OATD;;AAWArH,cAAQwH,eAAR,GAA0B,UAACpb,KAAD,EAAW;AACnC,YAAIib,KAAKjb,MAAM+C,MAAN,CAAamH,MAAtB;AACA,YAAG+Q,GAAGI,OAAH,KAAe,CAAlB,EAAqB;AACnB,cAAGR,cAAH,EAAmB;AACjBA;AACD;AACF;;AAED;AACA,YAAIS,cAAcL,GAAGM,iBAAH,CAAqB,OAArB,EAA8B,EAAEC,SAAS,MAAX,EAA9B,CAAlB;AACAF,oBAAYG,WAAZ,CAAwB,OAAxB,EAAiC,OAAjC,EAA0C,EAAEC,QAAQ,KAAV,EAA1C;AACAJ,oBAAYG,WAAZ,CAAwB,MAAxB,EAAgC,MAAhC,EAAwC,EAAEC,QAAQ,IAAV,EAAxC;AACAJ,oBAAYK,WAAZ,CAAwBC,UAAxB,GAAqC,UAAS5b,KAAT,EAAgB;AACnD;AACD,SAFD;AAGD,OAfD;AAgBD;;;gCAEWvH,Q,EAAU;;AAEpB,WAAKsG,YAAL,CAAkB,UAACkc,EAAD,EAAQ;AACxB,YAAIK,cAAcL,GAAGU,WAAH,CAAe,OAAf,EAAwBL,WAAxB,CAAoC,OAApC,CAAlB;AACA,YAAI3Q,QAAQ,EAAZ;AACA2Q,oBAAYO,UAAZ,GAAyBb,SAAzB,GAAqC,UAAShb,KAAT,EAAgB;AACnD,cAAI8b,SAAS9b,MAAM+C,MAAN,CAAamH,MAA1B;AACA,cAAI4R,MAAJ,EAAY;AACVnR,kBAAMkG,IAAN,CAAWiL,OAAOC,KAAlB;AACAD,mBAAOE,QAAP;AACD,WAHD,MAIK;AACHvjB,qBAASkS,KAAT;AACD;AACF,SATD;AAUD,OAbD,EAaG,IAbH;AAcD;;;6BAEQuG,I,EAAM;AACb+H,gBAAU,CAAC/H,IAAD,CAAV;AACD;;;8BAESvG,K,EAAOlS,Q,EAAU;;AAEzB,UAAGkS,MAAMhT,MAAN,IAAgB,CAAnB,EAAsB;AACpB,YAAGc,QAAH,EAAa;AACXA;AACD;AACD;AACD;;AAED,WAAKsG,YAAL,CAAkB,UAACkc,EAAD,EAAQ;AACxB,YAAIU,cAAcV,GAAGU,WAAH,CAAe,OAAf,EAAwB,WAAxB,CAAlB;AACAA,oBAAYC,UAAZ,GAAyB,UAAS5b,KAAT,EAAgB,CAExC,CAFD;;AAIA2b,oBAAYZ,OAAZ,GAAsB,UAAS/a,KAAT,EAAgB;AACpCxF,kBAAQC,GAAR,CAAY,oBAAZ,EAAkCuF,MAAM+C,MAAN,CAAaoY,SAA/C;AACD,SAFD;;AAIA,YAAIc,kBAAkBN,YAAYL,WAAZ,CAAwB,OAAxB,CAAtB;AACA,YAAIpf,IAAI,CAAR;AACAggB;;AAEA,iBAASA,OAAT,GAAmB;AACjB,cAAIhgB,IAAIyO,MAAMhT,MAAd,EAAsB;AACpB,gBAAIuZ,OAAOvG,MAAMzO,CAAN,CAAX;AACA+f,4BAAgBE,GAAhB,CAAoBjL,IAApB,EAA0B8J,SAA1B,GAAsCkB,OAAtC;AACA,cAAEhgB,CAAF;AACD,WAJD,MAIO;AACL,gBAAGzD,QAAH,EAAY;AACVA;AACD;AACF;AACF;AACF,OAzBD,EAyBG,IAzBH;AA0BD;;;+BAEUyY,I,EAAM;AACf,WAAKnS,YAAL,CAAkB,UAACkc,EAAD,EAAQ;AACxB,YAAIrH,UAAUqH,GAAGU,WAAH,CAAe,OAAf,EAAwB,WAAxB,EAAqCL,WAArC,CAAiD,OAAjD,EAA0Dc,MAA1D,CAAiElL,KAAKrb,IAAtE,CAAd;AACA+d,gBAAQoH,SAAR,GAAoB,UAAShb,KAAT,EAAgB;AAClCxF,kBAAQC,GAAR,CAAY,2BAAZ,EAAyCyW,KAAKrb,IAA9C;AACD,SAFD;AAGD,OALD,EAKG,IALH;AAMD;;;kCAEaA,I,EAAM4C,Q,EAAU;AAC5B,WAAKsG,YAAL,CAAkB,UAACkc,EAAD,EAAQ;AACxB,YAAIrH,UAAUqH,GAAGU,WAAH,CAAe,OAAf,EAAwB,UAAxB,EAAoCL,WAApC,CAAgD,OAAhD,EAAyDjd,GAAzD,CAA6DxI,IAA7D,CAAd;AACA+d,gBAAQoH,SAAR,GAAoB,UAAShb,KAAT,EAAgB;AAClCvH,mBAASuH,MAAMkK,MAAf;AACD,SAFD;AAGD,OALD,EAKG,IALH;AAMD;;;;;;AAGH9N,QAAQC,MAAR,CAAe,cAAf,EAA+BggB,OAA/B,CAAuC,WAAvC,EAAoDzB,SAApD;AACA,CAACxe,QACEC,MADF,CACS,cADT,EAEE6C,SAFF,CAEY,aAFZ,EAE2B,CAAC,UAAD,EAAa,UAASC,QAAT,EAAmB;AACxD,SAAO;AACLC,cAAU,GADL;AAELC,WAAO;AACLid,mBAAa;AADR,KAFF;AAKL3c,UAAO,cAAS6K,MAAT,EAAiB+R,QAAjB,EAA2B;AAChCpd,eAAS,YAAW;AAClB,YAAGqL,OAAO8R,WAAV,EAAuB;AACrBC,mBAAS,CAAT,EAAYra,KAAZ;AACD;AACF,OAJD;AAKD;AAXI,GAAP;AAaD,CAdyB,CAF3B;AAiBD;IAAOsa,wB;AAEL,sCAAc;AAAA;;AACZ,SAAKpd,QAAL,GAAgB,GAAhB;AACA,SAAKpB,WAAL,GAAmB,0CAAnB;AACA,SAAKqB,KAAL,GAAa;AACX6R,YAAM;AADK,KAAb;AAGD;;;;+BAEU1G,M,EAAQ7L,Y,EAAcyC,gB,EAAkB;AACjD;;AACAoJ,aAAOiS,UAAP,GAAoBrb,iBAAiBO,yBAAjB,CAA2C6I,OAAO0G,IAAlD,CAApB;;AAEA1G,aAAO7D,aAAP,GAAuB,UAASH,MAAT,EAAiBC,SAAjB,EAA4B;AACjDD,eAAOE,OAAP,GAAiB,IAAjB;AACAtF,yBAAiBuF,aAAjB,CAA+BH,MAA/B,EAAuCC,SAAvC,EAAkD+D,OAAO0G,IAAzD,EAA+D,UAAS3M,QAAT,EAAkB;AAC/EiC,iBAAOE,OAAP,GAAiB,KAAjB;AACD,SAFD;AAGD,OALD;;AAOA8D,aAAOkS,sBAAP,GAAgC,UAASjW,SAAT,EAAoB;AAClD,eAAOrF,iBAAiBub,0BAAjB,CAA4ClW,SAA5C,IAAyD,WAAzD,GAAuE,WAA9E;AACD,OAFD;AAGD;;;;;;AAIHrK,QAAQC,MAAR,CAAe,cAAf,EAA+B6C,SAA/B,CAAyC,0BAAzC,EAAqE;AAAA,SAAM,IAAIsd,wBAAJ,EAAN;AAAA,CAArE;AACA,CAACpgB,QACEC,MADF,CACS,cADT,EAEE6C,SAFF,CAEY,WAFZ,EAEyB,YAAW;AACnC,SAAQ;AACNG,WAAO;AACLG,YAAM;AADD,KADD;AAING,UAAM,cAASN,KAAT,EAAgBvC,OAAhB,EAAyB;AAC7B;AACA,UAAI8f,KAAK9f,QAAQ,CAAR,CAAT;;AAEA8f,SAAGC,SAAH,GAAe,IAAf;;AAEAD,SAAGhc,gBAAH,CACE,WADF,EAEE,UAASoJ,CAAT,EAAY;AACVA,UAAE8S,YAAF,CAAeC,aAAf,GAA+B,MAA/B;AACA/S,UAAE8S,YAAF,CAAeE,OAAf,CAAuB,MAAvB,EAA+B/S,KAAKkK,SAAL,CAAe9U,MAAMG,IAArB,CAA/B;AACA,aAAKyd,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OAPH,EAQE,KARF;;AAWAN,SAAGhc,gBAAH,CACE,SADF,EAEE,UAASoJ,CAAT,EAAY;AACV,aAAKiT,SAAL,CAAe1d,MAAf,CAAsB,MAAtB;AACA,eAAO,KAAP;AACD,OALH,EAME,KANF;AAQD;AA7BK,GAAR;AA+BD,CAlCA;;AAoCDnD,QACGC,MADH,CACU,cADV,EAEG6C,SAFH,CAEa,WAFb,EAE0B,YAAW;AACnC,SAAO;AACLG,WAAO;AACL8d,YAAM,GADD;AAELC,WAAK,GAFA;AAGL9R,WAAK;AAHA,KADF;AAML3L,UAAM,cAASN,KAAT,EAAgBvC,OAAhB,EAAyB;AAC7B;AACA,UAAI8f,KAAK9f,QAAQ,CAAR,CAAT;;AAEA8f,SAAGhc,gBAAH,CACE,UADF,EAEE,UAASoJ,CAAT,EAAY;AACVA,UAAE8S,YAAF,CAAeO,UAAf,GAA4B,MAA5B;AACA;AACA,YAAIrT,EAAEzJ,cAAN,EAAsByJ,EAAEzJ,cAAF;AACtB,aAAK0c,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OARH,EASE,KATF;;AAYA,UAAII,UAAU,CAAd;;AAEAV,SAAGhc,gBAAH,CACE,WADF,EAEE,UAASoJ,CAAT,EAAY;AACVsT;AACA,aAAKL,SAAL,CAAeC,GAAf,CAAmB,MAAnB;AACA,eAAO,KAAP;AACD,OANH,EAOE,KAPF;;AAUAN,SAAGhc,gBAAH,CACE,WADF,EAEE,UAASoJ,CAAT,EAAY;AACVsT;AACC,YAAIA,YAAY,CAAhB,EAAmB;AACjB,eAAKL,SAAL,CAAe1d,MAAf,CAAsB,MAAtB;AACD;AACF,eAAO,KAAP;AACD,OARH,EASE,KATF;;AAYAqd,SAAGhc,gBAAH,CACE,MADF,EAEE,UAASoJ,CAAT,EAAY;AACV;AACA,YAAIA,EAAEuT,eAAN,EAAuBvT,EAAEuT,eAAF;;AAEvB,aAAKN,SAAL,CAAe1d,MAAf,CAAsB,MAAtB;;AAEA,YAAIie,QAAQ,KAAK3nB,IAAjB;AACA,YAAI2J,OAAO,IAAI+M,IAAJ,CAAStC,KAAK5T,KAAL,CAAW2T,EAAE8S,YAAF,CAAeW,OAAf,CAAuB,MAAvB,CAAX,CAAT,CAAX;AACApe,cAAMuL,MAAN,CAAa,UAASvL,KAAT,EAAgB;AAC3B,cAAIqe,KAAKre,MAAM8d,IAAN,EAAT;AACA,cAAI,gBAAgB,OAAOO,EAA3B,EAA+B;AAC7BA,eAAG1T,CAAH,EAAM3K,MAAMiM,GAAZ,EAAiB9L,IAAjB;AACD;AACF,SALD;;AAOA,eAAO,KAAP;AACD,OAlBH,EAmBE,KAnBF;AAqBD;AAnEI,GAAP;AAqED,CAxED;AAyEA,CAACpD,QACEC,MADF,CACS,cADT,EAEE6C,SAFF,CAEY,YAFZ,EAE0B,YAAW;AAClC,SAAO;AACNE,cAAU,GADJ;AAENC,WAAO;AACLU,eAAS;AADJ,KAFD;AAKNJ,UAAM,cAAUN,KAAV,EAAiBvC,OAAjB,EAA0B;AAC/BA,cAAQ6gB,EAAR,CAAW,QAAX,EAAqB,UAAU3d,KAAV,EAAiB;AACpCX,cAAMuL,MAAN,CAAa,YAAU;AACrBvL,gBAAMU,OAAN,CAAc,EAAC4J,OAAO3J,MAAM+C,MAAN,CAAa4G,KAArB,EAAd;AACD,SAFD;AAGD,OAJD;AAKA;AAXK,GAAP;AAaH,CAhBA;AAiBD,CAACvN,QACEC,MADF,CACS,cADT,EAEE6C,SAFF,CAEY,WAFZ,EAEyB,YAAW;AACjC,SAAO;AACL0e,aAAS,SADJ;AAELje,UAAM,cAASN,KAAT,EAAgBvC,OAAhB,EAAyB+C,KAAzB,EAAgCge,SAAhC,EAA2C;AAC/C,UAAIC,YAAY,SAAZA,SAAY,CAASC,UAAT,EAAqB;AACnC,YAAIA,cAAc3H,SAAlB,EAA6B2H,aAAa,EAAb;AAC7B,YAAIC,aAAaD,WAAWzd,WAAX,EAAjB;AACA,YAAI0d,eAAeD,UAAnB,EAA+B;AAC7BF,oBAAUI,aAAV,CAAwBD,UAAxB;AACAH,oBAAUK,OAAV;AACD;AACD,eAAOF,UAAP;AACD,OARD;AASAH,gBAAUM,QAAV,CAAmBtN,IAAnB,CAAwBiN,SAAxB;AACAA,gBAAUze,MAAMQ,MAAMue,OAAZ,CAAV;AACD;AAdI,GAAP;AAgBD,CAnBF;AAoBD,CAAChiB,QACEC,MADF,CACS,cADT,EAEE6C,SAFF,CAEY,eAFZ,EAE6B,CAAC,SAAD,EAAY,UAAUmf,OAAV,EAAmB;AACzD,SAAO;AACHjf,cAAU,GADP;AAEHO,UAAM,cAAUN,KAAV,EAAiBvC,OAAjB,EAA0B+C,KAA1B,EAAiC;AACnC/C,cAAQ6gB,EAAR,CAAW,OAAX,EAAoB,YAAY;AAC5B,YAAI,CAACU,QAAQC,YAAR,GAAuB1pB,QAAvB,EAAL,EAAwC;AACpC;AACA,eAAK2pB,iBAAL,CAAuB,CAAvB,EAA0B,KAAKxC,KAAL,CAAWpkB,MAArC;AACH;AACJ,OALD;AAMH;AATE,GAAP;AAWH,CAZ6B,CAF7B;AAeD;IAAO6mB,gB;AAEL,4BAAYjP,WAAZ,EAAyB5Q,YAAzB,EAAuCC,aAAvC,EAAsD;AAAA;;AAClD,SAAK2Q,WAAL,GAAmBA,WAAnB;AACA,SAAK5Q,YAAL,GAAoBA,YAApB;AACA,SAAKC,aAAL,GAAqBA,aAArB;AACA,SAAK6f,uBAAL,GAA+BxU,KAAK5T,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,yBAArB,CAAX,KAA+D,EAA9F;AACA,SAAKohB,mBAAL,GAA2BzU,KAAK5T,KAAL,CAAWgH,aAAaC,OAAb,CAAqB,qBAArB,CAAX,KAA2D,EAAtF;;AAEAqB,iBAAaggB,mBAAb,CAAiC,kBAAjC,EAAqD,WAArD,EAAkE,UAAShU,KAAT,EAAe;AAAA;AAAA;AAAA;;AAAA;AAC/E,8BAAgBA,KAAhB,mIAAuB;AAAA,cAAdiU,GAAc;;;AAErBA,cAAI1nB,SAAJ,GAAgB,KAAKylB,0BAAL,CAAgCiC,GAAhC,CAAhB;;AAFqB;AAAA;AAAA;;AAAA;AAIrB,kCAAmBA,IAAIxM,OAAvB,mIAAgC;AAAA,kBAAvB5L,MAAuB;;AAC9B,kBAAG,KAAKiY,uBAAL,CAA6BpQ,QAA7B,CAAsC7H,OAAO9J,GAA7C,CAAH,EAAsD;AACpD,qBAAKmiB,kBAAL,CAAwBrY,MAAxB,EAAgCoY,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,CAWhEjkB,IAXgE,CAW3D,IAX2D,CAAlE;AAYH;;;;8CAMyBuW,I,EAAM;AAC9B,aAAO,KAAKuL,UAAL,CAAgB3O,MAAhB,CAAuB,UAAS8Q,GAAT,EAAa;AACzC,eAAOA,IAAIE,yBAAJ,CAA8B5N,IAA9B,EAAoCvZ,MAApC,GAA6C,CAApD;AACD,OAFM,CAAP;AAGD;;;kCAEa+E,G,EAAK;AAAA;AAAA;AAAA;;AAAA;AACjB,8BAAsB,KAAK+f,UAA3B,mIAAuC;AAAA,cAA9BhW,SAA8B;;AACrC,iBAAOtN,EAAEgT,IAAF,CAAO1F,UAAU2L,OAAjB,EAA0B,EAAC1V,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,KAAKiY,mBAAL,CAAyBrQ,QAAzB,CAAkC5H,UAAU/J,GAA5C,CAAR;AACD;;;oDAE+BxF,S,EAAWuP,S,EAAW;AACpD,UAAGvP,SAAH,EAAc;AACZiC,UAAEqZ,IAAF,CAAO,KAAKkM,mBAAZ,EAAiCjY,UAAU/J,GAA3C;AACD,OAFD,MAEO;AACL,aAAKgiB,mBAAL,CAAyB7N,IAAzB,CAA8BpK,UAAU/J,GAAxC;AACD;;AAEDW,mBAAamW,OAAb,CAAqB,qBAArB,EAA4CvJ,KAAKkK,SAAL,CAAe,KAAKuK,mBAApB,CAA5C;;AAEAjY,gBAAUvP,SAAV,GAAsB,KAAKylB,0BAAL,CAAgClW,SAAhC,CAAtB;AACD;;;iCAEY/J,G,EAAKjE,Q,EAAU;AAC1B,WAAKsmB,2BAAL,CAAiCriB,GAAjC,EAAsCjE,QAAtC;AACD;;;oCAEegO,S,EAAW;AAAA;AAAA;AAAA;;AAAA;AACzB,8BAAkBA,UAAU2L,OAA5B,mIAAqC;AAAA,cAA7B5L,MAA6B;;AACnCrN,YAAEqZ,IAAF,CAAO,KAAKkM,mBAAZ,EAAiCjY,SAAjC;AACA,cAAGD,OAAOwY,WAAV,EAAuB;AACrB,gBAAG,KAAKC,qBAAL,CAA2BzY,MAA3B,CAAH,EAAuC;AACrC,mBAAK0Y,mBAAL,CAAyB1Y,MAAzB;AACD;AACF;AACF;AARwB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAUzB,WAAK7H,YAAL,CAAkB8N,kBAAlB,CAAqChG,SAArC;AACA,WAAK7H,aAAL,CAAmBK,IAAnB,CAAwB,IAAxB;AACD;;;gDAE2BvC,G,EAAKjE,Q,EAAU;AACzC,WAAK8W,WAAL,CAAiB4P,MAAjB,CAAwBziB,GAAxB,EAA6BA,GAA7B,EAAkC2B,GAAlC,GAAwCpD,IAAxC,CAA6C,UAASsJ,QAAT,EAAkB;AAC7D,YAAIqa,MAAM,KAAKQ,uCAAL,CAA6C1iB,GAA7C,EAAkD6H,SAASuP,KAAT,EAAlD,CAAV;AACA,YAAGrb,QAAH,EAAa;AACXA,mBAASmmB,GAAT;AACD;AACF,OAL4C,CAK3CjkB,IAL2C,CAKtC,IALsC,CAA7C,EAMCO,KAND,CAMO,UAASqJ,QAAT,EAAkB;AACvB/J,gBAAQC,GAAR,CAAY,6BAAZ,EAA2C8J,QAA3C;AACA9L,iBAAS,IAAT;AACD,OATD;AAUD;;;4DAEuCiE,G,EAAK6V,oB,EAAsB;AACjE,UAAI9L,YAAYtN,EAAEgT,IAAF,CAAO,KAAKsQ,UAAZ,EAAwB,EAAC/f,KAAKA,GAAN,EAAxB,CAAhB;AACA,UAAG+J,SAAH,EAAc;AACZA,kBAAU4Y,8BAAV,CAAyC9M,oBAAzC;AACD,OAFD,MAEO;AACL9L,oBAAY,IAAI0L,SAAJ,CAAcI,oBAAd,CAAZ;AACA9L,kBAAU/J,GAAV,GAAgBA,GAAhB;AACA+J,kBAAUnC,QAAV,CAAmB,IAAnB;AACA,aAAK3F,YAAL,CAAkBiN,OAAlB,CAA0BnF,SAA1B;AACA,aAAK7H,aAAL,CAAmBK,IAAnB,CAAwB,IAAxB;AACD;;AAED,aAAOwH,SAAP;AACD;;;kDAE6B;AAAA;AAAA;AAAA;;AAAA;AAC5B,+BAAgB,KAAKgY,uBAArB,wIAA8C;AAAA,cAArC/hB,GAAqC;;AAC5C,cAAI8J,SAAS,KAAK8Y,aAAL,CAAmB5iB,GAAnB,CAAb;AACA,cAAG8J,MAAH,EAAW;AACT,iBAAK0Y,mBAAL,CAAyB1Y,MAAzB;AACD;AACF;AAN2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAQ5B,+BAAe,KAAKiW,UAApB,wIAAgC;AAAA,cAAxBmC,GAAwB;;AAC9B,eAAKG,2BAAL,CAAiCH,IAAIliB,GAArC,EAA0C,UAAS+J,SAAT,EAAmB;AAC3DA,sBAAUnC,QAAV,CAAmB,IAAnB;AACD,WAFD;AAGD;AAZ2B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAa7B;;;kCAEakC,M,EAAQC,S,EAAWyK,I,EAAMzY,Q,EAAU;;AAE/C,UAAG,KAAKkkB,0BAAL,CAAgClW,SAAhC,KAA8C,CAAC,KAAK7H,aAAL,CAAmBuE,cAAnB,EAAlD,EAAuF;AACrFqB,cAAM,2FAAN;AACA/L,iBAAS,IAAT;AACA;AACD;;AAED,cAAQ+N,OAAOuL,IAAf;AACE,aAAK,KAAL;AAAY;AACV,iBAAKxC,WAAL,CAAiB4P,MAAjB,CAAwB3Y,OAAO9J,GAA/B,EAAoC8J,OAAO9J,GAA3C,EAAgD2B,GAAhD,GAAsDpD,IAAtD,CAA2D,UAASsJ,QAAT,EAAkB;AAC3EiC,qBAAOpL,KAAP,GAAe,KAAf;AACA,kBAAIuP,QAAQpG,SAASoG,KAArB;AACA,mBAAKhM,YAAL,CAAkB0Z,6BAAlB,CAAgD1N,KAAhD;AACAlS,uBAASkS,KAAT;AACD,aAL0D,CAKzDhQ,IALyD,CAKpD,IALoD,CAA3D,EAMCO,KAND,CAMO,UAASqJ,QAAT,EAAkB;AACvBiC,qBAAOpL,KAAP,GAAe,IAAf;AACD,aARD;;AAUA;AACD;;AAED,aAAK,MAAL;AAAa;AACX,gBAAImkB,MAAMzqB,OAAOgjB,IAAP,CAAYtR,OAAO9J,GAAnB,EAAwB,QAAxB,CAAV;AACA6iB,gBAAIrd,KAAJ;AACAzJ;AACA;AACD;;AAED,aAAK,MAAL;AAAa;AACX,gBAAIyE,SAAS,EAAb;;AAEA,gBAAGsJ,OAAOwE,GAAV,EAAe;AACb,kBAAIL,QAAQ,KAAKhM,YAAL,CAAkBma,qBAAlB,CAAwCtS,OAAOqL,aAA/C,CAAZ;AACA3U,qBAAOyN,KAAP,GAAeA,MAAM2H,GAAN,CAAU,UAASpB,IAAT,EAAc;AACrC,oBAAIhU,SAAS,KAAKsiB,qBAAL,CAA2BtO,IAA3B,EAAiCzK,SAAjC,CAAb;AACA,uBAAOvJ,MAAP;AACD,eAHwB,CAGvBvC,IAHuB,CAGlB,IAHkB,CAAV,CAAf;AAKD,aAPD,MAOO;AACLuC,qBAAOgU,IAAP,GAAc,KAAKsO,qBAAL,CAA2BtO,IAA3B,EAAiCzK,SAAjC,CAAd;AACD;;AAED,iBAAKgZ,WAAL,CAAiBjZ,MAAjB,EAAyBC,SAAzB,EAAoCvJ,MAApC,EAA4C,UAASqH,QAAT,EAAkB;AAC5D9L,uBAAS8L,QAAT;AACD,aAFD;;AAIA;AACD;;AAED;AAAS,WAER;AA7CH;;AAgDAiC,aAAOiL,YAAP,GAAsB,IAAIhc,IAAJ,EAAtB;AACD;;;0CAEqB+Q,M,EAAQ;AAC5B,aAAO,KAAKiY,uBAAL,CAA6BpQ,QAA7B,CAAsC7H,OAAO9J,GAA7C,CAAP;AACD;;;wCAEmB8J,M,EAAQC,S,EAAW;AACrCtN,QAAEqZ,IAAF,CAAO,KAAKiM,uBAAZ,EAAqCjY,OAAO9J,GAA5C;AACAW,mBAAamW,OAAb,CAAqB,yBAArB,EAAgDvJ,KAAKkK,SAAL,CAAe,KAAKsK,uBAApB,CAAhD;AACA,WAAK9f,YAAL,CAAkB+gB,wBAAlB,CAA2ClZ,OAAO9J,GAAlD;;AAEAlC,cAAQ0c,MAAR,CAAe,KAAK+H,qBAAL,CAA2BzY,MAA3B,KAAsC,KAArD;AACD;;;uCAEkBA,M,EAAQC,S,EAAW;AACpC,UAAG,CAACtN,EAAEgT,IAAF,CAAO,KAAKsS,uBAAZ,EAAqCjY,OAAO9J,GAA5C,CAAJ,EAAsD;AACpD,aAAK+hB,uBAAL,CAA6B5N,IAA7B,CAAkCrK,OAAO9J,GAAzC;AACAW,qBAAamW,OAAb,CAAqB,yBAArB,EAAgDvJ,KAAKkK,SAAL,CAAe,KAAKsK,uBAApB,CAAhD;AACD;;AAED,UAAGjY,OAAOwY,WAAV,EAAuB;;AAErB,YAAGxY,OAAOwY,WAAP,IAAsB,OAAzB,EAAkC;AAChC,eAAKrgB,YAAL,CAAkBghB,qBAAlB,CAAwCnZ,OAAO9J,GAA/C,EAAoD8J,OAAOqL,aAA3D,EAA0E,UAAS+N,YAAT,EAAsB;AAC9F,iBAAKC,kBAAL,CAAwBrZ,MAAxB,EAAgCC,SAAhC,EAA2CmZ,YAA3C;AACD,WAFyE,CAExEjlB,IAFwE,CAEnE,IAFmE,CAA1E;AAGD;;AAED,YAAG6L,OAAOwY,WAAP,IAAsB,MAAzB,EAAiC;AAC/B;AACD;AAEF;AACF;;;gCAEWxY,M,EAAQC,S,EAAW3E,K,EAAO8d,Y,EAAc;AAClD,WAAKE,WAAL,GAAmB,KAAKA,WAAL,IAAoB,EAAvC;AACA,UAAG3mB,EAAEgT,IAAF,CAAO,KAAK2T,WAAZ,EAAyB,EAACpjB,KAAK8J,OAAO9J,GAAb,EAAzB,CAAH,EAAgD;AAC9C;AACD;;AAED;AACA,WAAKojB,WAAL,CAAiBjP,IAAjB,CAAsBrK,MAAtB;;AAEAzE,iBAAW,YAAY;AACrB;AACA,aAAK8d,kBAAL,CAAwBrZ,MAAxB,EAAgCC,SAAhC,EAA2CmZ,YAA3C;AACAzmB,UAAEqZ,IAAF,CAAO,KAAKsN,WAAZ,EAAyBtZ,MAAzB;AACD,OAJU,CAIT7L,IAJS,CAIJ,IAJI,CAAX,EAIcmH,QAAQ,IAJtB;AAKD;;;uCAEkB0E,M,EAAQC,S,EAAWmZ,Y,EAAc;AAClD,UAAGpZ,OAAOuZ,cAAP,GAAwB,CAA3B,EAA8B;AAC5B,YAAItO,eAAejL,OAAOiL,YAA1B;AACA,YAAIuO,gBAAgB,CAAC,IAAIvqB,IAAJ,KAAagc,YAAd,IAA4B,IAAhD;AACA,YAAGuO,gBAAgBxZ,OAAOuZ,cAA1B,EAA0C;AACxC,cAAIje,QAAQ0E,OAAOuZ,cAAP,GAAwBC,aAApC;AACA,eAAKC,WAAL,CAAiBzZ,MAAjB,EAAyBC,SAAzB,EAAoC3E,KAApC,EAA2C8d,YAA3C;AACA;AACD;AACF;;AAEDpZ,aAAOiL,YAAP,GAAsB,IAAIhc,IAAJ,EAAtB;;AAEA+E,cAAQC,GAAR,CAAY,oBAAZ;;AAEA,UAAG+L,OAAOuL,IAAP,IAAe,MAAlB,EAA0B;AACxB,YAAI7U,SAAS,EAAb;AACAA,eAAOyN,KAAP,GAAeiV,aAAatN,GAAb,CAAiB,UAASpB,IAAT,EAAc;AAC5C,cAAIhU,SAAS,KAAKsiB,qBAAL,CAA2BtO,IAA3B,EAAiCzK,SAAjC,CAAb;AACA,iBAAOvJ,MAAP;AACD,SAH+B,CAG9BvC,IAH8B,CAGzB,IAHyB,CAAjB,CAAf;AAIA,aAAK8kB,WAAL,CAAiBjZ,MAAjB,EAAyBC,SAAzB,EAAoCvJ,MAApC,EAA4C,IAA5C;AACD,OAPD,MAOO;AACL;AACD;AACF;;;0CAEqBgU,I,EAAMzK,S,EAAW;AACrC,aAAO,KAAK7H,aAAL,CAAmBkY,kBAAnB,CAAsC5F,IAAtC,EAA4C,KAAKyL,0BAAL,CAAgClW,SAAhC,CAA5C,CAAP;AACD;;;gCAEWD,M,EAAQC,S,EAAWvJ,M,EAAQzE,Q,EAAU;AAC/C,UAAImb,UAAU,KAAKrE,WAAL,CAAiB4P,MAAjB,CAAwB3Y,OAAO9J,GAA/B,EAAoC8J,OAAO9J,GAA3C,CAAd;AACA,UAAG,KAAKigB,0BAAL,CAAgClW,SAAhC,CAAH,EAA+C;AAC7CmN,gBAAQzJ,WAAR,GAAsB,KAAKvL,aAAL,CAAmB6U,aAAnB,EAAtB;AACD;AACDta,QAAEC,KAAF,CAAQwa,OAAR,EAAiB1W,MAAjB;;AAEA0W,cAAQM,IAAR,GAAejZ,IAAf,CAAoB,UAASsJ,QAAT,EAAkB;AACpCiC,eAAOpL,KAAP,GAAe,KAAf;AACA,YAAG3C,QAAH,EAAa;AACXA,mBAAS8L,SAASuP,KAAT,EAAT;AACD;AACF,OALD,EAMC5Y,KAND,CAMO,UAASqJ,QAAT,EAAkB;AACvBiC,eAAOpL,KAAP,GAAe,IAAf;AACAZ,gBAAQC,GAAR,CAAY,wBAAZ,EAAsC8J,QAAtC;AACA,YAAG9L,QAAH,EAAa;AACXA,mBAAS,EAAC2C,OAAO,eAAR,EAAT;AACD;AACF,OAZD;AAaD;;;wBA5PgB;AACf,aAAO,KAAKuD,YAAL,CAAkB8d,UAAzB;AACD;;;;;;AA8PHrgB,QAAQC,MAAR,CAAe,cAAf,EAA+BggB,OAA/B,CAAuC,kBAAvC,EAA2DmC,gBAA3D;AACA,CAACpiB,QAAQC,MAAR,CAAe,cAAf,EACEyR,MADF,CACS,SADT,EACoB,UAAUoS,OAAV,EAAmB;AAClC,SAAO,UAAUtlB,KAAV,EAAiB;AACpB,WAAOA,QAAQslB,QAAQ,MAAR,EAAgB,IAAIzqB,IAAJ,CAASmF,KAAT,CAAhB,EAAiC,YAAjC,EAA+C,KAA/C,CAAR,GAAgE,EAAvE;AACH,GAFD;AAGH,CALF,EAMEkT,MANF,CAMS,aANT,EAMwB,UAAUoS,OAAV,EAAmB;AACtC,SAAO,UAAUtlB,KAAV,EAAiB;AACpB,WAAOA,QAAQslB,QAAQ,MAAR,EAAgB,IAAIzqB,IAAJ,CAASmF,KAAT,CAAhB,EAAiC,mBAAjC,CAAR,GAAgE,EAAvE;AACH,GAFD;AAGH,CAVF;AAWD,CAACwB,QAAQC,MAAR,CAAe,cAAf,EACEggB,OADF,CACU,kBADV,EAC8B,UAAUnb,IAAV,EAAgB;;AAE3Cif,SAAOC,UAAP,CAAkB;AAChBC,YAAQ,IADQ;AAEhBC,cAAU;AAFM,GAAlB;;AAKA,OAAK/d,sBAAL,GAA8B,UAAStL,IAAT,EAAe;AAC3C,QAAG,CAACA,IAAD,IAASA,KAAKU,MAAL,IAAe,CAA3B,EAA8B;AAC5B,aAAO,EAAP;AACD;AACD,WAAOwoB,OAAOlpB,IAAP,CAAP;AACD,GALD;;AAOA,OAAKqL,UAAL,GAAkB,UAASie,SAAT,EAAoB;AACpC,WAAOrf,KAAKsf,WAAL,CAAiBD,SAAjB,CAAP;AACD,GAFD;AAKD,CApBF;AAqBD;IAAOE,Y;AAEL,0BAAc;AAAA;;AACZ,SAAKtV,KAAL,GAAa,EAAb;AACA,SAAKD,IAAL,GAAY,EAAZ;AACA,SAAKwV,iBAAL,GAAyB,EAAzB;AACA,SAAKC,mBAAL,GAA2B,EAA3B;AACA,SAAKhW,KAAL,GAAa,EAAb;AACA,SAAKiW,WAAL,GAAmB,EAAnB;AACD;;;;0CAcqBC,Y,EAAc;AAClC,aAAO,KAAKlW,KAAL,CAAWmD,MAAX,CAAkB,UAASoD,IAAT,EAAc;AACrC,eAAO,CAAC2P,aAAaxS,QAAb,CAAsB6C,KAAKjD,YAA3B,KAA4C4S,aAAaxS,QAAb,CAAsB,GAAtB,CAA7C,KAA4E,CAAC6C,KAAK3P,KAAzF;AACD,OAFM,CAAP;AAGD;;;6BAEQuf,M,EAAQ;AACf,aAAO3nB,EAAEgT,IAAF,CAAO,KAAKxB,KAAZ,EAAmB,EAAC9U,MAAMirB,MAAP,EAAnB,CAAP;AACD;;;kDAE6BnW,K,EAAO;AACnC,aAAO,KAAKgM,2CAAL,CAAiDhM,KAAjD,EAAwD,IAAxD,CAAP;AACD;;;gEAE2CA,K,EAAOoL,U,EAAY;AAC7D,UAAIgL,SAAS,EAAb;AAD6D;AAAA;AAAA;;AAAA;AAE7D,+BAAqBpW,KAArB,wIAA4B;AAAA,cAAnBmF,QAAmB;;AAC1BA,qBAAW3W,EAAEgY,IAAF,CAAOrB,QAAP,EAAiBiG,cAAc,EAA/B,CAAX;AACA,cAAI7E,OAAO,KAAKqF,QAAL,CAAczG,SAAS,MAAT,CAAd,CAAX;AACA,cAAGA,SAAS,SAAT,KAAuB,IAA1B,EAAgC;AAC5B,gBAAGoB,IAAH,EAAS;AACP,mBAAKxF,iBAAL,CAAuBwF,IAAvB;AACD;AACD;AACH;;AAED/X,YAAEgY,IAAF,CAAOrB,QAAP,EAAiBiG,UAAjB;;AAEA,cAAG,CAAC7E,IAAJ,EAAU;AACRA,mBAAO,KAAKlD,UAAL,CAAgB8B,QAAhB,CAAP;AACD,WAFD,MAEO;AACLoB,iBAAKnB,cAAL,CAAoBD,QAApB;AACD;;AAED,eAAKlE,OAAL,CAAasF,IAAb;;AAEA,cAAGpB,SAASO,OAAZ,EAAqB;AACnB,iBAAK2Q,wBAAL,CAA8B9P,IAA9B;AACD;;AAED6P,iBAAOlQ,IAAP,CAAYK,IAAZ;AACD;AA3B4D;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AA6B7D,WAAK+P,2BAAL,CAAiCF,MAAjC;;AAEA,WAAKG,SAAL;AACA,aAAOH,MAAP;AACD;;;gDAE2BA,M,EAAQ;AAAA;AAAA;AAAA;;AAAA;AAClC,+BAAoB,KAAKL,iBAAzB,wIAA4C;AAAA,cAApC9P,QAAoC;;AAC1C,cAAIuQ,gBAAgBJ,OAAOjT,MAAP,CAAc,UAASoD,IAAT,EAAc;AAAC,mBAAOA,KAAKjD,YAAL,IAAqB2C,SAAS8H,IAArC;AAA0C,WAAvE,CAApB;AACA,cAAGyI,cAAcxpB,MAAd,GAAuB,CAA1B,EAA6B;AAC3BiZ,qBAASnY,QAAT,CAAkB0oB,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,cAAtC/P,QAAsC;;AAC5C,cAAIuQ,gBAAgBJ,OAAOjT,MAAP,CAAc,UAASoD,IAAT,EAAc;AAC9C,mBAAON,SAASiB,aAAT,CAAuBxD,QAAvB,CAAgC6C,KAAKjD,YAArC,KAAsD2C,SAASiB,aAAT,CAAuBxD,QAAvB,CAAgC,GAAhC,CAA7D;AACD,WAFmB,CAApB;;AAIA,cAAG8S,cAAcxpB,MAAd,GAAuB,CAA1B,EAA6B;AAC3BiZ,qBAASnY,QAAT,CAAkB0oB,aAAlB;AACD;AACF;AATuC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAUzC;;;+BAEUrR,Q,EAAU;AACnB,UAAIoB,IAAJ;AACA,UAAGpB,SAAS7B,YAAT,IAAyB,MAA5B,EAAoC;AAClCiD,eAAO,IAAI3E,IAAJ,CAASuD,QAAT,CAAP;AACD,OAFD,MAEO,IAAGA,SAAS7B,YAAT,IAAyB,KAA5B,EAAmC;AACxCiD,eAAO,IAAInG,GAAJ,CAAQ+E,QAAR,CAAP;AACD,OAFM,MAEA,IAAGA,SAAS7B,YAAT,IAAyB,WAA5B,EAAyC;AAC9CiD,eAAO,IAAIiB,SAAJ,CAAcrC,QAAd,CAAP;AACD,OAFM,MAEA;AACLoB,eAAO,IAAIrB,IAAJ,CAASC,QAAT,CAAP;AACD;;AAEDoB,WAAKkQ,WAAL,CAAiB,IAAjB,EAAuB,UAASC,WAAT,EAAqB;AAC1C,aAAKC,iCAAL,CAAuC,CAACD,WAAD,CAAvC;AACD,OAFsB,CAErB1mB,IAFqB,CAEhB,IAFgB,CAAvB;;AAIA,aAAOuW,IAAP;AACD;;;6BAEQvG,K,EAAO;AACd,WAAKA,KAAL,GAAaxR,EAAEooB,IAAF,CAAO,KAAK5W,KAAL,CAAWgN,MAAX,CAAkBhN,KAAlB,CAAP,CAAb;;AAEAA,YAAM5B,OAAN,CAAc,UAASmI,IAAT,EAAc;AAC1B,YAAGA,KAAKjD,YAAL,IAAqB,KAAxB,EAA+B;AAC7B,cAAG,CAAC9U,EAAEgT,IAAF,CAAO,KAAKjB,IAAZ,EAAkB,EAACrV,MAAMqb,KAAKrb,IAAZ,EAAlB,CAAJ,EAA0C;AACxC,iBAAKqV,IAAL,CAAU0H,OAAV,CAAkB1B,IAAlB;AACD;AACF,SAJD,MAIO,IAAGA,KAAKjD,YAAL,IAAqB,MAAxB,EAAgC;AACrC,cAAG,CAAC9U,EAAEgT,IAAF,CAAO,KAAKhB,KAAZ,EAAmB,EAACtV,MAAMqb,KAAKrb,IAAZ,EAAnB,CAAJ,EAA2C;AACzC,iBAAKsV,KAAL,CAAWyH,OAAX,CAAmB1B,IAAnB;AACD;AACF,SAJM,MAIA,IAAGA,KAAKjD,YAAL,IAAqB,WAAxB,EAAqC;AAC1C,cAAG,CAAC9U,EAAEgT,IAAF,CAAO,KAAKyU,WAAZ,EAAyB,EAAC/qB,MAAMqb,KAAKrb,IAAZ,EAAzB,CAAJ,EAAiD;AAC/C,iBAAK+qB,WAAL,CAAiBhO,OAAjB,CAAyB1B,IAAzB;AACD;AACF;AACF,OAda,CAcZvW,IAdY,CAcP,IAdO,CAAd;AAeD;;;4BAEOuW,I,EAAM;AACZ,WAAKsQ,QAAL,CAAc,CAACtQ,IAAD,CAAd;AACD;;;wCAEmBY,W,EAAa;AAC/B,aAAO,KAAKnH,KAAL,CAAWmD,MAAX,CAAkB,UAASoD,IAAT,EAAc;AACrC,eAAOA,KAAKjD,YAAL,IAAqB6D,WAA5B;AACD,OAFM,CAAP;AAGD;;;6CAEwBZ,I,EAAM;AAC7B,UAAIX,gBAAgBW,KAAKX,aAAzB;AACA,UAAG,CAACA,cAAcS,UAAlB,EAA8B;AAC5B;AACD;;AAJ4B;AAAA;AAAA;;AAAA;AAM7B,+BAAqBT,cAAcS,UAAnC,wIAA+C;AAAA,cAAvCL,SAAuC;;AAC7C,cAAI8Q,iBAAiB,KAAKlL,QAAL,CAAc5F,UAAU9a,IAAxB,CAArB;AACA,cAAG4rB,cAAH,EAAmB;AACjBvQ,iBAAKwQ,qBAAL,CAA2BD,cAA3B;AACAA,2BAAeC,qBAAf,CAAqCxQ,IAArC;AACD,WAHD,MAGO;AACL;AACD;AACF;AAd4B;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAe9B;;;gCAEW;AACVrB,WAAKsJ,eAAL,CAAqB,KAAKhO,KAA1B;;AAEA,WAAKD,IAAL,CAAUnC,OAAV,CAAkB,UAASuC,GAAT,EAAa;AAC7BuE,aAAKsJ,eAAL,CAAqB7N,IAAIH,KAAzB;AACD,OAFD;AAGD;;;wCAEmBwW,E,EAAIjJ,I,EAAMjgB,Q,EAAU;AACtC,WAAKioB,iBAAL,CAAuB7P,IAAvB,CAA4B,EAAC8Q,IAAIA,EAAL,EAASjJ,MAAMA,IAAf,EAAqBjgB,UAAUA,QAA/B,EAA5B;AACD;;;2CAEsBkpB,E,EAAI;AACzBxoB,QAAEoG,MAAF,CAAS,KAAKmhB,iBAAd,EAAiCvnB,EAAEgT,IAAF,CAAO,KAAKuU,iBAAZ,EAA+B,EAACiB,IAAIA,EAAL,EAA/B,CAAjC;AACD;;;0CAEqBA,E,EAAI9P,a,EAAepZ,Q,EAAU;AACjD,WAAKkoB,mBAAL,CAAyB9P,IAAzB,CAA8B,EAAC8Q,IAAIA,EAAL,EAAS9P,eAAeA,aAAxB,EAAuCpZ,UAAUA,QAAjD,EAA9B;AACD;;;6CAEwBkpB,E,EAAI;AAC3BxoB,QAAEoG,MAAF,CAAS,KAAKohB,mBAAd,EAAmCxnB,EAAEgT,IAAF,CAAO,KAAKwU,mBAAZ,EAAiC,EAACgB,IAAIA,EAAL,EAAjC,CAAnC;AACD;;;oCAMe;AACd,aAAO,KAAKhX,KAAL,CAAWmD,MAAX,CAAkB,UAASoD,IAAT,EAAc;AAAC,eAAOA,KAAKV,KAAL,IAAc,IAAd,IAAsB,CAACU,KAAK3P,KAAnC;AAAyC,OAA1E,CAAP;AACD;;;oCAEeoJ,K,EAAO;AAAA;AAAA;AAAA;;AAAA;AACrB,+BAAgBA,KAAhB,wIAAuB;AAAA,cAAfuG,IAAe;;AACrBA,eAAK5M,QAAL,CAAc,KAAd;AACD;AAHoB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAItB;;;yCAEoB;AACnB,WAAK+Q,eAAL,CAAqB,KAAKN,aAAL,EAArB;AACD;;;uCAEkB7D,I,EAAM;AACvBA,WAAKkE,OAAL,GAAe,IAAf;AACA,UAAG,CAAClE,KAAK3P,KAAT,EAAgB;AACd2P,aAAK5M,QAAL,CAAc,IAAd;AACD;AACD4M,WAAK0Q,sBAAL;AACD;;;sCAEiB1Q,I,EAAM;AACtB/X,QAAEqZ,IAAF,CAAO,KAAK7H,KAAZ,EAAmBuG,IAAnB;;AAEA,UAAGA,KAAKjD,YAAL,IAAqB,KAAxB,EAA+B;AAC7B9U,UAAEqZ,IAAF,CAAO,KAAKtH,IAAZ,EAAkBgG,IAAlB;AACD,OAFD,MAEO,IAAGA,KAAKjD,YAAL,IAAqB,MAAxB,EAAgC;AACrC9U,UAAEqZ,IAAF,CAAO,KAAKrH,KAAZ,EAAmB+F,IAAnB;AACD,OAFM,MAEA,IAAGA,KAAKjD,YAAL,IAAqB,WAAxB,EAAqC;AAC1C9U,UAAEqZ,IAAF,CAAO,KAAKoO,WAAZ,EAAyB1P,IAAzB;AACD;AACF;;AAED;;;;;;mDAI+B2Q,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;;;wBApOc;AACb,aAAO,KAAKqG,KAAL,CAAWmD,MAAX,CAAkB,UAASoD,IAAT,EAAc;AACrC,eAAO,CAACA,KAAK3P,KAAb;AACD,OAFM,CAAP;AAGD;;;wBAEgB;AACf,aAAO,KAAKqf,WAAL,CAAiB9S,MAAjB,CAAwB,UAAS8Q,GAAT,EAAa;AAC1C,eAAO,CAACA,IAAIxJ,OAAZ;AACD,OAFM,CAAP;AAGD;;;wBAkKmB;AAClB,aAAO7I,KAAKC,gBAAL,CAAsB,KAAKrB,KAA3B,CAAP;AACD;;;;;;AAyDH/O,QAAQC,MAAR,CAAe,cAAf,EAA+BggB,OAA/B,CAAuC,cAAvC,EAAuDoE,YAAvD","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), 275)\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 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, $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 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 this.importData.loading = true;\n // allow loading indicator to come up with timeout\n $timeout(function(){\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"Import response:\", success, response);\n this.importData.loading = false;\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 }.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(function(items){\n $scope.$apply();\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n });\n\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 /*\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;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 var filterText = this.noteFilter.text.toLowerCase();\n if(filterText.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.safeTitle().toLowerCase().includes(filterText) || note.safeText().toLowerCase().includes(filterText);\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 markAllReferencesDirty() {\n this.allReferencedObjects().forEach(function(reference){\n reference.setDirty(true);\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, dbManager) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager) {\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\n if(this.syncOpInProgress) {\n // will perform anoter sync after current completes\n this.repeatSync = true;\n return;\n }\n\n this.syncOpInProgress = true;\n\n var allDirtyItems = modelManager.getDirtyItems();\n\n let submitLimit = 100;\n var dirtyItems = allDirtyItems.slice(0, submitLimit);\n if(dirtyItems.length < allDirtyItems.length) {\n // more items left to be synced, repeat\n this.repeatSync = true;\n } else {\n this.repeatSync = false;\n }\n\n if(!this.isUserSignedIn()) {\n this.writeItemsToLocalStorage(dirtyItems, function(responseItems){\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(dirtyItems);\n if(callback) {\n callback();\n }\n }.bind(this))\n\n return;\n }\n\n var request = Restangular.one(\"items/sync\");\n request.limit = 150;\n request.sync_token = this.syncToken;\n request.cursor_token = this.cursorToken;\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n request.post().then(function(response) {\n\n modelManager.clearDirtyItems(dirtyItems);\n\n // handle sync token\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n // handle cursor token (more results waiting, perform another sync)\n this.cursorToken = response.cursor_token;\n\n var retrieved = this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n var saved = this.handleItemsResponse(response.saved_items, omitFields);\n\n this.handleUnsavedItemsResponse(response.unsaved)\n\n this.writeItemsToLocalStorage(saved, null);\n this.writeItemsToLocalStorage(retrieved, null);\n\n this.syncOpInProgress = false;\n\n if(this.cursorToken || this.repeatSync == true) {\n this.syncWithOptions(callback, options);\n } else {\n if(callback) {\n callback(response);\n }\n }\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.markAllReferencesDirty();\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.clearSyncToken = function() {\n this.syncToken = null;\n localStorage.removeItem(\"syncToken\");\n }\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n var items = modelManager.mapResponseItemsToLocalModels(data.items);\n items.forEach(function(item){\n item.setDirty(true);\n item.markAllReferencesDirty();\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 this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeItemsToLocalStorage = function(items, callback) {\n var params = items.map(function(item) {\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\", \"presentation_url\"], false)\n }.bind(this));\n\n dbManager.saveItems(params, callback);\n }\n\n this.loadLocalItems = function(callback) {\n var params = dbManager.getAllItems(function(items){\n var items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n callback(items);\n }.bind(this))\n\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.clear();\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;class DBManager {\n\n openDatabase(callback, onUgradeNeeded) {\n var request = window.indexedDB.open(\"standardnotes\", 1);\n\n request.onerror = function(event) {\n alert(\"Please enable permissions for Standard Notes to use IndexedDB for offline mode.\");\n if(callback) {\n callback(null);\n }\n };\n\n request.onsuccess = (event) => {\n // console.log(\"Successfully opened database\", event.target.result);\n var db = event.target.result;\n db.onerror = function(errorEvent) {\n console.log(\"Database error: \" + errorEvent.target.errorCode);\n }\n if(callback) {\n callback(db);\n }\n };\n\n request.onupgradeneeded = (event) => {\n var db = event.target.result;\n if(db.version === 1) {\n if(onUgradeNeeded) {\n onUgradeNeeded();\n }\n }\n\n // Create an objectStore for this database\n var objectStore = db.createObjectStore(\"items\", { keyPath: \"uuid\" });\n objectStore.createIndex(\"title\", \"title\", { unique: false });\n objectStore.createIndex(\"uuid\", \"uuid\", { unique: true });\n objectStore.transaction.oncomplete = function(event) {\n // Ready to store values in the newly created objectStore.\n };\n };\n }\n\n getAllItems(callback) {\n\n this.openDatabase((db) => {\n var objectStore = db.transaction(\"items\").objectStore(\"items\");\n var items = [];\n objectStore.openCursor().onsuccess = function(event) {\n var cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n callback(items);\n }\n };\n }, null)\n }\n\n saveItem(item) {\n saveItems([item]);\n }\n\n saveItems(items, callback) {\n\n if(items.length == 0) {\n if(callback) {\n callback();\n }\n return;\n }\n\n this.openDatabase((db) => {\n var transaction = db.transaction(\"items\", \"readwrite\");\n transaction.oncomplete = function(event) {\n\n };\n\n transaction.onerror = function(event) {\n console.log(\"Transaction error:\", event.target.errorCode);\n };\n\n var itemObjectStore = transaction.objectStore(\"items\");\n var i = 0;\n putNext();\n\n function putNext() {\n if (i < items.length) {\n var item = items[i];\n itemObjectStore.put(item).onsuccess = putNext;\n ++i;\n } else {\n if(callback){\n callback();\n }\n }\n }\n }, null)\n }\n\n deleteItem(item) {\n this.openDatabase((db) => {\n var request = db.transaction(\"items\", \"readwrite\").objectStore(\"items\").delete(item.uuid);\n request.onsuccess = function(event) {\n console.log(\"Successfully deleted item\", item.uuid);\n };\n }, null)\n }\n\n getItemByUUID(uuid, callback) {\n this.openDatabase((db) => {\n var request = db.transaction(\"items\", \"readonly\").objectStore(\"items\").get(uuid);\n request.onsuccess = function(event) {\n callback(event.result);\n };\n }, null);\n }\n}\n\nangular.module('app.frontend').service('dbManager', DBManager);\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 'ngInject';\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\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;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(items) {\n for(var item of items) {\n item.setDirty(false);\n }\n }\n\n clearAllDirtyItems() {\n this.clearDirtyItems(this.getDirtyItems());\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"]} \ No newline at end of file From d615d1aebe95ed61944db187a5639b79ef9b7429 Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Thu, 12 Jan 2017 20:29:16 -0600 Subject: [PATCH 2/4] dbmanager delete item --- app/assets/javascripts/app/services/apiController.js | 2 +- app/assets/javascripts/app/services/extensionManager.js | 2 +- app/assets/javascripts/app/services/modelManager.js | 5 ++++- vendor/assets/javascripts/transpiled.js | 9 ++++++--- vendor/assets/javascripts/transpiled.js.map | 2 +- 5 files changed, 13 insertions(+), 7 deletions(-) diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index 00e4905ac..f5243e7f4 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -519,7 +519,7 @@ angular.module('app.frontend') this.writeItemsToLocalStorage = function(items, callback) { var params = items.map(function(item) { - return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false) + return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url", "dirty"], false) }.bind(this)); dbManager.saveItems(params, callback); diff --git a/app/assets/javascripts/app/services/extensionManager.js b/app/assets/javascripts/app/services/extensionManager.js index d44f2cd52..b31997fda 100644 --- a/app/assets/javascripts/app/services/extensionManager.js +++ b/app/assets/javascripts/app/services/extensionManager.js @@ -155,7 +155,7 @@ class ExtensionManager { }.bind(this)) } else { - params.item = this.outgoingParamsForItem(item, extension); + params.items = [this.outgoingParamsForItem(item, extension)]; } this.performPost(action, extension, params, function(response){ diff --git a/app/assets/javascripts/app/services/modelManager.js b/app/assets/javascripts/app/services/modelManager.js index 2dea6f4ad..06d2cedd0 100644 --- a/app/assets/javascripts/app/services/modelManager.js +++ b/app/assets/javascripts/app/services/modelManager.js @@ -1,6 +1,7 @@ class ModelManager { - constructor() { + constructor(dbManager) { + this.dbManager = dbManager; this.notes = []; this.tags = []; this.itemSyncObservers = []; @@ -217,6 +218,8 @@ class ModelManager { } else if(item.content_type == "Extension") { _.pull(this._extensions, item); } + + this.dbManager.deleteItem(item); } /* diff --git a/vendor/assets/javascripts/transpiled.js b/vendor/assets/javascripts/transpiled.js index db5ce0552..932b10dbb 100644 --- a/vendor/assets/javascripts/transpiled.js +++ b/vendor/assets/javascripts/transpiled.js @@ -2437,7 +2437,7 @@ var Tag = function (_Item3) { this.writeItemsToLocalStorage = function (items, callback) { var params = items.map(function (item) { - return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url"], false); + return this.paramsForItem(item, this.isUserSignedIn(), ["created_at", "updated_at", "presentation_url", "dirty"], false); }.bind(this)); dbManager.saveItems(params, callback); @@ -3189,7 +3189,7 @@ var ExtensionManager = function () { return params; }.bind(this)); } else { - params.item = this.outgoingParamsForItem(item, extension); + params.items = [this.outgoingParamsForItem(item, extension)]; } this.performPost(action, extension, params, function (response) { @@ -3352,9 +3352,10 @@ angular.module('app.frontend').service('extensionManager', ExtensionManager); }); ; var ModelManager = function () { - function ModelManager() { + function ModelManager(dbManager) { _classCallCheck(this, ModelManager); + this.dbManager = dbManager; this.notes = []; this.tags = []; this.itemSyncObservers = []; @@ -3686,6 +3687,8 @@ var ModelManager = function () { } else if (item.content_type == "Extension") { _.pull(this._extensions, item); } + + this.dbManager.deleteItem(item); } /* diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index b02c06609..954ed7e61 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","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","dbManager","getCurrentUser","openDatabase","clearSyncToken","sync","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","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","syncUpdated","$state","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","importData","loading","importJSONData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","items","$apply","setInterval","allTag","Tag","all","title","tags","notes","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","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","filterText","safeTitle","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","allReferencedObjects","reference","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","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","syncOpInProgress","repeatSync","allDirtyItems","getDirtyItems","submitLimit","dirtyItems","writeItemsToLocalStorage","responseItems","deleted","clearDirtyItems","limit","sync_token","cursor_token","cursorToken","createRequestParamsForItem","additionalFields","retrieved","handleItemsResponse","retrieved_items","omitFields","saved","saved_items","handleUnsavedItemsResponse","unsaved","undefined","mapping","itemResponse","findItem","alternateUUID","markAllReferencesDirty","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","removeItem","onDataReady","mapResponseItemsToLocalModels","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","staticifyObject","object","saveItems","getAllItems","sortItemsByDate","draftString","jsonObj","clear","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","allItems","saveBatchItems","DBManager","onUgradeNeeded","indexedDB","onerror","onsuccess","db","errorEvent","errorCode","onupgradeneeded","version","objectStore","createObjectStore","keyPath","createIndex","unique","transaction","oncomplete","openCursor","cursor","value","continue","itemObjectStore","putNext","put","delete","service","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","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","$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"],"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), 275)\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 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, $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 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 this.importData.loading = true;\n // allow loading indicator to come up with timeout\n $timeout(function(){\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"Import response:\", success, response);\n this.importData.loading = false;\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 }.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(function(items){\n $scope.$apply();\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n });\n\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 /*\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;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 var filterText = this.noteFilter.text.toLowerCase();\n if(filterText.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.safeTitle().toLowerCase().includes(filterText) || note.safeText().toLowerCase().includes(filterText);\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 markAllReferencesDirty() {\n this.allReferencedObjects().forEach(function(reference){\n reference.setDirty(true);\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, dbManager) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager) {\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\n if(this.syncOpInProgress) {\n // will perform anoter sync after current completes\n this.repeatSync = true;\n return;\n }\n\n this.syncOpInProgress = true;\n\n var allDirtyItems = modelManager.getDirtyItems();\n\n let submitLimit = 100;\n var dirtyItems = allDirtyItems.slice(0, submitLimit);\n if(dirtyItems.length < allDirtyItems.length) {\n // more items left to be synced, repeat\n this.repeatSync = true;\n } else {\n this.repeatSync = false;\n }\n\n if(!this.isUserSignedIn()) {\n this.writeItemsToLocalStorage(dirtyItems, function(responseItems){\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(dirtyItems);\n if(callback) {\n callback();\n }\n }.bind(this))\n\n return;\n }\n\n var request = Restangular.one(\"items/sync\");\n request.limit = 150;\n request.sync_token = this.syncToken;\n request.cursor_token = this.cursorToken;\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n request.post().then(function(response) {\n\n modelManager.clearDirtyItems(dirtyItems);\n\n // handle sync token\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n // handle cursor token (more results waiting, perform another sync)\n this.cursorToken = response.cursor_token;\n\n var retrieved = this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n var saved = this.handleItemsResponse(response.saved_items, omitFields);\n\n this.handleUnsavedItemsResponse(response.unsaved)\n\n this.writeItemsToLocalStorage(saved, null);\n this.writeItemsToLocalStorage(retrieved, null);\n\n this.syncOpInProgress = false;\n\n if(this.cursorToken || this.repeatSync == true) {\n this.syncWithOptions(callback, options);\n } else {\n if(callback) {\n callback(response);\n }\n }\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.markAllReferencesDirty();\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.clearSyncToken = function() {\n this.syncToken = null;\n localStorage.removeItem(\"syncToken\");\n }\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n var items = modelManager.mapResponseItemsToLocalModels(data.items);\n items.forEach(function(item){\n item.setDirty(true);\n item.markAllReferencesDirty();\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 this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeItemsToLocalStorage = function(items, callback) {\n var params = items.map(function(item) {\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\", \"presentation_url\"], false)\n }.bind(this));\n\n dbManager.saveItems(params, callback);\n }\n\n this.loadLocalItems = function(callback) {\n var params = dbManager.getAllItems(function(items){\n var items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n callback(items);\n }.bind(this))\n\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.clear();\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;class DBManager {\n\n openDatabase(callback, onUgradeNeeded) {\n var request = window.indexedDB.open(\"standardnotes\", 1);\n\n request.onerror = function(event) {\n alert(\"Please enable permissions for Standard Notes to use IndexedDB for offline mode.\");\n if(callback) {\n callback(null);\n }\n };\n\n request.onsuccess = (event) => {\n // console.log(\"Successfully opened database\", event.target.result);\n var db = event.target.result;\n db.onerror = function(errorEvent) {\n console.log(\"Database error: \" + errorEvent.target.errorCode);\n }\n if(callback) {\n callback(db);\n }\n };\n\n request.onupgradeneeded = (event) => {\n var db = event.target.result;\n if(db.version === 1) {\n if(onUgradeNeeded) {\n onUgradeNeeded();\n }\n }\n\n // Create an objectStore for this database\n var objectStore = db.createObjectStore(\"items\", { keyPath: \"uuid\" });\n objectStore.createIndex(\"title\", \"title\", { unique: false });\n objectStore.createIndex(\"uuid\", \"uuid\", { unique: true });\n objectStore.transaction.oncomplete = function(event) {\n // Ready to store values in the newly created objectStore.\n };\n };\n }\n\n getAllItems(callback) {\n\n this.openDatabase((db) => {\n var objectStore = db.transaction(\"items\").objectStore(\"items\");\n var items = [];\n objectStore.openCursor().onsuccess = function(event) {\n var cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n callback(items);\n }\n };\n }, null)\n }\n\n saveItem(item) {\n saveItems([item]);\n }\n\n saveItems(items, callback) {\n\n if(items.length == 0) {\n if(callback) {\n callback();\n }\n return;\n }\n\n this.openDatabase((db) => {\n var transaction = db.transaction(\"items\", \"readwrite\");\n transaction.oncomplete = function(event) {\n\n };\n\n transaction.onerror = function(event) {\n console.log(\"Transaction error:\", event.target.errorCode);\n };\n\n var itemObjectStore = transaction.objectStore(\"items\");\n var i = 0;\n putNext();\n\n function putNext() {\n if (i < items.length) {\n var item = items[i];\n itemObjectStore.put(item).onsuccess = putNext;\n ++i;\n } else {\n if(callback){\n callback();\n }\n }\n }\n }, null)\n }\n\n deleteItem(item) {\n this.openDatabase((db) => {\n var request = db.transaction(\"items\", \"readwrite\").objectStore(\"items\").delete(item.uuid);\n request.onsuccess = function(event) {\n console.log(\"Successfully deleted item\", item.uuid);\n };\n }, null)\n }\n\n getItemByUUID(uuid, callback) {\n this.openDatabase((db) => {\n var request = db.transaction(\"items\", \"readonly\").objectStore(\"items\").get(uuid);\n request.onsuccess = function(event) {\n callback(event.result);\n };\n }, null);\n }\n}\n\nangular.module('app.frontend').service('dbManager', DBManager);\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 'ngInject';\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\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;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(items) {\n for(var item of items) {\n item.setDirty(false);\n }\n }\n\n clearAllDirtyItems() {\n this.clearDirtyItems(this.getDirtyItems());\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"]} \ 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","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","dbManager","getCurrentUser","openDatabase","clearSyncToken","sync","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","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","syncUpdated","$state","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","importData","loading","importJSONData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","items","$apply","setInterval","allTag","Tag","all","title","tags","notes","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","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","filterText","safeTitle","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","allReferencedObjects","reference","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","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","syncOpInProgress","repeatSync","allDirtyItems","getDirtyItems","submitLimit","dirtyItems","writeItemsToLocalStorage","responseItems","deleted","clearDirtyItems","limit","sync_token","cursor_token","cursorToken","createRequestParamsForItem","additionalFields","retrieved","handleItemsResponse","retrieved_items","omitFields","saved","saved_items","handleUnsavedItemsResponse","unsaved","undefined","mapping","itemResponse","findItem","alternateUUID","markAllReferencesDirty","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","removeItem","onDataReady","mapResponseItemsToLocalModels","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","staticifyObject","object","saveItems","getAllItems","sortItemsByDate","draftString","jsonObj","clear","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","allItems","saveBatchItems","DBManager","onUgradeNeeded","indexedDB","onerror","onsuccess","db","errorEvent","errorCode","onupgradeneeded","version","objectStore","createObjectStore","keyPath","createIndex","unique","transaction","oncomplete","openCursor","cursor","value","continue","itemObjectStore","putNext","put","delete","service","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","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","$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","deleteItem","itemOne","itemTwo","removeItemAsRelationship"],"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), 275)\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 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, $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 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 this.importData.loading = true;\n // allow loading indicator to come up with timeout\n $timeout(function(){\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"Import response:\", success, response);\n this.importData.loading = false;\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 }.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(function(items){\n $scope.$apply();\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n });\n\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 /*\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;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 var filterText = this.noteFilter.text.toLowerCase();\n if(filterText.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.safeTitle().toLowerCase().includes(filterText) || note.safeText().toLowerCase().includes(filterText);\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 markAllReferencesDirty() {\n this.allReferencedObjects().forEach(function(reference){\n reference.setDirty(true);\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, dbManager) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager) {\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\n if(this.syncOpInProgress) {\n // will perform anoter sync after current completes\n this.repeatSync = true;\n return;\n }\n\n this.syncOpInProgress = true;\n\n var allDirtyItems = modelManager.getDirtyItems();\n\n let submitLimit = 100;\n var dirtyItems = allDirtyItems.slice(0, submitLimit);\n if(dirtyItems.length < allDirtyItems.length) {\n // more items left to be synced, repeat\n this.repeatSync = true;\n } else {\n this.repeatSync = false;\n }\n\n if(!this.isUserSignedIn()) {\n this.writeItemsToLocalStorage(dirtyItems, function(responseItems){\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(dirtyItems);\n if(callback) {\n callback();\n }\n }.bind(this))\n\n return;\n }\n\n var request = Restangular.one(\"items/sync\");\n request.limit = 150;\n request.sync_token = this.syncToken;\n request.cursor_token = this.cursorToken;\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n request.post().then(function(response) {\n\n modelManager.clearDirtyItems(dirtyItems);\n\n // handle sync token\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n // handle cursor token (more results waiting, perform another sync)\n this.cursorToken = response.cursor_token;\n\n var retrieved = this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n var saved = this.handleItemsResponse(response.saved_items, omitFields);\n\n this.handleUnsavedItemsResponse(response.unsaved)\n\n this.writeItemsToLocalStorage(saved, null);\n this.writeItemsToLocalStorage(retrieved, null);\n\n this.syncOpInProgress = false;\n\n if(this.cursorToken || this.repeatSync == true) {\n this.syncWithOptions(callback, options);\n } else {\n if(callback) {\n callback(response);\n }\n }\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.markAllReferencesDirty();\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.clearSyncToken = function() {\n this.syncToken = null;\n localStorage.removeItem(\"syncToken\");\n }\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n var items = modelManager.mapResponseItemsToLocalModels(data.items);\n items.forEach(function(item){\n item.setDirty(true);\n item.markAllReferencesDirty();\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 this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeItemsToLocalStorage = function(items, callback) {\n var params = items.map(function(item) {\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\", \"presentation_url\", \"dirty\"], false)\n }.bind(this));\n\n dbManager.saveItems(params, callback);\n }\n\n this.loadLocalItems = function(callback) {\n var params = dbManager.getAllItems(function(items){\n var items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n callback(items);\n }.bind(this))\n\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.clear();\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;class DBManager {\n\n openDatabase(callback, onUgradeNeeded) {\n var request = window.indexedDB.open(\"standardnotes\", 1);\n\n request.onerror = function(event) {\n alert(\"Please enable permissions for Standard Notes to use IndexedDB for offline mode.\");\n if(callback) {\n callback(null);\n }\n };\n\n request.onsuccess = (event) => {\n // console.log(\"Successfully opened database\", event.target.result);\n var db = event.target.result;\n db.onerror = function(errorEvent) {\n console.log(\"Database error: \" + errorEvent.target.errorCode);\n }\n if(callback) {\n callback(db);\n }\n };\n\n request.onupgradeneeded = (event) => {\n var db = event.target.result;\n if(db.version === 1) {\n if(onUgradeNeeded) {\n onUgradeNeeded();\n }\n }\n\n // Create an objectStore for this database\n var objectStore = db.createObjectStore(\"items\", { keyPath: \"uuid\" });\n objectStore.createIndex(\"title\", \"title\", { unique: false });\n objectStore.createIndex(\"uuid\", \"uuid\", { unique: true });\n objectStore.transaction.oncomplete = function(event) {\n // Ready to store values in the newly created objectStore.\n };\n };\n }\n\n getAllItems(callback) {\n\n this.openDatabase((db) => {\n var objectStore = db.transaction(\"items\").objectStore(\"items\");\n var items = [];\n objectStore.openCursor().onsuccess = function(event) {\n var cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n callback(items);\n }\n };\n }, null)\n }\n\n saveItem(item) {\n saveItems([item]);\n }\n\n saveItems(items, callback) {\n\n if(items.length == 0) {\n if(callback) {\n callback();\n }\n return;\n }\n\n this.openDatabase((db) => {\n var transaction = db.transaction(\"items\", \"readwrite\");\n transaction.oncomplete = function(event) {\n\n };\n\n transaction.onerror = function(event) {\n console.log(\"Transaction error:\", event.target.errorCode);\n };\n\n var itemObjectStore = transaction.objectStore(\"items\");\n var i = 0;\n putNext();\n\n function putNext() {\n if (i < items.length) {\n var item = items[i];\n itemObjectStore.put(item).onsuccess = putNext;\n ++i;\n } else {\n if(callback){\n callback();\n }\n }\n }\n }, null)\n }\n\n deleteItem(item) {\n this.openDatabase((db) => {\n var request = db.transaction(\"items\", \"readwrite\").objectStore(\"items\").delete(item.uuid);\n request.onsuccess = function(event) {\n console.log(\"Successfully deleted item\", item.uuid);\n };\n }, null)\n }\n\n getItemByUUID(uuid, callback) {\n this.openDatabase((db) => {\n var request = db.transaction(\"items\", \"readonly\").objectStore(\"items\").get(uuid);\n request.onsuccess = function(event) {\n callback(event.result);\n };\n }, null);\n }\n}\n\nangular.module('app.frontend').service('dbManager', DBManager);\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 'ngInject';\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\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;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.items = [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(dbManager) {\n this.dbManager = dbManager;\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(items) {\n for(var item of items) {\n item.setDirty(false);\n }\n }\n\n clearAllDirtyItems() {\n this.clearDirtyItems(this.getDirtyItems());\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 this.dbManager.deleteItem(item);\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"]} \ No newline at end of file From 0130fae17d9e3b599bf853e925848ad53c41b8f0 Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Thu, 12 Jan 2017 20:29:45 -0600 Subject: [PATCH 3/4] gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 9b65037fd..bf7ec85aa 100644 --- a/.gitignore +++ b/.gitignore @@ -25,6 +25,7 @@ /vendor/assets/javascripts/app.js /vendor/assets/javascripts/compiled.js /vendor/assets/javascripts/transpiled.js +vendor/assets/javascripts/transpiled.js.map /vendor/assets/javascripts/compiled.min.js /vendor/assets/javascripts/lib.js /vendor/assets/javascripts/templates.js From 86b6ac0d58cecbfdaadeeb3091bf966ef3b6df4e Mon Sep 17 00:00:00 2001 From: Mo Bitar Date: Fri, 13 Jan 2017 00:50:20 -0600 Subject: [PATCH 4/4] delete items on signout --- .../app/frontend/controllers/header.js | 5 ++-- .../javascripts/app/services/apiController.js | 7 ++++-- .../javascripts/app/services/dbManager.js | 10 ++++++++ vendor/assets/javascripts/transpiled.js | 25 +++++++++++++++---- vendor/assets/javascripts/transpiled.js.map | 2 +- 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/app/assets/javascripts/app/frontend/controllers/header.js b/app/assets/javascripts/app/frontend/controllers/header.js index 83f62b463..513776573 100644 --- a/app/assets/javascripts/app/frontend/controllers/header.js +++ b/app/assets/javascripts/app/frontend/controllers/header.js @@ -88,8 +88,9 @@ angular.module('app.frontend') this.signOutPressed = function() { this.showAccountMenu = false; - apiController.signout(); - window.location.reload(); + apiController.signout(function(){ + window.location.reload(); + }) } this.submitPasswordChange = function() { diff --git a/app/assets/javascripts/app/services/apiController.js b/app/assets/javascripts/app/services/apiController.js index f5243e7f4..ad7b5788c 100644 --- a/app/assets/javascripts/app/services/apiController.js +++ b/app/assets/javascripts/app/services/apiController.js @@ -571,8 +571,11 @@ angular.module('app.frontend') localStorage.setItem('mk', mk); } - this.signout = function() { - localStorage.clear(); + this.signout = function(callback) { + dbManager.clearAllItems(function(){ + localStorage.clear(); + callback(); + }); } this.encryptSingleItem = function(item, masterKey) { diff --git a/app/assets/javascripts/app/services/dbManager.js b/app/assets/javascripts/app/services/dbManager.js index 6385d7348..6c4b69653 100644 --- a/app/assets/javascripts/app/services/dbManager.js +++ b/app/assets/javascripts/app/services/dbManager.js @@ -115,6 +115,16 @@ class DBManager { }; }, null); } + + clearAllItems(callback) { + this.openDatabase((db) => { + var request = db.transaction("items", "readwrite").objectStore("items").clear(); + request.onsuccess = function(event) { + console.log("Successfully cleared items"); + callback(); + }; + }, null) + } } angular.module('app.frontend').service('dbManager', DBManager); diff --git a/vendor/assets/javascripts/transpiled.js b/vendor/assets/javascripts/transpiled.js index 932b10dbb..b822600d5 100644 --- a/vendor/assets/javascripts/transpiled.js +++ b/vendor/assets/javascripts/transpiled.js @@ -793,8 +793,9 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); this.signOutPressed = function () { this.showAccountMenu = false; - apiController.signout(); - window.location.reload(); + apiController.signout(function () { + window.location.reload(); + }); }; this.submitPasswordChange = function () { @@ -957,7 +958,7 @@ angular.module('app.frontend').controller('BaseCtrl', BaseCtrl); // refresh every 30s setInterval(function () { apiController.sync(null); - }, 30000); + }, 2000); }); $scope.allTag = new Tag({ all: true }); @@ -2487,8 +2488,11 @@ var Tag = function (_Item3) { localStorage.setItem('mk', mk); }; - this.signout = function () { - localStorage.clear(); + this.signout = function (callback) { + dbManager.clearAllItems(function () { + localStorage.clear(); + callback(); + }); }; this.encryptSingleItem = function (item, masterKey) { @@ -2711,6 +2715,17 @@ var DBManager = function () { }; }, null); } + }, { + key: 'clearAllItems', + value: function clearAllItems(callback) { + this.openDatabase(function (db) { + var request = db.transaction("items", "readwrite").objectStore("items").clear(); + request.onsuccess = function (event) { + console.log("Successfully cleared items"); + callback(); + }; + }, null); + } }]); return DBManager; diff --git a/vendor/assets/javascripts/transpiled.js.map b/vendor/assets/javascripts/transpiled.js.map index 954ed7e61..8fc64d9cf 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","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","dbManager","getCurrentUser","openDatabase","clearSyncToken","sync","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","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","syncUpdated","$state","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","importData","loading","importJSONData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","items","$apply","setInterval","allTag","Tag","all","title","tags","notes","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","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","filterText","safeTitle","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","allReferencedObjects","reference","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","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","syncOpInProgress","repeatSync","allDirtyItems","getDirtyItems","submitLimit","dirtyItems","writeItemsToLocalStorage","responseItems","deleted","clearDirtyItems","limit","sync_token","cursor_token","cursorToken","createRequestParamsForItem","additionalFields","retrieved","handleItemsResponse","retrieved_items","omitFields","saved","saved_items","handleUnsavedItemsResponse","unsaved","undefined","mapping","itemResponse","findItem","alternateUUID","markAllReferencesDirty","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","removeItem","onDataReady","mapResponseItemsToLocalModels","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","staticifyObject","object","saveItems","getAllItems","sortItemsByDate","draftString","jsonObj","clear","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","allItems","saveBatchItems","DBManager","onUgradeNeeded","indexedDB","onerror","onsuccess","db","errorEvent","errorCode","onupgradeneeded","version","objectStore","createObjectStore","keyPath","createIndex","unique","transaction","oncomplete","openCursor","cursor","value","continue","itemObjectStore","putNext","put","delete","service","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","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","$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","deleteItem","itemOne","itemTwo","removeItemAsRelationship"],"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), 275)\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 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, $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 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 this.importData.loading = true;\n // allow loading indicator to come up with timeout\n $timeout(function(){\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"Import response:\", success, response);\n this.importData.loading = false;\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 }.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(function(items){\n $scope.$apply();\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 30000);\n });\n\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 /*\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;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 var filterText = this.noteFilter.text.toLowerCase();\n if(filterText.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.safeTitle().toLowerCase().includes(filterText) || note.safeText().toLowerCase().includes(filterText);\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 markAllReferencesDirty() {\n this.allReferencedObjects().forEach(function(reference){\n reference.setDirty(true);\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, dbManager) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager) {\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\n if(this.syncOpInProgress) {\n // will perform anoter sync after current completes\n this.repeatSync = true;\n return;\n }\n\n this.syncOpInProgress = true;\n\n var allDirtyItems = modelManager.getDirtyItems();\n\n let submitLimit = 100;\n var dirtyItems = allDirtyItems.slice(0, submitLimit);\n if(dirtyItems.length < allDirtyItems.length) {\n // more items left to be synced, repeat\n this.repeatSync = true;\n } else {\n this.repeatSync = false;\n }\n\n if(!this.isUserSignedIn()) {\n this.writeItemsToLocalStorage(dirtyItems, function(responseItems){\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(dirtyItems);\n if(callback) {\n callback();\n }\n }.bind(this))\n\n return;\n }\n\n var request = Restangular.one(\"items/sync\");\n request.limit = 150;\n request.sync_token = this.syncToken;\n request.cursor_token = this.cursorToken;\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n request.post().then(function(response) {\n\n modelManager.clearDirtyItems(dirtyItems);\n\n // handle sync token\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n // handle cursor token (more results waiting, perform another sync)\n this.cursorToken = response.cursor_token;\n\n var retrieved = this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n var saved = this.handleItemsResponse(response.saved_items, omitFields);\n\n this.handleUnsavedItemsResponse(response.unsaved)\n\n this.writeItemsToLocalStorage(saved, null);\n this.writeItemsToLocalStorage(retrieved, null);\n\n this.syncOpInProgress = false;\n\n if(this.cursorToken || this.repeatSync == true) {\n this.syncWithOptions(callback, options);\n } else {\n if(callback) {\n callback(response);\n }\n }\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.markAllReferencesDirty();\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.clearSyncToken = function() {\n this.syncToken = null;\n localStorage.removeItem(\"syncToken\");\n }\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n var items = modelManager.mapResponseItemsToLocalModels(data.items);\n items.forEach(function(item){\n item.setDirty(true);\n item.markAllReferencesDirty();\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 this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeItemsToLocalStorage = function(items, callback) {\n var params = items.map(function(item) {\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\", \"presentation_url\", \"dirty\"], false)\n }.bind(this));\n\n dbManager.saveItems(params, callback);\n }\n\n this.loadLocalItems = function(callback) {\n var params = dbManager.getAllItems(function(items){\n var items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n callback(items);\n }.bind(this))\n\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.clear();\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;class DBManager {\n\n openDatabase(callback, onUgradeNeeded) {\n var request = window.indexedDB.open(\"standardnotes\", 1);\n\n request.onerror = function(event) {\n alert(\"Please enable permissions for Standard Notes to use IndexedDB for offline mode.\");\n if(callback) {\n callback(null);\n }\n };\n\n request.onsuccess = (event) => {\n // console.log(\"Successfully opened database\", event.target.result);\n var db = event.target.result;\n db.onerror = function(errorEvent) {\n console.log(\"Database error: \" + errorEvent.target.errorCode);\n }\n if(callback) {\n callback(db);\n }\n };\n\n request.onupgradeneeded = (event) => {\n var db = event.target.result;\n if(db.version === 1) {\n if(onUgradeNeeded) {\n onUgradeNeeded();\n }\n }\n\n // Create an objectStore for this database\n var objectStore = db.createObjectStore(\"items\", { keyPath: \"uuid\" });\n objectStore.createIndex(\"title\", \"title\", { unique: false });\n objectStore.createIndex(\"uuid\", \"uuid\", { unique: true });\n objectStore.transaction.oncomplete = function(event) {\n // Ready to store values in the newly created objectStore.\n };\n };\n }\n\n getAllItems(callback) {\n\n this.openDatabase((db) => {\n var objectStore = db.transaction(\"items\").objectStore(\"items\");\n var items = [];\n objectStore.openCursor().onsuccess = function(event) {\n var cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n callback(items);\n }\n };\n }, null)\n }\n\n saveItem(item) {\n saveItems([item]);\n }\n\n saveItems(items, callback) {\n\n if(items.length == 0) {\n if(callback) {\n callback();\n }\n return;\n }\n\n this.openDatabase((db) => {\n var transaction = db.transaction(\"items\", \"readwrite\");\n transaction.oncomplete = function(event) {\n\n };\n\n transaction.onerror = function(event) {\n console.log(\"Transaction error:\", event.target.errorCode);\n };\n\n var itemObjectStore = transaction.objectStore(\"items\");\n var i = 0;\n putNext();\n\n function putNext() {\n if (i < items.length) {\n var item = items[i];\n itemObjectStore.put(item).onsuccess = putNext;\n ++i;\n } else {\n if(callback){\n callback();\n }\n }\n }\n }, null)\n }\n\n deleteItem(item) {\n this.openDatabase((db) => {\n var request = db.transaction(\"items\", \"readwrite\").objectStore(\"items\").delete(item.uuid);\n request.onsuccess = function(event) {\n console.log(\"Successfully deleted item\", item.uuid);\n };\n }, null)\n }\n\n getItemByUUID(uuid, callback) {\n this.openDatabase((db) => {\n var request = db.transaction(\"items\", \"readonly\").objectStore(\"items\").get(uuid);\n request.onsuccess = function(event) {\n callback(event.result);\n };\n }, null);\n }\n}\n\nangular.module('app.frontend').service('dbManager', DBManager);\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 'ngInject';\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\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;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.items = [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(dbManager) {\n this.dbManager = dbManager;\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(items) {\n for(var item of items) {\n item.setDirty(false);\n }\n }\n\n clearAllDirtyItems() {\n this.clearDirtyItems(this.getDirtyItems());\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 this.dbManager.deleteItem(item);\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"]} \ 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","$stateProvider","$urlRouterProvider","$locationProvider","state","abstract","parent","views","templateUrl","controller","otherwise","$injector","$location","get","go","path","html5Mode","BaseCtrl","$rootScope","modelManager","apiController","dbManager","getCurrentUser","openDatabase","clearSyncToken","sync","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","response","alert","shareNote","openInNewTab","a","createElement","href","click","shareItem","unshareNote","unshareItem","presentationURL","clickedMenu","locked","deleteNote","syncUpdated","$state","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","importData","loading","importJSONData","submitImportPassword","importFileSelected","files","file","reader","FileReader","onload","e","JSON","result","auth_params","requestPassword","readAsText","showLogin","showRegistration","$scope","bodyClass","loadLocalItems","items","$apply","setInterval","allTag","Tag","all","title","tags","notes","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","addNew","selectionMade","removeTag","tagDidChange","isFirstLoad","noteFilter","visible","selectFirstNote","draft","getDraft","selectNote","createNewNote","selectedTagDelete","selectedTagShare","selectedTagUnshare","createNew","visibleNotes","filter","newNote","createItem","content_type","filterNotes","filterText","safeTitle","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","allReferencedObjects","reference","observer","push","contentObj","structureParams","references","referenceParams","item","omit","enc_item_key","presentation_url","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","syncOpInProgress","repeatSync","allDirtyItems","getDirtyItems","submitLimit","dirtyItems","writeItemsToLocalStorage","responseItems","deleted","clearDirtyItems","limit","sync_token","cursor_token","cursorToken","createRequestParamsForItem","additionalFields","retrieved","handleItemsResponse","retrieved_items","omitFields","saved","saved_items","handleUnsavedItemsResponse","unsaved","undefined","mapping","itemResponse","findItem","alternateUUID","markAllReferencesDirty","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","removeItem","onDataReady","mapResponseItemsToLocalModels","decryptItemsWithKey","textFile","makeTextFile","Blob","type","URL","revokeObjectURL","createObjectURL","allItemsMatchingTypes","staticifyObject","object","saveItems","getAllItems","sortItemsByDate","draftString","jsonObj","clearAllItems","clear","masterKey","item_key","decryptText","generateRandomEncryptionKey","encryptText","ek","firstHalfOfKey","ak","secondHalfOfKey","encryptedContent","authHash","hmac256","local_encryption_scheme","decryptSingleItem","isString","base64Decode","reencryptAllItemsAndSave","newMasterKey","oldMasterKey","allItems","saveBatchItems","DBManager","onUgradeNeeded","indexedDB","onerror","onsuccess","db","errorEvent","errorCode","onupgradeneeded","version","objectStore","createObjectStore","keyPath","createIndex","unique","transaction","oncomplete","openCursor","cursor","value","continue","itemObjectStore","putNext","put","delete","service","shouldFocus","$element","ContextualExtensionsMenu","extensions","accessTypeForExtension","extensionUsesEncryptedData","el","draggable","dataTransfer","effectAllowed","setData","classList","add","drop","bin","dropEffect","counter","stopPropagation","binId","getData","fn","on","require","modelCtrl","lowercase","inputValue","lowercased","$setViewValue","$render","$parsers","ngModel","$window","getSelection","setSelectionRange","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","$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","deleteItem","itemOne","itemTwo","removeItemAsRelationship"],"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), 275)\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 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, $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 apiController.signout(function(){\n window.location.reload();\n })\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 this.importData.loading = true;\n // allow loading indicator to come up with timeout\n $timeout(function(){\n apiController.importJSONData(data, password, function(success, response){\n console.log(\"Import response:\", success, response);\n this.importData.loading = false;\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 }.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(function(items){\n $scope.$apply();\n\n apiController.sync(null);\n // refresh every 30s\n setInterval(function () {\n apiController.sync(null);\n }, 2000);\n });\n\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 /*\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;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 var filterText = this.noteFilter.text.toLowerCase();\n if(filterText.length == 0) {\n note.visible = true;\n } else {\n note.visible = note.safeTitle().toLowerCase().includes(filterText) || note.safeText().toLowerCase().includes(filterText);\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 markAllReferencesDirty() {\n this.allReferencedObjects().forEach(function(reference){\n reference.setDirty(true);\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, dbManager) {\n return new ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager);\n }\n\n function ApiController($rootScope, Restangular, modelManager, ngDialog, dbManager) {\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\n if(this.syncOpInProgress) {\n // will perform anoter sync after current completes\n this.repeatSync = true;\n return;\n }\n\n this.syncOpInProgress = true;\n\n var allDirtyItems = modelManager.getDirtyItems();\n\n let submitLimit = 100;\n var dirtyItems = allDirtyItems.slice(0, submitLimit);\n if(dirtyItems.length < allDirtyItems.length) {\n // more items left to be synced, repeat\n this.repeatSync = true;\n } else {\n this.repeatSync = false;\n }\n\n if(!this.isUserSignedIn()) {\n this.writeItemsToLocalStorage(dirtyItems, function(responseItems){\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(dirtyItems);\n if(callback) {\n callback();\n }\n }.bind(this))\n\n return;\n }\n\n var request = Restangular.one(\"items/sync\");\n request.limit = 150;\n request.sync_token = this.syncToken;\n request.cursor_token = this.cursorToken;\n request.items = _.map(dirtyItems, function(item){\n return this.createRequestParamsForItem(item, options.additionalFields);\n }.bind(this));\n\n request.post().then(function(response) {\n\n modelManager.clearDirtyItems(dirtyItems);\n\n // handle sync token\n this.setSyncToken(response.sync_token);\n $rootScope.$broadcast(\"sync:updated_token\", this.syncToken);\n\n // handle cursor token (more results waiting, perform another sync)\n this.cursorToken = response.cursor_token;\n\n var retrieved = this.handleItemsResponse(response.retrieved_items, null);\n // merge only metadata for saved items\n var omitFields = [\"content\", \"enc_item_key\", \"auth_hash\"];\n var saved = this.handleItemsResponse(response.saved_items, omitFields);\n\n this.handleUnsavedItemsResponse(response.unsaved)\n\n this.writeItemsToLocalStorage(saved, null);\n this.writeItemsToLocalStorage(retrieved, null);\n\n this.syncOpInProgress = false;\n\n if(this.cursorToken || this.repeatSync == true) {\n this.syncWithOptions(callback, options);\n } else {\n if(callback) {\n callback(response);\n }\n }\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.markAllReferencesDirty();\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.clearSyncToken = function() {\n this.syncToken = null;\n localStorage.removeItem(\"syncToken\");\n }\n\n this.importJSONData = function(data, password, callback) {\n console.log(\"Importing data\", data);\n\n var onDataReady = function() {\n var items = modelManager.mapResponseItemsToLocalModels(data.items);\n items.forEach(function(item){\n item.setDirty(true);\n item.markAllReferencesDirty();\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 this.staticifyObject = function(object) {\n return JSON.parse(JSON.stringify(object));\n }\n\n this.writeItemsToLocalStorage = function(items, callback) {\n var params = items.map(function(item) {\n return this.paramsForItem(item, this.isUserSignedIn(), [\"created_at\", \"updated_at\", \"presentation_url\", \"dirty\"], false)\n }.bind(this));\n\n dbManager.saveItems(params, callback);\n }\n\n this.loadLocalItems = function(callback) {\n var params = dbManager.getAllItems(function(items){\n var items = this.handleItemsResponse(items, null);\n Item.sortItemsByDate(items);\n callback(items);\n }.bind(this))\n\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(callback) {\n dbManager.clearAllItems(function(){\n localStorage.clear();\n callback();\n });\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;class DBManager {\n\n openDatabase(callback, onUgradeNeeded) {\n var request = window.indexedDB.open(\"standardnotes\", 1);\n\n request.onerror = function(event) {\n alert(\"Please enable permissions for Standard Notes to use IndexedDB for offline mode.\");\n if(callback) {\n callback(null);\n }\n };\n\n request.onsuccess = (event) => {\n // console.log(\"Successfully opened database\", event.target.result);\n var db = event.target.result;\n db.onerror = function(errorEvent) {\n console.log(\"Database error: \" + errorEvent.target.errorCode);\n }\n if(callback) {\n callback(db);\n }\n };\n\n request.onupgradeneeded = (event) => {\n var db = event.target.result;\n if(db.version === 1) {\n if(onUgradeNeeded) {\n onUgradeNeeded();\n }\n }\n\n // Create an objectStore for this database\n var objectStore = db.createObjectStore(\"items\", { keyPath: \"uuid\" });\n objectStore.createIndex(\"title\", \"title\", { unique: false });\n objectStore.createIndex(\"uuid\", \"uuid\", { unique: true });\n objectStore.transaction.oncomplete = function(event) {\n // Ready to store values in the newly created objectStore.\n };\n };\n }\n\n getAllItems(callback) {\n\n this.openDatabase((db) => {\n var objectStore = db.transaction(\"items\").objectStore(\"items\");\n var items = [];\n objectStore.openCursor().onsuccess = function(event) {\n var cursor = event.target.result;\n if (cursor) {\n items.push(cursor.value);\n cursor.continue();\n }\n else {\n callback(items);\n }\n };\n }, null)\n }\n\n saveItem(item) {\n saveItems([item]);\n }\n\n saveItems(items, callback) {\n\n if(items.length == 0) {\n if(callback) {\n callback();\n }\n return;\n }\n\n this.openDatabase((db) => {\n var transaction = db.transaction(\"items\", \"readwrite\");\n transaction.oncomplete = function(event) {\n\n };\n\n transaction.onerror = function(event) {\n console.log(\"Transaction error:\", event.target.errorCode);\n };\n\n var itemObjectStore = transaction.objectStore(\"items\");\n var i = 0;\n putNext();\n\n function putNext() {\n if (i < items.length) {\n var item = items[i];\n itemObjectStore.put(item).onsuccess = putNext;\n ++i;\n } else {\n if(callback){\n callback();\n }\n }\n }\n }, null)\n }\n\n deleteItem(item) {\n this.openDatabase((db) => {\n var request = db.transaction(\"items\", \"readwrite\").objectStore(\"items\").delete(item.uuid);\n request.onsuccess = function(event) {\n console.log(\"Successfully deleted item\", item.uuid);\n };\n }, null)\n }\n\n getItemByUUID(uuid, callback) {\n this.openDatabase((db) => {\n var request = db.transaction(\"items\", \"readonly\").objectStore(\"items\").get(uuid);\n request.onsuccess = function(event) {\n callback(event.result);\n };\n }, null);\n }\n\n clearAllItems(callback) {\n this.openDatabase((db) => {\n var request = db.transaction(\"items\", \"readwrite\").objectStore(\"items\").clear();\n request.onsuccess = function(event) {\n console.log(\"Successfully cleared items\");\n callback();\n };\n }, null)\n }\n}\n\nangular.module('app.frontend').service('dbManager', DBManager);\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 'ngInject';\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\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;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.items = [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(dbManager) {\n this.dbManager = dbManager;\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(items) {\n for(var item of items) {\n item.setDirty(false);\n }\n }\n\n clearAllDirtyItems() {\n this.clearDirtyItems(this.getDirtyItems());\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 this.dbManager.deleteItem(item);\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"]} \ No newline at end of file