diff --git a/.gitignore b/.gitignore
index 56a26b7..ac0c86b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,8 +1,10 @@
-content/
node_modules/
.sass-cache/
.cache/
content/folio-images
+content/client-images
+content/blog-images
+content/user-images
.ftpconfig
.vscode/
config.development.json
diff --git a/brain/api/content/bookmarks.js b/brain/api/content/bookmarks.js
new file mode 100644
index 0000000..e18acdf
--- /dev/null
+++ b/brain/api/content/bookmarks.js
@@ -0,0 +1,168 @@
+import StringUtils from '../../tools/utilities/StringUtils';
+import RightsManager, {
+
+ TASK_CREATE,
+ TASK_UPDATE,
+ TASK_READ,
+ TASK_DELETE,
+ OBJECT_CLIENT_ADMIN,
+ OBJECT_CLIENT_USER,
+ OBJECT_PROJECT_CLIENT,
+ OBJECT_PROJECT_FOLIO,
+ OBJECT_BOOKMARK,
+ OBJECT_POST
+
+} from '../../tools/utilities/RightsManager';
+
+var express = require('express');
+var router = express.Router();
+var Models = require('../../models');
+
+var Models = require('../../models');
+const scrape = require('scrape-metadata')
+
+/*
+
+
+Get Bookmark Listzz
+
+*/
+
+router.get('/archive', function (req, res, next) {
+ BMArchive.find()
+ .then((bookmarks) => {
+ console.log(bookmarks[1])
+ res.json(bookmarks)
+ })
+ .catch((err) => {
+ console.log(err)
+ })
+});
+
+/*
+
+
+Get Bookmark List
+
+*/
+router.get('/', function (req, res, next) {
+ Bookmark.find().sort({
+ created: -1
+ })
+ .then((bookmarks) => {
+ res.json(bookmarks)
+ })
+ .catch((err) => {
+ console.log(err)
+ })
+});
+
+/*
+
+ Get Bookmark by ID
+
+*/
+router.get('/:id', function (req, res, next) {
+
+});
+
+
+
+/*
+
+ Create New BookMark
+
+*/
+router.post('/add', function (req, res, next) {
+ if (!req.session.user)
+ return res.json({
+ message: "You need to be logged in, champ."
+ });
+
+ var link = req.body.url;
+ Models.User.findById(req.session.user.id).then((user) => {
+ if (rightsManager.check(user.role, OBJECT_BOOKMARK, TASK_CREATE)) {
+ scrape(link, (err, meta) => {
+ var urlPieces = link.split("/");
+ Models.Bookmark.sync().then(f => {
+ Models.Bookmark.create({
+ source: urlPieces[0] + urlPieces[1] + '//' + urlPieces[2],
+ url: link,
+ image: meta.ogImage,
+ title: meta.title,
+ author: user.id,
+ listed: true
+ }).then(saved => {
+
+ res.json({
+ message: "link added"
+ });
+ }).catch(err => {
+ res.json({
+ message: "post error",
+ error: err
+ });
+ })
+ })
+ })
+ } else {
+ res.json({
+ message: "Nah. You can't do that. Talk to the admin, sport."
+ });
+ }
+ });
+
+});
+
+/*
+
+ Update Bookmark by ID
+
+*/
+router.post('/update/:id', function (req, res, next) {
+ if (!req.session.user)
+ return res.json({
+ message: "You need to be logged in, champ."
+ });
+ console.log("ID: "+req.params.id);
+ let title = req.body.title;
+ let tags = req.body.tags;
+ let image = req.body.image;
+
+ Models.User.findById(req.session.user.id).then((user) => {
+ if (rightsManager.check(user.role, OBJECT_BOOKMARK, TASK_UPDATE)) {
+ Models.Bookmark.findOne({
+ where: {
+ id: req.params.id
+ }
+ }).then(saved => {
+ console.log('SAVED: '+req.body.title);
+ saved.update({
+ title: title,
+ image: image
+ }).then(updated => {
+ res.json({
+ message: "bookmark updated"
+ });
+ }).catch(err => {
+ console.log(err)
+ })
+ }).catch(err => {
+ console.log(err)
+ })
+ } else {
+ res.json({
+ message: "Nah. You can't do that. Talk to the admin, sport."
+ });
+ }
+ });
+});
+/*
+
+ Delete Bookmark by ID
+
+*/
+router.delete('/:id', function (req, res, next) {
+
+});
+module.exports = router;
diff --git a/brain/api/content/folio.js b/brain/api/content/folio.js
new file mode 100644
index 0000000..418dd1a
--- /dev/null
+++ b/brain/api/content/folio.js
@@ -0,0 +1,235 @@
+
+import DateUtils from '../../tools/utilities/DateUtils';
+import RightsManager, {
+
+ TASK_CREATE,
+ TASK_UPDATE,
+ TASK_READ,
+ TASK_DELETE,
+ OBJECT_CLIENT_ADMIN,
+ OBJECT_CLIENT_USER,
+ OBJECT_PROJECT_CLIENT,
+ OBJECT_PROJECT_FOLIO,
+ OBJECT_BOOKMARK,
+ OBJECT_POST
+
+} from '../../tools/utilities/RightsManager';
+var express = require('express');
+var router = express.Router();
+var multer = require('multer');
+var fs = require('fs-extra');
+var Models = require('../../models');
+var User = require('../../models/User.js');
+
+const dateUtil = new DateUtils()
+var uploadPath = "./content/folio-images/" + dateUtil.getDate('year', new Date()) + "/" + dateUtil.getDate('month', new Date());
+fs.ensureDir(uploadPath, function (err) {
+ //console.log(err) // => null
+ // dir has now been created, including the directory it is to be placed in
+})
+var storage = multer.diskStorage({
+ destination: function (req, file, cb) {
+ cb(null, uploadPath)
+ },
+ filename: function (req, file, cb) {
+ var splice = file.originalname.split(':');
+ cb(null, splice[0]);
+ }
+});
+var upload = multer({
+ storage: storage
+}).array('folioImages');
+/*
+
+ Create New Folio Project
+
+*/
+router.post('/add', function (req, res, next) {
+ if (!req.user)
+ return res.json({
+ message: "You need to be logged in, champ."
+ })
+ User.findById(req.user._id).then((user) => {
+ upload(req, res, function (err) {
+ if (err) {
+ //console.log('Error in Saving Entry: ' + err);
+ res.json({
+ message: err
+ });
+ throw err;
+ } else {
+ if (RightsManager.check(user.role, [RightsManager.OBJECT_PROJECT_FOLIO], RightsManager.TASK_CREATE)) {
+ var project = new Project(req.body);
+ if (req.files != "") {
+ project.images = req.files;
+ } else {
+ console.log("NOTHING TO SAVE");
+ }
+ project.save().then((project) => {
+ res.json({
+ message: "new client project added"
+ });
+ }).catch((err) => {
+ console.log(err);
+ })
+ } else {
+ res.json({
+ message: "Nah. You can't do that. Talk to the admin, sport."
+ });
+ }
+ }
+ });
+ }).catch((err) => {
+ console.log(err);
+ })
+});
+/*
+
+ Get Folio Project List
+
+*/
+router.get('/', function (req, res, next) {
+ Project.find({}).then((projects) => {
+ var folioArray = [];
+ for (var i = 0; i < projects.length; i++) {
+ var imgURL = null;
+ if (projects[i].images.length != 0)
+ imgURL = String(projects[i].images[0].path).substring(8, String(projects[i].images[0].path).length);
+ var folioItem = {
+ id: projects[i]._id,
+ title: projects[i].title,
+ url: projects[i].url,
+ tools: projects[i].tools,
+ description: projects[i].description,
+ type: projects[i].type,
+ img_url: imgURL,
+ img_full_url: "http://formless.local/" + imgURL
+ }
+ folioArray[i] = folioItem;
+ }
+ res.json(folioArray);
+ })
+});
+/*
+
+ Get Folio Project by ID
+
+*/
+router.get('/:id', function (req, res, next) {
+ Project.findById(req.params.id).then((project) => {
+ res.json(project);
+ }).catch((err) => {
+ console.log(err);
+ });
+});
+/*
+
+ Update Folio Project by ID
+
+*/
+router.post('/update/:id', function (req, res, next) {
+ if (!req.session.user)
+ return res.json({
+ message: "You need to be logged in, champ."
+ });
+ Models.User.findById(req.session.user.id).then((user) => {
+ if (RightsManager.check(user.role, [RightsManager.OBJECT_PROJECT_FOLIO], RightsManager.TASK_UPDATE)) {
+ upload(req, res, function (err) {
+ if (err) {
+ //console.log('Error in Saving Entry: ' + err);
+ res.json({
+ message: err
+ });
+ throw err;
+ } else {
+ Models.FolioProject.findOne({where:{id: req.params.id}}).then((project) => {
+ if (req.files != "") {
+ project.images = req.files;
+ } else {
+ console.log("NOTHING TO SAVE");
+ }
+
+ console.log(req.body);
+
+ project.update(req.body).then(updated => {
+ res.json({
+ message: "project updated"
+ });
+ }).catch(err => {
+ console.log(err)
+ });
+
+ /**
+ project.save().then((saved) => {
+ res.json({
+ message: "project updated"
+ });
+ }).catch((err) => {
+ console.log(err);
+ })
+ **/
+ }).catch((err) => {
+ console.log(err);
+ })
+ }
+ });
+ } else {
+ res.json({
+ message: "Nah. You can't do that. Talk to the admin, sport."
+ });
+ }
+ });
+});
+/*
+
+ Delete Folio Project by ID
+
+*/
+router.delete('/:id', function (req, res, next) {
+ if (!req.user)
+ return res.json({
+ message: "users only, yo. you're not that"
+ });
+ User.findById(req.user._id).then((user) => {
+ if (RightsManager.check(user.role, [RightsManager.OBJECT_PROJECT_FOLIO], RightsManager.TASK_DELETE)) {
+ Project.findByIdAndRemove(req.params.id).then((project) => {
+ res.json({
+ message: 'project has been removed'
+ });
+ }).catch((err) => {
+ console.log(err);
+ })
+ } else {
+ res.json({
+ message: "Nah. You can't do that. Talk to the admin, sport."
+ });
+ }
+ });
+});
+
+router.post('/sort', function (req, res, next) {
+ var sortList = req.body;
+ var self = this;
+ User.findById(req.user._id).then((user) => {
+ if (RightsManager.check(user.role, [RightsManager.OBJECT_PROJECT_FOLIO], RightsManager.TASK_UPDATE)) {
+ var clean = true;
+ for (var i = 0; i < sortList.length; i++) {
+ Project.findByIdAndUpdate(sortList[i].sortID, {
+ sortIndex: sortList[i].sortIndex
+ }).then((project) => {
+ //console.log("SORTED")
+ //res.json({message: "sorted"})
+ }).catch((err) => {
+ //res.json({message: "sorted", error:err})
+ })
+ //res.json({message:'projects updated'})
+ }
+ } else {
+ res.json({
+ message: "Nah. You can't do that. Talk to the admin, sport."
+ });
+ }
+ });
+});
+
+module.exports = router;
diff --git a/brain/api/content/mailer.js b/brain/api/content/mailer.js
new file mode 100644
index 0000000..b15c164
--- /dev/null
+++ b/brain/api/content/mailer.js
@@ -0,0 +1,41 @@
+var express = require('express');
+var router = express.Router();
+var api_key = 'key-4ef13da32fb39b9d9f0370c9efba7f06';
+var domain = 'communique.playvicio.us';
+var mailgun = require('mailgun-js')({
+ apiKey: api_key,
+ domain: domain
+});
+
+router.post('/', function (req, res, next) {
+
+
+ // create reusable transporter object using the default SMTP transport
+
+ // setup e-mail data with unicode symbols
+ var mailOptions = {
+ from: req.body.email, // sender address
+ to: 'ro@playvicio.us', // list of receivers
+ subject: 'Availability Inquiry', // Subject line
+ text: "Message from: " + req.body.client + " <" + req.body.email + "> - " + req.body.description + " - " + req.body.type
+ };
+
+ mailgun.messages().send(mailOptions, function (error, body) {
+
+ if (error) {
+ res.json({
+ error: error
+ });
+ }
+ console.log(body);
+ res.json({
+ message: "message sent"
+ });
+ });
+
+
+});
+
+
+
+module.exports = router;
diff --git a/brain/api/content/posts.js b/brain/api/content/posts.js
new file mode 100644
index 0000000..4779435
--- /dev/null
+++ b/brain/api/content/posts.js
@@ -0,0 +1,345 @@
+var express = require('express');
+import DateUtils from '../../tools/utilities/DateUtils';
+import StringUtils from '../../tools/utilities/StringUtils';
+import RightsManager,
+{
+ TASK_CREATE,
+ TASK_UPDATE,
+ TASK_READ,
+ TASK_DELETE,
+ OBJECT_CLIENT_ADMIN,
+ OBJECT_CLIENT_USER,
+ OBJECT_PROJECT_CLIENT,
+ OBJECT_PROJECT_FOLIO,
+ OBJECT_BOOKMARK,
+ OBJECT_POST
+}
+from '../../tools/utilities/RightsManager';
+var router = express.Router();
+var multer = require('multer');
+var fs = require('fs-extra');
+var Models = require('../../models');
+var uuidv4 = require('uuid/v4');
+var md = require('markdown-it')('commonmark');
+var sanitize = require('sanitize-html');
+const dateUtils = new DateUtils();
+const stringUtils = new StringUtils();
+const rightsManager = new RightsManager();
+var uploadPath = "./content/blog-images/" + dateUtils.getDate('year', new Date()) + "/" + dateUtils.getDate('month', new Date());
+fs.ensureDir(uploadPath, function(err)
+{
+ //console.log(err) // => null
+ // dir has now been created, including the directory it is to be placed in
+})
+var storage = multer.diskStorage(
+{
+ destination: function(req, file, cb)
+ {
+ cb(null, uploadPath)
+ },
+ filename: function(req, file, cb)
+ {
+ var splice = file.originalname.split(':');
+ cb(null, splice[0]);
+ }
+});
+var feature_upload = multer(
+{
+ storage: storage
+}).array('feature_image');
+var post_upload = multer(
+{
+ storage: storage
+}).array('post_image');
+/***
+ ADD POST
+*/
+router.post('/add', function(req, res, next)
+{
+ if (!req.session.user) return res.json(
+ {
+ message: "You need to be logged in, champ."
+ });
+ Models.User.findById(req.session.user.id).then((user) =>
+ {
+ if (rightsManager.check(user.role, OBJECT_POST, TASK_CREATE))
+ {
+ feature_upload(req, res, function(err)
+ {
+ if (err)
+ {
+ res.json(
+ {
+ message: err
+ });
+ throw err;
+ }
+ else
+ {
+ var postImages = [];
+ if (req.files != "")
+ {
+ for (let i = 0; i < req.files.length; i++)
+ {
+ postImages.push(req.files[i].path);
+ }
+ }
+ else
+ {
+ console.log("NOTHING TO SAVE");
+ }
+ Models.Post.sync().then(f =>
+ {
+ var html = req.body.post_plaintext;
+ html = html.replace(/<\/?span[^>]*>/g, ""); //removes highightjs styling
+ console.log("REGULAR: " + html);
+ let buffed = sanitize(html,
+ {
+ allowedTags: ['del', 'a', 'iframe', 'img'],
+ allowedAttributes:
+ {
+ a: ['href', 'name', 'target'],
+ img: ['src'],
+ iframe: ['height', 'width', 'src', 'frameborder', 'allow', 'allowfullscreen']
+ }
+ })
+ buffed = stringUtils.decodeHTML(buffed)
+ Models.Post.create(
+ {
+ uuid: uuidv4(),
+ title: req.body.title,
+ slug: req.body.slug,
+ plaintext: buffed,
+ tags: req.body.tags,
+ page: req.body.status_page,
+ featured: req.body.status_feature,
+ published: req.body.status_published,
+ author_id: req.session.user.id,
+ origin_date: new Date(req.body.origin_date),
+ html: md.render(buffed,
+ {
+ html: true,
+ xhtmlOut: true,
+ }),
+ feature_image: JSON.stringify(postImages)
+ }).then(saved =>
+ {
+ res.json(
+ {
+ message: "postAdded",
+ postID: saved.slug
+ });
+ }).catch(err =>
+ {
+ console.log(err)
+ })
+ })
+ }
+ });
+ }
+ else
+ {
+ res.json(
+ {
+ message: "Nah. You can't do that. Talk to the admin, sport."
+ });
+ }
+ });
+});
+/***
+ UPDATE POST
+*/
+router.post('/update/:id', function(req, res, next)
+{
+ //console.log(req.body);
+ if (!req.session.user) return res.json(
+ {
+ message: "You need to be logged in, champ."
+ });
+ Models.User.findById(req.session.user.id).then((user) =>
+ {
+ if (rightsManager.check(user.role, OBJECT_POST, TASK_UPDATE))
+ {
+ feature_upload(req, res, function(err)
+ {
+ if (err)
+ {
+ res.json(
+ {
+ message: err
+ });
+ throw err;
+ }
+ else
+ {
+ var postImages = [];
+ if (req.files != "")
+ {
+ for (let i = 0; i < req.files.length; i++)
+ {
+ postImages.push(req.files[i].path);
+ }
+ }
+ else
+ {
+ console.log("NOTHING TO SAVE");
+ }
+ Models.Post.findOne(
+ {
+ where:
+ {
+ id: req.params.id
+ }
+ }).then(post =>
+ {
+ if (postImages.length == 0) postImages = JSON.parse(post.feature_image);
+ var html = req.body.post_plaintext;
+ html = html.replace(/<\/?span[^>]*>/g, ""); //removes highightjs styling
+ let cleaned = sanitize(html,
+ {
+ allowedTags: ['del', 'a', 'iframe', 'img'],
+ allowedAttributes:
+ {
+ a: ['href', 'name', 'target'],
+ img: ['src'],
+ iframe: ['height', 'width', 'src', 'frameborder', 'allow', 'allowfullscreen']
+ }
+ })
+ cleaned = stringUtils.decodeHTML(cleaned)
+ post.update(
+ {
+ title: req.body.title,
+ slug: req.body.slug,
+ plaintext: cleaned,
+ origin_date: new Date(req.body.origin_date),
+ tags: req.body.tags,
+ page: req.body.status_page,
+ featured: req.body.status_feature,
+ published: req.body.status_published,
+ html: md.render(cleaned,
+ {
+ html: true,
+ xhtmlOut: true
+ }),
+ feature_image: JSON.stringify(postImages)
+ }).then(updated =>
+ {
+ res.json(
+ {
+ message: "postUpdated"
+ });
+ }).catch(err =>
+ {
+ console.log(err)
+ res.json(
+ {
+ message: "postError",
+ error: err
+ });
+ })
+ }).catch(err =>
+ {
+ //console.log(err)
+ res.json(
+ {
+ message: "postError",
+ error: err
+ });
+ })
+ }
+ });
+ }
+ else
+ {
+ res.json(
+ {
+ message: "Nah. You can't do that. Talk to the admin, sport."
+ });
+ }
+ });
+});
+/***
+ POST IMAGE
+*/
+router.post('/add-post-image', function(req, res, next)
+{
+ //console.log(req.body);
+ if (!req.session.user) return res.json(
+ {
+ message: "You need to be logged in, champ."
+ });
+ Models.User.findById(req.session.user.id).then((user) =>
+ {
+ if (rightsManager.check(user.role, OBJECT_POST, TASK_CREATE))
+ {
+ post_upload(req, res, function(err)
+ {
+ if (err)
+ {
+ //console.log('Error in Saving Entry: ' + err);
+ res.json(
+ {
+ message: err
+ });
+ throw err;
+ }
+ else
+ {
+ var postImage = req.files[0].path;
+ return res.json(
+ {
+ message: "post image added",
+ url: postImage.substr(7, postImage.length)
+ });
+ }
+ });
+ }
+ else
+ {
+ res.json(
+ {
+ message: "Nah. You can't do that. Talk to the admin, sport."
+ });
+ }
+ });
+});
+router.post('/delete/:id', function(req, res, next)
+{
+ if (!req.session.user) return res.json(
+ {
+ message: "You need to be logged in, champ."
+ });
+ Models.User.findById(req.session.user.id).then((user) =>
+ {
+ if (rightsManager.check(user.role, OBJECT_POST, TASK_DELETE))
+ {
+ Models.Post.findOne(
+ {
+ where:
+ {
+ id: req.params.id
+ }
+ }).then(post =>
+ {
+ post.destroy().then(deleted =>
+ {
+ res.json(
+ {
+ message: "postDeleted"
+ });
+ })
+ }).catch(err =>
+ {
+ console.log(err);
+ })
+ }
+ else
+ {
+ res.json(
+ {
+ message: "Nah. You can't do that. Talk to the admin, sport."
+ });
+ }
+ });
+});
+module.exports = router;
\ No newline at end of file
diff --git a/brain/api/content/project.js b/brain/api/content/project.js
new file mode 100644
index 0000000..b5cac9b
--- /dev/null
+++ b/brain/api/content/project.js
@@ -0,0 +1,180 @@
+import RightsManager, {
+
+ TASK_CREATE,
+ TASK_UPDATE,
+ TASK_READ,
+ TASK_DELETE,
+ OBJECT_CLIENT_ADMIN,
+ OBJECT_CLIENT_USER,
+ OBJECT_PROJECT_CLIENT,
+ OBJECT_PROJECT_FOLIO,
+ OBJECT_BOOKMARK,
+ OBJECT_POST
+
+} from '../../tools/utilities/RightsManager';
+
+var express = require('express');
+var router = express.Router();
+var multer = require('multer');
+var fs = require('fs-extra');
+var Models = require('../../models');
+var User = require('../../models/User.js');
+var uploadPath = "./content/client-images/";
+fs.ensureDir(uploadPath, function(err) {
+ //console.log(err) // => null
+ // dir has now been created, including the directory it is to be placed in
+})
+var storage = multer.diskStorage({
+ destination: function(req, file, cb) {
+ cb(null, uploadPath)
+ },
+ filename: function(req, file, cb) {
+ var splice = file.originalname.split(':');
+ cb(null, splice[0]);
+ }
+});
+var upload = multer({storage: storage}).array('projectImages');
+var rightsManager = new RightsManager();
+/*
+
+ Create New Client Project
+
+*/
+router.post('/add', function(req, res, next) {
+ if (!req.user)
+ return res.json({message: "You need to be logged in, champ."})
+ User.findById(req.user._id).then((user) => {
+ upload(req, res, function(err) {
+ if (err) {
+ //console.log('Error in Saving Entry: ' + err);
+ res.json({message: err});
+ throw err;
+ } else {
+ if (rightsManager.check(user.role, OBJECT_PROJECT_FOLIO, TASK_CREATE)) {
+ var project = new Project(req.body);
+ project.owner = user._id;
+ project.user = [];
+ project.comments = [];
+ project.tasks = [];
+ project.created = new Date().getTime();
+ project.edited = new Date().getTime();
+ if (req.files != "") {
+ project.images = req.files;
+ } else {
+ console.log("NOTHING TO SAVE");
+ }
+ project.save().then((project) => {
+ res.json({message: "new client project added"});
+ }).catch((err) => {
+ console.log(err);
+ })
+ } else {
+ res.json({message: "Nah. You can't do that. Talk to the admin, sport."});
+ }
+ }
+ });
+ }).catch((err) => {
+ console.log(err);
+ })
+});
+/*
+
+ Get Client Project List
+
+*/
+router.get('/', function(req, res, next) {
+ if (!req.user)
+ return res.json({message: "You need to be logged in, champ."})
+ User.findById(req.user._id).then((user) => {
+ if ( rightsManager.check(user.role, OBJECT_POST, TASK_READ )) {
+ Project.find({}).then((projects) => {
+ res.json(projects);
+ }).then((users) => {
+ //res.json({message: "got user list"});
+ }).catch((err) => {
+ console.log(err);
+ });
+ } else {
+ res.json({message: "Nah. You can't do that. Talk to the admin, sport."});
+ }
+ }).catch((err) => {
+ console.log(err);
+ })
+});
+/*
+
+ Get Client Project by ID
+
+*/
+router.get('/:id', function(req, res, next) {
+ if (!req.user)
+ return res.json({message: "You need to be logged in, champ."});
+ User.findById(req.user._id).then((user) => {
+ if (RightsManager.check(user.role, [RightsManager.OBJECT_PROJECT_CLIENT], RightsManager.TASK_READ)) {
+ Project.findById(req.params.id).then((project) => {
+ res.json(project);
+ }).catch((err) => {
+ console.log(err);
+ });
+ }
+ })
+});
+/*
+
+ Update Client Project by ID
+
+*/
+router.post('/update/:id', function(req, res, next) {
+ if (!req.user)
+ return res.json({message: "You need to be logged in, champ."});
+ User.findById(req.user._id).then((user) => {
+ if ( rightsManager.check(user.role, OBJECT_POST, TASK_UPDATE) ) {
+ upload(req, res, function(err) {
+ if (err) {
+ //console.log('Error in Saving Entry: ' + err);
+ res.json({message: err});
+ throw err;
+ } else {
+ Project.findByIdAndUpdate(req.params.id, req.body).then((project) => {
+ if (req.files != "") {
+ project.images = req.files;
+ } else {
+ console.log("NOTHING TO SAVE");
+ }
+ project.edited = new Date().getTime();
+ project.save().then((saved) => {
+ res.json({message: "project updated"});
+ }).catch((err) => {
+ console.log(err);
+ })
+ }).catch((err) => {
+ console.log(err);
+ })
+ }
+ });
+ } else {
+ res.json({message: "Nah. You can't do that. Talk to the admin, sport."});
+ }
+ });
+});
+/*
+
+ Delete Client Project by ID
+
+*/
+router.delete('/:id', function(req, res, next) {
+ if (!req.user)
+ return res.json({message: "users only, yo. you're not that"});
+ User.findById(req.user._id).then((user) => {
+ if ( rightsManager.check(user.role, OBJECT_POST, TASK_DELETE) ) {
+ Project.findByIdAndRemove(req.params.id).then((project) => {
+ res.json({message: 'project has been removed'});
+ }).catch((err) => {
+ console.log(err);
+ })
+ } else {
+ res.json({message: "Nah. You can't do that. Talk to the admin, sport."});
+ }
+ });
+});
+module.exports = router;
diff --git a/brain/routes/back/index.js b/brain/routes/back/index.js
index 7f92e1a..3cef99b 100644
--- a/brain/routes/back/index.js
+++ b/brain/routes/back/index.js
@@ -1,11 +1,14 @@
+
+import DateUtils from '../../tools/utilities/DateUtils';
var express = require('express');
var router = express.Router();
var Models = require('../../models');
-var DateUtils = require('../../utils/DateUtils');
var hljs = require('highlight.js/lib/highlight');
var hljs_md = require('highlight.js/lib/languages/markdown');
hljs.registerLanguage('markdown', hljs_md);
+const dateUtils = new DateUtils();
+
//--------------------------
// Index
//--------------------------
@@ -14,7 +17,6 @@ router.get('/', function (req, res) {
if (req.session.user)
loggedIn = true;
- console.log('SYNCING');
Models.Post.sync().then(f => {
Models.Post.findAll({
order: [
@@ -107,7 +109,8 @@ router.get('/posts/add/new', function (req, res) {
res.render('dash/post-edit', {
title: 'Make New Post',
mode: 'admin',
- date: DateUtils.getDate('year', new Date()) + "-" + DateUtils.getDate('month', new Date()) + "-" + DateUtils.getDate('day', new Date()),
+ date: dateUtils.getDate('year', new Date()) + "-" + dateUtils.getDate('month', new Date()) + "-" + dateUtils.getDate('day', new Date()),
+ status:['false', 'false', 'false'],
edit: false
});
} else {
@@ -132,7 +135,7 @@ router.get('/posts/edit/:id', function (req, res) {
let sexydate
if (post.origin_date == "" || post.origin_date == null)
- sexydate = DateUtils.getDate('year', post.created_at) + "-" + DateUtils.getDate('month', post.created_at) + "-" + DateUtils.getDate('day', post.created_at)
+ sexydate = dateUtils.getDate('year', post.created_at) + "-" + dateUtils.getDate('month', post.created_at) + "-" + dateUtils.getDate('day', post.created_at)
else
sexydate = post.origin_date
res.render('dash/post-edit', {
diff --git a/themes/dash/src/com/tools/effects/Animate.jsx b/brain/tools/effects/Animate.js
similarity index 100%
rename from themes/dash/src/com/tools/effects/Animate.jsx
rename to brain/tools/effects/Animate.js
diff --git a/themes/dash/src/com/tools/effects/TextEffects.jsx b/brain/tools/effects/TextEffects.js
similarity index 100%
rename from themes/dash/src/com/tools/effects/TextEffects.jsx
rename to brain/tools/effects/TextEffects.js
diff --git a/themes/dash/src/com/tools/events/AuthEvent.jsx b/brain/tools/events/AuthEvent.js
similarity index 100%
rename from themes/dash/src/com/tools/events/AuthEvent.jsx
rename to brain/tools/events/AuthEvent.js
diff --git a/themes/dash/src/com/tools/events/DataEvent.jsx b/brain/tools/events/DataEvent.js
similarity index 100%
rename from themes/dash/src/com/tools/events/DataEvent.jsx
rename to brain/tools/events/DataEvent.js
diff --git a/themes/dash/src/com/tools/events/EditorEvent.jsx b/brain/tools/events/EditorEvent.js
similarity index 100%
rename from themes/dash/src/com/tools/events/EditorEvent.jsx
rename to brain/tools/events/EditorEvent.js
diff --git a/themes/dash/src/com/tools/events/EventEmitter.jsx b/brain/tools/events/EventEmitter.js
similarity index 100%
rename from themes/dash/src/com/tools/events/EventEmitter.jsx
rename to brain/tools/events/EventEmitter.js
diff --git a/themes/dash/src/com/tools/ui/Slideshow.jsx b/brain/tools/ui/Slideshow.js
similarity index 100%
rename from themes/dash/src/com/tools/ui/Slideshow.jsx
rename to brain/tools/ui/Slideshow.js
diff --git a/themes/dash/src/com/tools/utilities/TextEditor.jsx b/brain/tools/ui/TextEditor.js
similarity index 98%
rename from themes/dash/src/com/tools/utilities/TextEditor.jsx
rename to brain/tools/ui/TextEditor.js
index a190485..11326d7 100644
--- a/themes/dash/src/com/tools/utilities/TextEditor.jsx
+++ b/brain/tools/ui/TextEditor.js
@@ -1,5 +1,5 @@
import * as DataEvent from '../events/DataEvent';
-import DateUtils from './DateUtils';
+import DateUtils from '../utilities/DateUtils';
import {
position,
offset
diff --git a/themes/dash/src/com/tools/utilities/DOMUtils.jsx b/brain/tools/utilities/DOMUtils.js
similarity index 100%
rename from themes/dash/src/com/tools/utilities/DOMUtils.jsx
rename to brain/tools/utilities/DOMUtils.js
diff --git a/themes/dash/src/com/tools/utilities/DataUtils.jsx b/brain/tools/utilities/DataUtils.js
similarity index 100%
rename from themes/dash/src/com/tools/utilities/DataUtils.jsx
rename to brain/tools/utilities/DataUtils.js
diff --git a/themes/dash/src/com/tools/utilities/DateUtils.jsx b/brain/tools/utilities/DateUtils.js
similarity index 100%
rename from themes/dash/src/com/tools/utilities/DateUtils.jsx
rename to brain/tools/utilities/DateUtils.js
diff --git a/brain/tools/utilities/RightsManager.js b/brain/tools/utilities/RightsManager.js
new file mode 100644
index 0000000..ecf43fb
--- /dev/null
+++ b/brain/tools/utilities/RightsManager.js
@@ -0,0 +1,154 @@
+export const roles = {
+ hnic:
+ {
+ "client_admin":
+ {
+ "create": true,
+ "read": true,
+ "update": true,
+ "delete": true
+ },
+ "client_user":
+ {
+ "create": true,
+ "read": true,
+ "update": true,
+ "delete": true
+ },
+ "client_project":
+ {
+ "create": true,
+ "read": true,
+ "update": true,
+ "delete": true
+ },
+ "folio_project":
+ {
+ "create": true,
+ "read": true,
+ "update": true,
+ "delete": true
+ },
+ "bookmark":
+ {
+ "create": true,
+ "read": true,
+ "update": true,
+ "delete": true
+ },
+ "post":
+ {
+ "create": true,
+ "read": true,
+ "update": true,
+ "delete": true
+ }
+ },
+ client:
+ {
+ "client_admin":
+ {
+ "create": false,
+ "read": true,
+ "update": false,
+ "delete": false
+ },
+ "client_user":
+ {
+ "create": true,
+ "read": true,
+ "update": true,
+ "delete": true
+ },
+ "client_project":
+ {
+ "create": true,
+ "read": true,
+ "update": true,
+ "delete": false
+ },
+ "folio_project":
+ {
+ "create": false,
+ "read": false,
+ "update": false,
+ "delete": false
+ }
+ },
+ user:
+ {
+ "client_admin":
+ {
+ "create": false,
+ "read": false,
+ "update": false,
+ "delete": false
+ },
+ "client_user":
+ {
+ "create": false,
+ "read": true,
+ "update": false,
+ "delete": false
+ },
+ "client_project":
+ {
+ "create": false,
+ "read": true,
+ "update": true,
+ "delete": false
+ },
+ "folio_project":
+ {
+ "create": false,
+ "read": false,
+ "update": false,
+ "delete": false
+ },
+ "bookmark":
+ {
+ "create": true,
+ "read": true,
+ "update": true,
+ "delete": true
+ },
+ "post":
+ {
+ "create": false,
+ "read": false,
+ "update": false,
+ "delete": false
+ }
+ }
+};
+export const TASK_CREATE = 'create'
+export const TASK_UPDATE = 'update'
+export const TASK_READ = 'read'
+export const TASK_DELETE = 'delete'
+export const OBJECT_CLIENT_ADMIN = 'client_admin'
+export const OBJECT_CLIENT_USER = 'client_user'
+export const OBJECT_PROJECT_CLIENT = 'client_project'
+export const OBJECT_PROJECT_FOLIO = 'folio_project'
+export const OBJECT_BOOKMARK = 'bookmark'
+export const OBJECT_POST = 'post'
+export default class RightsManager
+{
+ //--------------------------
+ // constructor
+ //--------------------------
+ constructor()
+ {
+ var self = this;
+ }
+ //--------------------------
+ // methods
+ //--------------------------
+ check(role, object, task)
+ {
+ console.log(role + " *** " + object + " *** " + task);
+ return roles[role][object][task];
+ }
+ //--------------------------
+ // event handlers
+ //--------------------------
+}
\ No newline at end of file
diff --git a/themes/dash/src/com/tools/utilities/StringUtils.jsx b/brain/tools/utilities/StringUtils.js
similarity index 100%
rename from themes/dash/src/com/tools/utilities/StringUtils.jsx
rename to brain/tools/utilities/StringUtils.js
diff --git a/brain/utils/DateUtils.js b/brain/utils/DateUtils.js
deleted file mode 100644
index 650bcec..0000000
--- a/brain/utils/DateUtils.js
+++ /dev/null
@@ -1,100 +0,0 @@
-module.exports = {
- decodeHTML: function (string, quote_style) {
- var optTemp = 0,
- i = 0,
- noquotes = false;
- if (typeof quote_style === 'undefined') {
- quote_style = 2;
- }
- string = string.toString().replace(/</g, '<').replace(/>/g, '>');
- var OPTS = {
- 'ENT_NOQUOTES': 0,
- 'ENT_HTML_QUOTE_SINGLE': 1,
- 'ENT_HTML_QUOTE_DOUBLE': 2,
- 'ENT_COMPAT': 2,
- 'ENT_QUOTES': 3,
- 'ENT_IGNORE': 4
- };
- if (quote_style === 0) {
- noquotes = true;
- }
- if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags
- quote_style = [].concat(quote_style);
- for (i = 0; i < quote_style.length; i++) {
- // Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4
- if (OPTS[quote_style[i]] === 0) {
- noquotes = true;
- } else if (OPTS[quote_style[i]]) {
- optTemp = optTemp | OPTS[quote_style[i]];
- }
- }
- quote_style = optTemp;
- }
- if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {
- string = string.replace(/*39;/g, "'"); // PHP doesn't currently escape if more than one 0, but it should
- // string = string.replace(/'|*27;/g, "'"); // This would also be useful here, but not a part of PHP
- }
- if (!noquotes) {
- string = string.replace(/"/g, '"');
- }
- // Put this in last place to avoid escape being double-decoded
- string = string.replace(/&/g, '&');
- return string;
- },
- cleanString: function (str) {
- return (str + '').replace(/\\(.?)/g, function (s, n1) {
- switch (n1) {
- case '\\':
- return '\\';
- case '0':
- return '\u0000';
- case '':
- return '';
- default:
- return n1;
- }
- });
- },
-
- cleanString: function (string) {
- var clean = string.replace(/(^\-+|[^a-zA-Z0-9\/_| -]+|\-+$)/g, '').toLowerCase().replace(/[\/_| -]+/g, '-');
- return clean;
- },
-
-
- getDate: function (type, rawdate) {
- var day = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCDate()) : String(new Date().getUTCDate()));
- var month = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCMonth() + 1) : String(new Date().getUTCMonth() + 1));
- var year = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCFullYear()) : String(new Date().getUTCFullYear()));
- var hour = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCHours()) : String(new Date().getUTCHours()));
- var minute = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCMinutes()) : String(new Date().getUTCMinutes()));
- var seconds = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCSeconds()) : String(new Date().getUTCSeconds()));
- var millisecond = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCMilliseconds()) : String(new Date().getUTCMilliseconds()));
- var offset = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getTimezoneOffset()) : String(new Date().getTimezoneOffset()));
- if (day.length == 1)
- day = String("0" + day);
- if (month.length == 1)
- month = String("0" + month);
- offset = String(offset / 60);
- if (offset.length == 1)
- offset = String("0" + offset);
-
- switch (type) {
- case "day":
- return day;
- break;
- case "month":
- return month;
- break;
- case "year":
- return year;
- break;
- case "stamp":
- return String(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + seconds + "." + millisecond + "-" + (offset));
- break
- default:
- return String(year + "-" + month + "-" + day + " : " + hour + "-" + minute + "-" + seconds);
- break;
- }
- }
-};
\ No newline at end of file
diff --git a/brain/utils/RightsManager.js b/brain/utils/RightsManager.js
deleted file mode 100644
index e29a270..0000000
--- a/brain/utils/RightsManager.js
+++ /dev/null
@@ -1,112 +0,0 @@
-var roles = {
- hnic: {
- "client_admin": {
- "create": true,
- "read": true,
- "update": true,
- "delete": true
- },
- "client_user": {
- "create": true,
- "read": true,
- "update": true,
- "delete": true
- },
- "client_project": {
- "create": true,
- "read": true,
- "update": true,
- "delete": true
- },
- "folio_project": {
- "create": true,
- "read": true,
- "update": true,
- "delete": true
- },
- "bookmark": {
- "create": true,
- "read": true,
- "update": true,
- "delete": true
- }
-
- },
- client: {
- "client_admin": {
- "create": false,
- "read": true,
- "update": false,
- "delete": false
- },
- "client_user": {
- "create": true,
- "read": true,
- "update": true,
- "delete": true
- },
- "client_project": {
- "create": true,
- "read": true,
- "update": true,
- "delete": false
- },
- "folio_project": {
- "create": false,
- "read": false,
- "update": false,
- "delete": false
- }
- },
- user: {
- "client_admin": {
- "create": false,
- "read": false,
- "update": false,
- "delete": false
- },
- "client_user": {
- "create": false,
- "read": true,
- "update": false,
- "delete": false
- },
- "client_project": {
- "create": false,
- "read": true,
- "update": true,
- "delete": false
- },
- "folio_project": {
- "create": false,
- "read": false,
- "update": false,
- "delete": false
- },
- "bookmark": {
- "create": true,
- "read": true,
- "update": true,
- "delete": true
- }
- }
-};
-module.exports = {
- TASK_CREATE: 'create',
- TASK_UPDATE: 'update',
- TASK_READ: 'read',
- TASK_DELETE: 'delete',
- OBJECT_CLIENT_ADMIN: 'client_admin',
- OBJECT_CLIENT_USER: 'client_user',
- OBJECT_PROJECT_CLIENT: 'client_project',
- OBJECT_PROJECT_FOLIO: 'folio_project',
- OBJECT_BOOKMARK: 'bookmark',
- check: function(role, object, task) {
- for (var i = 0; i < object.length; i++) {
- if(!roles[role][object[i]][task])
- return false
- }
- return true;
- },
- hey: function() {}
-};
diff --git a/package-lock.json b/package-lock.json
index 0823f0a..fc18fea 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -2708,6 +2708,11 @@
"source-map": "~0.6.1"
}
},
+ "esm": {
+ "version": "3.0.84",
+ "resolved": "https://registry.npmjs.org/esm/-/esm-3.0.84.tgz",
+ "integrity": "sha512-SzSGoZc17S7P+12R9cg21Bdb7eybX25RnIeRZ80xZs+VZ3kdQKzqTp2k4hZJjR7p9l0186TTXSgrxzlMDBktlw=="
+ },
"esprima": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
diff --git a/package.json b/package.json
index 83c21a6..5a2ca4d 100644
--- a/package.json
+++ b/package.json
@@ -6,9 +6,9 @@
"repository": "https://code.playvicio.us/Are0h/Fipamo",
"theme": "default",
"scripts": {
- "start": "forever start init.js",
+ "start": "forever start -r esm init.js",
"stop": "forever stop init.js",
- "dev": "nodemon init.js",
+ "dev": "nodemon -r esm init.js",
"watch-front-scripts": "parcel watch themes/$npm_package_theme/src/com/Start.jsx --out-dir themes/$npm_package_theme/assets/js --out-file start.min.js --public-url /$npm_package_theme/assets/js",
"watch-front-styles": "stylus -w -m -o themes/$npm_package_theme/assets/css themes/$npm_package_theme/src/styles/base.styl",
"build-front-kit": "uglifyjs node_modules/scramble-text/dist/ScrambleText.min.js node_modules/animejs/anime.min.js node_modules/reframe.js/dist/reframe.min.js -c -o themes/$npm_package_theme/assets/js/toolkit.min.js",
@@ -28,6 +28,7 @@
"cookie-parser": "~1.3.3",
"debug": "^4.1.0",
"entypo": "^2.1.0",
+ "esm": "^3.0.84",
"express": "^4.16.4",
"express-session": "^1.15.6",
"fs-extra": "latest",
diff --git a/themes/dash/assets/js/dash.min.js b/themes/dash/assets/js/dash.min.js
index 1fd1d5a..6bec31b 100644
--- a/themes/dash/assets/js/dash.min.js
+++ b/themes/dash/assets/js/dash.min.js
@@ -104,7 +104,7 @@ parcelRequire = (function (modules, cache, entry, globalName) {
// Override the current require with this new one
return newRequire;
-})({"tools/events/EventEmitter.jsx":[function(require,module,exports) {
+})({"../../../../brain/tools/events/EventEmitter.jsx":[function(require,module,exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -191,7 +191,7 @@ function () {
var _default = EventEmitter;
exports.default = _default;
-},{}],"tools/events/DataEvent.jsx":[function(require,module,exports) {
+},{}],"../../../../brain/tools/events/DataEvent.jsx":[function(require,module,exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -243,7 +243,7 @@ var DataEvent = function DataEvent() {
var _default = new DataEvent();
exports.default = _default;
-},{}],"tools/utilities/DataUtils.jsx":[function(require,module,exports) {
+},{}],"../../../../brain/tools/utilities/DataUtils.jsx":[function(require,module,exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -430,7 +430,7 @@ function (_EventEmitter) {
var _default = DataUtils;
exports.default = _default;
-},{"../events/EventEmitter.jsx":"tools/events/EventEmitter.jsx","../events/DataEvent.jsx":"tools/events/DataEvent.jsx"}],"tools/effects/Animate.jsx":[function(require,module,exports) {
+},{"../events/EventEmitter.jsx":"../../../../brain/tools/events/EventEmitter.jsx","../events/DataEvent.jsx":"../../../../brain/tools/events/DataEvent.jsx"}],"../../../../brain/tools/effects/Animate.jsx":[function(require,module,exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -494,7 +494,7 @@ function (_EventEmitter) {
var _default = Animate;
exports.default = _default;
-},{"../events/EventEmitter.jsx":"tools/events/EventEmitter.jsx"}],"tools/utilities/StringUtils.jsx":[function(require,module,exports) {
+},{"../events/EventEmitter.jsx":"../../../../brain/tools/events/EventEmitter.jsx"}],"../../../../brain/tools/utilities/StringUtils.jsx":[function(require,module,exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -599,11 +599,11 @@ Object.defineProperty(exports, "__esModule", {
});
exports.default = void 0;
-var _DataUtils = _interopRequireWildcard(require("../tools/utilities/DataUtils"));
+var _DataUtils = _interopRequireWildcard(require("../../../../../brain//tools/utilities/DataUtils"));
-var DataEvent = _interopRequireWildcard(require("../tools/events/DataEvent"));
+var DataEvent = _interopRequireWildcard(require("../../../../../brain//tools/events/DataEvent"));
-var _StringUtils = _interopRequireDefault(require("../tools/utilities/StringUtils"));
+var _StringUtils = _interopRequireDefault(require("../../../../../brain//tools/utilities/StringUtils"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -718,7 +718,7 @@ function () {
}();
exports.default = PostActions;
-},{"../tools/utilities/DataUtils":"tools/utilities/DataUtils.jsx","../tools/events/DataEvent":"tools/events/DataEvent.jsx","../tools/utilities/StringUtils":"tools/utilities/StringUtils.jsx"}],"tools/events/EditorEvent.jsx":[function(require,module,exports) {
+},{"../../../../../brain//tools/utilities/DataUtils":"../../../../brain/tools/utilities/DataUtils.jsx","../../../../../brain//tools/events/DataEvent":"../../../../brain/tools/events/DataEvent.jsx","../../../../../brain//tools/utilities/StringUtils":"../../../../brain/tools/utilities/StringUtils.jsx"}],"../../../../brain/tools/events/EditorEvent.jsx":[function(require,module,exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -744,820 +744,7 @@ var EditorEvent = function EditorEvent() {
var _default = new EditorEvent();
exports.default = _default;
-},{}],"tools/utilities/DateUtils.jsx":[function(require,module,exports) {
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.default = void 0;
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-var DateUtils =
-/*#__PURE__*/
-function () {
- //--------------------------
- // constructor
- //--------------------------
- function DateUtils() {
- _classCallCheck(this, DateUtils);
- } //--------------------------
- // methods
- //--------------------------
-
-
- _createClass(DateUtils, [{
- key: "getMKtime",
- value: function getMKtime() {
- var time = new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate(), new Date().getHours(), new Date().getMinutes(), new Date().getSeconds(), 0).getTime() / 1000;
- return time;
- }
- }, {
- key: "convertMKtime",
- value: function convertMKtime(seconds) {
- var date = new Date(seconds * 1000);
- return date;
- }
- }, {
- key: "getDate",
- value: function getDate(type, rawdate) {
- var day = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCDate()) : String(new Date().getUTCDate());
- var month = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCMonth() + 1) : String(new Date().getUTCMonth() + 1);
- var year = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCFullYear()) : String(new Date().getUTCFullYear());
- var hour = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCHours()) : String(new Date().getUTCHours());
- var minute = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCMinutes()) : String(new Date().getUTCMinutes());
- var seconds = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCSeconds()) : String(new Date().getUTCSeconds());
- var millisecond = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCMilliseconds()) : String(new Date().getUTCMilliseconds());
- var offset = rawdate != null || rawdate != '' ? String(new Date(rawdate).getTimezoneOffset()) : String(new Date().getTimezoneOffset());
- if (day.length == 1) day = String("0" + day);
- if (month.length == 1) month = String("0" + month);
- offset = String(offset / 60);
- if (offset.length == 1) offset = String("0" + offset);
-
- switch (type) {
- case "day":
- return day;
- break;
-
- case "month":
- return month;
- break;
-
- case "year":
- return year;
- break;
-
- case "stamp":
- return String(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + seconds + "." + millisecond + "-" + offset);
- break;
-
- default:
- return String(year + "-" + month + "-" + day);
- break;
- }
- } //--------------------------
- // event handlers
- //--------------------------
-
- }]);
-
- return DateUtils;
-}();
-
-var _default = DateUtils;
-exports.default = _default;
-},{}],"../../../../node_modules/caret-pos/lib/esm2015/main.js":[function(require,module,exports) {
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.getOffset = exports.offset = exports.position = void 0;
-var attributes = ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopStyle', 'borderRightStyle', 'borderBottomStyle', 'borderLeftStyle', 'borderTopWidth', 'boxSizing', 'fontFamily', 'fontSize', 'fontWeight', 'height', 'letterSpacing', 'lineHeight', 'marginBottom', 'marginLeft', 'marginRight', 'marginTop', 'outlineWidth', 'overflow', 'overflowX', 'overflowY', 'paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop', 'textAlign', 'textOverflow', 'textTransform', 'whiteSpace', 'wordBreak', 'wordWrap'];
-/**
- * Create a mirror
- *
- * @param {Element} element The element
- * @param {string} html The html
- *
- * @return {object} The mirror object
- */
-
-var createMirror = function createMirror(element, html) {
- /**
- * The mirror element
- */
- var mirror = document.createElement('div');
- /**
- * Create the CSS for the mirror object
- *
- * @return {object} The style object
- */
-
- var mirrorCss = function mirrorCss() {
- var css = {
- position: 'absolute',
- left: -9999,
- top: 0,
- zIndex: -2000
- };
-
- if (element.tagName === 'TEXTAREA') {
- attributes.push('width');
- }
-
- attributes.forEach(function (attr) {
- css[attr] = getComputedStyle(element)[attr];
- });
- return css;
- };
- /**
- * Initialize the mirror
- *
- * @param {string} html The html
- *
- * @return {void}
- */
-
-
- var initialize = function initialize(html) {
- var styles = mirrorCss();
- Object.keys(styles).forEach(function (key) {
- mirror.style[key] = styles[key];
- });
- mirror.innerHTML = html;
- element.parentNode.insertBefore(mirror, element.nextSibling);
- };
- /**
- * Get the rect
- *
- * @return {Rect} The bounding rect
- */
-
-
- var rect = function rect() {
- var marker = mirror.ownerDocument.getElementById('caret-position-marker');
- var boundingRect = {
- left: marker.offsetLeft,
- top: marker.offsetTop,
- height: marker.offsetHeight
- };
- mirror.parentNode.removeChild(mirror);
- return boundingRect;
- };
-
- initialize(html);
- return {
- rect: rect
- };
-};
-
-var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
- return typeof obj;
-} : function (obj) {
- return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
-};
-/**
- * Check if a DOM Element is content editable
- *
- * @param {Element} element The DOM element
- *
- * @return {bool} If it is content editable
- */
-
-
-var isContentEditable = function isContentEditable(element) {
- return !!(element.contentEditable && element.contentEditable === 'true');
-};
-/**
- * Get the context from settings passed in
- *
- * @param {object} settings The settings object
- *
- * @return {object} window and document
- */
-
-
-var getContext = function getContext() {
- var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
- var customPos = settings.customPos,
- iframe = settings.iframe,
- noShadowCaret = settings.noShadowCaret;
-
- if (iframe) {
- return {
- iframe: iframe,
- window: iframe.contentWindow,
- document: iframe.contentDocument || iframe.contentWindow.document,
- noShadowCaret: noShadowCaret,
- customPos: customPos
- };
- }
-
- return {
- window: window,
- document: document,
- noShadowCaret: noShadowCaret,
- customPos: customPos
- };
-};
-/**
- * Get the offset of an element
- *
- * @param {Element} element The DOM element
- * @param {object} ctx The context
- *
- * @return {object} top and left
- */
-
-
-var getOffset = function getOffset(element, ctx) {
- var win = ctx && ctx.window || window;
- var doc = ctx && ctx.document || document;
- var rect = element.getBoundingClientRect();
- var docEl = doc.documentElement;
- var scrollLeft = win.pageXOffset || docEl.scrollLeft;
- var scrollTop = win.pageYOffset || docEl.scrollTop;
- return {
- top: rect.top + scrollTop,
- left: rect.left + scrollLeft
- };
-};
-/**
- * Check if a value is an object
- *
- * @param {any} value The value to check
- *
- * @return {bool} If it is an object
- */
-
-
-exports.getOffset = getOffset;
-
-var isObject = function isObject(value) {
- return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value !== null;
-};
-/**
- * Create a Input caret object.
- *
- * @param {Element} element The element
- * @param {Object} ctx The context
- */
-
-
-var createInputCaret = function createInputCaret(element, ctx) {
- /**
- * Get the current position
- *
- * @returns {int} The caret position
- */
- var getPos = function getPos() {
- return element.selectionStart;
- };
- /**
- * Set the position
- *
- * @param {int} pos The position
- *
- * @return {Element} The element
- */
-
-
- var setPos = function setPos(pos) {
- element.setSelectionRange(pos, pos);
- return element;
- };
- /**
- * The offset
- *
- * @param {int} pos The position
- *
- * @return {object} The offset
- */
-
-
- var getOffset$$1 = function getOffset$$1(pos) {
- var rect = getOffset(element);
- var position = getPosition(pos);
- return {
- top: rect.top + position.top + ctx.document.body.scrollTop,
- left: rect.left + position.left + ctx.document.body.scrollLeft,
- height: position.height
- };
- };
- /**
- * Get the current position
- *
- * @param {int} pos The position
- *
- * @return {object} The position
- */
-
-
- var getPosition = function getPosition(pos) {
- var format = function format(val) {
- var value = val.replace(/<|>|`|"|&/g, '?').replace(/\r\n|\r|\n/g, '
');
- return value;
- };
-
- if (ctx.customPos || ctx.customPos === 0) {
- pos = ctx.customPos;
- }
-
- var position = pos === undefined ? getPos() : pos;
- var startRange = element.value.slice(0, position);
- var endRange = element.value.slice(position);
- var html = '' + format(startRange) + '';
- html += '|';
- html += '' + format(endRange) + '';
- var mirror = createMirror(element, html);
- var rect = mirror.rect();
- rect.pos = getPos();
- return rect;
- };
-
- return {
- getPos: getPos,
- setPos: setPos,
- getOffset: getOffset$$1,
- getPosition: getPosition
- };
-};
-/**
- * Create an Editable Caret
- * @param {Element} element The editable element
- * @param {object|null} ctx The context
- *
- * @return {EditableCaret}
- */
-
-
-var createEditableCaret = function createEditableCaret(element, ctx) {
- /**
- * Set the caret position
- *
- * @param {int} pos The position to se
- *
- * @return {Element} The element
- */
- var setPos = function setPos(pos) {
- var sel = ctx.window.getSelection();
-
- if (sel) {
- var offset = 0;
- var found = false;
-
- var find = function find(position, parent) {
- for (var i = 0; i < parent.childNodes.length; i++) {
- var node = parent.childNodes[i];
-
- if (found) {
- break;
- }
-
- if (node.nodeType === 3) {
- if (offset + node.length >= position) {
- found = true;
- var range = ctx.document.createRange();
- range.setStart(node, position - offset);
- sel.removeAllRanges();
- sel.addRange(range);
- break;
- } else {
- offset += node.length;
- }
- } else {
- find(pos, node);
- }
- }
- };
-
- find(pos, element);
- }
-
- return element;
- };
- /**
- * Get the offset
- *
- * @return {object} The offset
- */
-
-
- var getOffset = function getOffset() {
- var range = getRange();
- var offset = {
- height: 0,
- left: 0,
- right: 0
- };
-
- if (!range) {
- return offset;
- }
-
- var hasCustomPos = ctx.customPos || ctx.customPos === 0; // endContainer in Firefox would be the element at the start of
- // the line
-
- if (range.endOffset - 1 > 0 && range.endContainer !== element || hasCustomPos) {
- var clonedRange = range.cloneRange();
- var fixedPosition = hasCustomPos ? ctx.customPos : range.endOffset;
- clonedRange.setStart(range.endContainer, fixedPosition - 1 < 0 ? 0 : fixedPosition - 1);
- clonedRange.setEnd(range.endContainer, fixedPosition);
- var rect = clonedRange.getBoundingClientRect();
- offset = {
- height: rect.height,
- left: rect.left + rect.width,
- top: rect.top
- };
- clonedRange.detach();
- }
-
- if ((!offset || offset && offset.height === 0) && !ctx.noShadowCaret) {
- var _clonedRange = range.cloneRange();
-
- var shadowCaret = ctx.document.createTextNode('|');
-
- _clonedRange.insertNode(shadowCaret);
-
- _clonedRange.selectNode(shadowCaret);
-
- var _rect = _clonedRange.getBoundingClientRect();
-
- offset = {
- height: _rect.height,
- left: _rect.left,
- top: _rect.top
- };
- shadowCaret.parentNode.removeChild(shadowCaret);
-
- _clonedRange.detach();
- }
-
- if (offset) {
- var doc = ctx.document.documentElement;
- offset.top += ctx.window.pageYOffset - (doc.clientTop || 0);
- offset.left += ctx.window.pageXOffset - (doc.clientLeft || 0);
- }
-
- return offset;
- };
- /**
- * Get the position
- *
- * @return {object} The position
- */
-
-
- var getPosition = function getPosition() {
- var offset = getOffset();
- var pos = getPos();
- var rect = element.getBoundingClientRect();
- var inputOffset = {
- top: rect.top + ctx.document.body.scrollTop,
- left: rect.left + ctx.document.body.scrollLeft
- };
- offset.left -= inputOffset.left;
- offset.top -= inputOffset.top;
- offset.pos = pos;
- return offset;
- };
- /**
- * Get the range
- *
- * @return {Range|null}
- */
-
-
- var getRange = function getRange() {
- if (!ctx.window.getSelection) {
- return;
- }
-
- var sel = ctx.window.getSelection();
- return sel.rangeCount > 0 ? sel.getRangeAt(0) : null;
- };
- /**
- * Get the caret position
- *
- * @return {int} The position
- */
-
-
- var getPos = function getPos() {
- var range = getRange();
- var clonedRange = range.cloneRange();
- clonedRange.selectNodeContents(element);
- clonedRange.setEnd(range.endContainer, range.endOffset);
- var pos = clonedRange.toString().length;
- clonedRange.detach();
- return pos;
- };
-
- return {
- getPos: getPos,
- setPos: setPos,
- getPosition: getPosition,
- getOffset: getOffset,
- getRange: getRange
- };
-};
-
-var createCaret = function createCaret(element, ctx) {
- if (isContentEditable(element)) {
- return createEditableCaret(element, ctx);
- }
-
- return createInputCaret(element, ctx);
-};
-
-var position = function position(element, value) {
- var settings = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
- var options = settings;
-
- if (isObject(value)) {
- options = value;
- value = null;
- }
-
- var ctx = getContext(options);
- var caret = createCaret(element, ctx);
-
- if (value || value === 0) {
- return caret.setPos(value);
- }
-
- return caret.getPosition();
-};
-/**
- *
- * @param {Element} element The DOM element
- * @param {number|undefined} value The value to set
- * @param {object} settings Any settings for context
- */
-
-
-exports.position = position;
-
-var offset = function offset(element, value) {
- var settings = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
- var options = settings;
-
- if (isObject(value)) {
- options = value;
- value = null;
- }
-
- var ctx = getContext(options);
- var caret = createCaret(element, ctx);
- return caret.getOffset(value);
-};
-
-exports.offset = offset;
-},{}],"tools/utilities/TextEditor.jsx":[function(require,module,exports) {
-"use strict";
-
-Object.defineProperty(exports, "__esModule", {
- value: true
-});
-exports.default = void 0;
-
-var DataEvent = _interopRequireWildcard(require("../events/DataEvent"));
-
-var _DateUtils = _interopRequireDefault(require("./DateUtils"));
-
-var _caretPos = require("caret-pos");
-
-var _EventEmitter2 = _interopRequireDefault(require("../events/EventEmitter"));
-
-var EditorEvent = _interopRequireWildcard(require("../events/EditorEvent"));
-
-function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
-
-function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
-
-function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
-
-function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-
-function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-
-function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
-
-function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
-
-function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
-
-function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
-
-function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
-
-function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
-
-var TextEditor =
-/*#__PURE__*/
-function (_EventEmitter) {
- _inherits(TextEditor, _EventEmitter);
-
- //--------------------------
- // constructor
- //--------------------------
- function TextEditor(textEditor, scrollLimit) {
- var _this;
-
- _classCallCheck(this, TextEditor);
-
- _this = _possibleConstructorReturn(this, _getPrototypeOf(TextEditor).call(this));
- hljs.initHighlightingOnLoad(); //this.dataUtils = new DataUtils();
-
- _this.dateUtils = new _DateUtils.default();
- _this.textEditor = textEditor;
- _this.fixLimit = scrollLimit;
- _this.caretPos = null;
- _this.url = '';
-
- var self = _assertThisInitialized(_assertThisInitialized(_this));
-
- _this.setInputs();
-
- window.addEventListener("scroll", function (f) {
- var fixLimit = _this.fixLimit;
-
- if (window.pageYOffset >= fixLimit) {
- document.getElementById('edit-control').style.position = "fixed";
- } else {
- document.getElementById('edit-control').style.position = "relative";
- }
- });
-
- _this.refresh();
-
- return _this;
- } //--------------------------
- // methods
- //--------------------------
-
-
- _createClass(TextEditor, [{
- key: "setInputs",
- value: function setInputs() {
- var _this2 = this;
-
- var self = this;
- var editorButtons = document.querySelectorAll('.editor-button');
-
- for (var i = 0, length = editorButtons.length; i < length; i++) {
- editorButtons[i].addEventListener('click', function (e) {
- return _this2.handleEditorOption(e);
- }, false);
- }
-
- this.textEditor.addEventListener('input', function (f) {
- if (f.inputType == "insertParagraph") {
- var caret = (0, _caretPos.position)(self.textEditor).pos + 1;
- var spiffed = hljs.highlight('markdown', self.textEditor.innerText).value;
- var temp = document.createElement("div");
- temp.innerText = spiffed;
- self.textEditor.innerHTML = temp.innerText;
- (0, _caretPos.position)(self.textEditor, caret);
- } else {
- self.refresh();
- }
- });
- }
- }, {
- key: "refresh",
- value: function refresh() {
- var caret = (0, _caretPos.position)(this.textEditor).pos;
- var spiffed = hljs.highlight('markdown', this.textEditor.innerText).value;
- var temp = document.createElement("div");
- temp.innerText = spiffed;
- this.textEditor.innerHTML = temp.innerText;
- (0, _caretPos.position)(this.textEditor, caret);
- }
- }, {
- key: "notify",
- value: function notify(type, data) {
- switch (type) {
- case DataEvent.POST_UPDATED:
- document.getElementById('submit-update').classList.add('icon-hide');
- document.getElementById('submit-good').classList.remove('icon-hide');
- document.getElementById('edit-update').classList.remove('submit-start');
- document.getElementById('edit-update').classList.add('submit-cool');
- setTimeout(function (f) {
- document.getElementById('submit-update').classList.remove('icon-hide');
- document.getElementById('submit-good').classList.add('icon-hide');
- document.getElementById('edit-update').classList.add('submit-start');
- document.getElementById('edit-update').classList.remove('submit-cool');
- }, 2000);
- break;
-
- case DataEvent.POST_ADDED:
- // do nothing
- break;
-
- case EditorEvent.EDITOR_UPLOAD_POST_IMAGE:
- (0, _caretPos.position)(this.textEditor, this.caretPos);
- var sel, range, pulled;
- sel = window.getSelection(); //console.log(sel)
- //console.log(note.message)
-
- if (sel.rangeCount) {
- range = sel.getRangeAt(0);
- pulled = sel.getRangeAt(0).toString();
- range.deleteContents();
- range.insertNode(document.createTextNode("![image alt text](" + data + " 'image title')"));
- }
-
- this.refresh();
- break;
- }
- } //--------------------------
- // event handlers
- //--------------------------
-
- }, {
- key: "handleEditorOption",
- value: function handleEditorOption(e) {
- e.preventDefault();
- var self = this;
- var sel, range, pulled;
- sel = window.getSelection(); //console.log(sel)
-
- if (sel.rangeCount) {
- range = sel.getRangeAt(0);
- pulled = sel.getRangeAt(0).toString();
- range.deleteContents();
-
- switch (e.target.id) {
- case "edit-bold":
- range.insertNode(document.createTextNode("**" + pulled + "**"));
- break;
-
- case "edit-italic":
- range.insertNode(document.createTextNode("*" + pulled + "*"));
- break;
-
- case "edit-strikethrough":
- range.insertNode(document.createTextNode("" + pulled + ""));
- break;
-
- case "edit-header1":
- range.insertNode(document.createTextNode("# " + pulled));
- break;
-
- case "edit-header2":
- range.insertNode(document.createTextNode("## " + pulled));
- break;
-
- case "edit-header3":
- range.insertNode(document.createTextNode("### " + pulled));
- break;
-
- case "edit-image":
- this.caretPos = (0, _caretPos.position)(this.textEditor).pos;
- this.emitEvent(EditorEvent.EDITOR_UPLOAD_POST_IMAGE);
- break;
-
- case "submit-save":
- case "edit-save":
- this.emitEvent(EditorEvent.EDITOR_SAVE);
- break;
-
- case "submit-update":
- case "edit-update":
- this.emitEvent(EditorEvent.EDITOR_UPDATE);
- break;
-
- case "edit-link":
- range.insertNode(document.createTextNode("[" + pulled + "](PASTE URL HERE)"));
- break;
-
- case "edit-delete":
- this.emitEvent(EditorEvent.EDITOR_DELETE);
- break;
-
- default:
- //range.insertNode(document.createTextNode("[" + self.url + "](PASTE URL HERE)"));
- break;
- }
- }
-
- this.refresh();
- }
- }]);
-
- return TextEditor;
-}(_EventEmitter2.default);
-
-var _default = TextEditor;
-exports.default = _default;
-},{"../events/DataEvent":"tools/events/DataEvent.jsx","./DateUtils":"tools/utilities/DateUtils.jsx","caret-pos":"../../../../node_modules/caret-pos/lib/esm2015/main.js","../events/EventEmitter":"tools/events/EventEmitter.jsx","../events/EditorEvent":"tools/events/EditorEvent.jsx"}],"../../../../node_modules/tiny-date-picker/dist/tiny-date-picker.js":[function(require,module,exports) {
+},{}],"../../../../node_modules/tiny-date-picker/dist/tiny-date-picker.js":[function(require,module,exports) {
var define;
var global = arguments[3];
(function (global, factory) {
@@ -2762,7 +1949,7 @@ var global = arguments[3];
})));
-},{}],"controllers/PostEditor.jsx":[function(require,module,exports) {
+},{}],"../../../../brain/tools/utilities/DateUtils.jsx":[function(require,module,exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -2770,21 +1957,921 @@ Object.defineProperty(exports, "__esModule", {
});
exports.default = void 0;
-var _DataUtils = _interopRequireWildcard(require("../tools/utilities/DataUtils"));
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
-var DataEvent = _interopRequireWildcard(require("../tools/events/DataEvent"));
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
-var Ease = _interopRequireWildcard(require("../tools/effects/Animate"));
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+var DateUtils =
+/*#__PURE__*/
+function () {
+ //--------------------------
+ // constructor
+ //--------------------------
+ function DateUtils() {
+ _classCallCheck(this, DateUtils);
+ } //--------------------------
+ // methods
+ //--------------------------
+
+
+ _createClass(DateUtils, [{
+ key: "getMKtime",
+ value: function getMKtime() {
+ var time = new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate(), new Date().getHours(), new Date().getMinutes(), new Date().getSeconds(), 0).getTime() / 1000;
+ return time;
+ }
+ }, {
+ key: "convertMKtime",
+ value: function convertMKtime(seconds) {
+ var date = new Date(seconds * 1000);
+ return date;
+ }
+ }, {
+ key: "getDate",
+ value: function getDate(type, rawdate) {
+ var day = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCDate()) : String(new Date().getUTCDate());
+ var month = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCMonth() + 1) : String(new Date().getUTCMonth() + 1);
+ var year = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCFullYear()) : String(new Date().getUTCFullYear());
+ var hour = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCHours()) : String(new Date().getUTCHours());
+ var minute = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCMinutes()) : String(new Date().getUTCMinutes());
+ var seconds = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCSeconds()) : String(new Date().getUTCSeconds());
+ var millisecond = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCMilliseconds()) : String(new Date().getUTCMilliseconds());
+ var offset = rawdate != null || rawdate != '' ? String(new Date(rawdate).getTimezoneOffset()) : String(new Date().getTimezoneOffset());
+ if (day.length == 1) day = String("0" + day);
+ if (month.length == 1) month = String("0" + month);
+ offset = String(offset / 60);
+ if (offset.length == 1) offset = String("0" + offset);
+
+ switch (type) {
+ case "day":
+ return day;
+ break;
+
+ case "month":
+ return month;
+ break;
+
+ case "year":
+ return year;
+ break;
+
+ case "stamp":
+ return String(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + seconds + "." + millisecond + "-" + offset);
+ break;
+
+ default:
+ return String(year + "-" + month + "-" + day);
+ break;
+ }
+ } //--------------------------
+ // event handlers
+ //--------------------------
+
+ }]);
+
+ return DateUtils;
+}();
+
+var _default = DateUtils;
+exports.default = _default;
+},{}],"../../../../brain/tools/utilities/DateUtils.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+var DateUtils =
+/*#__PURE__*/
+function () {
+ //--------------------------
+ // constructor
+ //--------------------------
+ function DateUtils() {
+ _classCallCheck(this, DateUtils);
+ } //--------------------------
+ // methods
+ //--------------------------
+
+
+ _createClass(DateUtils, [{
+ key: "getMKtime",
+ value: function getMKtime() {
+ var time = new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate(), new Date().getHours(), new Date().getMinutes(), new Date().getSeconds(), 0).getTime() / 1000;
+ return time;
+ }
+ }, {
+ key: "convertMKtime",
+ value: function convertMKtime(seconds) {
+ var date = new Date(seconds * 1000);
+ return date;
+ }
+ }, {
+ key: "getDate",
+ value: function getDate(type, rawdate) {
+ var day = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCDate()) : String(new Date().getUTCDate());
+ var month = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCMonth() + 1) : String(new Date().getUTCMonth() + 1);
+ var year = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCFullYear()) : String(new Date().getUTCFullYear());
+ var hour = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCHours()) : String(new Date().getUTCHours());
+ var minute = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCMinutes()) : String(new Date().getUTCMinutes());
+ var seconds = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCSeconds()) : String(new Date().getUTCSeconds());
+ var millisecond = rawdate != null || rawdate != '' ? String(new Date(rawdate).getUTCMilliseconds()) : String(new Date().getUTCMilliseconds());
+ var offset = rawdate != null || rawdate != '' ? String(new Date(rawdate).getTimezoneOffset()) : String(new Date().getTimezoneOffset());
+ if (day.length == 1) day = String("0" + day);
+ if (month.length == 1) month = String("0" + month);
+ offset = String(offset / 60);
+ if (offset.length == 1) offset = String("0" + offset);
+
+ switch (type) {
+ case "day":
+ return day;
+ break;
+
+ case "month":
+ return month;
+ break;
+
+ case "year":
+ return year;
+ break;
+
+ case "stamp":
+ return String(year + "-" + month + "-" + day + " " + hour + ":" + minute + ":" + seconds + "." + millisecond + "-" + offset);
+ break;
+
+ default:
+ return String(year + "-" + month + "-" + day);
+ break;
+ }
+ } //--------------------------
+ // event handlers
+ //--------------------------
+
+ }]);
+
+ return DateUtils;
+}();
+
+var _default = DateUtils;
+exports.default = _default;
+},{}],"../../../../node_modules/caret-pos/lib/esm2015/main.js":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.getOffset = exports.offset = exports.position = void 0;
+var attributes = ['borderBottomWidth', 'borderLeftWidth', 'borderRightWidth', 'borderTopStyle', 'borderRightStyle', 'borderBottomStyle', 'borderLeftStyle', 'borderTopWidth', 'boxSizing', 'fontFamily', 'fontSize', 'fontWeight', 'height', 'letterSpacing', 'lineHeight', 'marginBottom', 'marginLeft', 'marginRight', 'marginTop', 'outlineWidth', 'overflow', 'overflowX', 'overflowY', 'paddingBottom', 'paddingLeft', 'paddingRight', 'paddingTop', 'textAlign', 'textOverflow', 'textTransform', 'whiteSpace', 'wordBreak', 'wordWrap'];
+/**
+ * Create a mirror
+ *
+ * @param {Element} element The element
+ * @param {string} html The html
+ *
+ * @return {object} The mirror object
+ */
+
+var createMirror = function createMirror(element, html) {
+ /**
+ * The mirror element
+ */
+ var mirror = document.createElement('div');
+ /**
+ * Create the CSS for the mirror object
+ *
+ * @return {object} The style object
+ */
+
+ var mirrorCss = function mirrorCss() {
+ var css = {
+ position: 'absolute',
+ left: -9999,
+ top: 0,
+ zIndex: -2000
+ };
+
+ if (element.tagName === 'TEXTAREA') {
+ attributes.push('width');
+ }
+
+ attributes.forEach(function (attr) {
+ css[attr] = getComputedStyle(element)[attr];
+ });
+ return css;
+ };
+ /**
+ * Initialize the mirror
+ *
+ * @param {string} html The html
+ *
+ * @return {void}
+ */
+
+
+ var initialize = function initialize(html) {
+ var styles = mirrorCss();
+ Object.keys(styles).forEach(function (key) {
+ mirror.style[key] = styles[key];
+ });
+ mirror.innerHTML = html;
+ element.parentNode.insertBefore(mirror, element.nextSibling);
+ };
+ /**
+ * Get the rect
+ *
+ * @return {Rect} The bounding rect
+ */
+
+
+ var rect = function rect() {
+ var marker = mirror.ownerDocument.getElementById('caret-position-marker');
+ var boundingRect = {
+ left: marker.offsetLeft,
+ top: marker.offsetTop,
+ height: marker.offsetHeight
+ };
+ mirror.parentNode.removeChild(mirror);
+ return boundingRect;
+ };
+
+ initialize(html);
+ return {
+ rect: rect
+ };
+};
+
+var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) {
+ return typeof obj;
+} : function (obj) {
+ return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj;
+};
+/**
+ * Check if a DOM Element is content editable
+ *
+ * @param {Element} element The DOM element
+ *
+ * @return {bool} If it is content editable
+ */
+
+
+var isContentEditable = function isContentEditable(element) {
+ return !!(element.contentEditable && element.contentEditable === 'true');
+};
+/**
+ * Get the context from settings passed in
+ *
+ * @param {object} settings The settings object
+ *
+ * @return {object} window and document
+ */
+
+
+var getContext = function getContext() {
+ var settings = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
+ var customPos = settings.customPos,
+ iframe = settings.iframe,
+ noShadowCaret = settings.noShadowCaret;
+
+ if (iframe) {
+ return {
+ iframe: iframe,
+ window: iframe.contentWindow,
+ document: iframe.contentDocument || iframe.contentWindow.document,
+ noShadowCaret: noShadowCaret,
+ customPos: customPos
+ };
+ }
+
+ return {
+ window: window,
+ document: document,
+ noShadowCaret: noShadowCaret,
+ customPos: customPos
+ };
+};
+/**
+ * Get the offset of an element
+ *
+ * @param {Element} element The DOM element
+ * @param {object} ctx The context
+ *
+ * @return {object} top and left
+ */
+
+
+var getOffset = function getOffset(element, ctx) {
+ var win = ctx && ctx.window || window;
+ var doc = ctx && ctx.document || document;
+ var rect = element.getBoundingClientRect();
+ var docEl = doc.documentElement;
+ var scrollLeft = win.pageXOffset || docEl.scrollLeft;
+ var scrollTop = win.pageYOffset || docEl.scrollTop;
+ return {
+ top: rect.top + scrollTop,
+ left: rect.left + scrollLeft
+ };
+};
+/**
+ * Check if a value is an object
+ *
+ * @param {any} value The value to check
+ *
+ * @return {bool} If it is an object
+ */
+
+
+exports.getOffset = getOffset;
+
+var isObject = function isObject(value) {
+ return (typeof value === 'undefined' ? 'undefined' : _typeof(value)) === 'object' && value !== null;
+};
+/**
+ * Create a Input caret object.
+ *
+ * @param {Element} element The element
+ * @param {Object} ctx The context
+ */
+
+
+var createInputCaret = function createInputCaret(element, ctx) {
+ /**
+ * Get the current position
+ *
+ * @returns {int} The caret position
+ */
+ var getPos = function getPos() {
+ return element.selectionStart;
+ };
+ /**
+ * Set the position
+ *
+ * @param {int} pos The position
+ *
+ * @return {Element} The element
+ */
+
+
+ var setPos = function setPos(pos) {
+ element.setSelectionRange(pos, pos);
+ return element;
+ };
+ /**
+ * The offset
+ *
+ * @param {int} pos The position
+ *
+ * @return {object} The offset
+ */
+
+
+ var getOffset$$1 = function getOffset$$1(pos) {
+ var rect = getOffset(element);
+ var position = getPosition(pos);
+ return {
+ top: rect.top + position.top + ctx.document.body.scrollTop,
+ left: rect.left + position.left + ctx.document.body.scrollLeft,
+ height: position.height
+ };
+ };
+ /**
+ * Get the current position
+ *
+ * @param {int} pos The position
+ *
+ * @return {object} The position
+ */
+
+
+ var getPosition = function getPosition(pos) {
+ var format = function format(val) {
+ var value = val.replace(/<|>|`|"|&/g, '?').replace(/\r\n|\r|\n/g, '
');
+ return value;
+ };
+
+ if (ctx.customPos || ctx.customPos === 0) {
+ pos = ctx.customPos;
+ }
+
+ var position = pos === undefined ? getPos() : pos;
+ var startRange = element.value.slice(0, position);
+ var endRange = element.value.slice(position);
+ var html = '' + format(startRange) + '';
+ html += '|';
+ html += '' + format(endRange) + '';
+ var mirror = createMirror(element, html);
+ var rect = mirror.rect();
+ rect.pos = getPos();
+ return rect;
+ };
+
+ return {
+ getPos: getPos,
+ setPos: setPos,
+ getOffset: getOffset$$1,
+ getPosition: getPosition
+ };
+};
+/**
+ * Create an Editable Caret
+ * @param {Element} element The editable element
+ * @param {object|null} ctx The context
+ *
+ * @return {EditableCaret}
+ */
+
+
+var createEditableCaret = function createEditableCaret(element, ctx) {
+ /**
+ * Set the caret position
+ *
+ * @param {int} pos The position to se
+ *
+ * @return {Element} The element
+ */
+ var setPos = function setPos(pos) {
+ var sel = ctx.window.getSelection();
+
+ if (sel) {
+ var offset = 0;
+ var found = false;
+
+ var find = function find(position, parent) {
+ for (var i = 0; i < parent.childNodes.length; i++) {
+ var node = parent.childNodes[i];
+
+ if (found) {
+ break;
+ }
+
+ if (node.nodeType === 3) {
+ if (offset + node.length >= position) {
+ found = true;
+ var range = ctx.document.createRange();
+ range.setStart(node, position - offset);
+ sel.removeAllRanges();
+ sel.addRange(range);
+ break;
+ } else {
+ offset += node.length;
+ }
+ } else {
+ find(pos, node);
+ }
+ }
+ };
+
+ find(pos, element);
+ }
+
+ return element;
+ };
+ /**
+ * Get the offset
+ *
+ * @return {object} The offset
+ */
+
+
+ var getOffset = function getOffset() {
+ var range = getRange();
+ var offset = {
+ height: 0,
+ left: 0,
+ right: 0
+ };
+
+ if (!range) {
+ return offset;
+ }
+
+ var hasCustomPos = ctx.customPos || ctx.customPos === 0; // endContainer in Firefox would be the element at the start of
+ // the line
+
+ if (range.endOffset - 1 > 0 && range.endContainer !== element || hasCustomPos) {
+ var clonedRange = range.cloneRange();
+ var fixedPosition = hasCustomPos ? ctx.customPos : range.endOffset;
+ clonedRange.setStart(range.endContainer, fixedPosition - 1 < 0 ? 0 : fixedPosition - 1);
+ clonedRange.setEnd(range.endContainer, fixedPosition);
+ var rect = clonedRange.getBoundingClientRect();
+ offset = {
+ height: rect.height,
+ left: rect.left + rect.width,
+ top: rect.top
+ };
+ clonedRange.detach();
+ }
+
+ if ((!offset || offset && offset.height === 0) && !ctx.noShadowCaret) {
+ var _clonedRange = range.cloneRange();
+
+ var shadowCaret = ctx.document.createTextNode('|');
+
+ _clonedRange.insertNode(shadowCaret);
+
+ _clonedRange.selectNode(shadowCaret);
+
+ var _rect = _clonedRange.getBoundingClientRect();
+
+ offset = {
+ height: _rect.height,
+ left: _rect.left,
+ top: _rect.top
+ };
+ shadowCaret.parentNode.removeChild(shadowCaret);
+
+ _clonedRange.detach();
+ }
+
+ if (offset) {
+ var doc = ctx.document.documentElement;
+ offset.top += ctx.window.pageYOffset - (doc.clientTop || 0);
+ offset.left += ctx.window.pageXOffset - (doc.clientLeft || 0);
+ }
+
+ return offset;
+ };
+ /**
+ * Get the position
+ *
+ * @return {object} The position
+ */
+
+
+ var getPosition = function getPosition() {
+ var offset = getOffset();
+ var pos = getPos();
+ var rect = element.getBoundingClientRect();
+ var inputOffset = {
+ top: rect.top + ctx.document.body.scrollTop,
+ left: rect.left + ctx.document.body.scrollLeft
+ };
+ offset.left -= inputOffset.left;
+ offset.top -= inputOffset.top;
+ offset.pos = pos;
+ return offset;
+ };
+ /**
+ * Get the range
+ *
+ * @return {Range|null}
+ */
+
+
+ var getRange = function getRange() {
+ if (!ctx.window.getSelection) {
+ return;
+ }
+
+ var sel = ctx.window.getSelection();
+ return sel.rangeCount > 0 ? sel.getRangeAt(0) : null;
+ };
+ /**
+ * Get the caret position
+ *
+ * @return {int} The position
+ */
+
+
+ var getPos = function getPos() {
+ var range = getRange();
+ var clonedRange = range.cloneRange();
+ clonedRange.selectNodeContents(element);
+ clonedRange.setEnd(range.endContainer, range.endOffset);
+ var pos = clonedRange.toString().length;
+ clonedRange.detach();
+ return pos;
+ };
+
+ return {
+ getPos: getPos,
+ setPos: setPos,
+ getPosition: getPosition,
+ getOffset: getOffset,
+ getRange: getRange
+ };
+};
+
+var createCaret = function createCaret(element, ctx) {
+ if (isContentEditable(element)) {
+ return createEditableCaret(element, ctx);
+ }
+
+ return createInputCaret(element, ctx);
+};
+
+var position = function position(element, value) {
+ var settings = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ var options = settings;
+
+ if (isObject(value)) {
+ options = value;
+ value = null;
+ }
+
+ var ctx = getContext(options);
+ var caret = createCaret(element, ctx);
+
+ if (value || value === 0) {
+ return caret.setPos(value);
+ }
+
+ return caret.getPosition();
+};
+/**
+ *
+ * @param {Element} element The DOM element
+ * @param {number|undefined} value The value to set
+ * @param {object} settings Any settings for context
+ */
+
+
+exports.position = position;
+
+var offset = function offset(element, value) {
+ var settings = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
+ var options = settings;
+
+ if (isObject(value)) {
+ options = value;
+ value = null;
+ }
+
+ var ctx = getContext(options);
+ var caret = createCaret(element, ctx);
+ return caret.getOffset(value);
+};
+
+exports.offset = offset;
+},{}],"../../../../brain/tools/ui/TextEditor.jsx":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var DataEvent = _interopRequireWildcard(require("../events/DataEvent"));
+
+var _DateUtils = _interopRequireDefault(require("../utilities/DateUtils"));
+
+var _caretPos = require("caret-pos");
+
+var _EventEmitter2 = _interopRequireDefault(require("../events/EventEmitter"));
+
+var EditorEvent = _interopRequireWildcard(require("../events/EditorEvent"));
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) { var desc = Object.defineProperty && Object.getOwnPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : {}; if (desc.get || desc.set) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } } newObj.default = obj; return newObj; } }
+
+function _typeof(obj) { if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
+
+function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
+
+function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
+
+function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
+
+function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
+
+function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
+
+function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
+
+function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
+
+function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
+
+var TextEditor =
+/*#__PURE__*/
+function (_EventEmitter) {
+ _inherits(TextEditor, _EventEmitter);
+
+ //--------------------------
+ // constructor
+ //--------------------------
+ function TextEditor(textEditor, scrollLimit) {
+ var _this;
+
+ _classCallCheck(this, TextEditor);
+
+ _this = _possibleConstructorReturn(this, _getPrototypeOf(TextEditor).call(this));
+ hljs.initHighlightingOnLoad(); //this.dataUtils = new DataUtils();
+
+ _this.dateUtils = new _DateUtils.default();
+ _this.textEditor = textEditor;
+ _this.fixLimit = scrollLimit;
+ _this.caretPos = null;
+ _this.url = '';
+
+ var self = _assertThisInitialized(_assertThisInitialized(_this));
+
+ _this.setInputs();
+
+ window.addEventListener("scroll", function (f) {
+ var fixLimit = _this.fixLimit;
+
+ if (window.pageYOffset >= fixLimit) {
+ document.getElementById('edit-control').style.position = "fixed";
+ } else {
+ document.getElementById('edit-control').style.position = "relative";
+ }
+ });
+
+ _this.refresh();
+
+ return _this;
+ } //--------------------------
+ // methods
+ //--------------------------
+
+
+ _createClass(TextEditor, [{
+ key: "setInputs",
+ value: function setInputs() {
+ var _this2 = this;
+
+ var self = this;
+ var editorButtons = document.querySelectorAll('.editor-button');
+
+ for (var i = 0, length = editorButtons.length; i < length; i++) {
+ editorButtons[i].addEventListener('click', function (e) {
+ return _this2.handleEditorOption(e);
+ }, false);
+ }
+
+ this.textEditor.addEventListener('input', function (f) {
+ if (f.inputType == "insertParagraph") {
+ var caret = (0, _caretPos.position)(self.textEditor).pos + 1;
+ var spiffed = hljs.highlight('markdown', self.textEditor.innerText).value;
+ var temp = document.createElement("div");
+ temp.innerText = spiffed;
+ self.textEditor.innerHTML = temp.innerText;
+ (0, _caretPos.position)(self.textEditor, caret);
+ } else {
+ self.refresh();
+ }
+ });
+ }
+ }, {
+ key: "refresh",
+ value: function refresh() {
+ var caret = (0, _caretPos.position)(this.textEditor).pos;
+ var spiffed = hljs.highlight('markdown', this.textEditor.innerText).value;
+ var temp = document.createElement("div");
+ temp.innerText = spiffed;
+ this.textEditor.innerHTML = temp.innerText;
+ (0, _caretPos.position)(this.textEditor, caret);
+ }
+ }, {
+ key: "notify",
+ value: function notify(type, data) {
+ switch (type) {
+ case DataEvent.POST_UPDATED:
+ document.getElementById('submit-update').classList.add('icon-hide');
+ document.getElementById('submit-good').classList.remove('icon-hide');
+ document.getElementById('edit-update').classList.remove('submit-start');
+ document.getElementById('edit-update').classList.add('submit-cool');
+ setTimeout(function (f) {
+ document.getElementById('submit-update').classList.remove('icon-hide');
+ document.getElementById('submit-good').classList.add('icon-hide');
+ document.getElementById('edit-update').classList.add('submit-start');
+ document.getElementById('edit-update').classList.remove('submit-cool');
+ }, 2000);
+ break;
+
+ case DataEvent.POST_ADDED:
+ // do nothing
+ break;
+
+ case EditorEvent.EDITOR_UPLOAD_POST_IMAGE:
+ (0, _caretPos.position)(this.textEditor, this.caretPos);
+ var sel, range, pulled;
+ sel = window.getSelection(); //console.log(sel)
+ //console.log(note.message)
+
+ if (sel.rangeCount) {
+ range = sel.getRangeAt(0);
+ pulled = sel.getRangeAt(0).toString();
+ range.deleteContents();
+ range.insertNode(document.createTextNode("![image alt text](" + data + " 'image title')"));
+ }
+
+ this.refresh();
+ break;
+ }
+ } //--------------------------
+ // event handlers
+ //--------------------------
+
+ }, {
+ key: "handleEditorOption",
+ value: function handleEditorOption(e) {
+ e.preventDefault();
+ var self = this;
+ var sel, range, pulled;
+ sel = window.getSelection(); //console.log(sel)
+
+ if (sel.rangeCount) {
+ range = sel.getRangeAt(0);
+ pulled = sel.getRangeAt(0).toString();
+ range.deleteContents();
+
+ switch (e.target.id) {
+ case "edit-bold":
+ range.insertNode(document.createTextNode("**" + pulled + "**"));
+ break;
+
+ case "edit-italic":
+ range.insertNode(document.createTextNode("*" + pulled + "*"));
+ break;
+
+ case "edit-strikethrough":
+ range.insertNode(document.createTextNode("" + pulled + ""));
+ break;
+
+ case "edit-header1":
+ range.insertNode(document.createTextNode("# " + pulled));
+ break;
+
+ case "edit-header2":
+ range.insertNode(document.createTextNode("## " + pulled));
+ break;
+
+ case "edit-header3":
+ range.insertNode(document.createTextNode("### " + pulled));
+ break;
+
+ case "edit-image":
+ this.caretPos = (0, _caretPos.position)(this.textEditor).pos;
+ this.emitEvent(EditorEvent.EDITOR_UPLOAD_POST_IMAGE);
+ break;
+
+ case "submit-save":
+ case "edit-save":
+ this.emitEvent(EditorEvent.EDITOR_SAVE);
+ break;
+
+ case "submit-update":
+ case "edit-update":
+ this.emitEvent(EditorEvent.EDITOR_UPDATE);
+ break;
+
+ case "edit-link":
+ range.insertNode(document.createTextNode("[" + pulled + "](PASTE URL HERE)"));
+ break;
+
+ case "edit-delete":
+ this.emitEvent(EditorEvent.EDITOR_DELETE);
+ break;
+
+ default:
+ //range.insertNode(document.createTextNode("[" + self.url + "](PASTE URL HERE)"));
+ break;
+ }
+ }
+
+ this.refresh();
+ }
+ }]);
+
+ return TextEditor;
+}(_EventEmitter2.default);
+
+var _default = TextEditor;
+exports.default = _default;
+},{"../events/DataEvent":"../../../../brain/tools/events/DataEvent.jsx","../utilities/DateUtils":"../../../../brain/tools/utilities/DateUtils.js","caret-pos":"../../../../node_modules/caret-pos/lib/esm2015/main.js","../events/EventEmitter":"../../../../brain/tools/events/EventEmitter.jsx","../events/EditorEvent":"../../../../brain/tools/events/EditorEvent.jsx"}],"controllers/PostEditor.jsx":[function(require,module,exports) {
+"use strict";
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+exports.default = void 0;
+
+var _DataUtils = _interopRequireWildcard(require("../../../../../brain/tools/utilities/DataUtils"));
+
+var DataEvent = _interopRequireWildcard(require("../../../../../brain/tools/events/DataEvent"));
+
+var _Animate = _interopRequireDefault(require("../../../../../brain/tools/effects/Animate"));
var _PostActions = _interopRequireDefault(require("../actions/PostActions"));
-var EditorEvent = _interopRequireWildcard(require("../tools/events/EditorEvent"));
-
-var _TextEditor = _interopRequireDefault(require("../tools/utilities/TextEditor"));
+var EditorEvent = _interopRequireWildcard(require("../../../../../brain/tools/events/EditorEvent"));
var _tinyDatePicker = _interopRequireDefault(require("tiny-date-picker"));
-var _DateUtils = _interopRequireDefault(require("../tools/utilities/DateUtils"));
+var _DateUtils = _interopRequireDefault(require("../../../../../brain/tools/utilities/DateUtils"));
+
+var _TextEditor = _interopRequireDefault(require("../../../../../brain/tools/ui/TextEditor"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -2807,9 +2894,10 @@ function () {
_classCallCheck(this, PostEditor);
- reframe('iframe');
+ //reframe('iframe');
var self = this;
this.uploadFiles;
+ this.anim = new _Animate.default();
this.dataUtils = new _DataUtils.default();
this.dateUtils = new _DateUtils.default();
@@ -2851,7 +2939,7 @@ function () {
var _this2 = this;
var self = this;
- new Ease.default().object({
+ new _Animate.default().object({
targets: document.getElementById('loader'),
duration: 300,
opacity: 0,
@@ -2859,7 +2947,7 @@ function () {
complete: function complete() {
document.getElementById('loader').style.display = 'none';
document.getElementById('loader').style.visibility = 'hidden';
- new Ease.default().object({
+ new _Animate.default().object({
targets: document.getElementById('header'),
duration: 10,
opacity: 1,
@@ -3062,7 +3150,7 @@ function () {
exports.default = PostEditor;
PostEditor.uploadFiles = [];
-},{"../tools/utilities/DataUtils":"tools/utilities/DataUtils.jsx","../tools/events/DataEvent":"tools/events/DataEvent.jsx","../tools/effects/Animate":"tools/effects/Animate.jsx","../actions/PostActions":"actions/PostActions.jsx","../tools/events/EditorEvent":"tools/events/EditorEvent.jsx","../tools/utilities/TextEditor":"tools/utilities/TextEditor.jsx","tiny-date-picker":"../../../../node_modules/tiny-date-picker/dist/tiny-date-picker.js","../tools/utilities/DateUtils":"tools/utilities/DateUtils.jsx"}],"controllers/DisplayManager.jsx":[function(require,module,exports) {
+},{"../../../../../brain/tools/utilities/DataUtils":"../../../../brain/tools/utilities/DataUtils.jsx","../../../../../brain/tools/events/DataEvent":"../../../../brain/tools/events/DataEvent.jsx","../../../../../brain/tools/effects/Animate":"../../../../brain/tools/effects/Animate.jsx","../actions/PostActions":"actions/PostActions.jsx","../../../../../brain/tools/events/EditorEvent":"../../../../brain/tools/events/EditorEvent.jsx","tiny-date-picker":"../../../../node_modules/tiny-date-picker/dist/tiny-date-picker.js","../../../../../brain/tools/utilities/DateUtils":"../../../../brain/tools/utilities/DateUtils.jsx","../../../../../brain/tools/ui/TextEditor":"../../../../brain/tools/ui/TextEditor.jsx"}],"controllers/DisplayManager.jsx":[function(require,module,exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -3070,11 +3158,11 @@ Object.defineProperty(exports, "__esModule", {
});
exports.default = void 0;
-var _DataUtils = _interopRequireWildcard(require("../tools/utilities/DataUtils.jsx"));
+var _DataUtils = _interopRequireWildcard(require("../../../../../brain/tools/utilities/DataUtils"));
var _PostEditor = _interopRequireDefault(require("./PostEditor"));
-var _Animate = _interopRequireDefault(require("../tools/effects/Animate.jsx"));
+var _Animate = _interopRequireDefault(require("../../../../../brain/tools/effects/Animate.jsx"));
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -3097,7 +3185,7 @@ function () {
this.dataUtils = new _DataUtils.default();
this.currentDisplay = '';
- this.urlPieces = document.URL.split("/"); //grab url so system knows what to display
+ this.urlPieces = document.URL.split("/"); //grab url so system knows what to display
this.chooseDisplay(this.urlPieces[5], this.urlPieces[6]);
} //--------------------------
@@ -3108,7 +3196,8 @@ function () {
_createClass(DisplayManager, [{
key: "start",
value: function start() {
- var self = this;
+ var self = this; // new stuff
+
new _Animate.default().object({
targets: document.getElementById('loader'),
duration: 300,
@@ -3133,7 +3222,7 @@ function () {
}, {
key: "chooseDisplay",
value: function chooseDisplay(section, page) {
- this.currentDisplay = ''; //console.log(section+" "+page)
+ this.currentDisplay = '';
switch (section) {
case 'posts':
@@ -3156,7 +3245,7 @@ function () {
}();
exports.default = DisplayManager;
-},{"../tools/utilities/DataUtils.jsx":"tools/utilities/DataUtils.jsx","./PostEditor":"controllers/PostEditor.jsx","../tools/effects/Animate.jsx":"tools/effects/Animate.jsx"}],"Base.jsx":[function(require,module,exports) {
+},{"../../../../../brain/tools/utilities/DataUtils":"../../../../brain/tools/utilities/DataUtils.jsx","./PostEditor":"controllers/PostEditor.jsx","../../../../../brain/tools/effects/Animate.jsx":"../../../../brain/tools/effects/Animate.jsx"}],"Base.jsx":[function(require,module,exports) {
"use strict";
Object.defineProperty(exports, "__esModule", {
@@ -3164,9 +3253,9 @@ Object.defineProperty(exports, "__esModule", {
});
exports.default = void 0;
-var _DataUtils = _interopRequireWildcard(require("./tools/utilities/DataUtils.jsx"));
+var _DataUtils = _interopRequireWildcard(require("../../../../brain/tools/utilities/DataUtils"));
-var DataEvent = _interopRequireWildcard(require("./tools/events/DataEvent.jsx"));
+var DataEvent = _interopRequireWildcard(require("../../../../brain/tools/events/DataEvent.jsx"));
var _DisplayManager = _interopRequireDefault(require("./controllers/DisplayManager.jsx"));
@@ -3230,7 +3319,7 @@ function () {
}();
exports.default = Base;
-},{"./tools/utilities/DataUtils.jsx":"tools/utilities/DataUtils.jsx","./tools/events/DataEvent.jsx":"tools/events/DataEvent.jsx","./controllers/DisplayManager.jsx":"controllers/DisplayManager.jsx"}],"Start.jsx":[function(require,module,exports) {
+},{"../../../../brain/tools/utilities/DataUtils":"../../../../brain/tools/utilities/DataUtils.jsx","../../../../brain/tools/events/DataEvent.jsx":"../../../../brain/tools/events/DataEvent.jsx","./controllers/DisplayManager.jsx":"controllers/DisplayManager.jsx"}],"Start.jsx":[function(require,module,exports) {
"use strict";
var _Base = _interopRequireDefault(require("./Base.jsx"));
@@ -3267,7 +3356,7 @@ var parent = module.bundle.parent;
if ((!parent || !parent.isParcelRequire) && typeof WebSocket !== 'undefined') {
var hostname = "" || location.hostname;
var protocol = location.protocol === 'https:' ? 'wss' : 'ws';
- var ws = new WebSocket(protocol + '://' + hostname + ':' + "57869" + '/');
+ var ws = new WebSocket(protocol + '://' + hostname + ':' + "50421" + '/');
ws.onmessage = function (event) {
var data = JSON.parse(event.data);
diff --git a/themes/dash/assets/js/dash.min.map b/themes/dash/assets/js/dash.min.map
index e018f1c..aa02d3e 100644
--- a/themes/dash/assets/js/dash.min.map
+++ b/themes/dash/assets/js/dash.min.map
@@ -1 +1 @@
-{"version":3,"sources":["tools/events/EventEmitter.jsx","tools/events/DataEvent.jsx","tools/utilities/DataUtils.jsx","tools/effects/Animate.jsx","tools/utilities/StringUtils.jsx","actions/PostActions.jsx","tools/events/EditorEvent.jsx","tools/utilities/DateUtils.jsx","../../src/mirror.js","../../src/utils.js","../../src/input.js","../../src/editable.js","../../src/main.js","tools/utilities/TextEditor.jsx","../../../../node_modules/tiny-date-picker/dist/tiny-date-picker.js","controllers/PostEditor.jsx","controllers/DisplayManager.jsx","Base.jsx","Start.jsx"],"names":["EventEmitter","listeners","Map","label","callback","has","set","get","push","isFunction","obj","index","length","reduce","i","listener","splice","args","forEach","REQUEST_GOOD","REQUEST_LAME","IMG_REQUEST_GOOD","IMG_REQUEST_LAME","SETTINGS_LOADED","HTML_LOADED","ARCHIVES_JSON_LOADED","ARCHIVES_PAGE_LOADED","ARCHIVES_ENTRY_LOADED","PROJECT_UPDATED","PROJECT_ADDED","PROJECTS_SORTED","POST_IMAGE_ADDED","POST_ERROR","POST_ADDED","POST_UPDATED","POST_DELETED","DataEvent","REQUEST_TYPE_POST","REQUEST_TYPE_GET","REQUEST_TYPE_PUT","REQUEST_TYPE_DELETE","CONTENT_TYPE_JSON","CONTENT_TYPE_FORM","DataUtils","self","requestURL","eventType","requestType","contentType","requestData","Promise","resolve","reject","request","XMLHttpRequest","upload","onprogress","handleLoadProgress","open","onload","e","status","setRequestHeader","send","JSON","stringify","url","responseType","response","Error","statusText","onerror","src","body","document","querySelector","myImage","Image","crossOrigin","imgLoad","then","imageURL","window","URL","createObjectURL","percentComplete","Math","ceil","loaded","total","Animate","properties","animation","anime","StringUtils","string","clean","replace","toLowerCase","quote_style","optTemp","noquotes","toString","OPTS","concat","ENT_HTML_QUOTE_SINGLE","PostActions","folio","dataUtils","edit","uploadFiles","postData","FormData","files","file","type","match","append","name","txt","createElement","innerHTML","getElementById","value","cleanString","getAttribute","postURL","postEventType","postID","catch","err","EDITOR_DELETE","EDITOR_UPLOAD_POST_IMAGE","EDITOR_SAVE","EDITOR_UPDATE","EditorEvent","DateUtils","time","Date","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getTime","seconds","date","rawdate","day","String","getUTCDate","month","getUTCMonth","year","getUTCFullYear","hour","getUTCHours","minute","getUTCMinutes","getUTCSeconds","millisecond","getUTCMilliseconds","offset","getTimezoneOffset","attributes","createMirror","element","html","mirror","mirrorCss","css","tagName","attr","getComputedStyle","initialize","styles","keys","style","key","parentNode","insertBefore","nextSibling","rect","marker","ownerDocument","boundingRect","offsetLeft","offsetTop","offsetHeight","removeChild","isContentEditable","contentEditable","getContext","settings","customPos","iframe","noShadowCaret","contentWindow","contentDocument","getOffset","ctx","win","doc","getBoundingClientRect","docEl","documentElement","scrollLeft","pageXOffset","scrollTop","pageYOffset","top","left","isObject","createInputCaret","getPos","selectionStart","setPos","pos","setSelectionRange","elementOffset","position","getPosition","height","format","val","undefined","startRange","slice","endRange","createEditableCaret","sel","getSelection","found","find","parent","childNodes","node","nodeType","range","createRange","setStart","removeAllRanges","addRange","getRange","hasCustomPos","endOffset","endContainer","clonedRange","cloneRange","fixedPosition","setEnd","width","detach","shadowCaret","createTextNode","insertNode","selectNode","clientTop","clientLeft","inputOffset","rangeCount","getRangeAt","selectNodeContents","createCaret","options","caret","TextEditor","textEditor","scrollLimit","hljs","initHighlightingOnLoad","dateUtils","fixLimit","caretPos","setInputs","addEventListener","f","refresh","editorButtons","querySelectorAll","handleEditorOption","inputType","spiffed","highlight","innerText","temp","data","classList","add","remove","setTimeout","pulled","deleteContents","preventDefault","target","id","emitEvent","PostEditor","reframe","editor","addListener","handleEditorOptions","handlePostImageAdd","mode","start","object","targets","duration","opacity","easing","complete","display","visibility","handleDragOver","handleDrop","handleClicked","click","optionButtons","handlePostOptions","currentOption","active","setAttribute","submitPost","note","parse","notify","message","location","console","log","confirm","deletePost","stopPropagation","dataTransfer","dropEffect","reader","FileReader","theFile","image","result","title","escape","span","join","appendChild","readAsDataURL","DisplayManager","currentDisplay","urlPieces","split","chooseDisplay","section","page","Base","admin","displayManager","base"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IAAMA;;;AAGF;AACA;AACA;AACA,0BACA;AAAA;;AACI,SAAKC,SAAL,GAAiB,IAAIC,GAAJ,EAAjB;AACH,IACD;AACA;AACA;;;;;gCACYC,OAAOC,UAAU;AACzB,WAAKH,SAAL,CAAeI,GAAf,CAAmBF,KAAnB,KAA6B,KAAKF,SAAL,CAAeK,GAAf,CAAmBH,KAAnB,EAA0B,EAA1B,CAA7B;AACA,WAAKF,SAAL,CAAeM,GAAf,CAAmBJ,KAAnB,EAA0BK,IAA1B,CAA+BJ,QAA/B;AACH;;;mCAEcD,OAAOC,UAAU;AAC5B,UAAIK,UAAU,GAAG,SAAbA,UAAa,CAASC,GAAT,EAAc;AAC3B,eAAO,OAAOA,GAAP,IAAc,UAAd,IAA4B,KAAnC;AACH,OAFD;;AAIA,UAAIT,SAAS,GAAG,KAAKA,SAAL,CAAeM,GAAf,CAAmBJ,KAAnB,CAAhB;AAAA,UACIQ,KADJ;;AAGA,UAAIV,SAAS,IAAIA,SAAS,CAACW,MAA3B,EAAmC;AAC/BD,QAAAA,KAAK,GAAGV,SAAS,CAACY,MAAV,CAAiB,UAACC,CAAD,EAAIC,QAAJ,EAAcJ,KAAd,EAAwB;AAC7C,iBAAQF,UAAU,CAACM,QAAD,CAAV,IAAwBA,QAAQ,KAAKX,QAAtC,GACDU,CAAC,GAAGH,KADH,GAEDG,CAFN;AAGH,SAJO,EAIL,CAAC,CAJI,CAAR;;AAMA,YAAIH,KAAK,GAAG,CAAC,CAAb,EAAgB;AACZV,UAAAA,SAAS,CAACe,MAAV,CAAiBL,KAAjB,EAAwB,CAAxB;AACA,eAAKV,SAAL,CAAeK,GAAf,CAAmBH,KAAnB,EAA0BF,SAA1B;AACA,iBAAO,IAAP;AACH;AACJ;;AACD,aAAO,KAAP;AACH;;;8BAESE,OAAgB;AAAA,wCAANc,IAAM;AAANA,QAAAA,IAAM;AAAA;;AACtB,UAAIhB,SAAS,GAAG,KAAKA,SAAL,CAAeM,GAAf,CAAmBJ,KAAnB,CAAhB;;AACA,UAAIF,SAAS,IAAIA,SAAS,CAACW,MAA3B,EAAmC;AAC/BX,QAAAA,SAAS,CAACiB,OAAV,CAAkB,UAACH,QAAD,EAAc;AAC5BA,UAAAA,QAAQ,MAAR,SAAYE,IAAZ;AACH,SAFD;AAGA,eAAO,IAAP;AACH;;AACD,aAAO,KAAP;AACH,MACD;AACA;AACA;;;;;;;eAEWjB;;;;;;;;;;;;ACxDR,IAAMmB,YAAY,GAAG,aAArB;;AACA,IAAMC,YAAY,GAAG,aAArB;;AACA,IAAMC,gBAAgB,GAAG,gBAAzB;;AACA,IAAMC,gBAAgB,GAAG,gBAAzB;;AACA,IAAMC,eAAe,GAAG,YAAxB;;AACA,IAAMC,WAAW,GAAG,YAApB;;AACA,IAAMC,oBAAoB,GAAG,oBAA7B;;AACA,IAAMC,oBAAoB,GAAG,oBAA7B;;AACA,IAAMC,qBAAqB,GAAG,qBAA9B;;AACA,IAAMC,eAAe,GAAG,gBAAxB;;AACA,IAAMC,aAAa,GAAG,cAAtB;;AACA,IAAMC,eAAe,GAAG,gBAAxB;;AACA,IAAMC,gBAAgB,GAAG,gBAAzB;;AACA,IAAMC,UAAU,GAAG,WAAnB;;AACA,IAAMC,UAAU,GAAG,WAAnB;;AACA,IAAMC,YAAY,GAAG,aAArB;;AACA,IAAMC,YAAY,GAAG,gBAArB;;;IAEDC;;;;eAaS,IAAIA,SAAJ;;;;;;;;;;;ACzBf;;AACA;;;;;;;;;;;;;;;;;;;;;;;;AAPO,IAAMC,iBAAiB,GAAG,MAA1B;;AACA,IAAMC,gBAAgB,GAAG,KAAzB;;AACA,IAAMC,gBAAgB,GAAG,KAAzB;;AACA,IAAMC,mBAAmB,GAAG,QAA5B;;AACA,IAAMC,iBAAiB,GAAG,MAA1B;;AACA,IAAMC,iBAAiB,GAAG,uBAA1B;;;IAGDC;;;;;AACJ;AACA;AACA;AACA,uBAAc;AAAA;;AAAA;;AACZ;;AACA,QAAIC,IAAI,wDAAR;;AAFY;AAGb,IACD;AACA;AACA;;;;;4BACQC,YAAYC,WAAgG;AAAA,UAArFC,WAAqF,uEAAvET,gBAAuE;AAAA,UAArDU,WAAqD,uEAAvCP,iBAAuC;AAAA,UAApBQ,WAAoB,uEAAN,IAAM;AAClH,UAAIL,IAAI,GAAG,IAAX;AACA,aAAO,IAAIM,OAAJ,CAAY,UAASC,OAAT,EAAkBC,MAAlB,EAA0B;AAC3C,YAAIC,OAAO,GAAG,IAAIC,cAAJ,EAAd;AACAD,QAAAA,OAAO,CAACE,MAAR,CAAeC,UAAf,GAA4BZ,IAAI,CAACa,kBAAjC;AACAJ,QAAAA,OAAO,CAACK,IAAR,CAAaX,WAAb,EAA0BF,UAA1B,EAAsC,IAAtC;;AACAQ,QAAAA,OAAO,CAACM,MAAR,GAAiB,UAASC,CAAT,EAAY;AAC3B,cAAIP,OAAO,CAACQ,MAAR,IAAkB,GAAtB,EAA2B;AACzBV,YAAAA,OAAO,CAAC;AACNE,cAAAA,OAAO,EAAPA,OADM;AAENP,cAAAA,SAAS,EAATA;AAFM,aAAD,CAAP;AAID,WALD,MAKO;AACLM,YAAAA,MAAM,CAAC;AACLC,cAAAA,OAAO,EAAPA,OADK;AAELP,cAAAA,SAAS,EAATA;AAFK,aAAD,CAAN;AAID;;AACD;AACD,SAbD;;AAcA,YAAIC,WAAW,IAAIR,gBAAf,IAAmCQ,WAAW,IAAIV,iBAAtD,EAAyE;AACvE,kBAAQW,WAAR;AACE,iBAAKP,iBAAL;AACEY,cAAAA,OAAO,CAACS,gBAAR,CAAyB,cAAzB,EAAyC,iBAAiBd,WAA1D;AACAK,cAAAA,OAAO,CAACU,IAAR,CAAaC,IAAI,CAACC,SAAL,CAAehB,WAAf,CAAb;AACA;;AACF,iBAAKP,iBAAL;AACEW,cAAAA,OAAO,CAACU,IAAR,CAAad,WAAb;AACA;AAPJ;AASD,SAVD,MAUO;AACLI,UAAAA,OAAO,CAACU,IAAR;AACD;AACF,OA/BM,CAAP;AAgCD;;;4BACOG,KAAK;AACX,mBADW,CAEX;AACA;;AACA,aAAO,IAAIhB,OAAJ,CAAY,UAASC,OAAT,EAAkBC,MAAlB,EAA0B;AAC3C;AACA,YAAIC,OAAO,GAAG,IAAIC,cAAJ,EAAd;AACAD,QAAAA,OAAO,CAACK,IAAR,CAAa,KAAb,EAAoBQ,GAApB;AACAb,QAAAA,OAAO,CAACc,YAAR,GAAuB,MAAvB,CAJ2C,CAK3C;;AACAd,QAAAA,OAAO,CAACM,MAAR,GAAiB,YAAW;AAC1B,cAAIN,OAAO,CAACQ,MAAR,KAAmB,GAAvB,EAA4B;AAC1B;AACAV,YAAAA,OAAO,CAACE,OAAO,CAACe,QAAT,CAAP;AACD,WAHD,MAGO;AACL;AACAhB,YAAAA,MAAM,CAAC,IAAIiB,KAAJ,CAAU,iDAAiDhB,OAAO,CAACiB,UAAnE,CAAD,CAAN;AACD;AACF,SARD;;AASAjB,QAAAA,OAAO,CAACkB,OAAR,GAAkB,YAAW;AAC3B;AACA;AACAnB,UAAAA,MAAM,CAAC,IAAIiB,KAAJ,CAAU,4BAAV,CAAD,CAAN;AACD,SAJD,CAf2C,CAoB3C;;;AACAhB,QAAAA,OAAO,CAACU,IAAR;AACD,OAtBM,CAAP;AAuBD;;;8BACSS,KAAK;AACb;;AACA,UAAI5B,IAAI,GAAG,IAAX;AACA,aAAO,IAAIM,OAAJ,CAAY,UAASC,OAAT,EAAkBC,MAAlB,EAA0B;AAC3C;AACA,YAAIqB,IAAI,GAAGC,QAAQ,CAACC,aAAT,CAAuB,MAAvB,CAAX;AAAA,YACEC,OAAO,GAAG,IAAIC,KAAJ,EADZ;AAEAD,QAAAA,OAAO,CAACE,WAAR,GAAsB,EAAtB,CAJ2C,CAIjB;AAC1B;AACA;;AACAlC,QAAAA,IAAI,CAACmC,OAAL,CAAaP,GAAb,EAAkBQ,IAAlB,CAAuB,UAASZ,QAAT,EAAmB;AACxC;AACA,cAAIa,QAAQ,GAAGC,MAAM,CAACC,GAAP,CAAWC,eAAX,CAA2BhB,QAA3B,CAAf;AACAjB,UAAAA,OAAO,CAAC8B,QAAD,CAAP,CAHwC,CAI1C;AACA;AACA;AACA;AACC,SARD,EAQG,UAASZ,KAAT,EAAgB;AACjBjB,UAAAA,MAAM,CAACiB,KAAD,CAAN;AACD,SAVD;AAWD,OAlBM,CAAP;AAmBD,MACD;AACA;AACA;;;;uCACmBT,GAAG;AACpB,UAAIyB,eAAe,GAAGC,IAAI,CAACC,IAAL,CAAW3B,CAAC,CAAC4B,MAAF,GAAW5B,CAAC,CAAC6B,KAAd,GAAuB,GAAjC,CAAtB,CADoB,CAEtB;AACC;;;;EAvGqBzF;;eAyGT2C;;;;;;;;;;ACjHf;;;;;;;;;;;;;;;;;;;;;;AAAsD;;IAEhD+C;;;;;AACF;AACA;AACA;AACA,qBAAc;AAAA;;AAAA;AAEb,IACD;AACA;AACA;;;;;2BACOC,YAAY;AACf,UAAIC,SAAS,GAAGC,KAAK,CACjBF,UADiB,CAArB,CADe,CAIf;AACH,MACD;AACA;AACA;;;;;EAlBkB3F;;eAoBP0F;;;;;;;;;;;;;;;;ICtBTI;;;AAGF;AACA;AACA;AACA,yBACA;AAAA;AAAE,IACF;AACA;AACA;;;;;gCACYC,QACZ;AACI,UAAIC,KAAK,GAAGD,MAAM,CAACE,OAAP,CAAe,kCAAf,EAAmD,EAAnD,EAAuDC,WAAvD,GAAqED,OAArE,CAA6E,YAA7E,EAA2F,GAA3F,CAAZ;AACA,aAAOD,KAAP;AACH;;;+BAEUD,QAAQI,aAAa;AAC5B,UAAIC,OAAO,GAAG,CAAd;AAAA,UACItF,CAAC,GAAG,CADR;AAAA,UAEIuF,QAAQ,GAAG,KAFf;;AAGA,UAAI,OAAOF,WAAP,KAAuB,WAA3B,EAAwC;AACpCA,QAAAA,WAAW,GAAG,CAAd;AACH;;AACDJ,MAAAA,MAAM,GAAGA,MAAM,CAACO,QAAP,GAAkBL,OAAlB,CAA0B,OAA1B,EAAmC,GAAnC,EAAwCA,OAAxC,CAAgD,OAAhD,EAAyD,GAAzD,CAAT;AACA,UAAIM,IAAI,GAAG;AACP,wBAAgB,CADT;AAEP,iCAAyB,CAFlB;AAGP,iCAAyB,CAHlB;AAIP,sBAAc,CAJP;AAKP,sBAAc,CALP;AAMP,sBAAc;AANP,OAAX;;AAQA,UAAIJ,WAAW,KAAK,CAApB,EAAuB;AACnBE,QAAAA,QAAQ,GAAG,IAAX;AACH;;AACD,UAAI,OAAOF,WAAP,KAAuB,QAA3B,EAAqC;AAAE;AACnCA,QAAAA,WAAW,GAAG,GAAGK,MAAH,CAAUL,WAAV,CAAd;;AACA,aAAKrF,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGqF,WAAW,CAACvF,MAA5B,EAAoCE,CAAC,EAArC,EAAyC;AACrC;AACA,cAAIyF,IAAI,CAACJ,WAAW,CAACrF,CAAD,CAAZ,CAAJ,KAAyB,CAA7B,EAAgC;AAC5BuF,YAAAA,QAAQ,GAAG,IAAX;AACH,WAFD,MAEO,IAAIE,IAAI,CAACJ,WAAW,CAACrF,CAAD,CAAZ,CAAR,EAA0B;AAC7BsF,YAAAA,OAAO,GAAGA,OAAO,GAAGG,IAAI,CAACJ,WAAW,CAACrF,CAAD,CAAZ,CAAxB;AACH;AACJ;;AACDqF,QAAAA,WAAW,GAAGC,OAAd;AACH;;AACD,UAAID,WAAW,GAAGI,IAAI,CAACE,qBAAvB,EAA8C;AAC1CV,QAAAA,MAAM,GAAGA,MAAM,CAACE,OAAP,CAAe,UAAf,EAA2B,GAA3B,CAAT,CAD0C,CACA;AAC1C;AACH;;AACD,UAAI,CAACI,QAAL,EAAe;AACXN,QAAAA,MAAM,GAAGA,MAAM,CAACE,OAAP,CAAe,SAAf,EAA0B,GAA1B,CAAT;AACH,OArC2B,CAsC5B;;;AACAF,MAAAA,MAAM,GAAGA,MAAM,CAACE,OAAP,CAAe,QAAf,EAAyB,GAAzB,CAAT;AACA,aAAOF,MAAP;AACH,MAEG;AACA;AACA;;;;;;;eAEOD;;;;;;;;;;AChEf;;AACA;;AACA;;;;;;;;;;;;IACMY;;;AACF;AACA;AACA;AACA,yBAAc;AAAA;;AACV,QAAIC,KAAK,GAAG,EAAZ;AACA,SAAKC,SAAL,GAAiB,IAAIjE,kBAAJ,EAAjB;AACH,IACD;AACA;AACA;;;;;4BACQ,CAAE;;;+BAECkE,MAAMC,aAAa;AAC1B,UAAIlE,IAAI,GAAG,IAAX;AACA,aAAO,IAAIM,OAAJ,CAAY,UAASC,OAAT,EAAkBC,MAAlB,EAA0B;AACzC;AACA;AACA,YAAI2D,QAAQ,GAAG,IAAIC,QAAJ,EAAf,CAHyC,CAIzC;AACA;;AACA,YAAIC,KAAK,GAAGH,WAAZ;;AACA,aAAK,IAAIhG,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGmG,KAAK,CAACrG,MAA1B,EAAkCE,CAAC,EAAnC,EAAuC;AACnC,cAAIoG,IAAI,GAAGD,KAAK,CAACnG,CAAD,CAAhB,CADmC,CAEnC;;AACA,cAAI,CAACoG,IAAI,CAACC,IAAL,CAAUC,KAAV,CAAgB,SAAhB,CAAL,EAAiC;AAC7B;AACH,WALkC,CAMnC;;;AACAL,UAAAA,QAAQ,CAACM,MAAT,CAAgB,eAAhB,EAAiCH,IAAjC,EAAuCA,IAAI,CAACI,IAA5C;AACH,SAfwC,CAgBzC;AACA;;;AACA,YAAIC,GAAG,GAAG7C,QAAQ,CAAC8C,aAAT,CAAuB,UAAvB,CAAV;AACAD,QAAAA,GAAG,CAACE,SAAJ,GAAgB/C,QAAQ,CAACgD,cAAT,CAAwB,gBAAxB,EAA0CD,SAA1D;AACAV,QAAAA,QAAQ,CAACM,MAAT,CAAgB,OAAhB,EAAyB3C,QAAQ,CAACgD,cAAT,CAAwB,YAAxB,EAAsCC,KAA/D;AACAZ,QAAAA,QAAQ,CAACM,MAAT,CAAgB,MAAhB,EAAwB,IAAIvB,oBAAJ,GAAkB8B,WAAlB,CAA8BlD,QAAQ,CAACgD,cAAT,CAAwB,YAAxB,EAAsCC,KAApE,CAAxB;AACAZ,QAAAA,QAAQ,CAACM,MAAT,CAAgB,gBAAhB,EAAkCE,GAAG,CAACI,KAAtC;AACAZ,QAAAA,QAAQ,CAACM,MAAT,CAAgB,aAAhB,EAA+B3C,QAAQ,CAACgD,cAAT,CAAwB,WAAxB,EAAqCC,KAApE;AACAZ,QAAAA,QAAQ,CAACM,MAAT,CAAgB,MAAhB,EAAwB3C,QAAQ,CAACgD,cAAT,CAAwB,WAAxB,EAAqCC,KAA7D;AACAZ,QAAAA,QAAQ,CAACM,MAAT,CAAgB,aAAhB,EAA+B3C,QAAQ,CAACgD,cAAT,CAAwB,aAAxB,EAAuCG,YAAvC,CAAoD,aAApD,CAA/B;AACAd,QAAAA,QAAQ,CAACM,MAAT,CAAgB,gBAAhB,EAAkC3C,QAAQ,CAACgD,cAAT,CAAwB,gBAAxB,EAA0CG,YAA1C,CAAuD,aAAvD,CAAlC;AACAd,QAAAA,QAAQ,CAACM,MAAT,CAAgB,kBAAhB,EAAoC3C,QAAQ,CAACgD,cAAT,CAAwB,kBAAxB,EAA4CG,YAA5C,CAAyD,aAAzD,CAApC;AAEA,YAAIC,OAAJ;AACA,YAAIC,aAAJ;;AACA,YAAIlB,IAAJ,EAAU;AACN,cAAImB,MAAM,GAAGtD,QAAQ,CAACgD,cAAT,CAAwB,aAAxB,EAAuCG,YAAvC,CAAoD,SAApD,CAAb;AACAC,UAAAA,OAAO,GAAG,sBAAsBE,MAAhC;AACAD,UAAAA,aAAa,GAAG3F,SAAS,CAACF,YAA1B;AAEH,SALD,MAKO;AACH4F,UAAAA,OAAO,GAAG,eAAV;AACAC,UAAAA,aAAa,GAAG3F,SAAS,CAACH,UAA1B;AACH;;AACDW,QAAAA,IAAI,CAACgE,SAAL,CAAevD,OAAf,CAAuByE,OAAvB,EAAgCC,aAAhC,EAA+C1F,4BAA/C,EAAkEK,4BAAlE,EAAqFqE,QAArF,EACK/B,IADL,CACU,UAACZ,QAAD,EAAc;AAChBjB,UAAAA,OAAO,CAAC;AACJiB,YAAAA,QAAQ,EAARA;AADI,WAAD,CAAP;AAGH,SALL,EAKO6D,KALP,CAKa,UAACC,GAAD,EAAS;AAClB9E,UAAAA,MAAM,CAAC;AACH8E,YAAAA,GAAG,EAAHA;AADG,WAAD,CAAN;AAGH,SATD;AAUH,OAlDM,CAAP;AAmDH;;;iCAEW;AACR,UAAItF,IAAI,GAAG,IAAX;AACA,UAAIoF,MAAM,GAAGtD,QAAQ,CAACgD,cAAT,CAAwB,aAAxB,EAAuCG,YAAvC,CAAoD,SAApD,CAAb;AACA,aAAO,IAAI3E,OAAJ,CAAY,UAASC,OAAT,EAAkBC,MAAlB,EAAyB;AACxCR,QAAAA,IAAI,CAACgE,SAAL,CAAevD,OAAf,CAAuB,sBAAsB2E,MAA7C,EAAqD5F,SAAS,CAACD,YAA/D,EAA6EE,4BAA7E,EAAgGK,4BAAhG,EACKsC,IADL,CACU,UAACZ,QAAD,EAAc;AAChBjB,UAAAA,OAAO,CAAC;AACJiB,YAAAA,QAAQ,EAARA;AADI,WAAD,CAAP;AAGH,SALL,EAKO6D,KALP,CAKa,UAACC,GAAD,EAAS;AAClB9E,UAAAA,MAAM,CAAC;AACH8E,YAAAA,GAAG,EAAHA;AADG,WAAD,CAAN;AAGH,SATD;AAUH,OAXM,CAAP,CAHQ,CAeR;AACH,MACL;AACA;AACA;;;;;;;;;;;;;;;;;;AC1FO,IAAMC,aAAa,GAAG,cAAtB;;AACA,IAAMC,wBAAwB,GAAG,mBAAjC;;AACA,IAAMC,WAAW,GAAG,YAApB;;AACA,IAAMC,aAAa,GAAG,cAAtB;;;IAEDC;;;;eAaS,IAAIA,WAAJ;;;;;;;;;;;;;;;;;IClBTC;;;AAEF;AACA;AACA;AACA,uBAAc;AAAA;AAAE,IAEhB;AACA;AACA;;;;;gCACY;AACR,UAAIC,IAAI,GAAG,IAAIC,IAAJ,CAAS,IAAIA,IAAJ,GAAWC,WAAX,EAAT,EAAmC,IAAID,IAAJ,GAAWE,QAAX,EAAnC,EAA0D,IAAIF,IAAJ,GAAWG,OAAX,EAA1D,EAAgF,IAAIH,IAAJ,GAAWI,QAAX,EAAhF,EAAuG,IAAIJ,IAAJ,GAAWK,UAAX,EAAvG,EAAgI,IAAIL,IAAJ,GAAWM,UAAX,EAAhI,EAAyJ,CAAzJ,EAA4JC,OAA5J,KAAwK,IAAnL;AACA,aAAOR,IAAP;AACH;;;kCAEaS,SAAS;AACnB,UAAIC,IAAI,GAAG,IAAIT,IAAJ,CAASQ,OAAO,GAAG,IAAnB,CAAX;AACA,aAAOC,IAAP;AACH;;;4BAEOhC,MAAMiC,SAAS;AACnB,UAAIC,GAAG,GAAKD,OAAO,IAAI,IAAX,IAAmBA,OAAO,IAAI,EAA/B,GAAqCE,MAAM,CAAC,IAAIZ,IAAJ,CAASU,OAAT,EAAkBG,UAAlB,EAAD,CAA3C,GAA8ED,MAAM,CAAC,IAAIZ,IAAJ,GAAWa,UAAX,EAAD,CAA/F;AACA,UAAIC,KAAK,GAAKJ,OAAO,IAAI,IAAX,IAAmBA,OAAO,IAAI,EAA/B,GAAqCE,MAAM,CAAC,IAAIZ,IAAJ,CAASU,OAAT,EAAkBK,WAAlB,KAAkC,CAAnC,CAA3C,GAAmFH,MAAM,CAAC,IAAIZ,IAAJ,GAAWe,WAAX,KAA2B,CAA5B,CAAtG;AACA,UAAIC,IAAI,GAAKN,OAAO,IAAI,IAAX,IAAmBA,OAAO,IAAI,EAA/B,GAAqCE,MAAM,CAAC,IAAIZ,IAAJ,CAASU,OAAT,EAAkBO,cAAlB,EAAD,CAA3C,GAAkFL,MAAM,CAAC,IAAIZ,IAAJ,GAAWiB,cAAX,EAAD,CAApG;AACA,UAAIC,IAAI,GAAKR,OAAO,IAAI,IAAX,IAAmBA,OAAO,IAAI,EAA/B,GAAqCE,MAAM,CAAC,IAAIZ,IAAJ,CAASU,OAAT,EAAkBS,WAAlB,EAAD,CAA3C,GAA+EP,MAAM,CAAC,IAAIZ,IAAJ,GAAWmB,WAAX,EAAD,CAAjG;AACA,UAAIC,MAAM,GAAKV,OAAO,IAAI,IAAX,IAAmBA,OAAO,IAAI,EAA/B,GAAqCE,MAAM,CAAC,IAAIZ,IAAJ,CAASU,OAAT,EAAkBW,aAAlB,EAAD,CAA3C,GAAiFT,MAAM,CAAC,IAAIZ,IAAJ,GAAWqB,aAAX,EAAD,CAArG;AACA,UAAIb,OAAO,GAAKE,OAAO,IAAI,IAAX,IAAmBA,OAAO,IAAI,EAA/B,GAAqCE,MAAM,CAAC,IAAIZ,IAAJ,CAASU,OAAT,EAAkBY,aAAlB,EAAD,CAA3C,GAAiFV,MAAM,CAAC,IAAIZ,IAAJ,GAAWsB,aAAX,EAAD,CAAtG;AACA,UAAIC,WAAW,GAAKb,OAAO,IAAI,IAAX,IAAmBA,OAAO,IAAI,EAA/B,GAAqCE,MAAM,CAAC,IAAIZ,IAAJ,CAASU,OAAT,EAAkBc,kBAAlB,EAAD,CAA3C,GAAsFZ,MAAM,CAAC,IAAIZ,IAAJ,GAAWwB,kBAAX,EAAD,CAA/G;AACA,UAAIC,MAAM,GAAKf,OAAO,IAAI,IAAX,IAAmBA,OAAO,IAAI,EAA/B,GAAqCE,MAAM,CAAC,IAAIZ,IAAJ,CAASU,OAAT,EAAkBgB,iBAAlB,EAAD,CAA3C,GAAqFd,MAAM,CAAC,IAAIZ,IAAJ,GAAW0B,iBAAX,EAAD,CAAzG;AACA,UAAIf,GAAG,CAACzI,MAAJ,IAAc,CAAlB,EACIyI,GAAG,GAAGC,MAAM,CAAC,MAAMD,GAAP,CAAZ;AACJ,UAAIG,KAAK,CAAC5I,MAAN,IAAgB,CAApB,EACI4I,KAAK,GAAGF,MAAM,CAAC,MAAME,KAAP,CAAd;AACJW,MAAAA,MAAM,GAAGb,MAAM,CAACa,MAAM,GAAG,EAAV,CAAf;AACA,UAAIA,MAAM,CAACvJ,MAAP,IAAiB,CAArB,EACIuJ,MAAM,GAAGb,MAAM,CAAC,MAAMa,MAAP,CAAf;;AACJ,cAAQhD,IAAR;AACI,aAAK,KAAL;AACI,iBAAOkC,GAAP;AACA;;AACJ,aAAK,OAAL;AACI,iBAAOG,KAAP;AACA;;AACJ,aAAK,MAAL;AACI,iBAAOE,IAAP;AACA;;AACJ,aAAK,OAAL;AACI,iBAAOJ,MAAM,CAACI,IAAI,GAAG,GAAP,GAAaF,KAAb,GAAqB,GAArB,GAA2BH,GAA3B,GAAiC,GAAjC,GAAuCO,IAAvC,GAA8C,GAA9C,GAAoDE,MAApD,GAA6D,GAA7D,GAAmEZ,OAAnE,GAA6E,GAA7E,GAAmFe,WAAnF,GAAiG,GAAjG,GAAwGE,MAAzG,CAAb;AACA;;AACJ;AACI,iBAAOb,MAAM,CAACI,IAAI,GAAG,GAAP,GAAaF,KAAb,GAAqB,GAArB,GAA2BH,GAA5B,CAAb;AACA;AAfR;AAiBH,MAED;AACA;AACA;;;;;;;eAGWb;;;;;;;;;AC5Df,IAAM6B,UAAAA,GAAa,CACjB,mBADiB,EAEjB,iBAFiB,EAGjB,kBAHiB,EAIjB,gBAJiB,EAKjB,kBALiB,EAMjB,mBANiB,EAOjB,iBAPiB,EAQjB,gBARiB,EASjB,WATiB,EAUjB,YAViB,EAWjB,UAXiB,EAYjB,YAZiB,EAajB,QAbiB,EAcjB,eAdiB,EAejB,YAfiB,EAgBjB,cAhBiB,EAiBjB,YAjBiB,EAkBjB,aAlBiB,EAmBjB,WAnBiB,EAoBjB,cApBiB,EAqBjB,UArBiB,EAsBjB,WAtBiB,EAuBjB,WAvBiB,EAwBjB,eAxBiB,EAyBjB,aAzBiB,EA0BjB,cA1BiB,EA2BjB,YA3BiB,EA4BjB,WA5BiB,EA6BjB,cA7BiB,EA8BjB,eA9BiB,EA+BjB,YA/BiB,EAgCjB,WAhCiB,EAiCjB,UAjCiB,CAAnB;;;;;;;;;;AA4CA,IAAMC,YAAAA,GAAe,SAAfA,YAAe,CAACC,OAAD,EAAUC,IAAV,EAAmB;;;;MAKhCC,MAAAA,GAAS/F,QAAAA,CAAS8C,aAAT9C,CAAuB,KAAvBA;;;;;;;MAOTgG,SAAAA,GAAY,SAAZA,SAAY,GAAM;QAChBC,GAAAA,GAAM;gBACA,UADA;YAEJ,CAAC,IAFG;WAGL,CAHK;cAIF,CAAC;AAJC;;QAORJ,OAAAA,CAAQK,OAARL,KAAoB,YAAY;iBACvB/J,KAAK;;;eAGPU,QAAQ,UAAC2J,IAAD,EAAU;UACvBA,QAAQC,gBAAAA,CAAiBP,OAAjBO,CAAAA,CAA0BD,IAA1BC;AADd;WAIOH;AAhBT;;;;;;;;;;MA0BMI,UAAAA,GAAa,SAAbA,UAAa,CAACP,IAAD,EAAU;QACrBQ,MAAAA,GAASN,SAAAA;WACRO,KAAKD,QAAQ9J,QAAQ,UAAA,GAAA,EAAO;aAC1BgK,MAAMC,OAAOH,MAAAA,CAAOG,GAAPH;AADtB;WAGOvD,YAAY+C;YACXY,WAAWC,aAAaZ,QAAQF,OAAAA,CAAQe;AANlD;;;;;;;;MAcMC,IAAAA,GAAO,SAAPA,IAAO,GAAM;QACXC,MAAAA,GAASf,MAAAA,CAAOgB,aAAPhB,CAAqB/C,cAArB+C,CAAoC,uBAApCA;QACTiB,YAAAA,GAAe;YACbF,MAAAA,CAAOG,UADM;WAEdH,MAAAA,CAAOI,SAFO;cAGXJ,MAAAA,CAAOK;AAHI;WAKdT,WAAWU,YAAYrB;WAEvBiB;AATT;;aAYWlB;SAEJ;;AAAA;AAlET,CAAA;;;;;;;AC5CA;;;;;;;;;AAOA,IAAauB,iBAAAA,GAAoB,SAApBA,iBAAoB,CAACxB,OAAD,EAAA;SAAa,CAAC,EAC7CA,OAAAA,CAAQyB,eAARzB,IACAA,OAAAA,CAAQyB,eAARzB,KAA4B,MAFiB;AAAxC,CAAP;;;;;;;;;;AAYA,IAAa0B,UAAAA,GAAa,SAAbA,UAAa,GAAmB;MAAlBC,QAAkB,GAAA,SAAA,CAAA,MAAA,GAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAA,SAAA,CAAA,CAAA,CAAA,GAAP;MAC5BC,SADmC,GACED,QADF,CACnCC;MAAWC,MADwB,GACEF,QADF,CACxBE;MAAQC,aADgB,GACEH,QADF,CAChBG;;MACvBD,QAAQ;WACH;oBAAA;cAEGA,MAAAA,CAAOE,aAFV;gBAGKF,MAAAA,CAAOG,eAAPH,IAA0BA,MAAAA,CAAOE,aAAPF,CAAqB1H,QAHpD;kCAAA;;AAAA;;;SASF;kBAAA;sBAAA;gCAAA;;AAAA;AAZF,CAAP;;;;;;;;;;;AA4BA,IAAa8H,SAAAA,GAAY,SAAZA,SAAY,CAACjC,OAAD,EAAUkC,GAAV,EAAkB;MACnCC,GAAAA,GAAMD,GAAAA,IAAOA,GAAAA,CAAIvH,MAAXuH,IAAqBvH;MAC3ByH,GAAAA,GAAMF,GAAAA,IAAOA,GAAAA,CAAI/H,QAAX+H,IAAuB/H;MAC7B6G,IAAAA,GAAOhB,OAAAA,CAAQqC,qBAARrC;MACPsC,KAAAA,GAAQF,GAAAA,CAAIG;MACZC,UAAAA,GAAaL,GAAAA,CAAIM,WAAJN,IAAmBG,KAAAA,CAAME;MACtCE,SAAAA,GAAYP,GAAAA,CAAIQ,WAAJR,IAAmBG,KAAAA,CAAMI;SAEpC;SACA1B,IAAAA,CAAK4B,GAAL5B,GAAW0B,SADX;UAEC1B,IAAAA,CAAK6B,IAAL7B,GAAYwB;AAFb;AARF,CAAP;;;;;;;;;;;;AAqBA,IAAaM,QAAAA,GAAW,SAAXA,QAAW,CAAC1F,KAAD,EAAA;SAAW,CAAA,OAAOA,KAAP,KAAA,WAAA,GAAA,WAAA,GAAA,OAAA,CAAOA,KAAP,CAAA,MAAiB,QAAjB,IAA6BA,KAAAA,KAAU;AAAnE,CAAP;ACjEA;;;;;;;;AAMA,IAAM2F,gBAAAA,GAAmB,SAAnBA,gBAAmB,CAAC/C,OAAD,EAAUkC,GAAV,EAAkB;;;;;;MAOnCc,MAAAA,GAAS,SAATA,MAAS,GAAM;WACZhD,OAAAA,CAAQiD;AADjB;;;;;;;;;;MAWMC,MAAAA,GAAS,SAATA,MAAS,CAACC,GAAD,EAAS;YACdC,kBAAkBD,KAAKA;WAExBnD;AAHT;;;;;;;;;;MAaMiC,YAAAA,GAAY,SAAZA,YAAY,CAACkB,GAAD,EAAS;QACnBnC,IAAAA,GAAOqC,SAAAA,CAAcrD,OAAdqD;QACPC,QAAAA,GAAWC,WAAAA,CAAYJ,GAAZI;WAEV;WACAvC,IAAAA,CAAK4B,GAAL5B,GAAWsC,QAAAA,CAASV,GAApB5B,GAA0BkB,GAAAA,CAAI/H,QAAJ+H,CAAahI,IAAbgI,CAAkBQ,SAD5C;YAEC1B,IAAAA,CAAK6B,IAAL7B,GAAYsC,QAAAA,CAAST,IAArB7B,GAA4BkB,GAAAA,CAAI/H,QAAJ+H,CAAahI,IAAbgI,CAAkBM,UAF/C;cAGGc,QAAAA,CAASE;AAHZ;AAJT;;;;;;;;;;MAkBMD,WAAAA,GAAc,SAAdA,WAAc,CAACJ,GAAD,EAAS;QACrBM,MAAAA,GAAS,SAATA,MAAS,CAACC,GAAD,EAAS;UAClBtG,KAAAA,GAAQsG,GAAAA,CAAIhI,OAAJgI,CAAY,YAAZA,EAA0B,GAA1BA,EACThI,OADSgI,CACD,aADCA,EACa,OADbA;aAELtG;AAHT;;QAMI8E,GAAAA,CAAIN,SAAJM,IAAiBA,GAAAA,CAAIN,SAAJM,KAAkB,GAAG;YAClCA,GAAAA,CAAIN;;;QAGN0B,QAAAA,GAAWH,GAAAA,KAAQQ,SAARR,GAAoBH,MAAAA,EAApBG,GAA+BA;QAC1CS,UAAAA,GAAa5D,OAAAA,CAAQ5C,KAAR4C,CAAc6D,KAAd7D,CAAoB,CAApBA,EAAuBsD,QAAvBtD;QACb8D,QAAAA,GAAW9D,OAAAA,CAAQ5C,KAAR4C,CAAc6D,KAAd7D,CAAoBsD,QAApBtD;QACbC,IAAAA,GAAAA,wDAA6DwD,MAAAA,CAAOG,UAAPH,CAA7DxD,GAAA;YACI;oEACsDwD,MAAAA,CAAOK,QAAPL,IAA9D;QAEMvD,MAAAA,GAASH,YAAAA,CAAaC,OAAbD,EAAsBE,IAAtBF;QACTiB,IAAAA,GAAOd,MAAAA,CAAOc,IAAPd;SACRiD,MAAMH,MAAAA;WAEJhC;AAtBT;;SAyBO;kBAAA;kBAAA;2BAAA;;AAAA;AA1ET,CAAA;ACTA;;;;;;;;;AAOA,IAAM+C,mBAAAA,GAAsB,SAAtBA,mBAAsB,CAAC/D,OAAD,EAAUkC,GAAV,EAAkB;;;;;;;;MAStCgB,MAAAA,GAAS,SAATA,MAAS,CAACC,GAAD,EAAS;QAChBa,GAAAA,GAAM9B,GAAAA,CAAIvH,MAAJuH,CAAW+B,YAAX/B;;QACR8B,KAAK;UACHpE,MAAAA,GAAS;UACTsE,KAAAA,GAAQ;;UACNC,IAAAA,GAAO,SAAPA,IAAO,CAACb,QAAD,EAAWc,MAAX,EAAsB;aAC5B,IAAI7N,CAAAA,GAAI,GAAGA,CAAAA,GAAI6N,MAAAA,CAAOC,UAAPD,CAAkB/N,QAAQE,CAAAA,IAAK;cAC3C+N,IAAAA,GAAOF,MAAAA,CAAOC,UAAPD,CAAkB7N,CAAlB6N;;cACTF,OAAO;;;;cAGPI,IAAAA,CAAKC,QAALD,KAAkB,GAAG;gBACnB1E,MAAAA,GAAS0E,IAAAA,CAAKjO,MAAduJ,IAAwB0D,UAAU;sBAC5B;kBACFkB,KAAAA,GAAQtC,GAAAA,CAAI/H,QAAJ+H,CAAauC,WAAbvC;oBACRwC,SAASJ,MAAMhB,QAAAA,GAAW1D;kBAC5B+E;kBACAC,SAASJ;;AALf,mBAOO;wBACKF,IAAAA,CAAKjO;;AATnB,iBAWO;iBACA8M,KAAKmB;;;AAlBhB;;WAsBKnB,KAAKnD;;;WAGLA;AA9BT;;;;;;;;MAsCMiC,SAAAA,GAAY,SAAZA,SAAY,GAAM;QAChBuC,KAAAA,GAAQK,QAAAA;QACVjF,MAAAA,GAAS;cACH,CADG;YAEL,CAFK;aAGJ;AAHI;;QAMT,CAAC4E,OAAO;aACH5E;;;QAGHkF,YAAAA,GAAe5C,GAAAA,CAAIN,SAAJM,IAAiBA,GAAAA,CAAIN,SAAJM,KAAkB,EAZlC;;;QAgBjBsC,KAAAA,CAAMO,SAANP,GAAkB,CAAlBA,GAAsB,CAAtBA,IAA2BA,KAAAA,CAAMQ,YAANR,KAAuBxE,OAAlDwE,IAA8DM,cAAc;UACzEG,WAAAA,GAAcT,KAAAA,CAAMU,UAANV;UACdW,aAAAA,GAAgBL,YAAAA,GAAe5C,GAAAA,CAAIN,SAAnBkD,GAA+BN,KAAAA,CAAMO;kBAC/CL,SAASF,KAAAA,CAAMQ,cAAcG,aAAAA,GAAgB,CAAhBA,GAAoB,CAApBA,GAAwB,CAAxBA,GAA4BA,aAAAA,GAAgB;kBACzEC,OAAOZ,KAAAA,CAAMQ,cAAcG;UACjCnE,IAAAA,GAAOiE,WAAAA,CAAY5C,qBAAZ4C;eACJ;gBACCjE,IAAAA,CAAKwC,MADN;cAEDxC,IAAAA,CAAK6B,IAAL7B,GAAYA,IAAAA,CAAKqE,KAFhB;aAGFrE,IAAAA,CAAK4B;AAHH;kBAKG0C;;;QAGV,CAAC,CAAC1F,MAAD,IAAYA,MAAAA,IAAUA,MAAAA,CAAO4D,MAAP5D,KAAkB,CAAzC,KAAgD,CAACsC,GAAAA,CAAIJ,eAAe;UAChEmD,YAAAA,GAAcT,KAAAA,CAAMU,UAANV;;UACde,WAAAA,GAAcrD,GAAAA,CAAI/H,QAAJ+H,CAAasD,cAAbtD,CAA4B,GAA5BA;;mBACRuD,WAAWF;;mBACXG,WAAWH;;UACjBvE,KAAAA,GAAOiE,YAAAA,CAAY5C,qBAAZ4C;;eACJ;gBACCjE,KAAAA,CAAKwC,MADN;cAEDxC,KAAAA,CAAK6B,IAFJ;aAGF7B,KAAAA,CAAK4B;AAHH;kBAKG/B,WAAWU,YAAYgE;;mBACvBD;;;QAGV1F,QAAQ;UACJwC,GAAAA,GAAMF,GAAAA,CAAI/H,QAAJ+H,CAAaK;aAClBK,OAAOV,GAAAA,CAAIvH,MAAJuH,CAAWS,WAAXT,IAA0BE,GAAAA,CAAIuD,SAAJvD,IAAiB,CAA3CF;aACPW,QAAQX,GAAAA,CAAIvH,MAAJuH,CAAWO,WAAXP,IAA0BE,GAAAA,CAAIwD,UAAJxD,IAAkB,CAA5CF;;;WAGVtC;AAnDT;;;;;;;;MA2DM2D,WAAAA,GAAc,SAAdA,WAAc,GAAM;QAClB3D,MAAAA,GAASqC,SAAAA;QACTkB,GAAAA,GAAMH,MAAAA;QACNhC,IAAAA,GAAOhB,OAAAA,CAAQqC,qBAARrC;QACP6F,WAAAA,GAAc;WACb7E,IAAAA,CAAK4B,GAAL5B,GAAWkB,GAAAA,CAAI/H,QAAJ+H,CAAahI,IAAbgI,CAAkBQ,SADhB;YAEZ1B,IAAAA,CAAK6B,IAAL7B,GAAYkB,GAAAA,CAAI/H,QAAJ+H,CAAahI,IAAbgI,CAAkBM;AAFlB;WAIbK,QAAQgD,WAAAA,CAAYhD;WACpBD,OAAOiD,WAAAA,CAAYjD;WACnBO,MAAMA;WAENvD;AAZT;;;;;;;;MAoBMiF,QAAAA,GAAW,SAAXA,QAAW,GAAM;QACjB,CAAC3C,GAAAA,CAAIvH,MAAJuH,CAAW+B,cAAc;;;;QAGxBD,GAAAA,GAAM9B,GAAAA,CAAIvH,MAAJuH,CAAW+B,YAAX/B;WAEL8B,GAAAA,CAAI8B,UAAJ9B,GAAiB,CAAjBA,GAAqBA,GAAAA,CAAI+B,UAAJ/B,CAAe,CAAfA,CAArBA,GAAyC;AANlD;;;;;;;;MAcMhB,MAAAA,GAAS,SAATA,MAAS,GAAM;QACbwB,KAAAA,GAAQK,QAAAA;QACRI,WAAAA,GAAcT,KAAAA,CAAMU,UAANV;gBACRwB,mBAAmBhG;gBACnBoF,OAAOZ,KAAAA,CAAMQ,cAAcR,KAAAA,CAAMO;QACvC5B,GAAAA,GAAM8B,WAAAA,CAAYlJ,QAAZkJ,GAAuB5O;gBACvBiP;WAELnC;AART;;SAWO;kBAAA;kBAAA;4BAAA;wBAAA;;AAAA;AAvJT,CAAA;;ACGA,IAAM8C,WAAAA,GAAc,SAAdA,WAAc,CAACjG,OAAD,EAAUkC,GAAV,EAAkB;MAChCV,iBAAAA,CAAkBxB,OAAlBwB,GAA4B;WACvBuC,mBAAAA,CAAoB/D,OAApB+D,EAA6B7B,GAA7B6B;;;SAGFhB,gBAAAA,CAAiB/C,OAAjB+C,EAA0Bb,GAA1Ba;AALT,CAAA;;AAQA,IAAaO,QAAAA,GAAW,SAAXA,QAAW,CAACtD,OAAD,EAAU5C,KAAV,EAAmC;MAAlBuE,QAAkB,GAAA,SAAA,CAAA,MAAA,GAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAA,SAAA,CAAA,CAAA,CAAA,GAAP;MAC9CuE,OAAAA,GAAUvE;;MACVmB,QAAAA,CAAS1F,KAAT0F,GAAiB;cACT1F;YACF;;;MAEJ8E,GAAAA,GAAMR,UAAAA,CAAWwE,OAAXxE;MACNyE,KAAAA,GAAQF,WAAAA,CAAYjG,OAAZiG,EAAqB/D,GAArB+D;;MAEV7I,KAAAA,IAASA,KAAAA,KAAU,GAAG;WACjB+I,KAAAA,CAAMjD,MAANiD,CAAa/I,KAAb+I;;;SAGFA,KAAAA,CAAM5C,WAAN4C;AAbF,CAAP;;;;;;;;;;;AAsBA,IAAavG,MAAAA,GAAS,SAATA,MAAS,CAACI,OAAD,EAAU5C,KAAV,EAAmC;MAAlBuE,QAAkB,GAAA,SAAA,CAAA,MAAA,GAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAA,SAAA,CAAA,CAAA,CAAA,GAAP;MAC5CuE,OAAAA,GAAUvE;;MACVmB,QAAAA,CAAS1F,KAAT0F,GAAiB;cACT1F;YACF;;;MAGJ8E,GAAAA,GAAMR,UAAAA,CAAWwE,OAAXxE;MACNyE,KAAAA,GAAQF,WAAAA,CAAYjG,OAAZiG,EAAqB/D,GAArB+D;SACPE,KAAAA,CAAMlE,SAANkE,CAAgB/I,KAAhB+I;AATF,CAAP;;;;;;;;;;;ACxCA;;AACA;;AACA;;AAKA;;AACA;;;;;;;;;;;;;;;;;;;;;;;;IAEMC;;;;;AAEF;AACA;AACA;AACA,sBAAYC,UAAZ,EAAwBC,WAAxB,EAAqC;AAAA;;AAAA;;AACjC;AACAC,IAAAA,IAAI,CAACC,sBAAL,GAFiC,CAGjC;;AACA,UAAKC,SAAL,GAAiB,IAAIxI,kBAAJ,EAAjB;AACA,UAAKoI,UAAL,GAAkBA,UAAlB;AACA,UAAKK,QAAL,GAAgBJ,WAAhB;AACA,UAAKK,QAAL,GAAgB,IAAhB;AACA,UAAKhN,GAAL,GAAW,EAAX;;AACA,QAAItB,IAAI,wDAAR;;AACA,UAAKuO,SAAL;;AAEAjM,IAAAA,MAAM,CAACkM,gBAAP,CAAwB,QAAxB,EAAkC,UAAAC,CAAC,EAAI;AACnC,UAAIJ,QAAQ,GAAG,MAAKA,QAApB;;AACA,UAAI/L,MAAM,CAACgI,WAAP,IAAsB+D,QAA1B,EAAoC;AAChCvM,QAAAA,QAAQ,CAACgD,cAAT,CAAwB,cAAxB,EAAwCwD,KAAxC,CAA8C2C,QAA9C,GAAyD,OAAzD;AACH,OAFD,MAEO;AACHnJ,QAAAA,QAAQ,CAACgD,cAAT,CAAwB,cAAxB,EAAwCwD,KAAxC,CAA8C2C,QAA9C,GAAyD,UAAzD;AACH;AACJ,KAPD;;AAQA,UAAKyD,OAAL;;AApBiC;AAqBpC,IACD;AACA;AACA;;;;;gCACY;AAAA;;AACR,UAAI1O,IAAI,GAAG,IAAX;AACA,UAAI2O,aAAa,GAAG7M,QAAQ,CAAC8M,gBAAT,CAA0B,gBAA1B,CAApB;;AACA,WAAK,IAAI1Q,CAAC,GAAG,CAAR,EAAWF,MAAM,GAAG2Q,aAAa,CAAC3Q,MAAvC,EAA+CE,CAAC,GAAGF,MAAnD,EAA2DE,CAAC,EAA5D,EAAgE;AAC5DyQ,QAAAA,aAAa,CAACzQ,CAAD,CAAb,CAAiBsQ,gBAAjB,CAAkC,OAAlC,EAA2C,UAAAxN,CAAC;AAAA,iBAAI,MAAI,CAAC6N,kBAAL,CAAwB7N,CAAxB,CAAJ;AAAA,SAA5C,EAA4E,KAA5E;AACH;;AACD,WAAKgN,UAAL,CAAgBQ,gBAAhB,CAAiC,OAAjC,EAA0C,UAAAC,CAAC,EAAI;AAC3C,YAAGA,CAAC,CAACK,SAAF,IAAe,iBAAlB,EACA;AACI,cAAIhB,KAAK,GAAG,wBAAS9N,IAAI,CAACgO,UAAd,EAA0BlD,GAA1B,GAA8B,CAA1C;AACA,cAAIiE,OAAO,GAAGb,IAAI,CAACc,SAAL,CAAe,UAAf,EAA2BhP,IAAI,CAACgO,UAAL,CAAgBiB,SAA3C,EAAsDlK,KAApE;AACA,cAAImK,IAAI,GAAGpN,QAAQ,CAAC8C,aAAT,CAAuB,KAAvB,CAAX;AACAsK,UAAAA,IAAI,CAACD,SAAL,GAAiBF,OAAjB;AACA/O,UAAAA,IAAI,CAACgO,UAAL,CAAgBnJ,SAAhB,GAA4BqK,IAAI,CAACD,SAAjC;AACA,kCAASjP,IAAI,CAACgO,UAAd,EAA0BF,KAA1B;AACH,SARD,MAQK;AACD9N,UAAAA,IAAI,CAAC0O,OAAL;AACH;AACJ,OAZD;AAaH;;;8BACS;AACN,UAAIZ,KAAK,GAAG,wBAAS,KAAKE,UAAd,EAA0BlD,GAAtC;AACA,UAAIiE,OAAO,GAAGb,IAAI,CAACc,SAAL,CAAe,UAAf,EAA2B,KAAKhB,UAAL,CAAgBiB,SAA3C,EAAsDlK,KAApE;AACA,UAAImK,IAAI,GAAGpN,QAAQ,CAAC8C,aAAT,CAAuB,KAAvB,CAAX;AACAsK,MAAAA,IAAI,CAACD,SAAL,GAAiBF,OAAjB;AACA,WAAKf,UAAL,CAAgBnJ,SAAhB,GAA4BqK,IAAI,CAACD,SAAjC;AACA,8BAAS,KAAKjB,UAAd,EAA0BF,KAA1B;AACH;;;2BAEMvJ,MAAM4K,MAAM;AACf,cAAQ5K,IAAR;AACI,aAAK/E,SAAS,CAACF,YAAf;AACIwC,UAAAA,QAAQ,CAACgD,cAAT,CAAwB,eAAxB,EAAyCsK,SAAzC,CAAmDC,GAAnD,CAAuD,WAAvD;AACAvN,UAAAA,QAAQ,CAACgD,cAAT,CAAwB,aAAxB,EAAuCsK,SAAvC,CAAiDE,MAAjD,CAAwD,WAAxD;AACAxN,UAAAA,QAAQ,CAACgD,cAAT,CAAwB,aAAxB,EAAuCsK,SAAvC,CAAiDE,MAAjD,CAAwD,cAAxD;AACAxN,UAAAA,QAAQ,CAACgD,cAAT,CAAwB,aAAxB,EAAuCsK,SAAvC,CAAiDC,GAAjD,CAAqD,aAArD;AACAE,UAAAA,UAAU,CAAC,UAAAd,CAAC,EAAI;AACZ3M,YAAAA,QAAQ,CAACgD,cAAT,CAAwB,eAAxB,EAAyCsK,SAAzC,CAAmDE,MAAnD,CAA0D,WAA1D;AACAxN,YAAAA,QAAQ,CAACgD,cAAT,CAAwB,aAAxB,EAAuCsK,SAAvC,CAAiDC,GAAjD,CAAqD,WAArD;AACAvN,YAAAA,QAAQ,CAACgD,cAAT,CAAwB,aAAxB,EAAuCsK,SAAvC,CAAiDC,GAAjD,CAAqD,cAArD;AACAvN,YAAAA,QAAQ,CAACgD,cAAT,CAAwB,aAAxB,EAAuCsK,SAAvC,CAAiDE,MAAjD,CAAwD,aAAxD;AACH,WALS,EAKP,IALO,CAAV;AAOA;;AACJ,aAAK9P,SAAS,CAACH,UAAf;AACI;AACA;;AACJ,aAAKsG,WAAW,CAACH,wBAAjB;AACI,kCAAS,KAAKwI,UAAd,EAA0B,KAAKM,QAA/B;AACA,cAAI3C,GAAJ,EAASQ,KAAT,EAAgBqD,MAAhB;AACA7D,UAAAA,GAAG,GAAGrJ,MAAM,CAACsJ,YAAP,EAAN,CAHJ,CAGiC;AAC7B;;AACA,cAAID,GAAG,CAAC8B,UAAR,EAAoB;AAChBtB,YAAAA,KAAK,GAAGR,GAAG,CAAC+B,UAAJ,CAAe,CAAf,CAAR;AACA8B,YAAAA,MAAM,GAAG7D,GAAG,CAAC+B,UAAJ,CAAe,CAAf,EAAkBhK,QAAlB,EAAT;AACAyI,YAAAA,KAAK,CAACsD,cAAN;AACAtD,YAAAA,KAAK,CAACiB,UAAN,CAAiBtL,QAAQ,CAACqL,cAAT,CAAwB,uBAAuBgC,IAAvB,GAA8B,iBAAtD,CAAjB;AACH;;AACD,eAAKT,OAAL;AACA;AA7BR;AA+BH,MAED;AACA;AACA;;;;uCACmB1N,GAAG;AAClBA,MAAAA,CAAC,CAAC0O,cAAF;AACA,UAAI1P,IAAI,GAAG,IAAX;AACA,UAAI2L,GAAJ,EAASQ,KAAT,EAAgBqD,MAAhB;AACA7D,MAAAA,GAAG,GAAGrJ,MAAM,CAACsJ,YAAP,EAAN,CAJkB,CAIW;;AAC7B,UAAID,GAAG,CAAC8B,UAAR,EAAoB;AAChBtB,QAAAA,KAAK,GAAGR,GAAG,CAAC+B,UAAJ,CAAe,CAAf,CAAR;AACA8B,QAAAA,MAAM,GAAG7D,GAAG,CAAC+B,UAAJ,CAAe,CAAf,EAAkBhK,QAAlB,EAAT;AACAyI,QAAAA,KAAK,CAACsD,cAAN;;AACA,gBAAQzO,CAAC,CAAC2O,MAAF,CAASC,EAAjB;AACI,eAAK,WAAL;AACIzD,YAAAA,KAAK,CAACiB,UAAN,CAAiBtL,QAAQ,CAACqL,cAAT,CAAwB,OAAOqC,MAAP,GAAgB,IAAxC,CAAjB;AACA;;AACJ,eAAK,aAAL;AACIrD,YAAAA,KAAK,CAACiB,UAAN,CAAiBtL,QAAQ,CAACqL,cAAT,CAAwB,MAAMqC,MAAN,GAAe,GAAvC,CAAjB;AACA;;AACJ,eAAK,oBAAL;AACIrD,YAAAA,KAAK,CAACiB,UAAN,CAAiBtL,QAAQ,CAACqL,cAAT,CAAwB,UAAUqC,MAAV,GAAmB,QAA3C,CAAjB;AACA;;AACJ,eAAK,cAAL;AACIrD,YAAAA,KAAK,CAACiB,UAAN,CAAiBtL,QAAQ,CAACqL,cAAT,CAAwB,OAAOqC,MAA/B,CAAjB;AACA;;AACJ,eAAK,cAAL;AACIrD,YAAAA,KAAK,CAACiB,UAAN,CAAiBtL,QAAQ,CAACqL,cAAT,CAAwB,QAAQqC,MAAhC,CAAjB;AACA;;AACJ,eAAK,cAAL;AACIrD,YAAAA,KAAK,CAACiB,UAAN,CAAiBtL,QAAQ,CAACqL,cAAT,CAAwB,SAASqC,MAAjC,CAAjB;AACA;;AACJ,eAAK,YAAL;AACI,iBAAKlB,QAAL,GAAgB,wBAAS,KAAKN,UAAd,EAA0BlD,GAA1C;AACA,iBAAK+E,SAAL,CAAelK,WAAW,CAACH,wBAA3B;AACA;;AACJ,eAAK,aAAL;AACA,eAAK,WAAL;AACI,iBAAKqK,SAAL,CAAelK,WAAW,CAACF,WAA3B;AACA;;AACJ,eAAK,eAAL;AACA,eAAK,aAAL;AACI,iBAAKoK,SAAL,CAAelK,WAAW,CAACD,aAA3B;AACJ;;AACA,eAAK,WAAL;AACIyG,YAAAA,KAAK,CAACiB,UAAN,CAAiBtL,QAAQ,CAACqL,cAAT,CAAwB,MAAMqC,MAAN,GAAe,mBAAvC,CAAjB;AACA;;AACJ,eAAK,aAAL;AACI,iBAAKK,SAAL,CAAelK,WAAW,CAACJ,aAA3B;AACA;;AACJ;AACI;AACA;AAvCR;AAyCH;;AACD,WAAKmJ,OAAL;AACH;;;;EApJoBtR;;eAsJV2Q;;;;;AChKf;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;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;AA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","file":"dash.min.map","sourceRoot":"../../src/com","sourcesContent":["class EventEmitter\n{\n\n //--------------------------\n // constructor\n //--------------------------\n constructor()\n {\n this.listeners = new Map();\n }\n //--------------------------\n // methods\n //--------------------------\n addListener(label, callback) {\n this.listeners.has(label) || this.listeners.set(label, []);\n this.listeners.get(label).push(callback);\n }\n\n removeListener(label, callback) {\n var isFunction = function(obj) {\n return typeof obj == 'function' || false;\n };\n\n var listeners = this.listeners.get(label),\n index;\n\n if (listeners && listeners.length) {\n index = listeners.reduce((i, listener, index) => {\n return (isFunction(listener) && listener === callback)\n ? i = index\n : i;\n }, -1);\n\n if (index > -1) {\n listeners.splice(index, 1);\n this.listeners.set(label, listeners);\n return true;\n }\n }\n return false;\n }\n\n emitEvent(label, ...args) {\n var listeners = this.listeners.get(label);\n if (listeners && listeners.length) {\n listeners.forEach((listener) => {\n listener(...args);\n });\n return true;\n }\n return false;\n }\n //--------------------------\n // event handlers\n //--------------------------\n}\nexport default EventEmitter\n","export const REQUEST_GOOD = 'requestGood';\nexport const REQUEST_LAME = 'requestLame';\nexport const IMG_REQUEST_GOOD = 'imgRequestGood';\nexport const IMG_REQUEST_LAME = 'imgRequestLame';\nexport const SETTINGS_LOADED = 'dataLoaded';\nexport const HTML_LOADED = 'htmlLoaded';\nexport const ARCHIVES_JSON_LOADED = 'archivesJSONLoaded';\nexport const ARCHIVES_PAGE_LOADED = 'archivesPAGELoaded';\nexport const ARCHIVES_ENTRY_LOADED = 'archivesEntryLoaded';\nexport const PROJECT_UPDATED = 'projectUpdated';\nexport const PROJECT_ADDED = 'projectAdded';\nexport const PROJECTS_SORTED = 'projectsSorted';\nexport const POST_IMAGE_ADDED = 'postImageAdded';\nexport const POST_ERROR = 'postError';\nexport const POST_ADDED = 'postAdded';\nexport const POST_UPDATED = 'postUpdated';\nexport const POST_DELETED = 'postImageAdded';\n\nclass DataEvent\n{\n\n //--------------------------\n // methods\n //--------------------------\n\n\n\n //--------------------------\n // event handlers\n //--------------------------\n}\nexport default new DataEvent\n","export const REQUEST_TYPE_POST = \"POST\";\nexport const REQUEST_TYPE_GET = \"GET\";\nexport const REQUEST_TYPE_PUT = \"PUT\";\nexport const REQUEST_TYPE_DELETE = \"DELETE\";\nexport const CONTENT_TYPE_JSON = 'json';\nexport const CONTENT_TYPE_FORM = 'x-www-form-urlencoded';\nimport EventEmitter from '../events/EventEmitter.jsx';\nimport * as DataEvent from '../events/DataEvent.jsx';\nclass DataUtils extends EventEmitter {\n //--------------------------\n // constructor\n //--------------------------\n constructor() {\n super();\n var self = this;\n }\n //--------------------------\n // methods\n //--------------------------\n request(requestURL, eventType, requestType = REQUEST_TYPE_GET, contentType = CONTENT_TYPE_JSON, requestData = null) {\n var self = this;\n return new Promise(function(resolve, reject) {\n var request = new XMLHttpRequest();\n request.upload.onprogress = self.handleLoadProgress;\n request.open(requestType, requestURL, true);\n request.onload = function(e) {\n if (request.status == 200) {\n resolve({\n request,\n eventType\n });\n } else {\n reject({\n request,\n eventType\n });\n }\n ;\n };\n if (requestType == REQUEST_TYPE_PUT || requestType == REQUEST_TYPE_POST) {\n switch (contentType) {\n case CONTENT_TYPE_JSON:\n request.setRequestHeader(\"Content-type\", \"application/\" + contentType);\n request.send(JSON.stringify(requestData));\n break;\n case CONTENT_TYPE_FORM:\n request.send(requestData);\n break;\n }\n } else {\n request.send();\n }\n })\n }\n imgLoad(url) {\n 'use strict';\n // Create new promise with the Promise() constructor;\n // This has as its argument a function with two parameters, resolve and reject\n return new Promise(function(resolve, reject) {\n // Standard XHR to load an image\n var request = new XMLHttpRequest();\n request.open('GET', url);\n request.responseType = 'blob';\n // When the request loads, check whether it was successful\n request.onload = function() {\n if (request.status === 200) {\n // If successful, resolve the promise by passing back the request response\n resolve(request.response);\n } else {\n // If it fails, reject the promise with a error message\n reject(new Error('Image didn\\'t load successfully; error code:' + request.statusText));\n }\n };\n request.onerror = function() {\n // Also deal with the case when the entire request fails to begin with\n // This is probably a network error, so reject the promise with an appropriate message\n reject(new Error('There was a network error.'));\n };\n // Send the request\n request.send();\n });\n }\n loadImage(src) {\n 'use strict';\n let self = this;\n return new Promise(function(resolve, reject) {\n // Get a reference to the body element, and create a new image object\n var body = document.querySelector('body'),\n myImage = new Image();\n myImage.crossOrigin = \"\"; // or \"anonymous\"\n // Call the function with the URL we want to load, but then chain the\n // promise then() method on to the end of it. This contains two callbacks\n self.imgLoad(src).then(function(response) {\n // The first runs when the promise resolves, with the request.reponse specified within the resolve() method.\n var imageURL = window.URL.createObjectURL(response);\n resolve(imageURL);\n //$('background-content').setStyle('background-image', 'url('+imageURL+')') //myImage.src = imageURL;\n //console.log(imageURL);\n //body.appendChild(myImage);\n // The second runs when the promise is rejected, and logs the Error specified with the reject() method.\n }, function(Error) {\n reject(Error)\n });\n });\n }\n //--------------------------\n // event handlers\n //--------------------------\n handleLoadProgress(e) {\n var percentComplete = Math.ceil((e.loaded / e.total) * 100);\n //console.log(percentComplete);\n }\n}\nexport default DataUtils;\n","import EventEmitter from '../events/EventEmitter.jsx';;\n\nclass Animate extends EventEmitter {\n //--------------------------\n // constructor\n //--------------------------\n constructor() {\n super();\n }\n //--------------------------\n // methods\n //--------------------------\n object(properties) {\n var animation = anime(\n properties\n );\n //animation.start(properties);\n }\n //--------------------------\n // event handlers\n //--------------------------\n}\nexport default Animate\n","class StringUtils\n{\n\n //--------------------------\n // constructor\n //--------------------------\n constructor()\n {}\n //--------------------------\n // methods\n //--------------------------\n cleanString(string)\n {\n var clean = string.replace(/(^\\-+|[^a-zA-Z0-9\\/_| -]+|\\-+$)/g, '').toLowerCase().replace(/[\\/_| -]+/g, '-');\n return clean;\n }\n\n decodeHTML(string, quote_style) {\n var optTemp = 0,\n i = 0,\n noquotes = false;\n if (typeof quote_style === 'undefined') {\n quote_style = 2;\n }\n string = string.toString().replace(/</g, '<').replace(/>/g, '>');\n var OPTS = {\n 'ENT_NOQUOTES': 0,\n 'ENT_HTML_QUOTE_SINGLE': 1,\n 'ENT_HTML_QUOTE_DOUBLE': 2,\n 'ENT_COMPAT': 2,\n 'ENT_QUOTES': 3,\n 'ENT_IGNORE': 4\n };\n if (quote_style === 0) {\n noquotes = true;\n }\n if (typeof quote_style !== 'number') { // Allow for a single string or an array of string flags\n quote_style = [].concat(quote_style);\n for (i = 0; i < quote_style.length; i++) {\n // Resolve string input to bitwise e.g. 'PATHINFO_EXTENSION' becomes 4\n if (OPTS[quote_style[i]] === 0) {\n noquotes = true;\n } else if (OPTS[quote_style[i]]) {\n optTemp = optTemp | OPTS[quote_style[i]];\n }\n }\n quote_style = optTemp;\n }\n if (quote_style & OPTS.ENT_HTML_QUOTE_SINGLE) {\n string = string.replace(/*39;/g, \"'\"); // PHP doesn't currently escape if more than one 0, but it should\n // string = string.replace(/'|*27;/g, \"'\"); // This would also be useful here, but not a part of PHP\n }\n if (!noquotes) {\n string = string.replace(/"/g, '\"');\n }\n // Put this in last place to avoid escape being double-decoded\n string = string.replace(/&/g, '&');\n return string;\n }\n\n //--------------------------\n // event handlers\n //--------------------------\n}\nexport default StringUtils\n","import DataUtils, { REQUEST_TYPE_GET, REQUEST_TYPE_PUT, REQUEST_TYPE_POST, REQUEST_TYPE_DELETE, CONTENT_TYPE_JSON, CONTENT_TYPE_FORM } from '../tools/utilities/DataUtils';\nimport * as DataEvent from '../tools/events/DataEvent';\nimport StringUtils from '../tools/utilities/StringUtils';\nclass PostActions {\n //--------------------------\n // constructor\n //--------------------------\n constructor() {\n var folio = [];\n this.dataUtils = new DataUtils();\n }\n //--------------------------\n // methods\n //--------------------------\n start() {}\n\n submitPost(edit, uploadFiles) {\n let self = this;\n return new Promise(function(resolve, reject) {\n //collect form data\n //if(!this.validateForm())\n var postData = new FormData();\n //let projectImages = document.getElementById('projectImages');\n //var fileSelect = projectImages;\n var files = uploadFiles;\n for (var i = 0; i < files.length; i++) {\n var file = files[i];\n // Check the file type.\n if (!file.type.match('image.*')) {\n continue;\n }\n // Add the file to the request.\n postData.append('feature_image', file, file.name);\n }\n //var category = document.getElementById(\"content_category\");\n //let project_form = document.forms.namedItem(\"folio-project\");\n var txt = document.createElement(\"textarea\");\n txt.innerHTML = document.getElementById('edit-post-text').innerHTML;\n postData.append(\"title\", document.getElementById('post_title').value);\n postData.append('slug', new StringUtils().cleanString(document.getElementById('post_title').value));\n postData.append(\"post_plaintext\", txt.value);\n postData.append(\"origin_date\", document.getElementById('post-date').value);\n postData.append(\"tags\", document.getElementById('post_tags').value);\n postData.append(\"status_page\", document.getElementById('option-page').getAttribute('data-active'));\n postData.append(\"status_feature\", document.getElementById('option-feature').getAttribute('data-active'));\n postData.append(\"status_published\", document.getElementById('option-published').getAttribute('data-active'));\n\n let postURL;\n let postEventType;\n if (edit) {\n let postID = document.getElementById('edit-update').getAttribute('data-id');\n postURL = \"/api/post/update/\" + postID;\n postEventType = DataEvent.POST_UPDATED;\n \n } else {\n postURL = \"/api/post/add\";\n postEventType = DataEvent.POST_ADDED;\n }\n self.dataUtils.request(postURL, postEventType, REQUEST_TYPE_POST, CONTENT_TYPE_FORM, postData)\n .then((response) => {\n resolve({\n response\n })\n }).catch((err) => {\n reject({\n err\n });\n })\n });\n }\n\n deletePost(){\n let self = this;\n let postID = document.getElementById('edit-update').getAttribute('data-id');\n return new Promise(function(resolve, reject){\n self.dataUtils.request(\"/api/post/delete/\" + postID, DataEvent.POST_DELETED, REQUEST_TYPE_POST, CONTENT_TYPE_FORM)\n .then((response) => {\n resolve({\n response\n })\n }).catch((err) => {\n reject({\n err\n });\n })\n })\n //this.dataUtils.re\n }\n//--------------------------\n// event handlers\n//--------------------------\n}\nexport { PostActions as default }\n","export const EDITOR_DELETE = 'editorDelete';\nexport const EDITOR_UPLOAD_POST_IMAGE = 'editorUploadImage';\nexport const EDITOR_SAVE = 'editorSave';\nexport const EDITOR_UPDATE = 'editorUpdate';\n\nclass EditorEvent\n{\n\n //--------------------------\n // methods\n //--------------------------\n\n\n\n //--------------------------\n // event handlers\n //--------------------------\n}\nexport default new EditorEvent\n","class DateUtils {\n\n //--------------------------\n // constructor\n //--------------------------\n constructor() {}\n\n //--------------------------\n // methods\n //--------------------------\n getMKtime() {\n var time = new Date(new Date().getFullYear(), new Date().getMonth(), new Date().getDate(), new Date().getHours(), new Date().getMinutes(), new Date().getSeconds(), 0).getTime() / 1000;\n return time;\n }\n\n convertMKtime(seconds) {\n var date = new Date(seconds * 1000);\n return date;\n }\n\n getDate(type, rawdate) {\n var day = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCDate()) : String(new Date().getUTCDate()));\n var month = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCMonth() + 1) : String(new Date().getUTCMonth() + 1));\n var year = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCFullYear()) : String(new Date().getUTCFullYear()));\n var hour = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCHours()) : String(new Date().getUTCHours()));\n var minute = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCMinutes()) : String(new Date().getUTCMinutes()));\n var seconds = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCSeconds()) : String(new Date().getUTCSeconds()));\n var millisecond = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getUTCMilliseconds()) : String(new Date().getUTCMilliseconds()));\n var offset = ((rawdate != null || rawdate != '') ? String(new Date(rawdate).getTimezoneOffset()) : String(new Date().getTimezoneOffset()));\n if (day.length == 1)\n day = String(\"0\" + day);\n if (month.length == 1)\n month = String(\"0\" + month);\n offset = String(offset / 60);\n if (offset.length == 1)\n offset = String(\"0\" + offset);\n switch (type) {\n case \"day\":\n return day;\n break;\n case \"month\":\n return month;\n break;\n case \"year\":\n return year;\n break;\n case \"stamp\":\n return String(year + \"-\" + month + \"-\" + day + \" \" + hour + \":\" + minute + \":\" + seconds + \".\" + millisecond + \"-\" + (offset));\n break\n default:\n return String(year + \"-\" + month + \"-\" + day);\n break;\n }\n }\n\n //--------------------------\n // event handlers\n //--------------------------\n}\n\nexport default DateUtils","const attributes = [\n 'borderBottomWidth',\n 'borderLeftWidth',\n 'borderRightWidth',\n 'borderTopStyle',\n 'borderRightStyle',\n 'borderBottomStyle',\n 'borderLeftStyle',\n 'borderTopWidth',\n 'boxSizing',\n 'fontFamily',\n 'fontSize',\n 'fontWeight',\n 'height',\n 'letterSpacing',\n 'lineHeight',\n 'marginBottom',\n 'marginLeft',\n 'marginRight',\n 'marginTop',\n 'outlineWidth',\n 'overflow',\n 'overflowX',\n 'overflowY',\n 'paddingBottom',\n 'paddingLeft',\n 'paddingRight',\n 'paddingTop',\n 'textAlign',\n 'textOverflow',\n 'textTransform',\n 'whiteSpace',\n 'wordBreak',\n 'wordWrap',\n];\n\n/**\n * Create a mirror\n *\n * @param {Element} element The element\n * @param {string} html The html\n *\n * @return {object} The mirror object\n */\nconst createMirror = (element, html) => {\n\n /**\n * The mirror element\n */\n const mirror = document.createElement('div');\n\n /**\n * Create the CSS for the mirror object\n *\n * @return {object} The style object\n */\n const mirrorCss = () => {\n const css = {\n position: 'absolute',\n left: -9999,\n top: 0,\n zIndex: -2000\n };\n\n if (element.tagName === 'TEXTAREA') {\n attributes.push('width');\n }\n\n attributes.forEach((attr) => {\n css[attr] = getComputedStyle(element)[attr];\n });\n\n return css;\n };\n\n /**\n * Initialize the mirror\n *\n * @param {string} html The html\n *\n * @return {void}\n */\n const initialize = (html) => {\n const styles = mirrorCss();\n Object.keys(styles).forEach(key => {\n mirror.style[key] = styles[key];\n });\n mirror.innerHTML = html;\n element.parentNode.insertBefore(mirror, element.nextSibling);\n };\n\n /**\n * Get the rect\n *\n * @return {Rect} The bounding rect\n */\n const rect = () => {\n const marker = mirror.ownerDocument.getElementById('caret-position-marker');\n const boundingRect = {\n left: marker.offsetLeft,\n top: marker.offsetTop,\n height: marker.offsetHeight\n };\n mirror.parentNode.removeChild(mirror);\n\n return boundingRect;\n };\n\n initialize(html);\n\n return {\n rect,\n };\n};\n\nexport default createMirror;\n","/**\n * Check if a DOM Element is content editable\n *\n * @param {Element} element The DOM element\n *\n * @return {bool} If it is content editable\n */\nexport const isContentEditable = (element) => !!(\n element.contentEditable &&\n element.contentEditable === 'true'\n);\n\n/**\n * Get the context from settings passed in\n *\n * @param {object} settings The settings object\n *\n * @return {object} window and document\n */\nexport const getContext = (settings = {}) => {\n const { customPos, iframe, noShadowCaret } = settings;\n if (iframe) {\n return {\n iframe,\n window: iframe.contentWindow,\n document: iframe.contentDocument || iframe.contentWindow.document,\n noShadowCaret,\n customPos,\n };\n }\n\n return {\n window,\n document,\n noShadowCaret,\n customPos,\n };\n};\n\n/**\n * Get the offset of an element\n *\n * @param {Element} element The DOM element\n * @param {object} ctx The context\n *\n * @return {object} top and left\n */\nexport const getOffset = (element, ctx) => {\n const win = ctx && ctx.window || window;\n const doc = ctx && ctx.document || document;\n const rect = element.getBoundingClientRect();\n const docEl = doc.documentElement;\n const scrollLeft = win.pageXOffset || docEl.scrollLeft;\n const scrollTop = win.pageYOffset || docEl.scrollTop;\n\n return {\n top: rect.top + scrollTop,\n left: rect.left + scrollLeft\n };\n};\n\n/**\n * Check if a value is an object\n *\n * @param {any} value The value to check\n *\n * @return {bool} If it is an object\n */\nexport const isObject = (value) => typeof value === 'object' && value !== null;\n","import createMirror from './mirror';\nimport { getOffset as elementOffset } from './utils';\n\n/**\n * Create a Input caret object.\n *\n * @param {Element} element The element\n * @param {Object} ctx The context\n */\nconst createInputCaret = (element, ctx) => {\n\n /**\n * Get the current position\n *\n * @returns {int} The caret position\n */\n const getPos = () => {\n return element.selectionStart;\n };\n\n /**\n * Set the position\n *\n * @param {int} pos The position\n *\n * @return {Element} The element\n */\n const setPos = (pos) => {\n element.setSelectionRange(pos, pos);\n\n return element;\n };\n\n /**\n * The offset\n *\n * @param {int} pos The position\n *\n * @return {object} The offset\n */\n const getOffset = (pos) => {\n const rect = elementOffset(element);\n const position = getPosition(pos);\n\n return {\n top: rect.top + position.top + ctx.document.body.scrollTop,\n left: rect.left + position.left + ctx.document.body.scrollLeft,\n height: position.height,\n };\n };\n\n /**\n * Get the current position\n *\n * @param {int} pos The position\n *\n * @return {object} The position\n */\n const getPosition = (pos) => {\n const format = (val) => {\n let value = val.replace(/<|>|`|\"|&/g, '?')\n .replace(/\\r\\n|\\r|\\n/g,'
');\n return value;\n };\n\n if (ctx.customPos || ctx.customPos === 0) {\n pos = ctx.customPos;\n }\n\n const position = pos === undefined ? getPos() : pos;\n const startRange = element.value.slice(0, position);\n const endRange = element.value.slice(position);\n let html = `${format(startRange)}`;\n html += '|';\n html += `${format(endRange)}`;\n\n const mirror = createMirror(element, html);\n const rect = mirror.rect();\n rect.pos = getPos();\n\n return rect;\n };\n\n return {\n getPos,\n setPos,\n getOffset,\n getPosition,\n };\n};\n\nexport default createInputCaret;\n","/**\n * Create an Editable Caret\n * @param {Element} element The editable element\n * @param {object|null} ctx The context\n *\n * @return {EditableCaret}\n */\nconst createEditableCaret = (element, ctx) => {\n\n /**\n * Set the caret position\n *\n * @param {int} pos The position to se\n *\n * @return {Element} The element\n */\n const setPos = (pos) => {\n const sel = ctx.window.getSelection();\n if (sel) {\n let offset = 0;\n let found = false;\n const find = (position, parent) => {\n for (let i = 0; i < parent.childNodes.length; i++) {\n const node = parent.childNodes[i];\n if (found) {\n break;\n }\n if (node.nodeType === 3) {\n if (offset + node.length >= position) {\n found = true;\n const range = ctx.document.createRange();\n range.setStart(node, position - offset);\n sel.removeAllRanges();\n sel.addRange(range);\n break;\n } else {\n offset += node.length;\n }\n } else {\n find(pos, node);\n }\n }\n };\n find(pos, element);\n }\n\n return element;\n };\n\n /**\n * Get the offset\n *\n * @return {object} The offset\n */\n const getOffset = () => {\n const range = getRange();\n let offset = {\n height: 0,\n left: 0,\n right: 0,\n };\n\n if (!range) {\n return offset;\n }\n\n const hasCustomPos = ctx.customPos || ctx.customPos === 0;\n\n // endContainer in Firefox would be the element at the start of\n // the line\n if ((range.endOffset - 1 > 0 && range.endContainer !== element) || hasCustomPos) {\n const clonedRange = range.cloneRange();\n const fixedPosition = hasCustomPos ? ctx.customPos : range.endOffset;\n clonedRange.setStart(range.endContainer, fixedPosition - 1 < 0 ? 0 : fixedPosition - 1);\n clonedRange.setEnd(range.endContainer, fixedPosition);\n const rect = clonedRange.getBoundingClientRect();\n offset = {\n height: rect.height,\n left: rect.left + rect.width,\n top: rect.top,\n };\n clonedRange.detach();\n }\n\n if ((!offset || (offset && offset.height === 0)) && !ctx.noShadowCaret) {\n const clonedRange = range.cloneRange();\n const shadowCaret = ctx.document.createTextNode('|');\n clonedRange.insertNode(shadowCaret);\n clonedRange.selectNode(shadowCaret);\n const rect = clonedRange.getBoundingClientRect();\n offset = {\n height: rect.height,\n left: rect.left,\n top: rect.top,\n };\n shadowCaret.parentNode.removeChild(shadowCaret);\n clonedRange.detach();\n }\n\n if (offset) {\n const doc = ctx.document.documentElement;\n offset.top += ctx.window.pageYOffset - (doc.clientTop || 0);\n offset.left += ctx.window.pageXOffset - (doc.clientLeft || 0);\n }\n\n return offset;\n };\n\n /**\n * Get the position\n *\n * @return {object} The position\n */\n const getPosition = () => {\n const offset = getOffset();\n const pos = getPos();\n const rect = element.getBoundingClientRect();\n const inputOffset = {\n top: rect.top + ctx.document.body.scrollTop,\n left: rect.left + ctx.document.body.scrollLeft\n };\n offset.left -= inputOffset.left;\n offset.top -= inputOffset.top;\n offset.pos = pos;\n\n return offset;\n };\n\n /**\n * Get the range\n *\n * @return {Range|null}\n */\n const getRange = () => {\n if (!ctx.window.getSelection) {\n return;\n }\n const sel = ctx.window.getSelection();\n\n return sel.rangeCount > 0 ? sel.getRangeAt(0) : null;\n };\n\n /**\n * Get the caret position\n *\n * @return {int} The position\n */\n const getPos = () => {\n const range = getRange();\n const clonedRange = range.cloneRange();\n clonedRange.selectNodeContents(element);\n clonedRange.setEnd(range.endContainer, range.endOffset);\n const pos = clonedRange.toString().length;\n clonedRange.detach();\n\n return pos;\n };\n\n return {\n getPos,\n setPos,\n getPosition,\n getOffset,\n getRange,\n };\n};\n\nexport default createEditableCaret;\n","import createInputCaret from './input';\nimport createEditableCaret from './editable';\nimport {\n isContentEditable,\n getContext,\n isObject,\n} from './utils';\n\nexport { getOffset } from './utils';\n\nconst createCaret = (element, ctx) => {\n if (isContentEditable(element)) {\n return createEditableCaret(element, ctx);\n }\n\n return createInputCaret(element, ctx);\n};\n\nexport const position = (element, value, settings = {}) => {\n let options = settings;\n if (isObject(value)) {\n options = value;\n value = null;\n }\n const ctx = getContext(options);\n const caret = createCaret(element, ctx);\n\n if (value || value === 0) {\n return caret.setPos(value);\n }\n\n return caret.getPosition();\n};\n\n/**\n *\n * @param {Element} element The DOM element\n * @param {number|undefined} value The value to set\n * @param {object} settings Any settings for context\n */\nexport const offset = (element, value, settings = {}) => {\n let options = settings;\n if (isObject(value)) {\n options = value;\n value = null;\n }\n\n const ctx = getContext(options);\n const caret = createCaret(element, ctx);\n return caret.getOffset(value);\n};\n","import * as DataEvent from '../events/DataEvent';\nimport DateUtils from './DateUtils';\nimport {\n position,\n offset\n} from 'caret-pos';\n\nimport EventEmitter from '../events/EventEmitter';\nimport * as EditorEvent from '../events/EditorEvent';\n\nclass TextEditor extends EventEmitter {\n\n //--------------------------\n // constructor\n //--------------------------\n constructor(textEditor, scrollLimit) {\n super();\n hljs.initHighlightingOnLoad();\n //this.dataUtils = new DataUtils();\n this.dateUtils = new DateUtils();\n this.textEditor = textEditor;\n this.fixLimit = scrollLimit;\n this.caretPos = null;\n this.url = '';\n let self = this;\n this.setInputs();\n\n window.addEventListener(\"scroll\", f => {\n var fixLimit = this.fixLimit;\n if (window.pageYOffset >= fixLimit) {\n document.getElementById('edit-control').style.position = \"fixed\"\n } else {\n document.getElementById('edit-control').style.position = \"relative\"\n }\n });\n this.refresh();\n }\n //--------------------------\n // methods\n //--------------------------\n setInputs() {\n let self = this;\n var editorButtons = document.querySelectorAll('.editor-button');\n for (var i = 0, length = editorButtons.length; i < length; i++) {\n editorButtons[i].addEventListener('click', e => this.handleEditorOption(e), false);\n }\n this.textEditor.addEventListener('input', f => {\n if(f.inputType == \"insertParagraph\")\n {\n var caret = position(self.textEditor).pos+1;\n var spiffed = hljs.highlight('markdown', self.textEditor.innerText).value;\n var temp = document.createElement(\"div\");\n temp.innerText = spiffed;\n self.textEditor.innerHTML = temp.innerText;\n position(self.textEditor, caret)\n }else{\n self.refresh()\n }\n })\n }\n refresh() {\n var caret = position(this.textEditor).pos;\n var spiffed = hljs.highlight('markdown', this.textEditor.innerText).value;\n var temp = document.createElement(\"div\");\n temp.innerText = spiffed;\n this.textEditor.innerHTML = temp.innerText;\n position(this.textEditor, caret)\n }\n\n notify(type, data) {\n switch (type) {\n case DataEvent.POST_UPDATED:\n document.getElementById('submit-update').classList.add('icon-hide');\n document.getElementById('submit-good').classList.remove('icon-hide');\n document.getElementById('edit-update').classList.remove('submit-start');\n document.getElementById('edit-update').classList.add('submit-cool');\n setTimeout(f => {\n document.getElementById('submit-update').classList.remove('icon-hide');\n document.getElementById('submit-good').classList.add('icon-hide');\n document.getElementById('edit-update').classList.add('submit-start');\n document.getElementById('edit-update').classList.remove('submit-cool');\n }, 2000);\n\n break;\n case DataEvent.POST_ADDED:\n // do nothing\n break;\n case EditorEvent.EDITOR_UPLOAD_POST_IMAGE:\n position(this.textEditor, this.caretPos);\n var sel, range, pulled;\n sel = window.getSelection(); //console.log(sel)\n //console.log(note.message)\n if (sel.rangeCount) {\n range = sel.getRangeAt(0);\n pulled = sel.getRangeAt(0).toString();\n range.deleteContents();\n range.insertNode(document.createTextNode(\"![image alt text](\" + data + \" 'image title')\"));\n }\n this.refresh();\n break;\n }\n }\n\n //--------------------------\n // event handlers\n //--------------------------\n handleEditorOption(e) {\n e.preventDefault();\n var self = this;\n var sel, range, pulled;\n sel = window.getSelection(); //console.log(sel)\n if (sel.rangeCount) {\n range = sel.getRangeAt(0);\n pulled = sel.getRangeAt(0).toString();\n range.deleteContents();\n switch (e.target.id) {\n case \"edit-bold\":\n range.insertNode(document.createTextNode(\"**\" + pulled + \"**\"));\n break;\n case \"edit-italic\":\n range.insertNode(document.createTextNode(\"*\" + pulled + \"*\"));\n break;\n case \"edit-strikethrough\":\n range.insertNode(document.createTextNode(\"\" + pulled + \"\"));\n break;\n case \"edit-header1\":\n range.insertNode(document.createTextNode(\"# \" + pulled));\n break;\n case \"edit-header2\":\n range.insertNode(document.createTextNode(\"## \" + pulled));\n break;\n case \"edit-header3\":\n range.insertNode(document.createTextNode(\"### \" + pulled));\n break;\n case \"edit-image\":\n this.caretPos = position(this.textEditor).pos;\n this.emitEvent(EditorEvent.EDITOR_UPLOAD_POST_IMAGE);\n break;\n case \"submit-save\":\n case \"edit-save\":\n this.emitEvent(EditorEvent.EDITOR_SAVE);\n break;\n case \"submit-update\":\n case \"edit-update\":\n this.emitEvent(EditorEvent.EDITOR_UPDATE);\n break\n case \"edit-link\":\n range.insertNode(document.createTextNode(\"[\" + pulled + \"](PASTE URL HERE)\"));\n break;\n case \"edit-delete\":\n this.emitEvent(EditorEvent.EDITOR_DELETE);\n break\n default:\n //range.insertNode(document.createTextNode(\"[\" + self.url + \"](PASTE URL HERE)\"));\n break;\n }\n }\n this.refresh()\n }\n}\nexport default TextEditor","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (global.TinyDatePicker = factory());\n}(this, (function () { 'use strict';\n\n /**\n * @file A generic set of mutation-free date functions.\n */\n\n /**\n * now returns the current date without any time values\n *\n * @returns {Date}\n */\n function now() {\n var dt = new Date();\n dt.setHours(0, 0, 0, 0);\n return dt;\n }\n\n /**\n * dateEq compares two dates\n *\n * @param {Date} date1 the first date\n * @param {Date} date2 the second date\n * @returns {boolean}\n */\n function datesEq(date1, date2) {\n return (date1 && date1.toDateString()) === (date2 && date2.toDateString());\n }\n\n /**\n * shiftDay shifts the specified date by n days\n *\n * @param {Date} dt\n * @param {number} n\n * @returns {Date}\n */\n function shiftDay(dt, n) {\n dt = new Date(dt);\n dt.setDate(dt.getDate() + n);\n return dt;\n }\n\n /**\n * shiftMonth shifts the specified date by a specified number of months\n *\n * @param {Date} dt\n * @param {number} n\n * @param {boolean} wrap optional, if true, does not change year\n * value, defaults to false\n * @returns {Date}\n */\n function shiftMonth(dt, n, wrap) {\n dt = new Date(dt);\n\n var dayOfMonth = dt.getDate();\n var month = dt.getMonth() + n;\n\n dt.setDate(1);\n dt.setMonth(wrap ? (12 + month) % 12 : month);\n dt.setDate(dayOfMonth);\n\n // If dayOfMonth = 31, but the target month only has 30 or 29 or whatever...\n // head back to the max of the target month\n if (dt.getDate() < dayOfMonth) {\n dt.setDate(0);\n }\n\n return dt;\n }\n\n /**\n * shiftYear shifts the specified date by n years\n *\n * @param {Date} dt\n * @param {number} n\n * @returns {Date}\n */\n function shiftYear(dt, n) {\n dt = new Date(dt);\n dt.setFullYear(dt.getFullYear() + n);\n return dt;\n }\n\n /**\n * setYear changes the specified date to the specified year\n *\n * @param {Date} dt\n * @param {number} year\n */\n function setYear(dt, year) {\n dt = new Date(dt);\n dt.setFullYear(year);\n return dt;\n }\n\n /**\n * setMonth changes the specified date to the specified month\n *\n * @param {Date} dt\n * @param {number} month\n */\n function setMonth(dt, month) {\n return shiftMonth(dt, month - dt.getMonth());\n }\n\n /**\n * dateOrParse creates a function which, given a date or string, returns a date\n *\n * @param {function} parse the function used to parse strings\n * @returns {function}\n */\n function dateOrParse(parse) {\n return function (dt) {\n return dropTime(typeof dt === 'string' ? parse(dt) : dt);\n };\n }\n\n /**\n * constrainDate returns dt or min/max depending on whether dt is out of bounds (inclusive)\n *\n * @export\n * @param {Date} dt\n * @param {Date} min\n * @param {Date} max\n * @returns {Date}\n */\n function constrainDate(dt, min, max) {\n return (dt < min) ? min :\n (dt > max) ? max :\n dt;\n }\n\n function dropTime(dt) {\n dt = new Date(dt);\n dt.setHours(0, 0, 0, 0);\n return dt;\n }\n\n /**\n * @file Utility functions for function manipulation.\n */\n\n /**\n * bufferFn buffers calls to fn so they only happen every ms milliseconds\n *\n * @param {number} ms number of milliseconds\n * @param {function} fn the function to be buffered\n * @returns {function}\n */\n function bufferFn(ms, fn) {\n var timeout = undefined;\n return function () {\n clearTimeout(timeout);\n timeout = setTimeout(fn, ms);\n };\n }\n\n /**\n * noop is a function which does nothing at all.\n */\n function noop() { }\n\n /**\n * copy properties from object o2 to object o1.\n *\n * @params {Object} o1\n * @params {Object} o2\n * @returns {Object}\n */\n function cp() {\n var args = arguments;\n var o1 = args[0];\n for (var i = 1; i < args.length; ++i) {\n var o2 = args[i] || {};\n for (var key in o2) {\n o1[key] = o2[key];\n }\n }\n return o1;\n }\n\n /**\n * @file Responsible for sanitizing and creating date picker options.\n */\n\n var english = {\n days: ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'],\n months: [\n 'January',\n 'February',\n 'March',\n 'April',\n 'May',\n 'June',\n 'July',\n 'August',\n 'September',\n 'October',\n 'November',\n 'December',\n ],\n today: 'Today',\n clear: 'Clear',\n close: 'Close',\n };\n\n /**\n * DatePickerOptions constructs a new date picker options object, overriding\n * default values with any values specified in opts.\n *\n * @param {DatePickerOptions} opts\n * @returns {DatePickerOptions}\n */\n function DatePickerOptions(opts) {\n opts = opts || {};\n opts = cp(defaults(), opts);\n var parse = dateOrParse(opts.parse);\n opts.lang = cp(english, opts.lang);\n opts.parse = parse;\n opts.inRange = makeInRangeFn(opts);\n opts.min = parse(opts.min || shiftYear(now(), -100));\n opts.max = parse(opts.max || shiftYear(now(), 100));\n opts.hilightedDate = opts.parse(opts.hilightedDate);\n\n return opts;\n }\n\n function defaults() {\n return {\n lang: english,\n\n // Possible values: dp-modal, dp-below, dp-permanent\n mode: 'dp-modal',\n\n // The date to hilight initially if the date picker has no\n // initial value.\n hilightedDate: now(),\n\n format: function (dt) {\n return (dt.getMonth() + 1) + '/' + dt.getDate() + '/' + dt.getFullYear();\n },\n\n parse: function (str) {\n var date = new Date(str);\n return isNaN(date) ? now() : date;\n },\n\n dateClass: function () { },\n\n inRange: function () {\n return true;\n }\n };\n }\n\n function makeInRangeFn(opts) {\n var inRange = opts.inRange; // Cache this version, and return a variant\n\n return function (dt, dp) {\n return inRange(dt, dp) && opts.min <= dt && opts.max >= dt;\n };\n }\n\n /**\n * @file Helper functions for dealing with dom elements.\n */\n\n var Key = {\n left: 37,\n up: 38,\n right: 39,\n down: 40,\n enter: 13,\n esc: 27,\n };\n\n /**\n * on attaches an event handler to the specified element, and returns an\n * off function which can be used to remove the handler.\n *\n * @param {string} evt the name of the event to handle\n * @param {HTMLElement} el the element to attach to\n * @param {function} handler the event handler\n * @returns {function} the off function\n */\n function on(evt, el, handler) {\n el.addEventListener(evt, handler, true);\n\n return function () {\n el.removeEventListener(evt, handler, true);\n };\n }\n\n var CustomEvent = shimCustomEvent();\n\n function shimCustomEvent() {\n var CustomEvent = window.CustomEvent;\n\n if (typeof CustomEvent !== 'function') {\n CustomEvent = function (event, params) {\n params = params || {bubbles: false, cancelable: false, detail: undefined};\n var evt = document.createEvent('CustomEvent');\n evt.initCustomEvent(event, params.bubbles, params.cancelable, params.detail);\n return evt;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n }\n\n return CustomEvent;\n }\n\n /**\n * @file Manages the calendar / day-picker view.\n */\n\n var dayPicker = {\n onKeyDown: keyDown,\n onClick: {\n 'dp-day': selectDay,\n 'dp-next': gotoNextMonth,\n 'dp-prev': gotoPrevMonth,\n 'dp-today': selectToday,\n 'dp-clear': clear,\n 'dp-close': close,\n 'dp-cal-month': showMonthPicker,\n 'dp-cal-year': showYearPicker,\n },\n render: render\n };\n\n /**\n * view renders the calendar (day picker) as an HTML string.\n *\n * @param {DatePickerContext} context the date picker being rendered\n * @returns {string}\n */\n function render(dp) {\n var opts = dp.opts;\n var lang = opts.lang;\n var state = dp.state;\n var dayNames = lang.days;\n var dayOffset = opts.dayOffset || 0;\n var selectedDate = state.selectedDate;\n var hilightedDate = state.hilightedDate;\n var hilightedMonth = hilightedDate.getMonth();\n var today = now().getTime();\n\n return (\n '