Merge branch 'staging' into cba

pull/1/head
yflory 5 years ago
commit b208ca367d

@ -11,6 +11,8 @@ CKEDITOR.editorConfig = function( config ) {
config.removePlugins= 'resize,elementspath'; config.removePlugins= 'resize,elementspath';
config.resize_enabled= false; //bottom-bar config.resize_enabled= false; //bottom-bar
config.extraPlugins= 'autolink,colorbutton,colordialog,font,indentblock,justify,mediatag,print,blockbase64,mathjax,wordcount'; config.extraPlugins= 'autolink,colorbutton,colordialog,font,indentblock,justify,mediatag,print,blockbase64,mathjax,wordcount';
// FIXME translation for default? updating to a newer CKEditor seems like it will add 'default' by default
config.fontSize_sizes = '(Default)/unset;8/8px;9/9px;10/10px;11/11px;12/12px;14/14px;16/16px;18/18px;20/20px;22/22px;24/24px;26/26px;28/28px;36/36px;48/48px;72/72px';
config.toolbarGroups= [ config.toolbarGroups= [
// {"name":"clipboard","groups":["clipboard","undo"]}, // {"name":"clipboard","groups":["clipboard","undo"]},
//{"name":"editing","groups":["find","selection"]}, //{"name":"editing","groups":["find","selection"]},

@ -107,7 +107,7 @@ define([
])*/ ])*/
]) ])
]), ]),
h('div.cp-version-footer', "CryptPad v3.15.0 (PigFootedBandicoot)") h('div.cp-version-footer', "CryptPad v3.16.0 (Quagga)")
]); ]);
}; };

@ -1179,6 +1179,7 @@
&.fa-download { order: 2; } &.fa-download { order: 2; }
&.fa-upload { order: 3; } &.fa-upload { order: 3; }
&.fa-print { order: 4; } &.fa-print { order: 4; }
&.fa-arrows-h { order: 5; }
&.fa-cog { order: 5; } &.fa-cog { order: 5; }
&.fa-info-circle { order: 6; } &.fa-info-circle { order: 6; }
&.fa-help { order: 7; } &.fa-help { order: 7; }

