- ID de l'analyse :
- e633e7fe-98db-4eee-8fc4-4cfe35b4af12Terminée
- URL soumise :
- https://t.co/0wxMpjrDXq
- Fin du rapport :
Liens : 0 trouvé(s)
Liens sortants identifiés à partir de la page
Variables JavaScript : 131 trouvée(s)
Les variables JavaScript globales chargées dans l'objet fenêtre d'une page sont des variables déclarées en dehors des fonctions et accessibles depuis n'importe quel endroit du code au sein du champ d'application actuel
Nom | Type |
---|---|
onbeforetoggle | object |
documentPictureInPicture | object |
onscrollend | object |
RemoteStorage | function |
Widget | function |
gtag | function |
dataLayer | object |
science | function |
Pickr | function |
JSZip | function |
Messages de journal de console : 1 trouvé(s)
Messages consignés dans la console web
Type | Catégorie | Enregistrement |
---|---|---|
warning | other |
|
HTML
Le corps HTML de la page en données brutes
<!DOCTYPE html><html style="--readerBg: #000000; --sidebarCol: #28292B; --accentCol: #B73636; --textCol: #EEEEEE; --icoCol: #EEEEEE; --sidebarColDark: #191a1c; --sidebarColDarkA: #191a1c00; --prevCol: #212224; --accentSelected: #ffffff; --accentSelectedInvert: #444444; --borderColor: rgba(0,0,0,0.7); --blackLight: rgba(0,0,0,0.2); --sidebarColFocus: #0d0e10; --rescueShade: unset; --rdrBorderL: 1px; --rdr-wb: 2px; --blackFlag: rgba(0,0,0,0.7); --rdrAncBottomWhite: rgba(255,255,255,0.35); overflow: auto;"><head>
<meta charset="UTF-8">
<meta name="theme-color" content="#2b2f33">
<title>xx30 | Chapter 1 | Cubari</title>
<meta name="twitter:title" content="xx30 | Chapter 1 | Cubari">
<meta property="og:title" content="xx30 | Chapter 1 | Cubari">
<meta name="description" content="Read chapter 1 of xx30 | Cubari">
<meta name="twitter:card" content="summary">
<meta property="og:description" content="Read the xx30 manga series.">
<meta name="twitter:description" content="Read the xx30 manga series.">
<meta property="og:image" content="https://cdn.imgchest.com/files/l7lxcmlmb67.png">
<meta name="twitter:image" content="https://cdn.imgchest.com/files/l7lxcmlmb67.png">
<meta property="og:url" content="https://cubari.moe/read/imgchest/o24av9o3e4l/1/1/">
<meta name="viewport" content="width=device-width">
<link rel="stylesheet" href="/static/css/pickr.css?v=29a9e3e
">
<link rel="canonical" href="https://cubari.moe/read/imgchest/o24av9o3e4l/1/1/">
<link rel="stylesheet" type="text/css" href="/static/css/reader.css?v=29a9e3e
">
<link rel="manifest" href="/static/manifest.json?v=29a9e3e
">
<link rel="shortcut icon" sizes="128x128" type="image/png" href="/static/favicon.png?v=29a9e3e
" defer="">
<link rel="icon" sizes="128x128" type="image/png" href="/static/favicon.png?v=29a9e3e
">
<link rel="icon" sizes="512x512" type="image/png" href="/static/favicon.png?v=29a9e3e
">
<link rel="apple-touch-icon" sizes="128x128" href="/static/favicon.png?v=29a9e3e
">
<link rel="apple-touch-icon" sizes="256x256" href="/static/favicon.png?v=29a9e3e
">
<link rel="apple-touch-icon" sizes="512x512" href="/static/favicon.png?v=29a9e3e
">
<meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black-translucent">
<meta name="theme-color" content="#2b2f33">
<meta name="format-detection" content="telephone=no">
<meta name="referrer" content="same-origin">
<script src="/static/js/remotestorage.min.js"></script>
<script src="/static/js/widget.min.js"></script>
<script id="history_coverUrl" type="application/json">"https://cdn.imgchest.com/files/l7lxcmlmb67.png"</script>
<script id="history_source" type="application/json">"read/imgchest"</script>
<script id="history_slug" type="application/json">"o24av9o3e4l"</script>
<script id="history_url" type="application/json">"read/imgchest/o24av9o3e4l"</script>
<script id="history_title" type="application/json">"xx30"</script>
<script>
// remoteStorage backend that'll be our plugged in module
// This should be abstracted from what actually handles updates,
// since this'll give us the ability to pull this out in the future
const RS_PATH = "cubari";
const remoteStorage = (() => {
// Define the schema for our history
const Model = {name: RS_PATH, builder: (private) => {
const SERIES_META = "series";
const REPLACEMENT_STR = "{SOURCE_SLUG_REPLACEMENT}";
const SERIES_META_PATH_BASE = "series/";
const SERIES_META_PATH = `${SERIES_META_PATH_BASE}${REPLACEMENT_STR}`;
private.declareType(SERIES_META, {
type: "object",
properties: {
slug: {
type: "string"
},
coverUrl: {
type: "string"
},
source: {
type: "string"
},
url: {
type: "string"
},
title: {
type: "string"
},
timestamp: {
type: "number"
},
chapters: {
type: "array",
default: [] // Note that these aren't validated by our schema handler
},
pinned: {
type: "boolean",
default: false // Thus it's documenting only; handle it
}
},
required: ["slug", "source", "url", "title", "timestamp", "chapters", "pinned"]
});
let firstPartyValidator = (source) => {
return (source === "manga" || source === "series" || source === "default");
};
let pathBuilder = (path, slug, source) => {
if (!source) source = "default";
if (firstPartyValidator(source)) source = "default";
source = source.replace(" ", "_");
return path.replace(REPLACEMENT_STR, `${source}-${slug}`);
};
let seriesBuilder = (slug, coverUrl, source, url, title, pinned, chapters) => {
source = source.replace(" ", "_");
if (firstPartyValidator(source)) {
source = "default";
pinned = true; // First party chapters always pinned
}
return {
slug: slug,
coverUrl: coverUrl || "",
source: source,
url: url,
title: title,
timestamp: Date.now(),
chapters: chapters || [],
pinned: (pinned === undefined) ? false : pinned
};
};
return {
exports: {
firstPartyHandler: (source) => {
return firstPartyValidator(source) ? "default" : source;
},
slugBuilder: (slug, source) => {
return `${source}-${slug}`;
},
addSeries: (slug, coverUrl, source, url, title, pinned, chapters) => {
let toStore = seriesBuilder(slug, coverUrl, source, url, title, pinned, chapters);
return private.storeObject(
SERIES_META,
pathBuilder(SERIES_META_PATH, slug, source),
toStore);
},
editSeries: async (slug, coverUrl, source, url, title, pinned, chapters) => {
let obj = await private.getObject(pathBuilder(SERIES_META_PATH, slug, source));
if (obj) {
let toStore = seriesBuilder(
slug || obj.slug,
coverUrl || obj.coverUrl,
source || obj.source,
url || obj.url,
title || obj.title,
(pinned !== undefined) ? pinned : obj.pinned,
chapters || obj.chapters // Empty array is truthy
);
return private.storeObject(
SERIES_META,
pathBuilder(SERIES_META_PATH, slug, source),
toStore
)
} else {
// Fail-fast instead of adding the series
throw new Error("Cannot edit a non-existent series.");
}
},
getSeries: (slug, source) => {
return private.getObject(pathBuilder(SERIES_META_PATH, slug, source));
},
removeSeries: (slug, source) => {
return private.remove(pathBuilder(SERIES_META_PATH, slug, source));
},
getAllSeries: () => {
// Note for the future: getAll gives you the objects within, while
// getListing gives you just a list of files; thus, this gives you the
// metadata within
if (private.storage.connected) {
// maxAge cache in millis
return private.getAll(SERIES_META_PATH_BASE, 30000);
} else {
// Promise resolves immediately if no storage is connected
// https://remotestoragejs.readthedocs.io/en/v1.2.3/js-api/base-client.html#caching-logic-for-read-operations
return private.getAll(SERIES_META_PATH_BASE);
}
}
}
}
}};
let remoteStorage = new RemoteStorage({cache: true, modules: [Model]});
remoteStorage.access.claim(RS_PATH, "rw");
remoteStorage.caching.enable(`/${RS_PATH}/`);
return remoteStorage;
})();
// This will be the main handler that deals with both
// chapter and series history. All logic should be here
// and abstracted from the rest of the code
const globalHistoryHandler = (() => {
const STORAGE_KEY = "proxyHistory";
const SORT_KEY = "timestamp";
const MAX_VALUES = 20;
// Helper to return an array of objects from a nested object, sorted by key
let sortObjectByKey = (obj, key) => {
let sortable = [];
for (let k in obj) {
sortable.push(obj[k]);
}
sortable.sort((f, s) => s[key] - f[key]);
return sortable;
};
const sync = async () => {
// Sync operation ensures the local cache doesn't have any dangling objects.
// We'll sort for the timestamp key since that's what we use everywhere else
let allSeries = await remoteStorage[RS_PATH].getAllSeries();
for (const [key, value] of Object.entries(allSeries)) {
try {
if (!value[SORT_KEY]) {
// We don't use split here since the slug can potentially include "-"
let separatorIndex = key.indexOf("-");
let slug = key.slice(separatorIndex + 1);
let source = key.slice(0, separatorIndex);
await remoteStorage[RS_PATH].removeSeries(slug, source);
}
} catch (e) {
console.error("[Global History] Sync error, continuing.");
}
}
};
const enabled = () => {
return localStorage.getItem(STORAGE_KEY) ? true : false;
};
const enable = () => {
let settings = localStorage.getItem("settings");
let redirected = localStorage.getItem("redirected");
let storageOnce = localStorage.getItem("storageOnce");
localStorage.clear();
if (settings) localStorage.setItem("settings", settings);
if (redirected) localStorage.setItem("redirected", redirected);
if (storageOnce) localStorage.setItem("storageOnce", storageOnce);
localStorage.setItem(STORAGE_KEY, true);
};
const disable = () => {
let settings = localStorage.getItem("settings");
let redirected = localStorage.getItem("redirected");
let storageOnce = localStorage.getItem("storageOnce");
localStorage.clear();
if (settings) localStorage.setItem("settings", settings);
if (redirected) localStorage.setItem("redirected", redirected);
if (storageOnce) localStorage.setItem("storageOnce", storageOnce);
};
const pushSeries = async (slug, coverUrl, source, url, title) => {
await sync();
source = remoteStorage[RS_PATH].firstPartyHandler(source);
let allCurrentSeries = sortObjectByKey(await remoteStorage[RS_PATH].getAllSeries() || {}, SORT_KEY);
let existingSeries = allCurrentSeries.find((e) => e.slug === slug && e.source === source.replace(" ", "_"));
allCurrentSeries = allCurrentSeries.filter(e => !e.pinned);
// Be mindful of the cap regardless of the state of the tree
while ((allCurrentSeries.length + ((existingSeries) ? 0 : 1)) > MAX_VALUES) {
let last = allCurrentSeries.pop();
await remoteStorage[RS_PATH].removeSeries(last.slug, last.source);
}
if (existingSeries) {
// Effectively this updates the timestamp of the series, pushing it to the top
return remoteStorage[RS_PATH].editSeries(slug, coverUrl, source, url, title, existingSeries.pinned, existingSeries.chapters);
} else {
return remoteStorage[RS_PATH].addSeries(slug, coverUrl, source, url, title, undefined, undefined);
}
};
const removeSeries = async (slug, source) => {
await sync();
return remoteStorage[RS_PATH].removeSeries(slug, source);
};
const removeAllUnpinnedSeries = async () => {
let series = await globalHistoryHandler.getAllUnpinnedSeries();
if(series) {
Array.prototype.forEach.call(series, srs => {
removeSeries(srs.slug, srs.source)
})
}
};
const addChapters = async (slug, source, chapters) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
chapters = [...new Set([...chapters, ...existingSeries.chapters])];
return remoteStorage[RS_PATH].editSeries(slug, undefined, source, undefined, undefined, undefined, chapters);
} else {
console.error("[Global History] addChapters - Series didn't exist.");
}
};
const addChapter = async (slug, source, chapter) => {
return addChapters(slug, source, [chapter]);
};
const removeChapter = async (slug, source, chapter) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
chapters = existingSeries.chapters.filter(e => e !== chapter);
return remoteStorage[RS_PATH].editSeries(slug, undefined, source, undefined, undefined, undefined, chapters);
} else {
console.error("[Global History] removeChapter - Series didn't exist.");
}
};
const removeAllChapters = async (slug, source) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
return remoteStorage[RS_PATH].editSeries(slug, undefined, source, undefined, undefined, undefined, []);
} else {
console.error("[Global History] removeAllChapters - series didn't exist.");
}
};
const getReadChapters = async (slug, source) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
return existingSeries.chapters;
} else {
console.error("[Global History] getReadChapters - series didn't exist.");
}
};
const pinSeries = async (slug, source) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
return remoteStorage[RS_PATH].editSeries(slug, undefined, source, undefined, undefined, true, undefined);
} else {
console.error("[Global History] pinSeries - series didn't exist.");
}
};
const unpinSeries = async (slug, source) => {
let existingSeries = await remoteStorage[RS_PATH].getSeries(slug, source);
if (existingSeries) {
return remoteStorage[RS_PATH].editSeries(slug, undefined, source, undefined, undefined, false, undefined);
} else {
console.error("[Global History] unpinSeries - series didn't exist.");
}
};
const getAllPinnedSeries = async () => {
await sync();
return sortObjectByKey(await remoteStorage[RS_PATH].getAllSeries() || {}, SORT_KEY).filter(e => e.pinned);
};
const getAllUnpinnedSeries = async () => {
await sync();
return sortObjectByKey(await remoteStorage[RS_PATH].getAllSeries() || {}, SORT_KEY).filter(e => !e.pinned);
};
return {
max: MAX_VALUES,
enabled,
pushSeries,
removeSeries,
removeAllUnpinnedSeries,
addChapters,
addChapter,
removeChapter,
removeAllChapters,
getReadChapters,
pinSeries,
unpinSeries,
getAllPinnedSeries,
getAllUnpinnedSeries,
toggle: {
enable,
disable
}
};
})();
const tag = () => {
try {
let coverUrl = JSON.parse(document.getElementById("history_coverUrl").textContent);
let source = JSON.parse(document.getElementById("history_source").textContent);
if (!source) {
source = window.location.pathname
.split("/")
.filter(e => e)[1]
.replace("_", " ");
} else {
source = source.split("/")[1];
}
let slug = JSON.parse(document.getElementById("history_slug").textContent);
let url = JSON.parse(document.getElementById("history_url").textContent);
if (url) {
url = `/${url}`.split(slug)[0] + slug;
}
let title = JSON.parse(document.getElementById("history_title").textContent);
if (source && slug && url && title) {
remoteStorage.on("ready", async () => {
await globalHistoryHandler.pushSeries(slug, coverUrl, source, url, title);
window.dispatchEvent(new CustomEvent("history-ready"));
});
}
} catch (e) {
// Do nothing, silently fail.
}
};
window.addEventListener("load", async () => {
if((await localStorage.getItem('storageOnce')) == "1") return;
if (!globalHistoryHandler.enabled()) {
globalHistoryHandler.toggle.enable();
localStorage.setItem('storageOnce', "1")
}
})
</script>
<script>
// Seed the values from the template for the reader API calls
const BASE_API_PATH = "/read/api/imgchest/series/";
const IS_FIRST_PARTY = false;
const IS_INDEXED = false;
const IMAGE_PROXY_URL = "https://services.f-ck.me";
</script></head>
<body class="fit-width_limit direction-ltr gap-false theme-Cubari reset-false spread-1 spreadCount-1 spreadOffset-0 selectorAnchor-left selPinned-false selNum-true hoverinos-true sidebar-true previews-false clickTurnPage-true arrowTurnPage-false swipeGestures-true parallelDownloads-5 zoom-100">
<!-- Global site tag (gtag.js) - Google Analytics -->
<script async="" src="https://www.googletagmanager.com/gtag/js?id=G-ZX1TZQKKPL"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-ZX1TZQKKPL');
</script>
<script>
const science = (measurePerformance = false) => {
const scienceEndpoint = "https://obs.f-ck.me/ingest";
const proxyBasePath = "read";
const pathFragments = location.pathname.split("/");
const proxyMetadata = pathFragments[pathFragments.findIndex(e => e === proxyBasePath) + 1];
if (!proxyMetadata) {
return;
}
const sciencePayload = {
"p": "cubari.moe",
"m": proxyMetadata,
};
if (measurePerformance) {
const navPerf = performance.getEntriesByType("navigation");
if (navPerf.length === 1) {
sciencePayload["t"] = navPerf[0].duration;
}
}
fetch(`${scienceEndpoint}`, {
method: "POST",
mode: "no-cors",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify(sciencePayload),
});
};
window.science = science;
// Science once when the page is loaded
window.addEventListener("load", () => {
// We need to add this to the event loop so that the load
// event can be properly hydrated in the performance object
setTimeout(() => {
science(true);
}, 0);
});
</script>
<main id="rdr-main" class="UI Reader last-chapter" tabindex="-1" data-preload="3">
<aside class="">
<div class="hide-side UI Button MultiStateButton" data-bind="sidebar_button" data-tip="Show/hide sidebar [S]" data-tip-align="right" data-apr.sidebar="true">
<div class="hide-side-actual ico-btn"></div>
</div>
<header>
<a href="/" class="ico-btn guya"></a>
<h1 data-bind="title"><a href="/read/imgchest/o24av9o3e4l/">xx30</a></h1>
<button class="ico-btn"></button>
</header>
<div class="rdr-aside-buffer" data-bind="rdr_aside_buffer"></div>
<div class="rdr-aside-content" data-bind="rdr_aside_content">
<section class="rdr-selector" data-bind="rdr_selector">
<div class="rdr-selector-top">
<button data-bind="vol_next" class="rdr-selector-vol ico-btn prev disabled" data-tip="Next volume [.]"></button>
<div class="flex-spacer UI MessageBox" data-bind="message"></div>
<button data-bind="download_chapter" class="ico-btn download" data-tip="Download chapter in the background"></button>
<div class="download-anchor">
<div class="download-wrapper hidden" data-bind="download_wrapper">
<button data-bind="downloading_chapter" class="ico-btn downloading" disabled=""></button>
<button data-bind="download_cancel" class="ico-btn download-cancel"></button>
</div>
</div>
<a data-bind="share_button" data-tip="Copy short link [R]" class="rdr-share ico-btn "></a>
<!-- <a data-bind='comment_button' data-tip="Comments" class="rdr-comment ico-btn"></a> -->
<button data-bind="jump" class="ico-btn jump" data-tip="Jump to chapter... [J]"></button>
<button data-bind="search" class="ico-btn search" data-tip="Search the manga... [Ctrl]+[F]" style="display: none;"></button>
</div>
<div class="rdr-selector-mid">
<button data-bind="chap_prev" class="rdr-selector-chap ico-btn prev disabled" data-tip="Previous chapter [[]"></button>
<div class="rdr-vol-wrap UI FauxDrop" data-bind="selector_vol">
<label>1</label>
<select id="rdr-vol" class="UI List SimpleList"><option class="UI SimpleListItem" value="1">1</option></select>
</div>
<div class="rdr-chap-wrap UI FauxDrop" data-bind="selector_chap">
<label>1 - xx30</label>
<select id="rdr-chap" class="UI List SimpleList"><option class="UI SimpleListItem" value="1">1 - xx30</option></select>
</div>
<button data-bind="chap_next" class="rdr-selector-chap ico-btn next disabled" data-tip="Next chapter []]"></button>
</div>
<div class="rdr-selector-bot">
<button data-bind="vol_prev" class="rdr-selector-vol ico-btn next disabled" data-tip="Previous volume [,]"></button>
<div class="flex-spacer"></div>
<button data-bind="preload_button" class="ico-btn hidden UI Button MultiStateButton" data-tip="Change preload [L]" data-bhv.preload="3"></button>
<button data-bind="fit_button" class="ico-btn UI Button MultiStateButton" data-tip="Change fit mode [F]" data-lyt.fit="width_limit"></button>
<button data-bind="layout_button" class="ico-btn UI Button MultiStateButton" data-tip="Change layout direction [D]" data-lyt.direction="ltr"></button>
<button data-bind="spread_button" class="ico-btn UI Button MultiStateButton" data-tip="Change two-page mode [Q]" data-lyt.spread="1"></button>
<button data-bind="sel_pin_button" class="ico-btn UI Button MultiStateButton" data-tip="Pin page selector [N]" data-apr.selpinned="false"></button>
<button data-bind="settings_button" class="ico-btn" data-tip="Advanced settings... [O]"></button>
</div>
</section>
<section class="rdr-groups UI List Selector Tabs" data-bind="groups">
<div class="is-active UI SimpleListItem" data-list-id="1">imgchest</div></section>
<section class="rdr-previews" style="display: none;">
<div class="header UI Button MultiStateButton" data-bind="previews_button" data-apr.previews="false">
<span>Previews</span>
<div class="ico-btn expander" data-tip="Show previews [P]"></div>
</div>
<div data-bind="previews" class="rdr-previews-gallery UI List Selector Tabs">
</div>
</section>
<section class="rdr-description">
<div data-bind="image_description"></div>
</section>
</div>
</aside>
<div class="rdr-page-selector UI PageSelector" data-bind="page_selector">
<div class="rdr-page-selector-counter" data-bind="page_keys_count">1/14</div>
<div class="rdr-page-selector-keys UI List Selector Tabs" data-bind="page_keys">
<div class="UI Dummy is-active shown preloaded">1</div><div class="UI Dummy preloaded">2</div><div class="UI Dummy preloaded">3</div><div class="UI Dummy">4</div><div class="UI Dummy">5</div><div class="UI Dummy">6</div><div class="UI Dummy">7</div><div class="UI Dummy">8</div><div class="UI Dummy">9</div><div class="UI Dummy">10</div><div class="UI Dummy">11</div><div class="UI Dummy">12</div><div class="UI Dummy">13</div><div class="UI Dummy">14</div></div>
</div>
<content data-bind="image_viewer" class="rdr-area UI ReaderImageView">
<div class="preload-entity" data-bind="preload_entity">
<img src="https://cdn.imgchest.com/files/84jdcd8dpj4.png"><img><img><img>
</div>
<div class="rdr-image-wrap UI List Selector Tabs" data-bind="image_container" tabindex="-1" style="margin-left: 0%;">
<div tabindex="-1" class="UI List ReaderImageWrapper"><img src="https://cdn.imgchest.com/files/l7lxcmlmb67.png" class="UI ReaderImage" loading="eager"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="https://cdn.imgchest.com/files/84jdcd8dpj4.png" class="UI ReaderImage" loading="eager"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="https://cdn.imgchest.com/files/pyq9crmrqv4.png" class="UI ReaderImage" loading="eager"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div><div tabindex="-1" class="UI List ReaderImageWrapper"><img src="" class="UI ReaderImage"></div></div>
<div class="zoom-level refresh-chapter is-hidden" data-bind="random_chapter">
<div class="refresh-chapter-note">This is the Blu-ray extras "random chapter".<br>Click this button to
reshuffle the chapter.</div>
<div class="ico-btn" data-bind="random_chapter_button">↻</div>
</div>
<div class="hover-prev" data-bind="hover_prev">
<div class="hover-wrap">
<div class="hover-arrow"></div>
<div class="hover-sub"></div>
</div>
</div>
<div class="hover-next" data-bind="hover_next">
<div class="hover-wrap">
<div class="hover-arrow"></div>
<div class="hover-sub"></div>
</div>
</div>
<div dir="ltr" class="resize-sensor" style="pointer-events: none; position: absolute; inset: 0px; overflow: hidden; z-index: -1; visibility: hidden; max-width: 100%;"><div class="resize-sensor-expand" style="pointer-events: none; position: absolute; inset: 0px; overflow: hidden; z-index: -1; visibility: hidden; max-width: 100%;"><div style="position: absolute; left: 0px; top: 0px; transition: all 0s ease 0s; width: 503px; height: 610px;"></div></div><div class="resize-sensor-shrink" style="pointer-events: none; position: absolute; inset: 0px; overflow: hidden; z-index: -1; visibility: hidden; max-width: 100%;"><div style="position: absolute; left: 0px; top: 0px; transition: all 0s ease 0s; width: 200%; height: 200%;"></div></div></div></content>
<div class="zoom-level" data-bind="zoom_level">
<div class="ico-btn" data-bind="zoom_level_plus"></div>
<div class="ico-btn" data-bind="zoom_level_minus"></div>
</div>
</main>
<div class="Tooltippy UI" style="display: none;"></div>
<div class="Tooltippy Error UI"></div>
<div class="LodaManager hidden UI" tabindex="-1">
</div>
<script src="/static/js/pickr.min.js?v=29a9e3e
"></script>
<script src="/static/js/jszip.min.js?v=29a9e3e
"></script>
<script type="text/javascript" src="/static/js/ResizeSensor.js?v=29a9e3e
"></script>
<script type="text/javascript" src="/static/js/alg_lib.js?v=29a9e3e
"></script>
<script type="text/javascript" src="/static/js/UI2.js?v=29a9e3e
"></script>
<script type="text/javascript" src="/static/js/init.js?v=29a9e3e
"></script><div style="display: none;"></div><div class="pcr-app" data-theme="nano" aria-label="color picker dialog" role="window" tabindex="-1" style="left: 0px; top: 8px;">
<div class="pcr-selection">
<div class="pcr-color-preview" style="display:none" hidden="">
<button type="button" class="pcr-last-color" aria-label="use previous color" style="color: rgb(255, 255, 255);"></button>
<div class="pcr-current-color" style="color: rgb(58, 63, 68);"></div>
</div>
<div class="pcr-color-palette">
<div class="pcr-picker" style="left: calc(14.7059% - 9px); top: calc(73.3333% - 9px); background: rgb(58, 63, 68);"></div>
<div class="pcr-palette" tabindex="0" aria-label="color selection area" role="listbox" style="background: linear-gradient(to top, rgb(0, 0, 0), transparent), linear-gradient(to left, rgb(0, 128, 255), rgb(255, 255, 255));"></div>
</div>
<div class="pcr-color-chooser">
<div class="pcr-picker" style="left: calc(58.3333% - 9px); background-color: rgb(0, 128, 255);"></div>
<div class="pcr-hue pcr-slider" tabindex="0" aria-label="hue selection slider" role="slider"></div>
</div>
<div class="pcr-color-opacity" style="display:none" hidden="">
<div class="pcr-picker"></div>
<div class="pcr-opacity pcr-slider" tabindex="0" aria-label="selection slider" role="slider"></div>
</div>
</div>
<div class="pcr-swatches "></div>
<div class="pcr-interaction">
<input class="pcr-result" type="text" spellcheck="false" aria-label="color input field">
<input class="pcr-type active" data-type="HEXA" value="HEXA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="RGBA" value="RGBA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSLA" value="HSLA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSVA" value="HSVA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="CMYK" value="CMYK" type="button" style="display:none" hidden="">
<input class="pcr-save" value="Save" type="button" aria-label="save and close">
<input class="pcr-cancel" value="Cancel" type="button" style="display:none" hidden="" aria-label="cancel and close">
<input class="pcr-clear" value="Clear" type="button" style="display:none" hidden="" aria-label="clear and close">
</div>
</div><div class="pcr-app" data-theme="nano" aria-label="color picker dialog" role="window" tabindex="-1" style="left: 0px; top: 8px;">
<div class="pcr-selection">
<div class="pcr-color-preview" style="display:none" hidden="">
<button type="button" class="pcr-last-color" aria-label="use previous color" style="color: rgb(255, 255, 255);"></button>
<div class="pcr-current-color" style="color: rgb(238, 238, 238);"></div>
</div>
<div class="pcr-color-palette">
<div class="pcr-picker" style="left: calc(0% - 9px); top: calc(6.66667% - 9px); background: rgb(238, 238, 238);"></div>
<div class="pcr-palette" tabindex="0" aria-label="color selection area" role="listbox" style="background: linear-gradient(to top, rgb(0, 0, 0), transparent), linear-gradient(to left, rgb(255, 0, 0), rgb(255, 255, 255));"></div>
</div>
<div class="pcr-color-chooser">
<div class="pcr-picker" style="left: calc(0% - 9px); background-color: rgb(255, 0, 0);"></div>
<div class="pcr-hue pcr-slider" tabindex="0" aria-label="hue selection slider" role="slider"></div>
</div>
<div class="pcr-color-opacity" style="display:none" hidden="">
<div class="pcr-picker"></div>
<div class="pcr-opacity pcr-slider" tabindex="0" aria-label="selection slider" role="slider"></div>
</div>
</div>
<div class="pcr-swatches "></div>
<div class="pcr-interaction">
<input class="pcr-result" type="text" spellcheck="false" aria-label="color input field">
<input class="pcr-type active" data-type="HEXA" value="HEXA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="RGBA" value="RGBA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSLA" value="HSLA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSVA" value="HSVA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="CMYK" value="CMYK" type="button" style="display:none" hidden="">
<input class="pcr-save" value="Save" type="button" aria-label="save and close">
<input class="pcr-cancel" value="Cancel" type="button" style="display:none" hidden="" aria-label="cancel and close">
<input class="pcr-clear" value="Clear" type="button" style="display:none" hidden="" aria-label="clear and close">
</div>
</div><div class="pcr-app" data-theme="nano" aria-label="color picker dialog" role="window" tabindex="-1" style="left: 0px; top: 8px;">
<div class="pcr-selection">
<div class="pcr-color-preview" style="display:none" hidden="">
<button type="button" class="pcr-last-color" aria-label="use previous color" style="color: rgb(255, 255, 255);"></button>
<div class="pcr-current-color" style="color: rgb(178, 223, 251);"></div>
</div>
<div class="pcr-color-palette">
<div class="pcr-picker" style="left: calc(29.0837% - 9px); top: calc(1.56863% - 9px); background: rgb(178, 223, 251);"></div>
<div class="pcr-palette" tabindex="0" aria-label="color selection area" role="listbox" style="background: linear-gradient(to top, rgb(0, 0, 0), transparent), linear-gradient(to left, rgb(0, 157, 255), rgb(255, 255, 255));"></div>
</div>
<div class="pcr-color-chooser">
<div class="pcr-picker" style="left: calc(56.3927% - 9px); background-color: rgb(0, 157, 255);"></div>
<div class="pcr-hue pcr-slider" tabindex="0" aria-label="hue selection slider" role="slider"></div>
</div>
<div class="pcr-color-opacity" style="display:none" hidden="">
<div class="pcr-picker"></div>
<div class="pcr-opacity pcr-slider" tabindex="0" aria-label="selection slider" role="slider"></div>
</div>
</div>
<div class="pcr-swatches "></div>
<div class="pcr-interaction">
<input class="pcr-result" type="text" spellcheck="false" aria-label="color input field">
<input class="pcr-type active" data-type="HEXA" value="HEXA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="RGBA" value="RGBA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSLA" value="HSLA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSVA" value="HSVA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="CMYK" value="CMYK" type="button" style="display:none" hidden="">
<input class="pcr-save" value="Save" type="button" aria-label="save and close">
<input class="pcr-cancel" value="Cancel" type="button" style="display:none" hidden="" aria-label="cancel and close">
<input class="pcr-clear" value="Clear" type="button" style="display:none" hidden="" aria-label="clear and close">
</div>
</div><div class="pcr-app" data-theme="nano" aria-label="color picker dialog" role="window" tabindex="-1" style="left: 0px; top: 8px;">
<div class="pcr-selection">
<div class="pcr-color-preview" style="display:none" hidden="">
<button type="button" class="pcr-last-color" aria-label="use previous color" style="color: rgb(255, 255, 255);"></button>
<div class="pcr-current-color" style="color: rgb(39, 43, 48);"></div>
</div>
<div class="pcr-color-palette">
<div class="pcr-picker" style="left: calc(18.75% - 9px); top: calc(81.1765% - 9px); background: rgb(39, 43, 48);"></div>
<div class="pcr-palette" tabindex="0" aria-label="color selection area" role="listbox" style="background: linear-gradient(to top, rgb(0, 0, 0), transparent), linear-gradient(to left, rgb(0, 113, 255), rgb(255, 255, 255));"></div>
</div>
<div class="pcr-color-chooser">
<div class="pcr-picker" style="left: calc(59.2593% - 9px); background-color: rgb(0, 113, 255);"></div>
<div class="pcr-hue pcr-slider" tabindex="0" aria-label="hue selection slider" role="slider"></div>
</div>
<div class="pcr-color-opacity" style="display:none" hidden="">
<div class="pcr-picker"></div>
<div class="pcr-opacity pcr-slider" tabindex="0" aria-label="selection slider" role="slider"></div>
</div>
</div>
<div class="pcr-swatches "></div>
<div class="pcr-interaction">
<input class="pcr-result" type="text" spellcheck="false" aria-label="color input field">
<input class="pcr-type active" data-type="HEXA" value="HEXA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="RGBA" value="RGBA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSLA" value="HSLA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="HSVA" value="HSVA" type="button" style="display:none" hidden="">
<input class="pcr-type" data-type="CMYK" value="CMYK" type="button" style="display:none" hidden="">
<input class="pcr-save" value="Save" type="button" aria-label="save and close">
<input class="pcr-cancel" value="Cancel" type="button" style="display:none" hidden="" aria-label="cancel and close">
<input class="pcr-clear" value="Clear" type="button" style="display:none" hidden="" aria-label="clear and close">
</div>
</div>
<script type="text/javascript">
// History tagging
tag();
</script>
</body></html>