@ -259,7 +259,7 @@ module.exports.create = function (config, cb) {
throw new Error(err); throw new Error(err);
} }
})); }));
}).nThen(function (w) { }).nThen(function () {
if (config.disableIntegratedTasks) { return; } if (config.disableIntegratedTasks) { return; }
config.intervals = config.intervals || {}; config.intervals = config.intervals || {};

@ -665,31 +665,17 @@ const handleGetHistoryRange = function (Env, Server, seq, userId, parsed) {
} }
Server.send(userId, [seq, 'ACK']); Server.send(userId, [seq, 'ACK']);
Env.getOlderHistory(channelName, oldestKnownHash, function (err, messages) { Env.getOlderHistory(channelName, oldestKnownHash, desiredMessages, desiredCheckpoint, function (err, toSend) {
if (err && err.code !== 'ENOENT') { if (err && err.code !== 'ENOENT') {
Env.Log.error("HK_GET_OLDER_HISTORY", err); Env.Log.error("HK_GET_OLDER_HISTORY", err);
} }
if (!Array.isArray(messages)) { messages = []; } if (Array.isArray(toSend)) {
toSend.forEach(function (msg) {
// FIXME this reduction could be done in the worker instead of the main process Server.send(userId, [0, HISTORY_KEEPER_ID, 'MSG', userId,
var toSend = []; JSON.stringify(['HISTORY_RANGE', txid, msg])]);
if (typeof (desiredMessages) === "number") { });
toSend = messages.slice(-desiredMessages);
} else {
let cpCount = 0;
for (var i = messages.length - 1; i >= 0; i--) {
if (/^cp\|/.test(messages[i][4]) && i !== (messages.length - 1)) {
cpCount++;
}
toSend.unshift(messages[i]);
if (cpCount >= desiredCheckpoint) { break; }
}
} }
toSend.forEach(function (msg) {
Server.send(userId, [0, HISTORY_KEEPER_ID, 'MSG', userId,
JSON.stringify(['HISTORY_RANGE', txid, msg])]);
});
Server.send(userId, [0, HISTORY_KEEPER_ID, 'MSG', userId, Server.send(userId, [0, HISTORY_KEEPER_ID, 'MSG', userId,
JSON.stringify(['HISTORY_RANGE_END', txid, channelName]) JSON.stringify(['HISTORY_RANGE_END', txid, channelName])

@ -27,7 +27,7 @@ const CHANNEL_WRITE_WINDOW = 300000;
them. The tradeoff with this timeout is that some functions, the stream, and them. The tradeoff with this timeout is that some functions, the stream, and
and the timeout itself are stored in memory. A longer timeout uses more memory and the timeout itself are stored in memory. A longer timeout uses more memory
and running out of memory will also kill the server. */ and running out of memory will also kill the server. */
const STREAM_CLOSE_TIMEOUT = 300000; const STREAM_CLOSE_TIMEOUT = 120000;
/* The above timeout closes the stream, but apparently that doesn't always work. /* The above timeout closes the stream, but apparently that doesn't always work.
We set yet another timeout to allow the runtime to gracefully close the stream We set yet another timeout to allow the runtime to gracefully close the stream
@ -83,15 +83,31 @@ var channelExists = function (filepath, cb) {
const destroyStream = function (stream) { const destroyStream = function (stream) {
if (!stream) { return; } if (!stream) { return; }
try { stream.close(); } catch (err) { console.error(err); } try {
stream.close();
if (stream.closed && stream.fd === null) { return; }
} catch (err) {
console.error(err);
}
setTimeout(function () { setTimeout(function () {
try { stream.destroy(); } catch (err) { console.error(err); } try { stream.destroy(); } catch (err) { console.error(err); }
}, STREAM_DESTROY_TIMEOUT); }, STREAM_DESTROY_TIMEOUT);
}; };
/*
accept a stream, an id (used as a label) and an optional number of milliseconds
return a function which ignores all arguments
and first tries to gracefully close a stream
then destroys it after a period if the close was not successful
if the function is not called within the specified number of milliseconds
then it will be called implicitly with an error to indicate
that it was run because it timed out
*/
const ensureStreamCloses = function (stream, id, ms) { const ensureStreamCloses = function (stream, id, ms) {
return Util.bake(Util.mkTimeout(Util.once(function (err) { return Util.bake(Util.mkTimeout(Util.once(function (err) {
destroyStream(stream, id); destroyStream(stream);
if (err) { if (err) {
// this can only be a timeout error... // this can only be a timeout error...
console.log("stream close error:", err, id); console.log("stream close error:", err, id);
@ -106,7 +122,7 @@ const ensureStreamCloses = function (stream, id, ms) {
// it also allows the handler to abort reading at any time // it also allows the handler to abort reading at any time
const readMessagesBin = (env, id, start, msgHandler, cb) => { const readMessagesBin = (env, id, start, msgHandler, cb) => {
const stream = Fs.createReadStream(mkPath(env, id), { start: start }); const stream = Fs.createReadStream(mkPath(env, id), { start: start });
const finish = ensureStreamCloses(stream, id); const finish = ensureStreamCloses(stream, '[readMessagesBin:' + id + ']');
return void readFileBin(stream, msgHandler, function (err) { return void readFileBin(stream, msgHandler, function (err) {
cb(err); cb(err);
finish(); finish();
@ -117,7 +133,7 @@ const readMessagesBin = (env, id, start, msgHandler, cb) => {
// returns undefined if the first message was not an object (not an array) // returns undefined if the first message was not an object (not an array)
var getMetadataAtPath = function (Env, path, _cb) { var getMetadataAtPath = function (Env, path, _cb) {
const stream = Fs.createReadStream(path, { start: 0 }); const stream = Fs.createReadStream(path, { start: 0 });
const finish = ensureStreamCloses(stream, path); const finish = ensureStreamCloses(stream, '[getMetadataAtPath:' + path + ']');
var cb = Util.once(Util.mkAsync(Util.both(_cb, finish)), function () { var cb = Util.once(Util.mkAsync(Util.both(_cb, finish)), function () {
throw new Error("Multiple Callbacks"); throw new Error("Multiple Callbacks");
}); });
@ -203,7 +219,7 @@ var clearChannel = function (env, channelId, _cb) {
*/ */
var readMessages = function (path, msgHandler, _cb) { var readMessages = function (path, msgHandler, _cb) {
var stream = Fs.createReadStream(path, { start: 0}); var stream = Fs.createReadStream(path, { start: 0});
const finish = ensureStreamCloses(stream, path); const finish = ensureStreamCloses(stream, '[readMessages:' + path + ']');
var cb = Util.once(Util.mkAsync(Util.both(finish, _cb))); var cb = Util.once(Util.mkAsync(Util.both(finish, _cb)));
return readFileBin(stream, function (msgObj, readMore) { return readFileBin(stream, function (msgObj, readMore) {
@ -231,7 +247,7 @@ var getDedicatedMetadata = function (env, channelId, handler, _cb) {
var metadataPath = mkMetadataPath(env, channelId); var metadataPath = mkMetadataPath(env, channelId);
var stream = Fs.createReadStream(metadataPath, {start: 0}); var stream = Fs.createReadStream(metadataPath, {start: 0});
const finish = ensureStreamCloses(stream, metadataPath); const finish = ensureStreamCloses(stream, '[getDedicatedMetadata:' + metadataPath + ']');
var cb = Util.both(finish, _cb); var cb = Util.both(finish, _cb);
readFileBin(stream, function (msgObj, readMore) { readFileBin(stream, function (msgObj, readMore) {

@ -222,10 +222,10 @@ const computeMetadata = function (data, cb) {
const getOlderHistory = function (data, cb) { const getOlderHistory = function (data, cb) {
const oldestKnownHash = data.hash; const oldestKnownHash = data.hash;
const channelName = data.channel; const channelName = data.channel;
const desiredMessages = data.desiredMessages;
const desiredCheckpoint = data.desiredCheckpoint;
//const store = Env.store; var messages = [];
//const Log = Env.Log;
var messageBuffer = [];
var found = false; var found = false;
store.getMessages(channelName, function (msgStr) { store.getMessages(channelName, function (msgStr) {
if (found) { return; } if (found) { return; }
@ -246,9 +246,22 @@ const getOlderHistory = function (data, cb) {
if (hash === oldestKnownHash) { if (hash === oldestKnownHash) {
found = true; found = true;
} }
messageBuffer.push(parsed); messages.push(parsed);
}, function (err) { }, function (err) {
cb(err, messageBuffer); var toSend = [];
if (typeof (desiredMessages) === "number") {
toSend = messages.slice(-desiredMessages);
} else {
let cpCount = 0;
for (var i = messages.length - 1; i >= 0; i--) {
if (/^cp\|/.test(messages[i][4]) && i !== (messages.length - 1)) {
cpCount++;
}
toSend.unshift(messages[i]);
if (cpCount >= desiredCheckpoint) { break; }
}
}
cb(err, toSend);
}); });
}; };

@ -250,12 +250,14 @@ Workers.initialize = function (Env, config, _cb) {
}); });
}; };
Env.getOlderHistory = function (channel, oldestKnownHash, cb) { Env.getOlderHistory = function (channel, oldestKnownHash, desiredMessages, desiredCheckpoint, cb) {
Env.store.getWeakLock(channel, function (next) { Env.store.getWeakLock(channel, function (next) {
sendCommand({ sendCommand({
channel: channel, channel: channel,
command: "GET_OLDER_HISTORY", command: "GET_OLDER_HISTORY",
hash: oldestKnownHash, hash: oldestKnownHash,
desiredMessages: desiredMessages,
desiredCheckpoint: desiredCheckpoint,
}, Util.both(next, cb)); }, Util.both(next, cb));
}); });
}; };

2
package-lock.json generated

@ -1,6 +1,6 @@
{ {
"name": "cryptpad", "name": "cryptpad",
"version": "3.15.0", "version": "3.16.0",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {

@ -1,7 +1,7 @@
{ {
"name": "cryptpad", "name": "cryptpad",
"description": "realtime collaborative visual editor with zero knowlege server", "description": "realtime collaborative visual editor with zero knowlege server",
"version": "3.15.0", "version": "3.16.0",
"license": "AGPL-3.0+", "license": "AGPL-3.0+",
"repository": { "repository": {
"type": "git", "type": "git",

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -1651,7 +1651,6 @@ define([
if (data.hiddenReadOnly) { button.addClass('cp-hidden-if-readonly'); } if (data.hiddenReadOnly) { button.addClass('cp-hidden-if-readonly'); }
if (data.name) { if (data.name) {
button.addClass('cp-toolbar-icon-'+data.name); button.addClass('cp-toolbar-icon-'+data.name);
button.click(common.prepareFeedback(data.name));
} }
if (data.text) { if (data.text) {
$('<span>', {'class': 'cp-toolbar-drawer-element'}).text(data.text) $('<span>', {'class': 'cp-toolbar-drawer-element'}).text(data.text)

@ -313,6 +313,15 @@ define([
// finally, find all 'clickable' items and remove the class // finally, find all 'clickable' items and remove the class
$el.find('.clickable').removeClass('clickable'); $el.find('.clickable').removeClass('clickable');
}; };
var renderMermaid = function ($el) {
Mermaid.init(undefined, $el);
// clickable elements in mermaid don't work well with our sandboxing setup
// the function below strips clickable elements but still leaves behind some artifacts
// tippy tooltips might still be useful, so they're not removed. It would be
// preferable to just support links, but this covers up a rough edge in the meantime
removeMermaidClickables($el);
};
DiffMd.apply = function (newHtml, $content, common) { DiffMd.apply = function (newHtml, $content, common) {
var contextMenu = common.importMediaTagMenu(); var contextMenu = common.importMediaTagMenu();
@ -387,8 +396,15 @@ define([
var mts = []; var mts = [];
$content.find('media-tag, pre.mermaid').each(function (i, el) { $content.find('media-tag, pre.mermaid').each(function (i, el) {
if (el.nodeName.toLowerCase() === "pre") { if (el.nodeName.toLowerCase() === "pre") {
var clone = el.cloneNode();
return void mts.push({ return void mts.push({
svg: el.cloneNode(true) svg: clone,
render: function () {
var $el = $(clone);
$el.text(clone.getAttribute('mermaid-source'));
$el.attr('data-processed', '');
renderMermaid($el);
}
}); });
} }
var $el = $(el); var $el = $(el);
@ -401,7 +417,7 @@ define([
// Find initial position // Find initial position
var idx = -1; var idx = -1;
mts.some(function (obj, i) { mts.some(function (obj, i) {
if (isSvg && $mt.find('svg').attr('id') === $(obj.svg).find('svg').attr('id')) { if (isSvg && $mt.attr('mermaid-source') === $(obj.svg).attr('mermaid-source')) {
idx = i; idx = i;
return true; return true;
} }
@ -412,8 +428,15 @@ define([
}); });
if (idx === -1) { if (idx === -1) {
if (isSvg) { if (isSvg) {
var clone = $mt[0].cloneNode();
mts.unshift({ mts.unshift({
svg: $mt[0].cloneNode(true) svg: clone,
render: function () {
var $el = $(clone);
$el.text(clone.getAttribute('mermaid-source'));
$el.attr('data-processed', '');
renderMermaid($el);
}
}); });
} else { } else {
mts.unshift({ mts.unshift({
@ -511,12 +534,7 @@ define([
// check if you had cached a pre-rendered instance of the supplied source // check if you had cached a pre-rendered instance of the supplied source
if (typeof(cached) !== 'object') { if (typeof(cached) !== 'object') {
try { try {
Mermaid.init(undefined, $el); renderMermaid($el);
// clickable elements in mermaid don't work well with our sandboxing setup
// the function below strips clickable elements but still leaves behind some artifacts
// tippy tooltips might still be useful, so they're not removed. It would be
// preferable to just support links, but this covers up a rough edge in the meantime
removeMermaidClickables($el);
} catch (e) { console.error(e); } } catch (e) { console.error(e); }
return; return;
} }

@ -250,36 +250,47 @@ define([
// Check src and cryptkey // Check src and cryptkey
var cfg = tags[i]; var cfg = tags[i];
var tag;
if (cfg.svg) { if (cfg.svg) {
$spinner.hide();
$inner.append(cfg.svg); $inner.append(cfg.svg);
locked = false; if (!cfg.render) {
return; $spinner.hide();
} console.error('here');
locked = false;
var src = cfg.src; return;
var key = cfg.key; }
if (cfg.href) { console.error('there');
var parsed = Hash.parsePadUrl(cfg.href); setTimeout(cfg.render);
var secret = Hash.getSecrets(parsed.type, parsed.hash, cfg.password); tag = cfg.svg;
var host = priv.fileHost || priv.origin || ''; } else {
src = host + Hash.getBlobPathFromHex(secret.channel); var src = cfg.src;
var _key = secret.keys && secret.keys.cryptKey; var key = cfg.key;
if (_key) { key = 'cryptpad:' + Nacl.util.encodeBase64(_key); } if (cfg.href) {
} var parsed = Hash.parsePadUrl(cfg.href);
if (!src || !key) { var secret = Hash.getSecrets(parsed.type, parsed.hash, cfg.password);
locked = false; var host = priv.fileHost || priv.origin || '';
$spinner.hide(); src = host + Hash.getBlobPathFromHex(secret.channel);
return void UI.log(Messages.error); var _key = secret.keys && secret.keys.cryptKey;
if (_key) { key = 'cryptpad:' + Nacl.util.encodeBase64(_key); }
}
if (!src || !key) {
locked = false;
$spinner.hide();
return void UI.log(Messages.error);
}
tag = h('media-tag', {
src: src,
'data-crypto-key': key
});
$inner.append(tag);
MediaTag(tag).on('error', function () {
locked = false;
$spinner.hide();
UI.log(Messages.error);
});
} }
var tag = h('media-tag', {
src: src,
'data-crypto-key': key
});
$inner.append(tag);
var observer = new MutationObserver(function(mutations) { var observer = new MutationObserver(function(mutations) {
mutations.forEach(function() { mutations.forEach(function() {
locked = false; locked = false;
@ -291,11 +302,6 @@ define([
childList: true, childList: true,
characterData: false characterData: false
}); });
MediaTag(tag).on('error', function () {
locked = false;
$spinner.hide();
UI.log(Messages.error);
});
}; };
show(i); show(i);

@ -355,7 +355,6 @@ define([
APP.FM.handleFile(blob, data); APP.FM.handleFile(blob, data);
}; };
Messages.oo_login = 'Log in...'; // XXX
var noLogin = false; var noLogin = false;
var makeCheckpoint = function (force) { var makeCheckpoint = function (force) {
@ -1120,12 +1119,12 @@ define([
var x2tSaveAndConvertData = function(data, filename, extension, finalFilename) { var x2tSaveAndConvertData = function(data, filename, extension, finalFilename) {
// Perform the x2t conversion // Perform the x2t conversion
require(['/common/onlyoffice/x2t/x2t.js'], function() { // XXX why does this fail without an access-control-allow-origin header? require(['/common/onlyoffice/x2t/x2t.js'], function() { // FIXME why does this fail without an access-control-allow-origin header?
var x2t = window.Module; var x2t = window.Module;
x2t.run(); x2t.run();
if (x2tInitialized) { if (x2tInitialized) {
debug("x2t runtime already initialized"); debug("x2t runtime already initialized");
x2tSaveAndConvertDataInternal(x2t, data, filename, extension, finalFilename); // XXX shouldn't this return ? return void x2tSaveAndConvertDataInternal(x2t, data, filename, extension, finalFilename);
} }
x2t.onRuntimeInitialized = function() { x2t.onRuntimeInitialized = function() {

@ -38,6 +38,9 @@ define([
drive: { drive: {
hideDuplicate: true hideDuplicate: true
}, },
pad: {
width: true
},
general: { general: {
allowUserFeedback: true allowUserFeedback: true
} }

@ -1342,5 +1342,13 @@
"admin_openFilesTitle": "Offene Dateien", "admin_openFilesTitle": "Offene Dateien",
"canvas_select": "Auswahl", "canvas_select": "Auswahl",
"canvas_brush": "Pinsel", "canvas_brush": "Pinsel",
"profile_copyKey": "Öffentlichen Schlüssel kopieren" "profile_copyKey": "Öffentlichen Schlüssel kopieren",
"cba_hide": "Autorenfarben verbergen",
"cba_enable": "Aktivieren",
"cba_properties": "Autorenfarben (experimentell)",
"cba_disable": "Löschen und Deaktivieren",
"cba_show": "Autorenfarben anzeigen",
"cba_writtenBy": "Geschrieben von: {0}",
"cba_hint": "Diese Einstellung wird zukünftig verwendet, wenn du ein neues Pad erstellst.",
"oo_login": "Bitte logge dich ein oder erstelle ein Account, um die Performance von Tabellen zu verbessern."
} }

@ -1342,5 +1342,13 @@
"admin_openFilesTitle": "Fichiers Ouverts", "admin_openFilesTitle": "Fichiers Ouverts",
"profile_copyKey": "Copier la clé publique", "profile_copyKey": "Copier la clé publique",
"canvas_select": "Selection", "canvas_select": "Selection",
"canvas_brush": "Pinceau" "canvas_brush": "Pinceau",
"cba_show": "Montrer les couleurs d'auteurs",
"cba_disable": "Effacer et Désactiver",
"cba_hint": "Ce réglage sera mémorisé lors de la création de votre prochain pad.",
"cba_enable": "Activer",
"cba_writtenBy": "Écrit par : {0}",
"cba_properties": "Couleurs par auteurs (expérimental)",
"cba_hide": "Cacher les couleurs d'auteurs",
"oo_login": "Veuillez vous connecter ou vous inscrire pour améliorer la performance des feuilles de calcul."
} }

@ -1342,5 +1342,13 @@
"admin_openFilesTitle": "Open Files", "admin_openFilesTitle": "Open Files",
"admin_openFilesHint": "Number of file descriptors currently open on the server.", "admin_openFilesHint": "Number of file descriptors currently open on the server.",
"canvas_brush": "Brush", "canvas_brush": "Brush",
"canvas_select": "Select" "canvas_select": "Select",
"cba_writtenBy": "Written by: {0}",
"cba_properties": "Author colors (experimental)",
"cba_hint": "This setting will be remembered when you create your next pad.",
"cba_enable": "Enable",
"cba_disable": "Clear and Disable",
"cba_show": "Show author colors",
"cba_hide": "Hide author colors",
"oo_login": "Please log in or register to improve the performance of spreadsheets."
} }

@ -201,6 +201,180 @@
"chainpadError": "Er was een kritieke fout bij het updaten van uw inhoud. Deze pagina is nu alleen leesbaar om uw werk niet kwijt te raken. <br>Druk op <em>Esc</em> om verder te gaan met het bekijken van deze werkomgeving, of herlaad de pagina om te proberen deze werkomgeving weer aan te kunnen passen.", "chainpadError": "Er was een kritieke fout bij het updaten van uw inhoud. Deze pagina is nu alleen leesbaar om uw werk niet kwijt te raken. <br>Druk op <em>Esc</em> om verder te gaan met het bekijken van deze werkomgeving, of herlaad de pagina om te proberen deze werkomgeving weer aan te kunnen passen.",
"inactiveError": "Deze werkomgeving is verwijderd wegens gebrek aan activiteit. Druk op Esc om een nieuwe werkomgeving aan te maken.", "inactiveError": "Deze werkomgeving is verwijderd wegens gebrek aan activiteit. Druk op Esc om een nieuwe werkomgeving aan te maken.",
"deletedError": "Deze werkomgeving is verwijderd door de eigenaar en is niet meer beschikbaar.", "deletedError": "Deze werkomgeving is verwijderd door de eigenaar en is niet meer beschikbaar.",
"main_title": "CryptPad: Geen Kennis, Onvertraagd Collaboratief Aanpassen" "main_title": "CryptPad: Geen Kennis, Onvertraagd Collaboratief Aanpassen",
"fc_open_ro": "Openen (alleen-lezen)",
"history_restorePrompt": "Weet u zeker dat u de bestaande documentversie wilt vervangen met de weergegeven versie?",
"history_restoreDone": "Document hersteld",
"history_version": "Versie:",
"openLinkInNewTab": "Open Link in Nieuw Tabblad",
"pad_mediatagTitle": "Mediamarkering Instellingen",
"pad_mediatagWidth": "Breedte (px)",
"pad_mediatagHeight": "Hoogte (px)",
"pad_mediatagRatio": "Behoud ratio",
"pad_mediatagBorder": "Randbreedte (px)",
"pad_mediatagPreview": "Voorbeeld",
"pad_mediatagImport": "Opslaan in uw CryptDrive",
"pad_mediatagOptions": "Afbeeldingeigenschappen",
"kanban_newBoard": "Nieuw bord",
"kanban_item": "Item {0}",
"kanban_todo": "Te Doen",
"kanban_working": "In voortgang",
"kanban_deleteBoard": "Weet u zeker dat u dit bord wilt verwijderen?",
"kanban_addBoard": "Een bord toevoegen",
"kanban_removeItem": "Verwijder dit item",
"kanban_removeItemConfirm": "Weet u zeker dat u dit item wilt verwijderen?",
"poll_p_save": "Uw instellingen worden direct geüpdate, dus u hoeft deze nooit op te slaan.",
"poll_p_encryption": "Al uw invoer worden versleuteld zodat alleen de personen met de link toegang kunnen krijgen. Zelfs de server kan niet zien wat u wijzigt.",
"wizardLog": "Klik op de knop linksboven om terug te gaan naar uw enquête",
"wizardTitle": "Gebruik het formulier om een enquête aan te maken",
"wizardConfirm": "Bent u echt klaar om deze opties toe te voegen aan uw enquête?",
"poll_publish_button": "Publiceren",
"poll_admin_button": "Admin",
"poll_create_user": "Voeg een nieuwe gebruiker toe",
"poll_create_option": "Voeg een nieuwe optie toe",
"poll_commit": "Indienen",
"poll_closeWizardButton": "Sluit formulier",
"poll_closeWizardButtonTitle": "Sluit formulier",
"poll_wizardComputeButton": "Bereken Opties",
"poll_wizardClearButton": "Tabel Leegmaken",
"poll_wizardAddDateButton": "+ Data",
"poll_wizardAddTimeButton": "+ Tijden",
"poll_optionPlaceholder": "Optie",
"poll_userPlaceholder": "Uw naam",
"poll_removeOption": "Weet u zeker dat u deze optie wilt verwijderen?",
"poll_removeUser": "Weet u zeker dat u deze gebruiker wilt verwijderen?",
"poll_titleHint": "Titel",
"poll_remove": "Verwijder",
"poll_edit": "Wijzig",
"poll_locked": "Vergrendeld",
"poll_unlocked": "Ontgrendeld",
"poll_bookmark_col": "Voeg een bladwijzer toe aan deze kolom zodat deze altijd ontgrendeld is en weergegeven aan het begin",
"poll_bookmarked_col": "Dit is uw kolom met bladwijzer. Deze is altijd ontgrendeld en weergegeven aan het begin.",
"poll_total": "TOTAAL",
"poll_comment_list": "Commentaar",
"poll_comment_add": "Commentaar toevoegen",
"poll_comment_submit": "Verzenden",
"poll_comment_placeholder": "Uw commentaar",
"poll_comment_disabled": "Publiceer deze enquête met de ✓ knop om commentaar toe te staan.",
"oo_reconnect": "De verbinding met de server is terug. Klik op OK om te herladen en door te gaan met werken.",
"oo_cantUpload": "Uploaden is niet toegestaan als andere gebruikers aanwezig zijn.",
"oo_uploaded": "Uw upload is voltooid. Klik op OK om te herladen of Annuleren om door te gaan in alleen-lezen modus.",
"canvas_clear": "Leegmaken",
"canvas_delete": "Verwijder selectie",
"canvas_disable": "Tekenen uitschakelen",
"canvas_enable": "Tekenen inschakelen",
"canvas_width": "Breedte",
"canvas_opacity": "Ondoorzichtigheid",
"canvas_opacityLabel": "Ondoorzichtigheid: {0}",
"canvas_widthLabel": "Breedte: {0}",
"canvas_saveToDrive": "Deze afbeelding opslaan als bestand in uw CryptDrive",
"canvas_currentBrush": "Huidige borstel",
"canvas_chooseColor": "Kies een kleur",
"canvas_imageEmbed": "Plaats een afbeelding van uw computer",
"profileButton": "Profiel",
"profile_urlPlaceholder": "URL",
"profile_namePlaceholder": "Naam weergegeven op uw profiel",
"profile_avatar": "Avatar",
"profile_upload": " Een nieuw avatar uploaden",
"profile_uploadSizeError": "Foutmelding: uw avatar moet kleiner zijn dan {0}",
"profile_uploadTypeError": "Foutmelding: uw avatartype is niet toegestaan. Toegestane types zijn: {0}",
"profile_error": "Foutmelding tijdens het maken van uw profiel: {0}",
"profile_register": "U moet zich aanmelden om een profiel aan te maken!",
"profile_create": "Een profiel aanmaken",
"profile_description": "Beschrijving",
"profile_viewMyProfile": "Mijn profiel bekijken",
"userlist_addAsFriendTitle": "Stuur \"{0}\" een contactverzoek",
"contacts_title": "Contacten",
"contacts_addError": "Foutmelding tijdens het toevoegen van die contact aan de lijst",
"contacts_added": "Contactuitnodiging geaccepteerd.",
"contacts_rejected": "Contactuitnodiging afgewezen",
"contacts_request": "<em>{0}</em> wilt u toevoegen als contactpersoon. <b>Accepteren<b>?",
"contacts_send": "Verzenden",
"contacts_remove": "Verwijder deze contactpersoon",
"contacts_confirmRemove": "Weet u zeker dat u <em>{0}</em> wilt verwijderen uit uw contacten?",
"contacts_typeHere": "Schrijf hier een bericht...",
"contacts_warning": "Alles dat u hier schrijft blijft beschikbaar voor alle huidige en toekomstige gebruikers van deze werkomgeving. Wees voorzichtig met gevoelige informatie!",
"contacts_padTitle": "Gesprek",
"contacts_info1": "Dit zijn uw contacten. Vanaf hier kunt u:",
"contacts_info2": "Klik op uw contactpersoon's icoon om een gesprek met hun te beginnen",
"contacts_info3": "Dubbelklik op hun icoon om hun profiel te bekijken",
"contacts_info4": "Beide deelnemers kunnen de gesprekgeschiedenis voorgoed leegmaken",
"contacts_removeHistoryTitle": "Gesprekgeschiedenis leegmaken",
"contacts_confirmRemoveHistory": "Weet u zeker dat u voorgoed de gesprekgeschiedenis wilt leegmaken? De data kan niet worden hersteld",
"contacts_removeHistoryServerError": "Foutmelding tijdens het verwijderen van uw gesprekgeschiedenis. Probeer later opnieuw",
"contacts_fetchHistory": "Eerdere geschiedenis binnenhalen",
"contacts_friends": "Contacten",
"contacts_rooms": "Kamers",
"contacts_leaveRoom": "Deze kamer verlaten",
"contacts_online": "Een andere gebruiker in deze kamer is online",
"debug_getGraphWait": "De grafiek genereren... Even wachten, alstublieft.",
"fm_rootName": "Documenten",
"fm_trashName": "Prullenbak",
"fm_unsortedName": "Niet-gesorteerde bestanden",
"fm_filesDataName": "Alle bestanden",
"fm_templateName": "Sjablonen",
"fm_searchName": "Zoeken",
"fm_recentPadsName": "Recente werkomgevingen",
"fm_tagsName": "Markeringen",
"fm_sharedFolderName": "Gedeelde map",
"fm_searchPlaceholder": "Zoeken...",
"fm_newButton": "Nieuw",
"fm_newButtonTitle": "Make een nieuwe werkomgeving of map, importeer een bestand in de huidige map",
"fm_newFolder": "Nieuwe map",
"fm_newFile": "Nieuwe werkomgeving",
"fm_folder": "Map",
"fm_sharedFolder": "Gedeelde map",
"fm_folderName": "Mapnaam",
"fm_numberOfFolders": "Aantal mappen",
"fm_numberOfFiles": "Aantal bestanden",
"fm_fileName": "Bestandsnaam",
"fm_title": "Titel",
"fm_type": "Type",
"fm_forbidden": "Verboden actie",
"fm_originalPath": "Oorspronkelijke pad",
"fm_openParent": "Weergeven in map",
"fm_noname": "Document Zonder Title",
"fm_emptyTrashDialog": "Weet u zeker dat u de prullenbak wilt legen?",
"fm_removeSeveralPermanentlyDialog": "Weet u zeker dat u deze {0} elementen voorgoed wilt verwijderen van uw CryptDrive?",
"fm_removePermanentlyDialog": "Weet u zeker dat u dit element voorgoed wilt verwijderen van uw CryptDrive?",
"fm_removePermanentlyNote": "Werkomgevingen in uw eigendom worden verwijderd van de server als u doorgaat.",
"fm_removeSeveralDialog": "Weet u zeker dat u deze {0} elementen wilt verplaatsen naar de prullenbak?",
"fm_removeDialog": "Weet u zeker dat u {0} wilt verplaatsen naar de prullenbak?",
"fm_deleteOwnedPad": "Weet u zeker dat u deze werkomgeving wilt verwijderen van de server?",
"fm_deleteOwnedPads": "Weet u zeker dat u deze werkomgevingen wilt verwijderen van de server?",
"fm_restoreDialog": "Weet u zeker dat u {0} wilt terugzetten naar de vorige lokatie?",
"fm_unknownFolderError": "De geselecteerde of laatst bezochte map bestaat niet meer. De bovenliggende map aan het openen...",
"fm_backup_title": "Backup link",
"fm_nameFile": "Hoe wilt u dit bestand noemen?",
"fm_error_cantPin": "Interne server fout. Graag de pagina herladen en opnieuw proberen.",
"fm_canBeShared": "Deze map is deelbaar",
"fm_prop_tagsList": "Markeringen",
"fm_burnThisDriveButton": "Verwijder alle informatie opgeslagen door CryptPad in uw browser",
"fm_padIsOwned": "U bent de eigenaar van deze werkomgeving",
"fm_padIsOwnedOther": "Deze werkomgeving is van een andere gebruiker",
"fm_deletedPads": "Deze werkomgeving bestaan niet meer op de server, ze zijn verwijderd van uw CryptDrive: {0}",
"fm_tags_name": "Markeringsnaam",
"fm_tags_used": "Aantal gebruikers",
"fm_passwordProtected": "Vergrendeld met wachtwoord",
"fc_newfolder": "Nieuwe map",
"fc_newsharedfolder": "Nieuwe gedeelde map",
"fc_rename": "Hernoemen",
"fc_color": "Kleur wijzigen",
"fc_open": "Openen",
"fc_openInCode": "Openen in Code bewerker",
"fc_expandAll": "Alles Uitvouwen",
"fc_collapseAll": "Alles Samenvouwen",
"fc_delete": "Naar prullenbak verplaatsen",
"fc_delete_owned": "Verwijderen van server",
"fc_restore": "Herstellen",
"fc_remove": "Verwijder uit uw CryptDrive",
"fc_remove_sharedfolder": "Verwijderen",
"fc_empty": "Prullenbak legen",
"fc_prop": "Eigenschappen",
"fc_hashtag": "Markeringen",
"getEmbedCode": "Krijg integratiecode",
"kanban_done": "Gedaan",
"poll_comment_remove": "Verwijder dit commentaar",
"profile_fieldSaved": "Nieuwe waarde opgeslagen: {0}",
"fm_morePads": "Meer"
} }

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -7,7 +7,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="/common/onlyoffice/main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="/common/onlyoffice/main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="/common/onlyoffice/main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="/common/onlyoffice/main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -731,10 +731,30 @@ define([
$iframe.find('body').attr('spellcheck', true); $iframe.find('body').attr('spellcheck', true);
} }
}); });
Messages.pad_useFullWidth = "Use full width"; // XXX
Messages.pad_usePageWidth = "Use page mode"; // XXX
framework._.sfCommon.getAttribute(['pad', 'width'], function (err, data) { framework._.sfCommon.getAttribute(['pad', 'width'], function (err, data) {
if (data) { var active = data || typeof(data) === "undefined";
if (active) {
$iframe.find('html').addClass('cke_body_width'); $iframe.find('html').addClass('cke_body_width');
} }
var $width = framework._.sfCommon.createButton('', true, {
icon: 'fa-arrows-h',
text: active ? Messages.pad_useFullWidth : Messages.pad_usePageWidth,
name: "pad-width",
},function () {
if (active) {
$iframe.find('html').removeClass('cke_body_width');
} else {
$iframe.find('html').addClass('cke_body_width');
}
active = !active;
var key = active ? Messages.pad_useFullWidth : Messages.pad_usePageWidth;
$width.find('.cp-toolbar-drawer-element').text(key);
framework._.sfCommon.setAttribute(['pad', 'width'], active);
});
framework._.toolbar.$drawer.append($width);
}); });
framework._.sfCommon.isPadStored(function (err, val) { framework._.sfCommon.isPadStored(function (err, val) {

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="/common/onlyoffice/main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="/common/onlyoffice/main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="main.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

@ -6,7 +6,7 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="referrer" content="no-referrer" /> <meta name="referrer" content="no-referrer" />
<script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script> <script async data-bootload="/common/sframe-app-outer.js" data-main="/common/boot.js?ver=1.0" src="/bower_components/requirejs/require.js?ver=2.3.5"></script>
<link href="/customize/src/outer.css" rel="stylesheet" type="text/css"> <link href="/customize/src/outer.css?ver=1.1" rel="stylesheet" type="text/css">
</head> </head>
<body> <body>
<iframe id="sbox-iframe"> <iframe id="sbox-iframe">

Loading…
Cancel
Save