diff --git a/images/facebook.png b/images/facebook.png
new file mode 100644
index 0000000000000000000000000000000000000000..1c2605c250d156ee371a6b044a22e212b04d9ce1
Binary files /dev/null and b/images/facebook.png differ
diff --git a/images/failed.gif b/images/failed.gif
new file mode 100644
index 0000000000000000000000000000000000000000..9f07137c0b9cbd738b865538d91826fe2e096062
Binary files /dev/null and b/images/failed.gif differ
diff --git a/images/icon.png b/images/icon.png
new file mode 100644
index 0000000000000000000000000000000000000000..4d3f4dbb068b3921568b8814aecd078d2c45b87e
Binary files /dev/null and b/images/icon.png differ
diff --git a/images/image-placeholder.jpg b/images/image-placeholder.jpg
new file mode 100644
index 0000000000000000000000000000000000000000..0e17ccaf633117881145feef4b098b27b25d168a
Binary files /dev/null and b/images/image-placeholder.jpg differ
diff --git a/images/index.php b/images/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..1580272ca20148e6cd43366e262c335765ed9b5e
--- /dev/null
+++ b/images/index.php
@@ -0,0 +1,3 @@
+
diff --git a/images/new.png b/images/new.png
new file mode 100644
index 0000000000000000000000000000000000000000..4a87e44ebe5dfc0dbcae26c9eb5530a1a376cdf9
Binary files /dev/null and b/images/new.png differ
diff --git a/images/nochange.gif b/images/nochange.gif
new file mode 100644
index 0000000000000000000000000000000000000000..c5a38657b711b941e24681ada711f54a680318f7
Binary files /dev/null and b/images/nochange.gif differ
diff --git a/images/ok.gif b/images/ok.gif
new file mode 100644
index 0000000000000000000000000000000000000000..7e41c953c1f0fded823b0fbc76fd049432ff066b
Binary files /dev/null and b/images/ok.gif differ
diff --git a/images/pinterest.png b/images/pinterest.png
new file mode 100644
index 0000000000000000000000000000000000000000..c2719bc0aba0d12264bf09ff68597e6df03d94a7
Binary files /dev/null and b/images/pinterest.png differ
diff --git a/images/running.gif b/images/running.gif
new file mode 100644
index 0000000000000000000000000000000000000000..c1677d8a253c733881911769767821da63d467aa
Binary files /dev/null and b/images/running.gif differ
diff --git a/images/twitter.png b/images/twitter.png
new file mode 100644
index 0000000000000000000000000000000000000000..61fd25dfd19ddb767165bc96d46d5f9f2f2d1e30
Binary files /dev/null and b/images/twitter.png differ
diff --git a/includes/class-madara-fetcher.php b/includes/class-madara-fetcher.php
new file mode 100644
index 0000000000000000000000000000000000000000..79c97944d1bf82aebc64d18da8b77fa3d8c8fa8b
--- /dev/null
+++ b/includes/class-madara-fetcher.php
@@ -0,0 +1,250 @@
+ $query,
+ 'orderby' => 'meta_value_num',
+ 'paged' => $page,
+ 'template' => 'search',
+ 'meta_query' => [
+ [
+ 'relation' => 'AND'
+ ]
+ ],
+ 'post_type' => 'wp-manga',
+ 'post_status' => 'publish',
+ 'meta_key' => '_latest_update',
+ 'order' => 'desc',
+ 'manga_archives_item_layout' => 'big_thumbnail'
+ ];
+
+ // Adjust search parameters based on the specified type
+ switch ($type) {
+ case 'new':
+ $vars['orderby'] = 'date';
+ break;
+ case 'latest':
+ $vars['orderby'] = 'meta_value_num';
+ $vars['meta_key'] = '_latest_update';
+ $vars['order'] = 'desc';
+ break;
+ case 'trending':
+ $vars['orderby'] = 'meta_value_num';
+ $vars['meta_key'] = '_wp_manga_week_views_value';
+ $vars['order'] = 'desc';
+ break;
+ case 'most_viewed':
+ $vars['orderby'] = 'meta_value_num';
+ $vars['meta_key'] = '_wp_manga_views';
+ $vars['order'] = 'desc';
+ break;
+ case 'rating':
+ $vars['orderby'] = [
+ ['query_avarage_reviews' => 'DESC'],
+ ['query_total_reviews' => 'DESC']
+ ];
+ $vars['meta_query'][] = [
+ 'query_avarage_reviews' => [
+ 'key' => '_manga_avarage_reviews'
+ ],
+ 'query_total_reviews' => [
+ 'key' => '_manga_total_votes'
+ ]
+ ];
+ break;
+ case 'a_z':
+ $vars['orderby'] = 'post_title';
+ $vars['order'] = 'ASC';
+ break;
+ case 'relevance':
+ // No additional parameters needed for relevance
+ break;
+ }
+
+ // Prepare the arguments for the HTTP request
+ $args = [
+ 'sslverify' => false,
+ 'body' => [
+ 'action' => 'madara_load_more',
+ 'page' => $page,
+ 'template' => 'madara-core/content/content-search',
+ 'vars' => $vars
+ ]
+ ];
+
+ // Perform the HTTP request to fetch manga data
+ $response = wp_remote_post($url, $args);
+
+ // Check for errors in the response
+ if (is_wp_error($response)) {
+ return ['error' => $response->get_error_message()];
+ }
+
+ // Retrieve and process the response body
+ $html = wp_remote_retrieve_body($response);
+ $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
+ if(empty($html))
+ {
+ return ['error' => 'Empty response from the server'];
+ }
+ // Load the HTML into a DOMDocument for parsing
+ libxml_use_internal_errors(true);
+ $dom = new DOMDocument();
+ $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
+ libxml_clear_errors();
+
+ // Use XPath to query the DOM for manga items
+ $xpath = new DOMXPath($dom);
+ $manga_items = $xpath->query('//div[contains(@class, "c-tabs-item__content")]');
+ $manga_list = [];
+
+ // Iterate through the manga items and extract data
+ foreach ($manga_items as $item) {
+ $title = $xpath->query('.//div[@class="post-title"]/h3[@class="h4"]/a', $item)->item(0)->nodeValue;
+ $cover_image = $xpath->query('.//div[@class="tab-thumb c-image-hover"]/a/img', $item)->item(0)->getAttribute('data-src');
+ $description = '';
+ $genres = [];
+ $status = '';
+
+ $index = 0;
+ $summary_headings = $xpath->query('.//div[@class="summary-heading"]/h5', $item);
+
+ // Extract specific details based on the summary headings
+ foreach ($summary_headings as $heading) {
+ $heading_text = trim($heading->nodeValue);
+ if ($heading_text === 'Alternative') {
+ $description = $xpath->query('.//div[@class="summary-content"]', $item)->item($index)->nodeValue;
+ $index++;
+ } elseif ($heading_text === 'Authors' || $heading_text === 'Artists') {
+ $index++;
+ } elseif ($heading_text === 'Genres') {
+ $genres = [];
+ $genre_elements = $xpath->query('.//div[@class="summary-content"]', $item)->item($index)->getElementsByTagName('a');
+ foreach ($genre_elements as $genre) {
+ $genres[] = $genre->nodeValue;
+ }
+ $index++;
+ } elseif ($heading_text === 'Status') {
+ $status = $xpath->query('.//div[@class="summary-content"]', $item)->item($index)->nodeValue;
+ $index++;
+ }
+ }
+
+ // Extract additional details like last updated date and latest chapter
+ if($last_updated = $xpath->query('.//div[@class="meta-item post-on"]/span[@class="font-meta"]', $item)->item(0))
+ {
+ $last_updated = $xpath->query('.//div[@class="meta-item post-on"]/span[@class="font-meta"]', $item)->item(0)->nodeValue;
+ }
+ else
+ {
+ $last_updated = '';
+ }
+ if($xpath->query('.//div[@class="meta-item latest-chap"]/span[@class="font-meta chapter"]/a', $item)->item(0))
+ {
+ $latest_chapter = $xpath->query('.//div[@class="meta-item latest-chap"]/span[@class="font-meta chapter"]/a', $item)->item(0)->nodeValue;
+ }
+ else
+ {
+ $latest_chapter = '';
+ }
+ if($xpath->query('.//div[@class="post-title"]/h3[@class="h4"]/a', $item)->item(0))
+ {
+ $url = $xpath->query('.//div[@class="post-title"]/h3[@class="h4"]/a', $item)->item(0)->getAttribute('href');
+ }
+ else
+ {
+ $url = '';
+ }
+
+ // Add the extracted manga data to the list
+ $manga_list[] = [
+ 'title' => $title,
+ 'url' => $url,
+ 'cover_image' => $cover_image,
+ 'description' => trim($description),
+ 'genres' => implode(', ', $genres),
+ 'status' => trim($status),
+ 'last_updated' => trim($last_updated),
+ 'latest_chapter' => $latest_chapter,
+ ];
+ }
+
+ // Return an error message if no manga are found
+ if (empty($manga_list)) {
+ return ['error' => 'No manga found on the provided URL.'];
+ }
+
+ // Return the list of manga data
+ return $manga_list;
+ }
+
+ /**
+ * Fetch detailed manga data from a specific URL.
+ *
+ * @param string $url The URL of the manga.
+ * @return array The detailed manga data or an error message.
+ */
+ public static function get_manga_details($url) {
+ // Perform the HTTP request to fetch manga details
+ $response = wp_remote_get($url, ['sslverify' => false]);
+
+ // Check for errors in the response
+ if (is_wp_error($response)) {
+ return ['error' => $response->get_error_message()];
+ }
+
+ // Retrieve and process the response body
+ $html = wp_remote_retrieve_body($response);
+ $html = mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8');
+
+ // Load the HTML into a DOMDocument for parsing
+ libxml_use_internal_errors(true);
+ $dom = new DOMDocument();
+ $dom->loadHTML($html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
+ libxml_clear_errors();
+
+ // Use XPath to query the DOM for detailed manga data
+ $xpath = new DOMXPath($dom);
+
+ // Extract the manga details
+ $title = $xpath->query('//h1[@class="title"]')->item(0)->nodeValue;
+ $cover_image = $xpath->query('//div[@class="thumb"]/img')->item(0)->getAttribute('src');
+ $description = $xpath->query('//div[@class="description-summary"]/div[@class="summary__content show-more"]')->item(0)->nodeValue;
+ $genres = [];
+ $genre_elements = $xpath->query('//div[@class="genres-content"]/a');
+ foreach ($genre_elements as $genre) {
+ $genres[] = $genre->nodeValue;
+ }
+ $status = $xpath->query('//div[@class="post-status"]/div[@class="summary-content"]/a')->item(0)->nodeValue;
+
+ // Return the detailed manga data
+ return [
+ 'title' => trim($title),
+ 'cover_image' => $cover_image,
+ 'description' => trim($description),
+ 'genres' => implode(', ', $genres),
+ 'status' => trim($status)
+ ];
+ }
+}
\ No newline at end of file
diff --git a/includes/class-madara-handler.php b/includes/class-madara-handler.php
new file mode 100644
index 0000000000000000000000000000000000000000..7b19c83ea7ad31033f003a6a031dfbca1a8ec1d0
--- /dev/null
+++ b/includes/class-madara-handler.php
@@ -0,0 +1,285 @@
+
+
+
Ultimate Manga Scraper: Madara Enhancements
+
Credits to ThuGie
+
+
+
+
+
+
+
+
+
+
+
+ Enable Auto Load More
+
+
Manga Loaded: 0
+
+
+
+
+ #
+ Title
+ Cover Image
+ Description
+ Genres
+ Status
+ Last Updated
+ Latest Chapter
+ Actions
+
+
+
+ $manga): ?>
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Load More
+
+ delete('ums_manga_generic_list', 'options');
+
+ // Get current rules
+ $rules = get_option('ums_manga_generic_list', []);
+
+ // Validate the schedule format
+ $schedule = '24';
+ if (!is_numeric($schedule) || $schedule <= 0) {
+ $schedule = '24';
+ }
+
+ $new_rule = [
+ trim($manga['url']),
+ $schedule,
+ '1',
+ (new DateTime())->modify('-24 hours -5 minutes')->format('Y-m-d H:i:s'),
+ '1000',
+ 'publish',
+ 'admin',
+ '',
+ '',
+ 'genre',
+ 'genre',
+ '',
+ '1',
+ '0',
+ '1',
+ '0',
+ '0',
+ '0',
+ '0',
+ ];
+
+ $rules[] = $new_rule;
+ update_option('ums_manga_generic_list', $rules); // Update the rules option
+ }
+
+ // Enqueue scripts for the admin page
+ public static function enqueue_scripts() {
+ wp_enqueue_script('madara-enhancements', plugin_dir_url(__FILE__) . '../assets/js/madara-enhancements.js', ['jquery'], null, true);
+ wp_localize_script('madara-enhancements', 'madaraEnhancements', [
+ 'ajaxUrl' => admin_url('admin-ajax.php'),
+ 'nonce' => wp_create_nonce('madara_enhancements_nonce'),
+ ]);
+ }
+
+ // Handle AJAX request to search manga
+// Handle AJAX request to search manga
+public static function search_manga() {
+ check_ajax_referer('madara_enhancements_nonce', '_ajax_nonce'); // Verify nonce for security
+
+ $query = isset($_POST['query']) ? sanitize_text_field($_POST['query']) : ''; // Get the search query
+ $type = isset($_POST['type']) ? sanitize_text_field($_POST['type']) : ''; // Get the search type
+ $page = isset($_POST['page']) ? intval($_POST['page']) : 0; // Get the page number
+
+ // Fetch manga data from the URL
+ $manga_list = UMS_Madara_Fetcher::get_manga_data($page, $query, $type);
+
+ // Check if there was an error fetching the manga data
+ if (isset($manga_list['error'])) {
+ wp_send_json_error($manga_list['error']); // Send error response if there's an error
+ return;
+ }
+
+ $existing_manga_urls = array_map('trim', array_column(get_option('ums_manga_generic_list', []), 0)); // Get the list of existing manga URLs
+
+ // Filter out existing manga from the list
+ $filtered_manga_list = array_filter($manga_list, function($manga) use ($existing_manga_urls) {
+ return !in_array(trim($manga['url']), $existing_manga_urls);
+ });
+
+ // Get the current madara_manga_list
+ $current_manga_list = get_option('madara_manga_list', []);
+ // Merge the current list with the new filtered list
+ $updated_manga_list = array_merge($current_manga_list, $filtered_manga_list);
+ // Update the madara_manga_list with the combined list
+ update_option('madara_manga_list', $updated_manga_list);
+
+ wp_send_json_success(array_values($filtered_manga_list)); // Send success response with the filtered manga list
+}
+
+ // Handle AJAX request to save the manga fetch URL
+ public static function save_manga_fetch_url() {
+ check_ajax_referer('madara_enhancements_nonce', '_ajax_nonce'); // Verify nonce for security
+
+ $manga_fetch_url = isset($_POST['manga_fetch_url']) ? esc_url_raw($_POST['manga_fetch_url']) : ''; // Get the manga fetch URL
+
+ if ($manga_fetch_url) {
+ update_option('manga_fetch_url', $manga_fetch_url); // Update the manga fetch URL option
+ wp_send_json_success(); // Send success response
+ } else {
+ wp_send_json_error('Invalid URL.'); // Send error response if the URL is invalid
+ }
+ }
+}
\ No newline at end of file
diff --git a/index.php b/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..1580272ca20148e6cd43366e262c335765ed9b5e
--- /dev/null
+++ b/index.php
@@ -0,0 +1,3 @@
+
diff --git a/languages/index.php b/languages/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..1580272ca20148e6cd43366e262c335765ed9b5e
--- /dev/null
+++ b/languages/index.php
@@ -0,0 +1,3 @@
+
diff --git a/languages/ultimate-manga-scraper.pot b/languages/ultimate-manga-scraper.pot
new file mode 100644
index 0000000000000000000000000000000000000000..2d0ca41ef08c7a9bf06d3bbeba3727b530bffa97
--- /dev/null
+++ b/languages/ultimate-manga-scraper.pot
@@ -0,0 +1,2760 @@
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: Ultimate Web Novel & Manga Scraper\n"
+"POT-Creation-Date: 2023-08-10 09:03+0200\n"
+"PO-Revision-Date: 2023-08-10 09:03+0200\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
+"X-Generator: Poedit 3.3.2\n"
+"X-Poedit-Basepath: ..\n"
+"X-Poedit-Flags-xgettext: --add-comments=translators:\n"
+"X-Poedit-WPHeader: ultimate-manga-scraper.php\n"
+"X-Poedit-SourceCharset: UTF-8\n"
+"X-Poedit-KeywordsList: __;_e;_n:1,2;_x:1,2c;_ex:1,2c;_nx:4c,1,2;esc_attr__;"
+"esc_attr_e;esc_attr_x:1,2c;esc_html__;esc_html_e;esc_html_x:1,2c;_n_noop:1,2;"
+"_nx_noop:3c,1,2;__ngettext_noop:1,2\n"
+"X-Poedit-SearchPath-0: .\n"
+"X-Poedit-SearchPathExcluded-0: *.min.js\n"
+
+#: res/other/plugin-dash.php:14
+msgid "Recommended Plugins For You"
+msgstr ""
+
+#: res/other/plugin-dash.php:43 res/other/plugin-dash.php:141
+msgid "Error getting content: "
+msgstr ""
+
+#: res/other/plugin-dash.php:50 res/other/plugin-dash.php:148
+msgid "Apparently, there are no updates to show!"
+msgstr ""
+
+#: res/other/plugin-dash.php:66 res/other/plugin-dash.php:164
+msgid "Learn more"
+msgstr ""
+
+#: res/other/plugin-dash.php:83
+msgid "FAQ"
+msgstr ""
+
+#: res/other/plugin-dash.php:83 ultimate-manga-scraper.php:922
+msgid "Support"
+msgstr ""
+
+#: res/other/plugin-dash.php:83
+msgid "View More"
+msgstr ""
+
+#: res/other/plugin-dash.php:83 res/other/plugin-dash.php:181
+msgid "Don't show this widget"
+msgstr ""
+
+#: res/other/plugin-dash.php:111
+msgid "Latest News"
+msgstr ""
+
+#: res/other/plugin-dash.php:181
+msgid "+ More"
+msgstr ""
+
+#: res/other/plugin-dash.php:220
+msgid "Highlighted"
+msgstr ""
+
+#: res/other/plugin-dash.php:226
+msgid "A selection of plugins, highlighted for you."
+msgstr ""
+
+#: res/other/plugin-dash.php:413
+msgid "Download Now"
+msgstr ""
+
+#: res/other/plugin-dash.php:414
+msgid "More information about"
+msgstr ""
+
+#: res/other/plugin-dash.php:414
+msgid "More Details"
+msgstr ""
+
+#: res/other/plugin-dash.php:447 res/other/plugin-dash.php:468
+msgid "Click here to get the plugin"
+msgstr ""
+
+#: res/other/plugin-dash.php:448
+msgid "Download the plugin here"
+msgstr ""
+
+#: res/other/plugin-dash.php:467
+msgid ""
+"Just download the plugin from CodeCanyon and install it to your site in a "
+"few seconds."
+msgstr ""
+
+#: res/ums-logs.php:58
+msgid "System Info:"
+msgstr ""
+
+#: res/ums-logs.php:62
+msgid "Some general system information."
+msgstr ""
+
+#: res/ums-logs.php:70
+msgid "User Agent:"
+msgstr ""
+
+#: res/ums-logs.php:74
+msgid "Web Server:"
+msgstr ""
+
+#: res/ums-logs.php:78
+msgid "PHP Version:"
+msgstr ""
+
+#: res/ums-logs.php:82
+msgid "PHP Max POST Size:"
+msgstr ""
+
+#: res/ums-logs.php:86
+msgid "PHP Max Upload Size:"
+msgstr ""
+
+#: res/ums-logs.php:90
+msgid "PHP Memory Limit:"
+msgstr ""
+
+#: res/ums-logs.php:94
+msgid "PHP DateTime Class:"
+msgstr ""
+
+#: res/ums-logs.php:95 res/ums-logs.php:99
+msgid "Available"
+msgstr ""
+
+#: res/ums-logs.php:95 res/ums-logs.php:99
+msgid "Not available"
+msgstr ""
+
+#: res/ums-logs.php:98
+msgid "PHP Curl:"
+msgstr ""
+
+#: res/ums-logs.php:109
+msgid "Rules Currently Running:"
+msgstr ""
+
+#: res/ums-logs.php:113
+msgid "These rules are currently running on your server."
+msgstr ""
+
+#: res/ums-logs.php:142
+msgid "Unknown rule type: "
+msgstr ""
+
+#: res/ums-logs.php:151
+msgid "No rules are running right now"
+msgstr ""
+
+#: res/ums-logs.php:156
+msgid "Are you sure you want to clear the running list?"
+msgstr ""
+
+#: res/ums-logs.php:157
+msgid "Caution! This is for debugging purpose only!"
+msgstr ""
+
+#: res/ums-logs.php:157
+msgid "Clear Running Rules List"
+msgstr ""
+
+#: res/ums-logs.php:165 res/ums-logs.php:175
+msgid "Restore Plugin Default Settings"
+msgstr ""
+
+#: res/ums-logs.php:169
+msgid ""
+"Hit this button and the plugin settings will be restored to their default "
+"values. Warning! All settings will be lost!"
+msgstr ""
+
+#: res/ums-logs.php:175
+msgid "Are you sure you want to restore the default plugin settings?"
+msgstr ""
+
+#: res/ums-logs.php:181
+msgid "Delete All Posts Generated by this Plugin:"
+msgstr ""
+
+#: res/ums-logs.php:185
+msgid "Hit this button and all posts generated by this plugin will be deleted!"
+msgstr ""
+
+#: res/ums-logs.php:191
+msgid ""
+"Are you sure you want to delete all generated posts? This can take a while, "
+"please wait until it finishes."
+msgstr ""
+
+#: res/ums-logs.php:191
+msgid "Delete All Generated Posts"
+msgstr ""
+
+#: res/ums-logs.php:196
+msgid "Activity Log:"
+msgstr ""
+
+#: res/ums-logs.php:200
+msgid ""
+"This is the main log of your plugin. Here will be listed every single "
+"instance of the rules you run or are automatically run by schedule jobs (if "
+"you enable logging, in the plugin configuration)."
+msgstr ""
+
+#: res/ums-logs.php:214
+msgid "Log empty"
+msgstr ""
+
+#: res/ums-logs.php:220
+msgid "Are you sure you want to delete all logs?"
+msgstr ""
+
+#: res/ums-logs.php:221
+msgid "Delete Logs"
+msgstr ""
+
+#: res/ums-main.php:144 res/ums-novel-list.php:39 res/ums-rules-list.php:40
+#: res/ums-text-list.php:39 res/ums-vipnovel-list.php:39
+msgid "Settings saved."
+msgstr ""
+
+#: res/ums-main.php:153
+msgid "Plugin registration failed!"
+msgstr ""
+
+#: res/ums-main.php:162
+msgid "Plugin registration successful!"
+msgstr ""
+
+#: res/ums-main.php:174
+msgid "Main Switch:"
+msgstr ""
+
+#: res/ums-main.php:179
+msgid "Enable or disable this plugin. This acts like a main switch."
+msgstr ""
+
+#: res/ums-main.php:197
+msgid ""
+"This feature of the plugin is disabled! Please enable it from the above "
+"switch."
+msgstr ""
+
+#: res/ums-main.php:209
+msgid "Plugin Registration Info - Automatic Updates Enabled:"
+msgstr ""
+
+#: res/ums-main.php:211
+msgid "Item Name:"
+msgstr ""
+
+#: res/ums-main.php:213
+msgid "Item ID:"
+msgstr ""
+
+#: res/ums-main.php:216
+msgid "Created At:"
+msgstr ""
+
+#: res/ums-main.php:219
+msgid "Buyer Name:"
+msgstr ""
+
+#: res/ums-main.php:222
+msgid "License Type:"
+msgstr ""
+
+#: res/ums-main.php:225
+msgid "Supported Until:"
+msgstr ""
+
+#: res/ums-main.php:228
+msgid "Revoke License"
+msgstr ""
+
+#: res/ums-main.php:236
+msgid ""
+"This is a trial version of the plugin. Automatic updates for this plugin are "
+"disabled. Please activate the plugin from below, so you can benefit of "
+"automatic updates for it!"
+msgstr ""
+
+#: res/ums-main.php:244
+#, php-format
+msgid ""
+"Please input your Envato purchase code, to enable automatic updates in the "
+"plugin. To get your purchase code, please follow this tutorial . Info submitted to the registration "
+"server consists of: purchase code, site URL, site name, admin email. All "
+"these data will be used strictly for registration purposes."
+msgstr ""
+
+#: res/ums-main.php:248
+msgid "Register Envato Purchase Code To Enable Automatic Updates:"
+msgstr ""
+
+#: res/ums-main.php:250
+msgid "Envato Purchase Code"
+msgstr ""
+
+#: res/ums-main.php:254
+msgid "Register Purchase Code"
+msgstr ""
+
+#: res/ums-main.php:269
+msgid "Tips for using the plugin:"
+msgstr ""
+
+#: res/ums-main.php:271
+#, php-format
+msgid ""
+"This plugin requires the Madara - WordPress "
+"Theme for Manga to work. Please get it from here ."
+msgstr ""
+
+#: res/ums-main.php:273
+#, php-format
+msgid ""
+"Need help configuring this plugin? Please check it's video tutorial ."
+msgstr ""
+
+#: res/ums-main.php:275
+#, php-format
+msgid ""
+"Having issues with the plugin? Please be sure to check our knowledge-base before you contact our support !"
+msgstr ""
+
+#: res/ums-main.php:276
+#, php-format
+msgid ""
+"Do you enjoy our plugin? Please give it a rating on CodeCanyon, or check our website for other cool plugins."
+msgstr ""
+
+#: res/ums-main.php:282
+msgid "Scraping Enhancements:"
+msgstr ""
+
+#: res/ums-main.php:291
+#, php-format
+msgid ""
+"If you wish to use the HeadlessBrowserAPI to render JavaScript generated "
+"content for your scraped pages, enter your API key here. Get one here . If you enter a value here, new options "
+"will become available in the 'Use PhantomJs/Puppeteer/Tor To Parse "
+"JavaScript On Pages' in importing rule settings."
+msgstr ""
+
+#: res/ums-main.php:295
+msgid "HeadlessBrowserAPI Key (Optional)"
+msgstr ""
+
+#: res/ums-main.php:300
+msgid "Remaining API Calls For Today: "
+msgstr ""
+
+#: res/ums-main.php:304 res/ums-novel-list.php:318 res/ums-novel-list.php:1268
+#: res/ums-rules-list.php:513 res/ums-rules-list.php:1699
+#: res/ums-text-list.php:318 res/ums-text-list.php:1267
+#: res/ums-vipnovel-list.php:318 res/ums-vipnovel-list.php:1268
+msgid ""
+"New feature added to this plugin: it is able to use HeadlessBrowserAPI to "
+"scrape with JavaScript rendered content any website from the internet. Also, "
+"the Tor node of the API will be able to scrape .onion sites from the Dark "
+"Net!"
+msgstr ""
+
+#: res/ums-main.php:311
+msgid "API key"
+msgstr ""
+
+#: res/ums-main.php:319
+msgid "Plugin Options:"
+msgstr ""
+
+#: res/ums-main.php:328
+msgid ""
+"Please check this checkbox if your server has CloudFlare caching active. "
+"This is needed to prevent some issues happening, because CloudFlare is "
+"limiting the execution time of plugins to 100 seconds."
+msgstr ""
+
+#: res/ums-main.php:332
+msgid "My Server Is Using CloudFlare Caching:"
+msgstr ""
+
+#: res/ums-main.php:348
+msgid ""
+"Select the storage you wish to use to store scraped manga. To display more "
+"options here, set up storage settings in Madara Theme Settings."
+msgstr ""
+
+#: res/ums-main.php:352
+msgid "Manga Storage Device:"
+msgstr ""
+
+#: res/ums-main.php:382
+msgid "Do you want to enable logging for rules?"
+msgstr ""
+
+#: res/ums-main.php:386
+msgid "Enable Logging for Rules:"
+msgstr ""
+
+#: res/ums-main.php:402
+msgid ""
+"Do you want to enable detailed logging for rules? Note that this will "
+"dramatically increase the size of the log this plugin generates."
+msgstr ""
+
+#: res/ums-main.php:406
+msgid "Enable Detailed Logging for Rules:"
+msgstr ""
+
+#: res/ums-main.php:424
+msgid ""
+"In case of your server forcefully stopping the processing of chapters in the "
+"plugin, it will attempt to recover and restart processing. On some servers, "
+"this might cause duplicate content issues. Do you want to disable automatic "
+"rerunning of rules?"
+msgstr ""
+
+#: res/ums-main.php:428
+msgid "Disable Automatic Rerunning of Rules:"
+msgstr ""
+
+#: res/ums-main.php:444
+msgid "Choose if you want to automatically clear logs after a period of time."
+msgstr ""
+
+#: res/ums-main.php:448
+msgid "Automatically Clear Logs After:"
+msgstr ""
+
+#: res/ums-main.php:458 res/ums-novel-list.php:275 res/ums-novel-list.php:291
+#: res/ums-novel-list.php:1214 res/ums-novel-list.php:1236
+#: res/ums-rules-list.php:471 res/ums-rules-list.php:487
+#: res/ums-rules-list.php:1650 res/ums-rules-list.php:1672
+#: res/ums-text-list.php:275 res/ums-text-list.php:291
+#: res/ums-text-list.php:1213 res/ums-text-list.php:1235
+#: res/ums-vipnovel-list.php:275 res/ums-vipnovel-list.php:291
+#: res/ums-vipnovel-list.php:1214 res/ums-vipnovel-list.php:1236
+#: ultimate-manga-scraper.php:46
+msgid "Disabled"
+msgstr ""
+
+#: res/ums-main.php:463
+msgid "Once a month"
+msgstr ""
+
+#: res/ums-main.php:468
+msgid "Once a week"
+msgstr ""
+
+#: res/ums-main.php:473
+msgid "Once a day"
+msgstr ""
+
+#: res/ums-main.php:478
+msgid "Twice a day"
+msgstr ""
+
+#: res/ums-main.php:483
+msgid "Once an hour"
+msgstr ""
+
+#: res/ums-main.php:494
+msgid ""
+"If you want to use a proxy to crawl webpages, input it's address here. "
+"Required format: IP Address/URL:port"
+msgstr ""
+
+#: res/ums-main.php:498
+msgid "Web Proxy Address:"
+msgstr ""
+
+#: res/ums-main.php:503
+msgid "Input web proxy url"
+msgstr ""
+
+#: res/ums-main.php:513
+msgid ""
+"If you want to use a proxy to crawl webpages, and it requires "
+"authentification, input it's authentification details here. Required format: "
+"username:password"
+msgstr ""
+
+#: res/ums-main.php:517
+msgid "Web Proxy Authentification:"
+msgstr ""
+
+#: res/ums-main.php:522
+msgid "Input web proxy auth"
+msgstr ""
+
+#: res/ums-main.php:532
+msgid ""
+"Set the timeout (in seconds) for every rule running. I recommend that you "
+"leave this field at it's default value (3600)."
+msgstr ""
+
+#: res/ums-main.php:536
+msgid "Timeout for Rule Running (seconds):"
+msgstr ""
+
+#: res/ums-main.php:541
+msgid "Input rule timeout in seconds"
+msgstr ""
+
+#: res/ums-main.php:553
+msgid ""
+"Set the delay (in seconds) for every scraping request. I recommend that you "
+"leave this field at it's default value (1)."
+msgstr ""
+
+#: res/ums-main.php:557
+msgid "Delay Between Requests (seconds):"
+msgstr ""
+
+#: res/ums-main.php:562
+msgid "Input request timeout in seconds"
+msgstr ""
+
+#: res/ums-main.php:572
+msgid ""
+"Set a default value for the 'Schedule' rule paramter. If you leave this "
+"field blank, the value 24 will be used."
+msgstr ""
+
+#: res/ums-main.php:576
+msgid "Default Value For The 'Schedule' Rule Parameter:"
+msgstr ""
+
+#: res/ums-main.php:581
+msgid "24"
+msgstr ""
+
+#: res/ums-main.php:591
+msgid ""
+"Set a default value for the 'Author' rule paramter. If you leave this field "
+"blank, there will not be set a default author for rules."
+msgstr ""
+
+#: res/ums-main.php:595
+msgid "Default Value For The 'Author' Rule Parameter:"
+msgstr ""
+
+#: res/ums-main.php:622
+msgid ""
+"Set a default value for the 'Max # Chapters' rule paramter. If you leave "
+"this field blank, the value 1 will be used."
+msgstr ""
+
+#: res/ums-main.php:626
+msgid "Default Value For The 'Max # Chapters' Rule Parameter:"
+msgstr ""
+
+#: res/ums-main.php:631 res/ums-main.php:650
+msgid "1"
+msgstr ""
+
+#: res/ums-main.php:641
+msgid ""
+"Set a default value for the 'Maximum Number Of Manga to Scrape' rule "
+"paramter. If you leave this field blank, the value 1 will be used."
+msgstr ""
+
+#: res/ums-main.php:645
+msgid ""
+"Default Value For The 'Maximum Number Of Manga to Scrape' Rule Parameter:"
+msgstr ""
+
+#: res/ums-main.php:656 res/ums-novel-list.php:433 res/ums-novel-list.php:1426
+#: res/ums-rules-list.php:615 res/ums-rules-list.php:1844
+#: res/ums-text-list.php:433 res/ums-text-list.php:1425
+#: res/ums-vipnovel-list.php:433 res/ums-vipnovel-list.php:1426
+msgid "Translation Options:"
+msgstr ""
+
+#: res/ums-main.php:666
+#, php-format
+msgid ""
+"If you wish to use the official version of the Google Translator API for "
+"translation, you must enter first a Google API Key. Get one here . Please enable the 'Cloud Translation API' in Google Cloud Console . Translation will work "
+"even without even without entering an API key here, but in this case, an "
+"unofficial Google Translate API will be used."
+msgstr ""
+
+#: res/ums-main.php:670
+msgid "Google Translator API Key (Optional)"
+msgstr ""
+
+#: res/ums-main.php:675
+msgid "API Key (optional)"
+msgstr ""
+
+#: res/ums-main.php:687
+#, php-format
+msgid ""
+"If you wish to use Microsoft for translation, you must enter first a "
+"Microsoft 'Access Key'. Learn how to get one here . If you enter a value here, new options will become "
+"available in the 'Automatically Translate Content To' and 'Source Language' "
+"fields."
+msgstr ""
+
+#: res/ums-main.php:691
+msgid "Microsoft Translator Access Key (Optional)"
+msgstr ""
+
+#: res/ums-main.php:696
+msgid "Access key (optional)"
+msgstr ""
+
+#: res/ums-main.php:708
+#, php-format
+msgid ""
+"If you selected a specific region in your Azure Microsoft account, you must "
+"enter it here. Learn more here . The default "
+"is global."
+msgstr ""
+
+#: res/ums-main.php:712
+msgid "Microsoft Translator Region Code (Optional)"
+msgstr ""
+
+#: res/ums-main.php:717
+msgid "global"
+msgstr ""
+
+#: res/ums-main.php:729
+#, php-format
+msgid ""
+"If you wish to use DeepL for translation, you must enter first a DeepL "
+"'Authentication Key'. Get one here . If you "
+"enter a value here, new options will become available in the 'Automatically "
+"Translate Content To' and 'Source Language' fields."
+msgstr ""
+
+#: res/ums-main.php:733
+msgid "DeepL Translator Authentication Key (Optional)"
+msgstr ""
+
+#: res/ums-main.php:738
+msgid "Auth key (optional)"
+msgstr ""
+
+#: res/ums-main.php:750
+msgid ""
+"Check this checkbox if the above API key is a DeepL free plan key. If it is "
+"a PRO key, please uncheck this checkbox."
+msgstr ""
+
+#: res/ums-main.php:754
+msgid "The Above Is A DeepL Free API Key:"
+msgstr ""
+
+#: res/ums-main.php:774
+msgid "PhantomJS Settings:"
+msgstr ""
+
+#: res/ums-main.php:783
+#, php-format
+msgid ""
+"Set the path on your local server of the phantomjs executable. If you leave "
+"this field blank, the default 'phantomjs' call will be used. How to install PhantomJs? "
+msgstr ""
+
+#: res/ums-main.php:787
+msgid "PhantomJS Path On Server:"
+msgstr ""
+
+#: res/ums-main.php:794 res/ums-novel-list.php:1277 res/ums-rules-list.php:1708
+#: res/ums-text-list.php:1276 res/ums-vipnovel-list.php:1277
+msgid ""
+"INFO: PhantomJS not found - please install it on your server or configure "
+"the path to it in plugin's 'Main Settings'!"
+msgstr ""
+
+#: res/ums-main.php:794 res/ums-novel-list.php:1277 res/ums-rules-list.php:1708
+#: res/ums-text-list.php:1276 res/ums-vipnovel-list.php:1277
+msgid "How to install PhantomJs?"
+msgstr ""
+
+#: res/ums-main.php:798 res/ums-novel-list.php:1281 res/ums-rules-list.php:1712
+#: res/ums-text-list.php:1280 res/ums-vipnovel-list.php:1281
+msgid ""
+"INFO: PhantomJS cannot run - shell exec is not enabled on your server. "
+"Please enable it and retry using this feature of the plugin."
+msgstr ""
+
+#: res/ums-main.php:802 res/ums-novel-list.php:1285 res/ums-rules-list.php:1716
+#: res/ums-text-list.php:1284 res/ums-vipnovel-list.php:1285
+msgid ""
+"INFO: PhantomJS cannot run - shell exec is not allowed to run on your server "
+"(in disable_functions list in php.ini). Please enable it and retry using "
+"this feature of the plugin."
+msgstr ""
+
+#: res/ums-main.php:806 res/ums-novel-list.php:1289 res/ums-rules-list.php:1720
+#: res/ums-text-list.php:1288 res/ums-vipnovel-list.php:1289
+msgid "INFO: PhantomJS OK"
+msgstr ""
+
+#: res/ums-main.php:814
+msgid "Path to phantomjs"
+msgstr ""
+
+#: res/ums-main.php:824
+msgid ""
+"Set the timeout (in milliseconds) for every phantomjs running. I recommend "
+"that you leave this field at it's default value (15000). If you leave this "
+"field blank, the default value will be used."
+msgstr ""
+
+#: res/ums-main.php:828
+msgid "Timeout for PhantomJs Execution:"
+msgstr ""
+
+#: res/ums-main.php:833
+msgid "Input phantomjs timeout in milliseconds"
+msgstr ""
+
+#: res/ums-main.php:845 res/ums-novel-list.php:754 res/ums-rules-list.php:936
+#: res/ums-text-list.php:754 res/ums-vipnovel-list.php:754
+msgid "Save Settings"
+msgstr ""
+
+#: res/ums-novel-list.php:30
+msgid "BoxNovel.com Novels Scraper"
+msgstr ""
+
+#: res/ums-novel-list.php:48 res/ums-text-list.php:48
+#: res/ums-vipnovel-list.php:48
+msgid ""
+"This is a demo version of the \"Ultimate Web Novel And Manga Scraper\" "
+"plugin, you will have access to a limited feature set only (maximum scraped "
+"chapter count limited to 3). To gain access to the full feature set of the "
+"plugin, please purchase it"
+msgstr ""
+
+#: res/ums-novel-list.php:61 res/ums-rules-list.php:62 res/ums-text-list.php:61
+#: res/ums-vipnovel-list.php:61
+msgid "ID"
+msgstr ""
+
+#: res/ums-novel-list.php:65 res/ums-rules-list.php:66 res/ums-text-list.php:65
+#: res/ums-vipnovel-list.php:65
+msgid "This is the ID of the rule."
+msgstr ""
+
+#: res/ums-novel-list.php:71 res/ums-text-list.php:71
+#: res/ums-vipnovel-list.php:71
+msgid "Novels URL / Search Keyword"
+msgstr ""
+
+#: res/ums-novel-list.php:75
+msgid ""
+"Add the URL of the Web Novel (or a comma separated list of Web Novel URLs) "
+"or a keyword search. Example Web Novel URL: https://boxnovel.com/novel/ghost-"
+"emperor-wild-wife-dandy-eldest-miss/ - you can also add a comma separated "
+"list of similar URLs. If you want to query all web novels, you can enter "
+"here a * (star symbol)."
+msgstr ""
+
+#: res/ums-novel-list.php:80 res/ums-rules-list.php:81 res/ums-text-list.php:80
+#: res/ums-vipnovel-list.php:80
+msgid "Schedule"
+msgstr ""
+
+#: res/ums-novel-list.php:86 res/ums-rules-list.php:87 res/ums-text-list.php:86
+#: res/ums-vipnovel-list.php:86
+msgid ""
+"Select the interval in minutes after which you want this rule to run. "
+"Defined in minutes."
+msgstr ""
+
+#: res/ums-novel-list.php:90 res/ums-rules-list.php:91 res/ums-text-list.php:90
+#: res/ums-vipnovel-list.php:90
+msgid ""
+"Select the interval in hours after which you want this rule to run. Defined "
+"in hours."
+msgstr ""
+
+#: res/ums-novel-list.php:96 res/ums-rules-list.php:97 res/ums-text-list.php:96
+#: res/ums-vipnovel-list.php:96
+msgid "Max # Chapters"
+msgstr ""
+
+#: res/ums-novel-list.php:99 res/ums-text-list.php:99
+#: res/ums-vipnovel-list.php:99
+msgid ""
+"Number of chapters to scrape from each web novel is listed and scraped by "
+"this rule."
+msgstr ""
+
+#: res/ums-novel-list.php:104 res/ums-rules-list.php:105
+#: res/ums-text-list.php:104 res/ums-vipnovel-list.php:104
+msgid "Chapter Status"
+msgstr ""
+
+#: res/ums-novel-list.php:109 res/ums-rules-list.php:110
+#: res/ums-text-list.php:109 res/ums-vipnovel-list.php:109
+msgid "Select the chapter status: published, draft, pending."
+msgstr ""
+
+#: res/ums-novel-list.php:114 res/ums-text-list.php:114
+#: res/ums-vipnovel-list.php:114
+msgid "Novel Author"
+msgstr ""
+
+#: res/ums-novel-list.php:117 res/ums-text-list.php:117
+#: res/ums-vipnovel-list.php:117
+msgid ""
+"Select the author that you want to assign for the automatically generated "
+"web novels."
+msgstr ""
+
+#: res/ums-novel-list.php:121 res/ums-rules-list.php:122
+#: res/ums-text-list.php:121 res/ums-vipnovel-list.php:121
+msgid "More Options"
+msgstr ""
+
+#: res/ums-novel-list.php:124 res/ums-rules-list.php:125
+#: res/ums-text-list.php:124 res/ums-vipnovel-list.php:124
+msgid "Shows advanced settings for this rule."
+msgstr ""
+
+#: res/ums-novel-list.php:128 res/ums-rules-list.php:129
+#: res/ums-text-list.php:128 res/ums-vipnovel-list.php:128
+msgid "Del"
+msgstr ""
+
+#: res/ums-novel-list.php:131 res/ums-rules-list.php:132
+#: res/ums-text-list.php:131 res/ums-vipnovel-list.php:131
+msgid "Do you want to delete this rule?"
+msgstr ""
+
+#: res/ums-novel-list.php:135 res/ums-rules-list.php:136
+#: res/ums-text-list.php:135 res/ums-vipnovel-list.php:135
+msgid "Active"
+msgstr ""
+
+#: res/ums-novel-list.php:138 res/ums-rules-list.php:139
+#: res/ums-text-list.php:138 res/ums-vipnovel-list.php:138
+msgid ""
+"Do you want to enable this rule? You can deactivate any rule (you don't have "
+"to delete them to deactivate them)."
+msgstr ""
+
+#: res/ums-novel-list.php:144 res/ums-rules-list.php:145
+#: res/ums-text-list.php:144 res/ums-vipnovel-list.php:144
+msgid "Info"
+msgstr ""
+
+#: res/ums-novel-list.php:147 res/ums-text-list.php:147
+#: res/ums-vipnovel-list.php:147
+msgid "The number of web novels this rule has generated so far."
+msgstr ""
+
+#: res/ums-novel-list.php:151 res/ums-rules-list.php:152
+#: res/ums-text-list.php:151 res/ums-vipnovel-list.php:151
+msgid "Actions"
+msgstr ""
+
+#: res/ums-novel-list.php:154 res/ums-rules-list.php:155
+#: res/ums-text-list.php:154 res/ums-vipnovel-list.php:154
+msgid ""
+"Do you want to run this rule now? Note that only one instance of a rule is "
+"allowed at once."
+msgstr ""
+
+#: res/ums-novel-list.php:181 res/ums-novel-list.php:1098
+#: res/ums-rules-list.php:183 res/ums-rules-list.php:1305
+#: res/ums-text-list.php:181 res/ums-text-list.php:1097
+#: res/ums-vipnovel-list.php:181 res/ums-vipnovel-list.php:1098
+msgid "Pending -> Moderate"
+msgstr ""
+
+#: res/ums-novel-list.php:182 res/ums-novel-list.php:1103
+#: res/ums-rules-list.php:184 res/ums-rules-list.php:1310
+#: res/ums-text-list.php:182 res/ums-text-list.php:1102
+#: res/ums-vipnovel-list.php:182 res/ums-vipnovel-list.php:1103
+msgid "Draft -> Moderate"
+msgstr ""
+
+#: res/ums-novel-list.php:183 res/ums-novel-list.php:1108
+#: res/ums-rules-list.php:185 res/ums-rules-list.php:1315
+#: res/ums-text-list.php:183 res/ums-text-list.php:1107
+#: res/ums-vipnovel-list.php:183 res/ums-vipnovel-list.php:1108
+msgid "Published"
+msgstr ""
+
+#: res/ums-novel-list.php:184 res/ums-novel-list.php:1113
+#: res/ums-rules-list.php:186 res/ums-rules-list.php:1320
+#: res/ums-text-list.php:184 res/ums-text-list.php:1112
+#: res/ums-vipnovel-list.php:184 res/ums-vipnovel-list.php:1113
+msgid "Private"
+msgstr ""
+
+#: res/ums-novel-list.php:185 res/ums-novel-list.php:1118
+#: res/ums-rules-list.php:187 res/ums-rules-list.php:1325
+#: res/ums-text-list.php:185 res/ums-text-list.php:1117
+#: res/ums-vipnovel-list.php:185 res/ums-vipnovel-list.php:1118
+msgid "Trash"
+msgstr ""
+
+#: res/ums-novel-list.php:195 res/ums-novel-list.php:1133
+#: res/ums-rules-list.php:204 res/ums-rules-list.php:1340
+#: res/ums-text-list.php:195 res/ums-text-list.php:1132
+#: res/ums-vipnovel-list.php:195 res/ums-vipnovel-list.php:1133
+msgid "Random user"
+msgstr ""
+
+#: res/ums-novel-list.php:196 res/ums-novel-list.php:1138
+#: res/ums-rules-list.php:205 res/ums-rules-list.php:1345
+#: res/ums-text-list.php:196 res/ums-text-list.php:1137
+#: res/ums-vipnovel-list.php:196 res/ums-vipnovel-list.php:1138
+msgid "Import author"
+msgstr ""
+
+#: res/ums-novel-list.php:204 res/ums-rules-list.php:213
+#: res/ums-text-list.php:204 res/ums-vipnovel-list.php:204
+msgid "New Rule"
+msgstr ""
+
+#: res/ums-novel-list.php:204 res/ums-novel-list.php:1146
+#: res/ums-rules-list.php:213 res/ums-rules-list.php:1353
+#: res/ums-text-list.php:204 res/ums-text-list.php:1145
+#: res/ums-vipnovel-list.php:204 res/ums-vipnovel-list.php:1146
+msgid "Advanced Settings"
+msgstr ""
+
+#: res/ums-novel-list.php:214 res/ums-novel-list.php:1154
+#: res/ums-rules-list.php:223 res/ums-rules-list.php:1361
+#: res/ums-text-list.php:214 res/ums-text-list.php:1153
+#: res/ums-vipnovel-list.php:214 res/ums-vipnovel-list.php:1154
+msgid "Do you want to reverse scraping of chapters and start with oldest?"
+msgstr ""
+
+#: res/ums-novel-list.php:218 res/ums-rules-list.php:227
+#: res/ums-text-list.php:218 res/ums-vipnovel-list.php:218
+msgid "Reverse Scraping (Start With Oldest Chapters):"
+msgstr ""
+
+#: res/ums-novel-list.php:228 res/ums-text-list.php:228
+#: res/ums-vipnovel-list.php:228
+msgid "Set the maximum web novel count to scrape. This value is optional."
+msgstr ""
+
+#: res/ums-novel-list.php:232 res/ums-text-list.php:232
+#: res/ums-vipnovel-list.php:232
+msgid "Maximum Number Of Novels to Scrape:"
+msgstr ""
+
+#: res/ums-novel-list.php:241 res/ums-novel-list.php:1183
+#: res/ums-text-list.php:241 res/ums-text-list.php:1182
+#: res/ums-vipnovel-list.php:241 res/ums-vipnovel-list.php:1183
+msgid ""
+"Select the web novel genre that you want for the automatically generated web "
+"novel to have."
+msgstr ""
+
+#: res/ums-novel-list.php:245 res/ums-text-list.php:245
+#: res/ums-vipnovel-list.php:245
+msgid "Additional Novel Genre:"
+msgstr ""
+
+#: res/ums-novel-list.php:248 res/ums-novel-list.php:1190
+#: res/ums-rules-list.php:444 res/ums-rules-list.php:1626
+#: res/ums-text-list.php:248 res/ums-text-list.php:1189
+#: res/ums-vipnovel-list.php:248 res/ums-vipnovel-list.php:1190
+msgid "Do Not Add a Genre"
+msgstr ""
+
+#: res/ums-novel-list.php:268 res/ums-text-list.php:268
+#: res/ums-vipnovel-list.php:268
+msgid ""
+"Do you want to automatically add web novel genres from the web novel items?"
+msgstr ""
+
+#: res/ums-novel-list.php:272 res/ums-rules-list.php:468
+#: res/ums-text-list.php:272 res/ums-vipnovel-list.php:272
+msgid "Auto Add Genres:"
+msgstr ""
+
+#: res/ums-novel-list.php:276 res/ums-novel-list.php:292
+#: res/ums-novel-list.php:1219 res/ums-novel-list.php:1241
+#: res/ums-text-list.php:276 res/ums-text-list.php:292
+#: res/ums-text-list.php:1218 res/ums-text-list.php:1240
+#: res/ums-vipnovel-list.php:276 res/ums-vipnovel-list.php:292
+#: res/ums-vipnovel-list.php:1219 res/ums-vipnovel-list.php:1241
+msgid "Novel Genres"
+msgstr ""
+
+#: res/ums-novel-list.php:284 res/ums-text-list.php:284
+#: res/ums-vipnovel-list.php:284
+msgid ""
+"Do you want to automatically add web novel tags from the web novel items?"
+msgstr ""
+
+#: res/ums-novel-list.php:288 res/ums-text-list.php:288
+#: res/ums-vipnovel-list.php:288
+msgid "Auto Add Novel Tags:"
+msgstr ""
+
+#: res/ums-novel-list.php:293 res/ums-novel-list.php:1246
+#: res/ums-text-list.php:293 res/ums-text-list.php:1245
+#: res/ums-vipnovel-list.php:293 res/ums-vipnovel-list.php:1246
+msgid "Novel Tags"
+msgstr ""
+
+#: res/ums-novel-list.php:301 res/ums-novel-list.php:1252
+#: res/ums-text-list.php:301 res/ums-text-list.php:1251
+#: res/ums-vipnovel-list.php:301 res/ums-vipnovel-list.php:1252
+msgid ""
+"Select the web novel tags that you want for the automatically generated web "
+"novel to have."
+msgstr ""
+
+#: res/ums-novel-list.php:305 res/ums-text-list.php:305
+#: res/ums-vipnovel-list.php:305
+msgid "Additional Novel Tags:"
+msgstr ""
+
+#: res/ums-novel-list.php:314 res/ums-rules-list.php:509
+#: res/ums-text-list.php:314 res/ums-vipnovel-list.php:314
+msgid ""
+"Do you want to try to use PhantomJS to try to parse JavaScript from crawled "
+"pages (for pages that create dynamic content, on page load, using "
+"JavaScript)? Please note that for this to work, you must have PhantomJs "
+"installed on your server. You can configure the path to PhantomJS from your "
+"server, from plugin's 'Main Settings'."
+msgstr ""
+
+#: res/ums-novel-list.php:317 res/ums-rules-list.php:512
+#: res/ums-text-list.php:317 res/ums-vipnovel-list.php:317
+msgid "Content Scraping Method To Use:"
+msgstr ""
+
+#: res/ums-novel-list.php:326 res/ums-novel-list.php:1300
+#: res/ums-rules-list.php:521 res/ums-rules-list.php:1731
+#: res/ums-text-list.php:326 res/ums-text-list.php:1299
+#: res/ums-vipnovel-list.php:326 res/ums-vipnovel-list.php:1300
+msgid "WordPress (Default)"
+msgstr ""
+
+#: res/ums-novel-list.php:327 res/ums-novel-list.php:1305
+#: res/ums-rules-list.php:522 res/ums-rules-list.php:1736
+#: res/ums-text-list.php:327 res/ums-text-list.php:1304
+#: res/ums-vipnovel-list.php:327 res/ums-vipnovel-list.php:1305
+msgid "Use PhantomJS"
+msgstr ""
+
+#: res/ums-novel-list.php:328 res/ums-novel-list.php:1310
+#: res/ums-rules-list.php:523 res/ums-rules-list.php:1741
+#: res/ums-text-list.php:328 res/ums-text-list.php:1309
+#: res/ums-vipnovel-list.php:328 res/ums-vipnovel-list.php:1310
+msgid "Use Puppeteer"
+msgstr ""
+
+#: res/ums-novel-list.php:329 res/ums-novel-list.php:330
+#: res/ums-novel-list.php:331 res/ums-novel-list.php:1317
+#: res/ums-novel-list.php:1326 res/ums-novel-list.php:1335
+#: res/ums-rules-list.php:524 res/ums-rules-list.php:525
+#: res/ums-rules-list.php:526 res/ums-rules-list.php:1748
+#: res/ums-rules-list.php:1757 res/ums-rules-list.php:1766
+#: res/ums-text-list.php:329 res/ums-text-list.php:330
+#: res/ums-text-list.php:331 res/ums-text-list.php:1316
+#: res/ums-text-list.php:1325 res/ums-text-list.php:1334
+#: res/ums-vipnovel-list.php:329 res/ums-vipnovel-list.php:330
+#: res/ums-vipnovel-list.php:331 res/ums-vipnovel-list.php:1317
+#: res/ums-vipnovel-list.php:1326 res/ums-vipnovel-list.php:1335
+msgid ""
+"This option is disabled. To enable it, add a HeadlessBrowserAPI Key in the "
+"plugin's 'Main Settings' menu."
+msgstr ""
+
+#: res/ums-novel-list.php:329 res/ums-novel-list.php:1319
+#: res/ums-rules-list.php:524 res/ums-rules-list.php:1750
+#: res/ums-text-list.php:329 res/ums-text-list.php:1318
+#: res/ums-vipnovel-list.php:329 res/ums-vipnovel-list.php:1319
+msgid "Puppeteer (HeadlessBrowserAPI)"
+msgstr ""
+
+#: res/ums-novel-list.php:329 res/ums-novel-list.php:330
+#: res/ums-novel-list.php:331 res/ums-rules-list.php:524
+#: res/ums-rules-list.php:525 res/ums-rules-list.php:526
+#: res/ums-text-list.php:329 res/ums-text-list.php:330
+#: res/ums-text-list.php:331 res/ums-vipnovel-list.php:329
+#: res/ums-vipnovel-list.php:330 res/ums-vipnovel-list.php:331
+msgid ""
+" - to enable, add a HeadlessBrowserAPI key in the plugin's 'Main Settings'"
+msgstr ""
+
+#: res/ums-novel-list.php:330 res/ums-novel-list.php:1328
+#: res/ums-rules-list.php:525 res/ums-rules-list.php:1759
+#: res/ums-text-list.php:330 res/ums-text-list.php:1327
+#: res/ums-vipnovel-list.php:330 res/ums-vipnovel-list.php:1328
+msgid "Tor (HeadlessBrowserAPI)"
+msgstr ""
+
+#: res/ums-novel-list.php:331 res/ums-novel-list.php:1337
+#: res/ums-rules-list.php:526 res/ums-rules-list.php:1768
+#: res/ums-text-list.php:331 res/ums-text-list.php:1336
+#: res/ums-vipnovel-list.php:331 res/ums-vipnovel-list.php:1337
+msgid "PhantomJS (HeadlessBrowserAPI)"
+msgstr ""
+
+#: res/ums-novel-list.php:340 res/ums-novel-list.php:1343
+#: res/ums-rules-list.php:535 res/ums-rules-list.php:1774
+#: res/ums-text-list.php:340 res/ums-text-list.php:1342
+#: res/ums-vipnovel-list.php:340 res/ums-vipnovel-list.php:1343
+msgid ""
+"Set the number of milliseconds that phantomjs should wait before rendering "
+"pages (1000 ms = 1 sec)."
+msgstr ""
+
+#: res/ums-novel-list.php:343 res/ums-rules-list.php:538
+#: res/ums-text-list.php:343 res/ums-vipnovel-list.php:343
+msgid "Headless Browser Wait Before Rendering Pages (ms):"
+msgstr ""
+
+#: res/ums-novel-list.php:358 res/ums-novel-list.php:1355
+#: res/ums-text-list.php:358 res/ums-text-list.php:1354
+#: res/ums-vipnovel-list.php:358 res/ums-vipnovel-list.php:1355
+msgid "Do you want to enable comments for the generated web novel?"
+msgstr ""
+
+#: res/ums-novel-list.php:362 res/ums-text-list.php:362
+#: res/ums-vipnovel-list.php:362
+msgid "Enable Comments For Novel:"
+msgstr ""
+
+#: res/ums-novel-list.php:375 res/ums-text-list.php:375
+#: res/ums-vipnovel-list.php:375
+msgid "Do you want to enable pingbacks/trackbacks for the generated web novel?"
+msgstr ""
+
+#: res/ums-novel-list.php:379 res/ums-rules-list.php:574
+#: res/ums-text-list.php:379 res/ums-vipnovel-list.php:379
+msgid "Enable Pingback/Trackback:"
+msgstr ""
+
+#: res/ums-novel-list.php:392 res/ums-novel-list.php:1387
+#: res/ums-text-list.php:392 res/ums-text-list.php:1386
+#: res/ums-vipnovel-list.php:392 res/ums-vipnovel-list.php:1387
+msgid "Do you want to get the publish date from the source web novels?"
+msgstr ""
+
+#: res/ums-novel-list.php:396 res/ums-text-list.php:396
+#: res/ums-vipnovel-list.php:396
+msgid "Get Publish Date From Novel:"
+msgstr ""
+
+#: res/ums-novel-list.php:408 res/ums-novel-list.php:1403
+#: res/ums-text-list.php:408 res/ums-text-list.php:1402
+#: res/ums-vipnovel-list.php:408 res/ums-vipnovel-list.php:1403
+msgid ""
+"Set a global chapter warning message to display on the scraped web novel."
+msgstr ""
+
+#: res/ums-novel-list.php:412 res/ums-rules-list.php:607
+#: res/ums-text-list.php:412 res/ums-vipnovel-list.php:412
+msgid "Global Chapter Warning Message:"
+msgstr ""
+
+#: res/ums-novel-list.php:422 res/ums-novel-list.php:1415
+#: res/ums-text-list.php:422 res/ums-text-list.php:1414
+#: res/ums-vipnovel-list.php:422 res/ums-vipnovel-list.php:1415
+msgid ""
+"Set the first chapter slug for the scraped web novel. This needs to be set "
+"only if the first chapter URL is different than chapter-1"
+msgstr ""
+
+#: res/ums-novel-list.php:426 res/ums-text-list.php:426
+#: res/ums-vipnovel-list.php:426
+msgid "First Chapter Slug:"
+msgstr ""
+
+#: res/ums-novel-list.php:440 res/ums-rules-list.php:622
+#: res/ums-text-list.php:440 res/ums-vipnovel-list.php:440
+msgid ""
+"Do you want to automatically translate generated content using Google "
+"Translate? If set, this will overwrite the 'Automatically Translate Content "
+"To' option from plugin's 'Main Settings'."
+msgstr ""
+
+#: res/ums-novel-list.php:443 res/ums-rules-list.php:625
+#: res/ums-text-list.php:443 res/ums-vipnovel-list.php:443
+msgid "Automatically Translate Content To:"
+msgstr ""
+
+#: res/ums-novel-list.php:443 res/ums-novel-list.php:1432
+#: res/ums-rules-list.php:625 res/ums-rules-list.php:1850
+#: res/ums-text-list.php:443 res/ums-text-list.php:1431
+#: res/ums-vipnovel-list.php:443 res/ums-vipnovel-list.php:1432
+msgid "Info:"
+msgstr ""
+
+#: res/ums-novel-list.php:443 res/ums-novel-list.php:1432
+#: res/ums-rules-list.php:625 res/ums-rules-list.php:1850
+#: res/ums-text-list.php:443 res/ums-text-list.php:1431
+#: res/ums-vipnovel-list.php:443 res/ums-vipnovel-list.php:1432
+msgid "for translation, the plugin also supports WPML."
+msgstr ""
+
+#: res/ums-novel-list.php:443 res/ums-novel-list.php:1432
+#: res/ums-rules-list.php:625 res/ums-rules-list.php:1850
+#: res/ums-text-list.php:443 res/ums-text-list.php:1431
+#: res/ums-vipnovel-list.php:443 res/ums-vipnovel-list.php:1432
+msgid "Get WPML now!"
+msgstr ""
+
+#: res/ums-novel-list.php:486 res/ums-rules-list.php:668
+#: res/ums-text-list.php:486 res/ums-vipnovel-list.php:486
+msgid "Do you want to not translate web novel titles"
+msgstr ""
+
+#: res/ums-novel-list.php:490 res/ums-rules-list.php:672
+#: res/ums-text-list.php:490 res/ums-vipnovel-list.php:490
+msgid "Do Not Translate Title:"
+msgstr ""
+
+#: res/ums-novel-list.php:513 res/ums-rules-list.php:695
+#: res/ums-text-list.php:513 res/ums-vipnovel-list.php:513
+msgid "No info."
+msgstr ""
+
+#: res/ums-novel-list.php:524 res/ums-novel-list.php:1597
+#: res/ums-rules-list.php:706 res/ums-rules-list.php:2015
+#: res/ums-text-list.php:524 res/ums-text-list.php:1596
+#: res/ums-vipnovel-list.php:524 res/ums-vipnovel-list.php:1597
+msgid "Select an Action"
+msgstr ""
+
+#: res/ums-novel-list.php:525 res/ums-novel-list.php:1598
+#: res/ums-rules-list.php:707 res/ums-rules-list.php:2016
+#: res/ums-text-list.php:525 res/ums-text-list.php:1597
+#: res/ums-vipnovel-list.php:525 res/ums-vipnovel-list.php:1598
+msgid "Run This Rule Now"
+msgstr ""
+
+#: res/ums-novel-list.php:526 res/ums-text-list.php:526
+#: res/ums-vipnovel-list.php:526
+msgid "Move All Novel To Trash"
+msgstr ""
+
+#: res/ums-novel-list.php:527 res/ums-text-list.php:527
+#: res/ums-vipnovel-list.php:527
+msgid "Permanently Delete All Novel"
+msgstr ""
+
+#: res/ums-novel-list.php:749 res/ums-rules-list.php:931
+#: res/ums-text-list.php:749 res/ums-vipnovel-list.php:749
+msgid "First Page"
+msgstr ""
+
+#: res/ums-novel-list.php:749 res/ums-rules-list.php:931
+#: res/ums-text-list.php:749 res/ums-vipnovel-list.php:749
+msgid "Previous Page"
+msgstr ""
+
+#: res/ums-novel-list.php:749 res/ums-rules-list.php:931
+#: res/ums-text-list.php:749 res/ums-vipnovel-list.php:749
+msgid "Page"
+msgstr ""
+
+#: res/ums-novel-list.php:749 res/ums-rules-list.php:931
+#: res/ums-text-list.php:749 res/ums-vipnovel-list.php:749
+msgid "of"
+msgstr ""
+
+#: res/ums-novel-list.php:749 res/ums-rules-list.php:931
+#: res/ums-text-list.php:749 res/ums-vipnovel-list.php:749
+msgid "Rules Per Page:"
+msgstr ""
+
+#: res/ums-novel-list.php:749 res/ums-rules-list.php:931
+#: res/ums-text-list.php:749 res/ums-vipnovel-list.php:749
+msgid "Next Page"
+msgstr ""
+
+#: res/ums-novel-list.php:749 res/ums-rules-list.php:931
+#: res/ums-text-list.php:749 res/ums-vipnovel-list.php:749
+msgid "Last Page"
+msgstr ""
+
+#: res/ums-novel-list.php:757 res/ums-rules-list.php:939
+#: res/ums-text-list.php:757 res/ums-vipnovel-list.php:757
+msgid "Confused about rule running status icons?"
+msgstr ""
+
+#: res/ums-novel-list.php:757 res/ums-rules-list.php:939
+#: res/ums-text-list.php:757 res/ums-vipnovel-list.php:757
+msgid "More info"
+msgstr ""
+
+#: res/ums-novel-list.php:762 res/ums-rules-list.php:944
+#: res/ums-text-list.php:762 res/ums-vipnovel-list.php:762
+msgid "In Progress"
+msgstr ""
+
+#: res/ums-novel-list.php:762 res/ums-rules-list.php:944
+#: res/ums-text-list.php:762 res/ums-vipnovel-list.php:762
+msgid "Importing is Running"
+msgstr ""
+
+#: res/ums-novel-list.php:766 res/ums-rules-list.php:948
+#: res/ums-text-list.php:766 res/ums-vipnovel-list.php:766
+msgid "Success"
+msgstr ""
+
+#: res/ums-novel-list.php:766 res/ums-text-list.php:766
+#: res/ums-vipnovel-list.php:766
+msgid "New Novel Created"
+msgstr ""
+
+#: res/ums-novel-list.php:770 res/ums-rules-list.php:952
+#: res/ums-text-list.php:770 res/ums-vipnovel-list.php:770
+msgid "Failed"
+msgstr ""
+
+#: res/ums-novel-list.php:770 res/ums-rules-list.php:952
+#: res/ums-text-list.php:770 res/ums-vipnovel-list.php:770
+msgid "An Error Occurred."
+msgstr ""
+
+#: res/ums-novel-list.php:770 res/ums-rules-list.php:952
+#: res/ums-text-list.php:770 res/ums-vipnovel-list.php:770
+msgid "Please check 'Activity and Logging' plugin menu for details."
+msgstr ""
+
+#: res/ums-novel-list.php:774 res/ums-text-list.php:774
+#: res/ums-vipnovel-list.php:774
+msgid "No Change - No New Novel Created"
+msgstr ""
+
+#: res/ums-novel-list.php:774 res/ums-rules-list.php:956
+#: res/ums-text-list.php:774 res/ums-vipnovel-list.php:774
+msgid "Possible reasons:"
+msgstr ""
+
+#: res/ums-novel-list.php:780 res/ums-text-list.php:780
+#: res/ums-vipnovel-list.php:780
+msgid ""
+"Already all web novel are published that match your search and web novels "
+"will be published when new content will be available"
+msgstr ""
+
+#: res/ums-novel-list.php:781 res/ums-rules-list.php:963
+#: res/ums-text-list.php:781 res/ums-vipnovel-list.php:781
+msgid "Some restrictions you defined in the plugin's 'Main Settings'"
+msgstr ""
+
+#: res/ums-novel-list.php:781 res/ums-text-list.php:781
+#: res/ums-vipnovel-list.php:781
+msgid ""
+"example: 'Minimum Content Word Count', 'Maximum Content Word Count', "
+"'Minimum Title Word Count', 'Maximum Title Word Count', 'Banned Words List', "
+"'Reuired Words List', 'Skip Novel Without Images'"
+msgstr ""
+
+#: res/ums-novel-list.php:781 res/ums-text-list.php:781
+#: res/ums-vipnovel-list.php:781
+msgid "prevent posting of new web novels."
+msgstr ""
+
+#: res/ums-novel-list.php:1146 res/ums-rules-list.php:1353
+#: res/ums-text-list.php:1145 res/ums-vipnovel-list.php:1146
+msgid "Rule"
+msgstr ""
+
+#: res/ums-novel-list.php:1157 res/ums-rules-list.php:1364
+#: res/ums-text-list.php:1156 res/ums-vipnovel-list.php:1157
+msgid "Reverse Scraping (Start With Oldest Chapters)"
+msgstr ""
+
+#: res/ums-novel-list.php:1171 res/ums-text-list.php:1170
+#: res/ums-vipnovel-list.php:1171
+msgid "Set a maximum number of web novel to scrape. This value is optional."
+msgstr ""
+
+#: res/ums-novel-list.php:1174 res/ums-text-list.php:1173
+#: res/ums-vipnovel-list.php:1174
+msgid "Maximum Number Of Novel to Scrape"
+msgstr ""
+
+#: res/ums-novel-list.php:1180 res/ums-rules-list.php:430
+#: res/ums-rules-list.php:1616 res/ums-text-list.php:1179
+#: res/ums-vipnovel-list.php:1180
+msgid "Miscellaneous Options:"
+msgstr ""
+
+#: res/ums-novel-list.php:1186 res/ums-text-list.php:1185
+#: res/ums-vipnovel-list.php:1186
+msgid "Additional Novel Genre"
+msgstr ""
+
+#: res/ums-novel-list.php:1203 res/ums-text-list.php:1202
+#: res/ums-vipnovel-list.php:1203
+msgid "Do you want to automatically add web novel genres from the feed items?"
+msgstr ""
+
+#: res/ums-novel-list.php:1206 res/ums-rules-list.php:1642
+#: res/ums-text-list.php:1205 res/ums-vipnovel-list.php:1206
+msgid "Auto Add Genres"
+msgstr ""
+
+#: res/ums-novel-list.php:1225 res/ums-text-list.php:1224
+#: res/ums-vipnovel-list.php:1225
+msgid "Do you want to automatically add web novel tags from the feed items?"
+msgstr ""
+
+#: res/ums-novel-list.php:1228 res/ums-text-list.php:1227
+#: res/ums-vipnovel-list.php:1228
+msgid "Auto Add Novel Tags"
+msgstr ""
+
+#: res/ums-novel-list.php:1255 res/ums-text-list.php:1254
+#: res/ums-vipnovel-list.php:1255
+msgid "Additional Novel Tags"
+msgstr ""
+
+#: res/ums-novel-list.php:1264 res/ums-rules-list.php:1695
+#: res/ums-text-list.php:1263 res/ums-vipnovel-list.php:1264
+msgid ""
+"Do you want to try to use PhantomJS to try to parse JavaScript from crawled "
+"pages (for pages that create dynamic content, on page load, using "
+"JavaScript)? Please note that for this to work, you must have PhantomJs "
+"installed on your server. You can configure the path to PhantomJS from your "
+"server, from plugin\\'s \\'Main Settings\\'."
+msgstr ""
+
+#: res/ums-novel-list.php:1267 res/ums-rules-list.php:1698
+#: res/ums-text-list.php:1266 res/ums-vipnovel-list.php:1267
+msgid "Content Scraping Method To Use"
+msgstr ""
+
+#: res/ums-novel-list.php:1346 res/ums-rules-list.php:1777
+#: res/ums-text-list.php:1345 res/ums-vipnovel-list.php:1346
+msgid "Headless Browser Wait Before Rendering Pages (ms)"
+msgstr ""
+
+#: res/ums-novel-list.php:1358 res/ums-text-list.php:1357
+#: res/ums-vipnovel-list.php:1358
+msgid "Enable Comments For Novel"
+msgstr ""
+
+#: res/ums-novel-list.php:1371 res/ums-text-list.php:1370
+#: res/ums-vipnovel-list.php:1371
+msgid ""
+"Do you want to enable pingbacks and trackbacks for the generated web novel?"
+msgstr ""
+
+#: res/ums-novel-list.php:1374 res/ums-rules-list.php:1805
+#: res/ums-text-list.php:1373 res/ums-vipnovel-list.php:1374
+msgid "Enable Pingback/Trackback"
+msgstr ""
+
+#: res/ums-novel-list.php:1390 res/ums-text-list.php:1389
+#: res/ums-vipnovel-list.php:1390
+msgid "Get Publish Date From Novel"
+msgstr ""
+
+#: res/ums-novel-list.php:1406 res/ums-rules-list.php:1837
+#: res/ums-text-list.php:1405 res/ums-vipnovel-list.php:1406
+msgid "Global Chapter Warning Message"
+msgstr ""
+
+#: res/ums-novel-list.php:1418 res/ums-text-list.php:1417
+#: res/ums-vipnovel-list.php:1418
+msgid "First Chapter Slug"
+msgstr ""
+
+#: res/ums-novel-list.php:1429 res/ums-rules-list.php:1847
+#: res/ums-text-list.php:1428 res/ums-vipnovel-list.php:1429
+msgid ""
+"Do you want to automatically translate generated content using Google "
+"Translate? If set, this will overwrite the \\'Automatically Translate "
+"Content To\\' option from plugin\\'s \\'Main Settings\\'."
+msgstr ""
+
+#: res/ums-novel-list.php:1432 res/ums-rules-list.php:1850
+#: res/ums-text-list.php:1431 res/ums-vipnovel-list.php:1432
+msgid "Automatically Translate Content To"
+msgstr ""
+
+#: res/ums-novel-list.php:1475 res/ums-rules-list.php:1893
+#: res/ums-text-list.php:1474 res/ums-vipnovel-list.php:1475
+msgid "Do you want to not translate web novel titles?"
+msgstr ""
+
+#: res/ums-novel-list.php:1478 res/ums-rules-list.php:1896
+#: res/ums-text-list.php:1477 res/ums-vipnovel-list.php:1478
+msgid "Do Not Translate Title"
+msgstr ""
+
+#: res/ums-novel-list.php:1506 res/ums-text-list.php:1505
+#: res/ums-vipnovel-list.php:1506
+msgid "Novels Generated:"
+msgstr ""
+
+#: res/ums-novel-list.php:1508 res/ums-text-list.php:1507
+#: res/ums-vipnovel-list.php:1508
+msgid "View Generated Novels"
+msgstr ""
+
+#: res/ums-novel-list.php:1510 res/ums-rules-list.php:1928
+#: res/ums-text-list.php:1509 res/ums-vipnovel-list.php:1510
+msgid "Last Run: "
+msgstr ""
+
+#: res/ums-novel-list.php:1516 res/ums-rules-list.php:1934
+#: res/ums-text-list.php:1515 res/ums-vipnovel-list.php:1516
+msgid "Next Run: "
+msgstr ""
+
+#: res/ums-novel-list.php:1527 res/ums-rules-list.php:1945
+#: res/ums-text-list.php:1526 res/ums-vipnovel-list.php:1527
+msgid "WP-CRON Disabled. Rules will not automatically run!"
+msgstr ""
+
+#: res/ums-novel-list.php:1544 res/ums-rules-list.php:1962
+#: res/ums-text-list.php:1543 res/ums-vipnovel-list.php:1544
+msgctxt "Date Time Format1"
+msgid "Y-m-d H:i:s"
+msgstr ""
+
+#: res/ums-novel-list.php:1560 res/ums-rules-list.php:1978
+#: res/ums-text-list.php:1559 res/ums-vipnovel-list.php:1560
+msgid "Rule Disabled"
+msgstr ""
+
+#: res/ums-novel-list.php:1563 res/ums-rules-list.php:1981
+#: res/ums-text-list.php:1562 res/ums-vipnovel-list.php:1563
+msgid "Local Time: "
+msgstr ""
+
+#: res/ums-novel-list.php:1599 res/ums-text-list.php:1598
+#: res/ums-vipnovel-list.php:1599
+msgid "Move All Novels To Trash"
+msgstr ""
+
+#: res/ums-novel-list.php:1600 res/ums-text-list.php:1599
+#: res/ums-vipnovel-list.php:1600
+msgid "Permanently Delete All Novels"
+msgstr ""
+
+#: res/ums-rules-list.php:31
+msgid "FanFox.net Manga Scraper"
+msgstr ""
+
+#: res/ums-rules-list.php:49
+msgid ""
+"This is a demo version of the \"Ultimate Web Novel And Manga Scraper\" "
+"plugin, you will have access to a limited feature set only (maximum scraped "
+"chapter count limited to 3), manga count limited to 1). To gain access to "
+"the full feature set of the plugin, please purchase it"
+msgstr ""
+
+#: res/ums-rules-list.php:72
+msgid "Manga URL / Search Keyword"
+msgstr ""
+
+#: res/ums-rules-list.php:76
+msgid ""
+"Add the URL of the manga or a search keyword. Example manga URL: https://"
+"fanfox.net/manga/onepunch_man/ If you want to query all results returned by "
+"the advanced search setup, you can enter here a * (star symbol). You can "
+"also add a comma separated list of URLs or keywords."
+msgstr ""
+
+#: res/ums-rules-list.php:100
+msgid ""
+"Number of chapters to scrape from each manga is listed and scraped by this "
+"rule."
+msgstr ""
+
+#: res/ums-rules-list.php:115
+msgid "Manga Author"
+msgstr ""
+
+#: res/ums-rules-list.php:118
+msgid ""
+"Select the author that you want to assign for the automatically generated "
+"manga."
+msgstr ""
+
+#: res/ums-rules-list.php:148
+msgid "The number of manga this rule has generated so far."
+msgstr ""
+
+#: res/ums-rules-list.php:233 res/ums-rules-list.php:1374
+msgid "Advanced Search Options:"
+msgstr ""
+
+#: res/ums-rules-list.php:240 res/ums-rules-list.php:1378
+msgid "Select the search result type to query."
+msgstr ""
+
+#: res/ums-rules-list.php:244
+msgid "Search Result Type:"
+msgstr ""
+
+#: res/ums-rules-list.php:247 res/ums-rules-list.php:356
+#: res/ums-rules-list.php:373 res/ums-rules-list.php:393
+#: res/ums-rules-list.php:1389 res/ums-rules-list.php:1505
+#: res/ums-rules-list.php:1532 res/ums-rules-list.php:1573
+msgid "Any"
+msgstr ""
+
+#: res/ums-rules-list.php:248 res/ums-rules-list.php:1394
+msgid "Manga"
+msgstr ""
+
+#: res/ums-rules-list.php:249 res/ums-rules-list.php:1399
+msgid "Chinese"
+msgstr ""
+
+#: res/ums-rules-list.php:250 res/ums-rules-list.php:1404
+msgid "Korean"
+msgstr ""
+
+#: res/ums-rules-list.php:259 res/ums-rules-list.php:1411
+msgid "Select the manga author you wish to query."
+msgstr ""
+
+#: res/ums-rules-list.php:263
+msgid "Search Manga Author:"
+msgstr ""
+
+#: res/ums-rules-list.php:272 res/ums-rules-list.php:1423
+msgid "Select the manga artist you wish to query."
+msgstr ""
+
+#: res/ums-rules-list.php:276
+msgid "Search Manga Artist:"
+msgstr ""
+
+#: res/ums-rules-list.php:285
+msgid "Select the manga genres you wish to query."
+msgstr ""
+
+#: res/ums-rules-list.php:289
+msgid "Search Manga Genres:"
+msgstr ""
+
+#: res/ums-rules-list.php:298
+msgid "Select the manga genres you wish to exclude."
+msgstr ""
+
+#: res/ums-rules-list.php:302
+msgid "Exclude Manga Genres:"
+msgstr ""
+
+#: res/ums-rules-list.php:311 res/ums-rules-list.php:1459
+msgid "Set a release year to query manga before it."
+msgstr ""
+
+#: res/ums-rules-list.php:315
+msgid "Manga Release Year Before:"
+msgstr ""
+
+#: res/ums-rules-list.php:324 res/ums-rules-list.php:1471
+msgid "Set a release year to query manga after it."
+msgstr ""
+
+#: res/ums-rules-list.php:328
+msgid "Manga Release Year After:"
+msgstr ""
+
+#: res/ums-rules-list.php:337 res/ums-rules-list.php:1483
+msgid "Set a minimum rating for the queried manga."
+msgstr ""
+
+#: res/ums-rules-list.php:341
+msgid "Minimum Manga Rating:"
+msgstr ""
+
+#: res/ums-rules-list.php:350 res/ums-rules-list.php:1495
+msgid "Do you want to search only completed manga?"
+msgstr ""
+
+#: res/ums-rules-list.php:354
+msgid "Search Completed Manga:"
+msgstr ""
+
+#: res/ums-rules-list.php:357 res/ums-rules-list.php:1510
+msgid "Completed"
+msgstr ""
+
+#: res/ums-rules-list.php:358 res/ums-rules-list.php:1515
+msgid "Ongoing"
+msgstr ""
+
+#: res/ums-rules-list.php:367 res/ums-rules-list.php:1522
+msgid "Set the sorting of the manga results?"
+msgstr ""
+
+#: res/ums-rules-list.php:371
+msgid "Results Sorting:"
+msgstr ""
+
+#: res/ums-rules-list.php:374 res/ums-rules-list.php:1537
+msgid "Name"
+msgstr ""
+
+#: res/ums-rules-list.php:375 res/ums-rules-list.php:1542
+msgid "Rating"
+msgstr ""
+
+#: res/ums-rules-list.php:376 res/ums-rules-list.php:1547
+msgid "Views"
+msgstr ""
+
+#: res/ums-rules-list.php:377 res/ums-rules-list.php:1552
+msgid "Chapters"
+msgstr ""
+
+#: res/ums-rules-list.php:378 res/ums-rules-list.php:1557
+msgid "Latest Chapter"
+msgstr ""
+
+#: res/ums-rules-list.php:387 res/ums-rules-list.php:1563
+msgid "Select results ordering type."
+msgstr ""
+
+#: res/ums-rules-list.php:391
+msgid "Results Ordering:"
+msgstr ""
+
+#: res/ums-rules-list.php:394 res/ums-rules-list.php:1578
+msgid "Ascending"
+msgstr ""
+
+#: res/ums-rules-list.php:395 res/ums-rules-list.php:1583
+msgid "Descending"
+msgstr ""
+
+#: res/ums-rules-list.php:404
+msgid "Set the maximum manga count to scrape. This value is optional."
+msgstr ""
+
+#: res/ums-rules-list.php:408
+msgid "Maximum Number Of Manga to Scrape:"
+msgstr ""
+
+#: res/ums-rules-list.php:418 res/ums-rules-list.php:1602
+msgid ""
+"Do you want to remember last posted item and continue search from it the "
+"next time the importing rule runs?"
+msgstr ""
+
+#: res/ums-rules-list.php:422
+msgid ""
+"Cache Items For Continuous Posting (disable to get first results page only):"
+msgstr ""
+
+#: res/ums-rules-list.php:437 res/ums-rules-list.php:1619
+msgid ""
+"Select the manga genre that you want for the automatically generated manga "
+"to have."
+msgstr ""
+
+#: res/ums-rules-list.php:441
+msgid "Additional Manga Genre:"
+msgstr ""
+
+#: res/ums-rules-list.php:464
+msgid "Do you want to automatically add manga genres from the manga items?"
+msgstr ""
+
+#: res/ums-rules-list.php:472 res/ums-rules-list.php:488
+#: res/ums-rules-list.php:1655 res/ums-rules-list.php:1677
+msgid "Manga Genres"
+msgstr ""
+
+#: res/ums-rules-list.php:480
+msgid "Do you want to automatically add manga tags from the manga items?"
+msgstr ""
+
+#: res/ums-rules-list.php:484
+msgid "Auto Add Manga Tags:"
+msgstr ""
+
+#: res/ums-rules-list.php:496 res/ums-rules-list.php:1683
+msgid ""
+"Select the manga tags that you want for the automatically generated manga to "
+"have."
+msgstr ""
+
+#: res/ums-rules-list.php:500
+msgid "Additional Manga Tags:"
+msgstr ""
+
+#: res/ums-rules-list.php:553 res/ums-rules-list.php:1786
+msgid "Do you want to enable comments for the generated manga?"
+msgstr ""
+
+#: res/ums-rules-list.php:557
+msgid "Enable Comments For Manga:"
+msgstr ""
+
+#: res/ums-rules-list.php:570
+msgid "Do you want to enable pingbacks/trackbacks for the generated manga?"
+msgstr ""
+
+#: res/ums-rules-list.php:587 res/ums-rules-list.php:1818
+msgid "Do you want to get the publish date from the source manga?"
+msgstr ""
+
+#: res/ums-rules-list.php:591
+msgid "Get Publish Date From Manga:"
+msgstr ""
+
+#: res/ums-rules-list.php:603 res/ums-rules-list.php:1834
+msgid "Set a global chapter warning message to display on the scraped manga."
+msgstr ""
+
+#: res/ums-rules-list.php:708 res/ums-rules-list.php:2017
+msgid "Move All Manga To Trash"
+msgstr ""
+
+#: res/ums-rules-list.php:709 res/ums-rules-list.php:2018
+msgid "Permanently Delete All Manga"
+msgstr ""
+
+#: res/ums-rules-list.php:948
+msgid "New Manga Created"
+msgstr ""
+
+#: res/ums-rules-list.php:956
+msgid "No Change - No New Manga Created"
+msgstr ""
+
+#: res/ums-rules-list.php:962
+msgid ""
+"Already all manga are published that match your search and manga will be "
+"manga when new content will be available"
+msgstr ""
+
+#: res/ums-rules-list.php:963
+msgid ""
+"example: 'Minimum Content Word Count', 'Maximum Content Word Count', "
+"'Minimum Title Word Count', 'Maximum Title Word Count', 'Banned Words List', "
+"'Reuired Words List', 'Skip Manga Without Images'"
+msgstr ""
+
+#: res/ums-rules-list.php:963
+msgid "prevent posting of new manga."
+msgstr ""
+
+#: res/ums-rules-list.php:1381
+msgid "Search Result Type"
+msgstr ""
+
+#: res/ums-rules-list.php:1414
+msgid "Search Manga Author"
+msgstr ""
+
+#: res/ums-rules-list.php:1426
+msgid "Search Manga Artist"
+msgstr ""
+
+#: res/ums-rules-list.php:1435
+msgid ""
+"Select the manga genre you wish to query. You can enter a comma separated "
+"list of genres. Valid genres are: Action, Adult, Adventure, Comedy, "
+"Doujinshi, Drama, Ecchi, Fantasy, Gender Bender, Harem, Historical, "
+"Horror, Josei, Martial Arts, Mature, Mecha, Mystery, One Shot, "
+"Psychological, Romance, School Life, Sci-fi, Seinen, Shoujo, Shoujo "
+"Ai, Shounen, Shounen Ai, Slice of Life, Smut, Sports, Supernatural, "
+"Tragedy, Webtoons, Yaoi, Yuri"
+msgstr ""
+
+#: res/ums-rules-list.php:1438
+msgid "Include Manga Genres"
+msgstr ""
+
+#: res/ums-rules-list.php:1447
+msgid ""
+"Select the manga genre you wish to exclude. You can enter a comma separated "
+"list of genres. Valid genres are: Action, Adult, Adventure, Comedy, "
+"Doujinshi, Drama, Ecchi, Fantasy, Gender Bender, Harem, Historical, "
+"Horror, Josei, Martial Arts, Mature, Mecha, Mystery, One Shot, "
+"Psychological, Romance, School Life, Sci-fi, Seinen, Shoujo, Shoujo "
+"Ai, Shounen, Shounen Ai, Slice of Life, Smut, Sports, Supernatural, "
+"Tragedy, Webtoons, Yaoi, Yuri"
+msgstr ""
+
+#: res/ums-rules-list.php:1450
+msgid "Exclude Manga Genres"
+msgstr ""
+
+#: res/ums-rules-list.php:1462
+msgid "Manga Release Year Before"
+msgstr ""
+
+#: res/ums-rules-list.php:1474
+msgid "Manga Release Year After"
+msgstr ""
+
+#: res/ums-rules-list.php:1486
+msgid "Minimum Manga Rating"
+msgstr ""
+
+#: res/ums-rules-list.php:1498
+msgid "Search Completed Manga"
+msgstr ""
+
+#: res/ums-rules-list.php:1525
+msgid "Result Sorting"
+msgstr ""
+
+#: res/ums-rules-list.php:1566
+msgid "Results Ordering"
+msgstr ""
+
+#: res/ums-rules-list.php:1590
+msgid "Set a maximum number of manga to scrape. This value is optional."
+msgstr ""
+
+#: res/ums-rules-list.php:1593
+msgid "Maximum Number Of Manga to Scrape"
+msgstr ""
+
+#: res/ums-rules-list.php:1605
+msgid ""
+"Cache Items For Continuous Posting (disable to get first results page only)"
+msgstr ""
+
+#: res/ums-rules-list.php:1622
+msgid "Additional Manga Genre"
+msgstr ""
+
+#: res/ums-rules-list.php:1639
+msgid "Do you want to automatically add manga genres from the feed items?"
+msgstr ""
+
+#: res/ums-rules-list.php:1661
+msgid "Do you want to automatically add manga tags from the feed items?"
+msgstr ""
+
+#: res/ums-rules-list.php:1664
+msgid "Auto Add Manga Tags"
+msgstr ""
+
+#: res/ums-rules-list.php:1686
+msgid "Additional Manga Tags"
+msgstr ""
+
+#: res/ums-rules-list.php:1789
+msgid "Enable Comments For Manga"
+msgstr ""
+
+#: res/ums-rules-list.php:1802
+msgid "Do you want to enable pingbacks and trackbacks for the generated manga?"
+msgstr ""
+
+#: res/ums-rules-list.php:1821
+msgid "Get Publish Date From Manga"
+msgstr ""
+
+#: res/ums-rules-list.php:1924
+msgid "Manga Generated:"
+msgstr ""
+
+#: res/ums-rules-list.php:1926
+msgid "View Generated Manga"
+msgstr ""
+
+#: res/ums-text-list.php:30
+msgid "WuxiaWorld.site Novels Scraper"
+msgstr ""
+
+#: res/ums-text-list.php:75
+msgid ""
+"Add the URL of the Web Novel (or a comma separated list of Web Novel URLs) "
+"or a keyword search. Example Web Novel URL: https://wuxiaworld.site/novel/"
+"super-gene-webnovel-read/ - you can also add a comma separated list of "
+"similar URLs. If you want to query all web novels, you can enter here a * "
+"(star symbol)."
+msgstr ""
+
+#: res/ums-vipnovel-list.php:30
+msgid "NewNovel.org Novels Scraper"
+msgstr ""
+
+#: res/ums-vipnovel-list.php:75
+msgid ""
+"Add the URL of the Web Novel (or a comma separated list of Web Novel URLs) "
+"or a keyword search. Example Web Novel URL: https://newnovel.org/novel/ghost-"
+"emperor-wild-wife-dandy-eldest-miss/ - you can also add a comma separated "
+"list of similar URLs. If you want to query all web novels, you can enter "
+"here a * (star symbol)."
+msgstr ""
+
+#: ultimate-manga-scraper.php:47
+msgid "Afrikaans (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:48
+msgid "Albanian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:49
+msgid "Arabic (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:50
+msgid "Amharic (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:51
+msgid "Armenian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:52
+msgid "Belarusian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:53
+msgid "Bulgarian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:54
+msgid "Catalan (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:55
+msgid "Chinese Simplified (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:56
+msgid "Croatian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:57
+msgid "Czech (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:58
+msgid "Danish (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:59
+msgid "Dutch (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:60
+msgid "English (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:61
+msgid "Estonian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:62
+msgid "Filipino (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:63
+msgid "Finnish (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:64
+msgid "French (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:65
+msgid "Galician (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:66
+msgid "German (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:67
+msgid "Greek (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:68
+msgid "Hebrew (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:69
+msgid "Hindi (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:70
+msgid "Hungarian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:71
+msgid "Icelandic (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:72
+msgid "Indonesian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:73
+msgid "Irish (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:74
+msgid "Italian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:75
+msgid "Japanese (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:76
+msgid "Korean (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:77
+msgid "Latvian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:78
+msgid "Lithuanian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:79
+msgid "Norwegian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:80
+msgid "Macedonian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:81
+msgid "Malay (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:82
+msgid "Maltese (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:83
+msgid "Persian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:84
+msgid "Polish (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:85
+msgid "Portuguese (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:86
+msgid "Romanian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:87
+msgid "Russian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:88
+msgid "Serbian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:89
+msgid "Slovak (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:90
+msgid "Slovenian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:91
+msgid "Spanish (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:92 ultimate-manga-scraper.php:147
+msgid "Swahili (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:93
+msgid "Swedish (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:94
+msgid "Thai (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:95
+msgid "Turkish (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:96
+msgid "Ukrainian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:97
+msgid "Vietnamese (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:98
+msgid "Welsh (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:99
+msgid "Yiddish (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:100
+msgid "Tamil (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:101
+msgid "Azerbaijani (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:102
+msgid "Kannada (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:103
+msgid "Basque (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:104
+msgid "Bengali (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:105
+msgid "Latin (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:106
+msgid "Chinese Traditional (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:107
+msgid "Esperanto (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:108
+msgid "Georgian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:109
+msgid "Telugu (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:110
+msgid "Gujarati (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:111
+msgid "Haitian Creole (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:112
+msgid "Urdu (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:114
+msgid "Burmese (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:115
+msgid "Bosnian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:116
+msgid "Cebuano (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:117
+msgid "Chichewa (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:118
+msgid "Corsican (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:119
+msgid "Frisian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:120
+msgid "Scottish Gaelic (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:121
+msgid "Hausa (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:122
+msgid "Hawaian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:123
+msgid "Hmong (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:124
+msgid "Igbo (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:125
+msgid "Javanese (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:126
+msgid "Kazakh (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:127
+msgid "Khmer (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:128
+msgid "Kurdish (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:129
+msgid "Kyrgyz (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:130
+msgid "Lao (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:131
+msgid "Luxembourgish (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:132
+msgid "Malagasy (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:133
+msgid "Malayalam (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:134
+msgid "Maori (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:135
+msgid "Marathi (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:136
+msgid "Mongolian (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:137
+msgid "Nepali (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:138
+msgid "Pashto (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:139
+msgid "Punjabi (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:140
+msgid "Samoan (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:141
+msgid "Sesotho (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:142
+msgid "Shona (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:143
+msgid "Sindhi (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:144
+msgid "Sinhala (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:145
+msgid "Somali (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:146
+msgid "Sundanese (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:148
+msgid "Tajik (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:149
+msgid "Uzbek (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:150
+msgid "Xhosa (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:151
+msgid "Yoruba (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:152
+msgid "Zulu (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:154
+msgid "Assammese (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:155
+msgid "Aymara (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:156
+msgid "Bambara (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:157
+msgid "Bhojpuri (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:158
+msgid "Dhivehi (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:159
+msgid "Dogri (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:160
+msgid "Ewe (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:161
+msgid "Guarani (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:162
+msgid "Ilocano (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:163
+msgid "Kinyarwanda (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:164
+msgid "Konkani (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:165
+msgid "Krio (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:166
+msgid "Kurdish - Sorani (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:167
+msgid "Lingala (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:168
+msgid "Luganda (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:169
+msgid "Maithili (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:170
+msgid "Meiteilon (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:171
+msgid "Mizo (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:172
+msgid "Odia (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:173
+msgid "Oromo (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:174
+msgid "Quechua (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:175
+msgid "Sanskrit (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:176
+msgid "Sepedi (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:177
+msgid "Tatar (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:178
+msgid "Tigrinya (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:179
+msgid "Tsonga (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:180
+msgid "Turkmen (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:181
+msgid "Twi (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:182
+msgid "Uyghur (Google Translate)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:806
+#, php-format
+msgid ""
+"The plugin is not registered. Automatic updating is disabled. Please "
+"purchase a license for it from here and "
+"register the plugin from the 'Main Settings' menu using your purchase code. "
+"How I find my purchase code?"
+msgstr ""
+
+#: ultimate-manga-scraper.php:827
+msgid "Activate Plugin License"
+msgstr ""
+
+#: ultimate-manga-scraper.php:839
+msgid "Main Settings"
+msgstr ""
+
+#: ultimate-manga-scraper.php:844
+msgid "Manga Scraper (FanFox.net)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:847
+msgid "Web Novel Scraper (BoxNovel.com)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:850
+msgid "Web Novel Scraper (NewNovel.org)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:853
+msgid "Web Novel Scraper (WuxiaWorld.site)"
+msgstr ""
+
+#: ultimate-manga-scraper.php:856
+msgid "Activity & Logging"
+msgstr ""
+
+#: ultimate-manga-scraper.php:930
+msgid "Settings"
+msgstr ""
+
+#: ultimate-manga-scraper.php:940
+msgid "ums Cron"
+msgstr ""
+
+#: ultimate-manga-scraper.php:944
+msgid "Once A Minute"
+msgstr ""
+
+#: ultimate-manga-scraper.php:948
+msgid "Once Weekly"
+msgstr ""
+
+#: ultimate-manga-scraper.php:952
+msgid "Once Monthly"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9399
+msgctxt "taxonomy general name"
+msgid "Post Source"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9400
+msgctxt "taxonomy singular name"
+msgid "Post Source"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9401
+msgid "Search Post Source"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9402
+msgid "Popular Post Source"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9403
+msgid "All Post Sources"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9406
+msgid "Edit Post Source"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9407
+msgid "Update Post Source"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9408
+msgid "Add New Post Source"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9409
+msgid "New Post Source Name"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9410
+msgid "Separate Post Source with commas"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9411
+msgid "Add or remove Post Source"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9412
+msgid "Choose from the most used Post Source"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9413
+msgid "No Post Sources found."
+msgstr ""
+
+#: ultimate-manga-scraper.php:9414
+msgid "Post Source"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9494
+msgid ""
+"Please enable curl PHP extension. Please contact your hosting provider's "
+"support to help you in this matter."
+msgstr ""
+
+#: ultimate-manga-scraper.php:9499
+msgid "You are not allowed to activate plugins!"
+msgstr ""
+
+#: ultimate-manga-scraper.php:9507
+#, php-format
+msgid ""
+"This plugin can not be activated because it requires a PHP version greater "
+"than %1$s. Please update your PHP version before you activate it."
+msgstr ""
+
+#: ultimate-manga-scraper.php:9513
+#, php-format
+msgid ""
+"This plugin can not be activated because it requires a WordPress version "
+"greater than %1$s. Please go to Dashboard -> Updates to get the latest "
+"version of WordPress."
+msgstr ""
+
+#: update-checker/Puc/v4/Plugin/UpdateChecker.php:363
+#: update-checker/Puc/v4p8/Plugin/Ui.php:128
+msgid "Check for updates"
+msgstr ""
+
+#: update-checker/Puc/v4/Plugin/UpdateChecker.php:409
+msgid "This plugin is up to date."
+msgstr ""
+
+#: update-checker/Puc/v4/Plugin/UpdateChecker.php:411
+msgid "A new version of this plugin is available."
+msgstr ""
+
+#: update-checker/Puc/v4/Plugin/UpdateChecker.php:413
+#: update-checker/Puc/v4p8/Plugin/Ui.php:223
+#, php-format
+msgid "Unknown update checker status \"%s\""
+msgstr ""
+
+#: update-checker/Puc/v4/Vcs/PluginUpdateChecker.php:83
+#: update-checker/Puc/v4p8/Vcs/PluginUpdateChecker.php:98
+msgid "There is no changelog available."
+msgstr ""
+
+#: update-checker/Puc/v4p8/Plugin/Ui.php:54
+msgid "View details"
+msgstr ""
+
+#: update-checker/Puc/v4p8/Plugin/Ui.php:77
+#, php-format
+msgid "More information about %s"
+msgstr ""
+
+#: update-checker/Puc/v4p8/Plugin/Ui.php:213
+#, php-format
+msgctxt "the plugin title"
+msgid "The %s plugin is up to date."
+msgstr ""
+
+#: update-checker/Puc/v4p8/Plugin/Ui.php:215
+#, php-format
+msgctxt "the plugin title"
+msgid "A new version of the %s plugin is available."
+msgstr ""
+
+#: update-checker/Puc/v4p8/Plugin/Ui.php:217
+#, php-format
+msgctxt "the plugin title"
+msgid "Could not determine if updates are available for %s."
+msgstr ""
+
+#. Plugin Name of the plugin/theme
+msgid "Ultimate Web Novel & Manga Scraper"
+msgstr ""
+
+#. Plugin URI of the plugin/theme
+msgid "//1.envato.market/coderevolution"
+msgstr ""
+
+#. Description of the plugin/theme
+msgid "This plugin will scrape manga for you, day and night"
+msgstr ""
+
+#. Author of the plugin/theme
+msgid "CodeRevolution"
+msgstr ""
+
+#. Author URI of the plugin/theme
+msgid "//coderevolution.ro"
+msgstr ""
diff --git a/readme.txt b/readme.txt
new file mode 100644
index 0000000000000000000000000000000000000000..fe64cb200ce2ec15e64699cb2d905af116ab860a
--- /dev/null
+++ b/readme.txt
@@ -0,0 +1,33 @@
+=== Ultimate Web Novel & Manga Scraper Plugin for WordPress ===
+Contributors: coderevolution
+Donate link: https://www.patreon.com/coderevolution
+Tags: popup, subscribers
+Requires at least: 4.0
+Tested up to: 6.8.0
+Stable tag: 6.7.1
+License: Regular/Extended License
+
+Another plugin made by CodeRevolution.
+
+== Description ==
+
+Nice to meet you! My name is Szabi from CodeRevolution. We are a team of a few people who work FULL TIME as freelancers, making plugins and scripts for Envato Market. Because we dedicate all our time to this, our items are filled with passion, and we can offer premium support to our customers all the time! Feel free to ask in advance any question you might have about our items! If you buy any of our items, you will have support in case something is not working as specified, related to our item, according to Envato Support Policy.
+Hope that you enjoy my work!
+
+== Installation ==
+
+1. Upload the plugin files to the `/wp-content/plugins/plugin-name` directory, or install the plugin through the WordPress plugins screen directly.
+2. Activate the plugin through the 'Plugins' screen in WordPress
+3. Use the Settings->Plugin Name screen to configure the plugin
+
+
+== Frequently Asked Questions ==
+
+= How do I update this plugin? =
+
+This plugin supports automatical updating. Please click "Check for updates" for this plugin in the WordPress plugins control panel. If a new version is available you will be prompted. Click "Update now" to finish the updating process.
+
+== Changelog ==
+
+= 1.0 =
+For a detailed changelog, please check the plugin's CodeCanyon page, from here (search for the plugin, from our portfolio): //1.envato.market/coderevolutionplugins
\ No newline at end of file
diff --git a/res/ImageResize/ImageResize.php b/res/ImageResize/ImageResize.php
new file mode 100644
index 0000000000000000000000000000000000000000..fd730424738ec0cd0e4875ebdd199a6f49f7f7fe
--- /dev/null
+++ b/res/ImageResize/ImageResize.php
@@ -0,0 +1,717 @@
+ 127)
+ {
+ $isAscii = false;
+ break;
+ }
+ }
+ if($isAscii == true)
+ {
+ global $wp_filesystem;
+ if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
+ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
+ wp_filesystem($creds);
+ }
+ if ($filename === null || empty($filename) || (substr($filename, 0, 7) !== 'data://' && !$wp_filesystem->is_file($filename))) {
+ throw new ImageResizeException('File does not exist');
+ }
+ if(!function_exists('finfo_open'))
+ {
+ throw new ImageResizeException('finfo_open does not exist, cannot resize image.');
+ }
+ $finfo = finfo_open(FILEINFO_MIME_TYPE);
+ if (strstr(finfo_file($finfo, $filename), 'image') === false) {
+ throw new ImageResizeException('Unsupported file type (' . $filename . '): ' . finfo_file($finfo, $filename));
+ }
+ }
+
+ if (!$image_info = getimagesize($filename, $this->source_info)) {
+ $image_info = getimagesize($filename);
+ }
+
+ if (!$image_info) {
+ throw new ImageResizeException('Could not read file ' . $filename);
+ }
+
+ list(
+ $this->original_w,
+ $this->original_h,
+ $this->source_type
+ ) = $image_info;
+
+ switch ($this->source_type) {
+ case IMAGETYPE_GIF:
+ $this->source_image = imagecreatefromgif($filename);
+ break;
+
+ case IMAGETYPE_JPEG:
+ $this->source_image = $this->imageCreateJpegfromExif($filename);
+
+ // set new width and height for image, maybe it has changed
+ $this->original_w = ImageSX($this->source_image);
+ $this->original_h = ImageSY($this->source_image);
+
+ break;
+
+ case IMAGETYPE_PNG:
+ $this->source_image = imagecreatefrompng($filename);
+ break;
+
+ case IMAGETYPE_WEBP:
+ if (version_compare(PHP_VERSION, '5.5.0', '<')) {
+ throw new ImageResizeException('For WebP support PHP >= 5.5.0 is required');
+ }
+ $this->source_image = imagecreatefromwebp($filename);
+ break;
+
+ default:
+ throw new ImageResizeException('Unsupported image type');
+ break;
+ }
+
+ if (!$this->source_image) {
+ throw new ImageResizeException('Could not load image');
+ }
+
+ return $this->resize($this->getSourceWidth(), $this->getSourceHeight());
+ }
+
+ // http://stackoverflow.com/a/28819866
+ public function imageCreateJpegfromExif($filename)
+ {
+ $img = imagecreatefromjpeg($filename);
+
+ if (!function_exists('exif_read_data') || !isset($this->source_info['APP1']) || strpos($this->source_info['APP1'], 'Exif') !== 0) {
+ return $img;
+ }
+
+ $exif = exif_read_data($filename);
+
+ if (!$exif || !isset($exif['Orientation'])) {
+ return $img;
+ }
+
+ $orientation = $exif['Orientation'];
+
+ if ($orientation === 6 || $orientation === 5) {
+ $img = imagerotate($img, 270, 0);
+ } elseif ($orientation === 3 || $orientation === 4) {
+ $img = imagerotate($img, 180, 0);
+ } elseif ($orientation === 8 || $orientation === 7) {
+ $img = imagerotate($img, 90, 0);
+ }
+
+ if ($orientation === 5 || $orientation === 4 || $orientation === 7) {
+ imageflip($img, IMG_FLIP_HORIZONTAL);
+ }
+
+ return $img;
+ }
+
+ /**
+ * Saves new image
+ *
+ * @param string $filename
+ * @param string $image_type
+ * @param integer $quality
+ * @param integer $permissions
+ * @return \static
+ */
+ public function save($filename, $image_type = null, $quality = null, $permissions = null)
+ {
+ $image_type = $image_type ?: $this->source_type;
+ $quality = is_numeric($quality) ? (int) abs($quality) : null;
+
+ switch ($image_type) {
+ case IMAGETYPE_GIF:
+ $dest_image = imagecreatetruecolor($this->getDestWidth(), $this->getDestHeight());
+
+ $background = imagecolorallocatealpha($dest_image, 255, 255, 255, 1);
+ imagecolortransparent($dest_image, $background);
+ imagefill($dest_image, 0, 0, $background);
+ imagesavealpha($dest_image, true);
+ break;
+
+ case IMAGETYPE_JPEG:
+ $dest_image = imagecreatetruecolor($this->getDestWidth(), $this->getDestHeight());
+
+ $background = imagecolorallocate($dest_image, 255, 255, 255);
+ imagefilledrectangle($dest_image, 0, 0, $this->getDestWidth(), $this->getDestHeight(), $background);
+ break;
+
+ case IMAGETYPE_WEBP:
+ if (version_compare(PHP_VERSION, '5.5.0', '<')) {
+ throw new ImageResizeException('For WebP support PHP >= 5.5.0 is required');
+ }
+ $dest_image = imagecreatetruecolor($this->getDestWidth(), $this->getDestHeight());
+
+ $background = imagecolorallocate($dest_image, 255, 255, 255);
+ imagefilledrectangle($dest_image, 0, 0, $this->getDestWidth(), $this->getDestHeight(), $background);
+ break;
+
+ case IMAGETYPE_PNG:
+ if (!$this->quality_truecolor && !imageistruecolor($this->source_image)) {
+ $dest_image = imagecreate($this->getDestWidth(), $this->getDestHeight());
+
+ $background = imagecolorallocatealpha($dest_image, 255, 255, 255, 1);
+ imagecolortransparent($dest_image, $background);
+ imagefill($dest_image, 0, 0, $background);
+ } else {
+ $dest_image = imagecreatetruecolor($this->getDestWidth(), $this->getDestHeight());
+ }
+
+ imagealphablending($dest_image, false);
+ imagesavealpha($dest_image, true);
+ break;
+ }
+
+ imageinterlace($dest_image, $this->interlace);
+
+ imagecopyresampled(
+ $dest_image,
+ $this->source_image,
+ $this->dest_x,
+ $this->dest_y,
+ $this->source_x,
+ $this->source_y,
+ $this->getDestWidth(),
+ $this->getDestHeight(),
+ $this->source_w,
+ $this->source_h
+ );
+
+ switch ($image_type) {
+ case IMAGETYPE_GIF:
+ imagegif($dest_image, $filename);
+ break;
+
+ case IMAGETYPE_JPEG:
+ if ($quality === null || $quality > 100) {
+ $quality = $this->quality_jpg;
+ }
+
+ imagejpeg($dest_image, $filename, $quality);
+ break;
+
+ case IMAGETYPE_WEBP:
+ if (version_compare(PHP_VERSION, '5.5.0', '<')) {
+ throw new ImageResizeException('For WebP support PHP >= 5.5.0 is required');
+ }
+ if ($quality === null) {
+ $quality = $this->quality_webp;
+ }
+
+ imagewebp($dest_image, $filename, $quality);
+ break;
+
+ case IMAGETYPE_PNG:
+ if ($quality === null || $quality > 9) {
+ $quality = $this->quality_png;
+ }
+
+ imagepng($dest_image, $filename, $quality);
+ break;
+ }
+
+ if ($permissions) {
+ global $wp_filesystem;
+ if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
+ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
+ wp_filesystem($creds);
+ }
+ $wp_filesystem->chmod($filename, $permissions);
+ }
+
+ imagedestroy($dest_image);
+imagedestroy($this->source_image);
+
+ return $this;
+ }
+
+ /**
+ * Convert the image to string
+ *
+ * @param int $image_type
+ * @param int $quality
+ * @return string
+ */
+ public function getImageAsString($image_type = null, $quality = null)
+ {
+ $string_temp = tempnam(sys_get_temp_dir(), '');
+
+ $this->save($string_temp, $image_type, $quality);
+
+ global $wp_filesystem;
+ if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
+ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
+ wp_filesystem($creds);
+ }
+ $string = $wp_filesystem->get_contents($string_temp);
+
+ $wp_filesystem->delete($string_temp);
+
+ return $string;
+ }
+
+ /**
+ * Convert the image to string with the current settings
+ *
+ * @return string
+ */
+ public function __toString()
+ {
+ return $this->getImageAsString();
+ }
+
+ /**
+ * Outputs image to browser
+ * @param string $image_type
+ * @param integer $quality
+ */
+ public function output($image_type = null, $quality = null)
+ {
+ $image_type = $image_type ?: $this->source_type;
+
+ header('Content-Type: ' . image_type_to_mime_type($image_type));
+
+ $this->save(null, $image_type, $quality);
+ }
+
+ /**
+ * Resizes image according to the given short side (short side proportional)
+ *
+ * @param integer $max_short
+ * @param boolean $allow_enlarge
+ * @return \static
+ */
+ public function resizeToShortSide($max_short, $allow_enlarge = false)
+ {
+ if ($this->getSourceHeight() < $this->getSourceWidth()) {
+ $ratio = $max_short / $this->getSourceHeight();
+ $long = $this->getSourceWidth() * $ratio;
+
+ $this->resize($long, $max_short, $allow_enlarge);
+ } else {
+ $ratio = $max_short / $this->getSourceWidth();
+ $long = $this->getSourceHeight() * $ratio;
+
+ $this->resize($max_short, $long, $allow_enlarge);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Resizes image according to the given long side (short side proportional)
+ *
+ * @param integer $max_long
+ * @param boolean $allow_enlarge
+ * @return \static
+ */
+ public function resizeToLongSide($max_long, $allow_enlarge = false)
+ {
+ if ($this->getSourceHeight() > $this->getSourceWidth()) {
+ $ratio = $max_long / $this->getSourceHeight();
+ $short = $this->getSourceWidth() * $ratio;
+
+ $this->resize($short, $max_long, $allow_enlarge);
+ } else {
+ $ratio = $max_long / $this->getSourceWidth();
+ $short = $this->getSourceHeight() * $ratio;
+
+ $this->resize($max_long, $short, $allow_enlarge);
+ }
+
+ return $this;
+ }
+
+ /**
+ * Resizes image according to the given height (width proportional)
+ *
+ * @param integer $height
+ * @param boolean $allow_enlarge
+ * @return \static
+ */
+ public function resizeToHeight($height, $allow_enlarge = false)
+ {
+ $ratio = $height / $this->getSourceHeight();
+ $width = $this->getSourceWidth() * $ratio;
+
+ $this->resize($width, $height, $allow_enlarge);
+
+ return $this;
+ }
+
+ /**
+ * Resizes image according to the given width (height proportional)
+ *
+ * @param integer $width
+ * @param boolean $allow_enlarge
+ * @return \static
+ */
+ public function resizeToWidth($width, $allow_enlarge = false)
+ {
+ $ratio = $width / $this->getSourceWidth();
+ $height = $this->getSourceHeight() * $ratio;
+
+ $this->resize($width, $height, $allow_enlarge);
+
+ return $this;
+ }
+
+ /**
+ * Resizes image to best fit inside the given dimensions
+ *
+ * @param integer $max_width
+ * @param integer $max_height
+ * @param boolean $allow_enlarge
+ * @return \static
+ */
+ public function resizeToBestFit($max_width, $max_height, $allow_enlarge = false)
+ {
+ if ($this->getSourceWidth() <= $max_width && $this->getSourceHeight() <= $max_height && $allow_enlarge === false) {
+ return $this;
+ }
+
+ $ratio = $this->getSourceHeight() / $this->getSourceWidth();
+ $width = $max_width;
+ $height = $width * $ratio;
+
+ if ($height > $max_height) {
+ $height = $max_height;
+ $width = $height / $ratio;
+ }
+
+ return $this->resize($width, $height, $allow_enlarge);
+ }
+
+ /**
+ * Resizes image according to given scale (proportionally)
+ *
+ * @param integer|float $scale
+ * @return \static
+ */
+ public function scale($scale)
+ {
+ $width = $this->getSourceWidth() * $scale / 100;
+ $height = $this->getSourceHeight() * $scale / 100;
+
+ $this->resize($width, $height, true);
+
+ return $this;
+ }
+
+ /**
+ * Resizes image according to the given width and height
+ *
+ * @param integer $width
+ * @param integer $height
+ * @param boolean $allow_enlarge
+ * @return \static
+ */
+ public function resize($width, $height, $allow_enlarge = false)
+ {
+ if (!$allow_enlarge) {
+ // if the user hasn't explicitly allowed enlarging,
+ // but either of the dimensions are larger then the original,
+ // then just use original dimensions - this logic may need rethinking
+
+ if ($width > $this->getSourceWidth() || $height > $this->getSourceHeight()) {
+ $width = $this->getSourceWidth();
+ $height = $this->getSourceHeight();
+ }
+ }
+
+ $this->source_x = 0;
+ $this->source_y = 0;
+
+ $this->dest_w = $width;
+ $this->dest_h = $height;
+
+ $this->source_w = $this->getSourceWidth();
+ $this->source_h = $this->getSourceHeight();
+
+ return $this;
+ }
+
+ /**
+ * Crops image according to the given width, height and crop position
+ *
+ * @param integer $width
+ * @param integer $height
+ * @param boolean $allow_enlarge
+ * @param integer $position
+ * @return \static
+ */
+ public function crop($width, $height, $allow_enlarge = false, $position = self::CROPCENTER)
+ {
+ if (!$allow_enlarge) {
+ // this logic is slightly different to resize(),
+ // it will only reset dimensions to the original
+ // if that particular dimenstion is larger
+
+ if ($width > $this->getSourceWidth()) {
+ $width = $this->getSourceWidth();
+ }
+
+ if ($height > $this->getSourceHeight()) {
+ $height = $this->getSourceHeight();
+ }
+ }
+
+ $ratio_source = $this->getSourceWidth() / $this->getSourceHeight();
+ $ratio_dest = $width / $height;
+
+ if ($ratio_dest < $ratio_source) {
+ $this->resizeToHeight($height, $allow_enlarge);
+
+ $excess_width = ($this->getDestWidth() - $width) / $this->getDestWidth() * $this->getSourceWidth();
+
+ $this->source_w = $this->getSourceWidth() - $excess_width;
+ $this->source_x = $this->getCropPosition($excess_width, $position);
+
+ $this->dest_w = $width;
+ } else {
+ $this->resizeToWidth($width, $allow_enlarge);
+
+ $excess_height = ($this->getDestHeight() - $height) / $this->getDestHeight() * $this->getSourceHeight();
+
+ $this->source_h = $this->getSourceHeight() - $excess_height;
+ $this->source_y = $this->getCropPosition($excess_height, $position);
+
+ $this->dest_h = $height;
+ }
+
+ return $this;
+ }
+
+ /**
+ * Crops image according to the given width, height, x and y
+ *
+ * @param integer $width
+ * @param integer $height
+ * @param integer $x
+ * @param integer $y
+ * @return \static
+ */
+ public function freecrop($width, $height, $x = false, $y = false)
+ {
+ if ($x === false or $y === false) {
+ return $this->crop($width, $height);
+ }
+ $this->source_x = $x;
+ $this->source_y = $y;
+ if ($width > $this->getSourceWidth() - $x) {
+ $this->source_w = $this->getSourceWidth() - $x;
+ } else {
+ $this->source_w = $width;
+ }
+
+ if ($height > $this->getSourceHeight() - $y) {
+ $this->source_h = $this->getSourceHeight() - $y;
+ } else {
+ $this->source_h = $height;
+ }
+
+ $this->dest_w = $width;
+ $this->dest_h = $height;
+
+ return $this;
+ }
+
+ /**
+ * Gets source width
+ *
+ * @return integer
+ */
+ public function getSourceWidth()
+ {
+ return $this->original_w;
+ }
+
+ /**
+ * Gets source height
+ *
+ * @return integer
+ */
+ public function getSourceHeight()
+ {
+ return $this->original_h;
+ }
+
+ /**
+ * Gets width of the destination image
+ *
+ * @return integer
+ */
+ public function getDestWidth()
+ {
+ return $this->dest_w;
+ }
+
+ /**
+ * Gets height of the destination image
+ * @return integer
+ */
+ public function getDestHeight()
+ {
+ return $this->dest_h;
+ }
+
+ /**
+ * Gets crop position (X or Y) according to the given position
+ *
+ * @param integer $expectedSize
+ * @param integer $position
+ * @return integer
+ */
+ protected function getCropPosition($expectedSize, $position = self::CROPCENTER)
+ {
+ $size = 0;
+ switch ($position) {
+ case self::CROPBOTTOM:
+ case self::CROPRIGHT:
+ $size = $expectedSize;
+ break;
+ case self::CROPCENTER:
+ case self::CROPCENTRE:
+ $size = $expectedSize / 2;
+ break;
+ case self::CROPTOPCENTER:
+ $size = $expectedSize / 4;
+ break;
+ }
+ return $size;
+ }
+}
+
+// imageflip definition for PHP < 5.5
+if (!function_exists('imageflip')) {
+ define('IMG_FLIP_HORIZONTAL', 0);
+ define('IMG_FLIP_VERTICAL', 1);
+ define('IMG_FLIP_BOTH', 2);
+
+ function imageflip($image, $mode)
+ {
+ switch ($mode) {
+ case IMG_FLIP_HORIZONTAL: {
+ $max_x = imagesx($image) - 1;
+ $half_x = $max_x / 2;
+ $sy = imagesy($image);
+ $temp_image = imageistruecolor($image)? imagecreatetruecolor(1, $sy): imagecreate(1, $sy);
+ for ($x = 0; $x < $half_x; ++$x) {
+ imagecopy($temp_image, $image, 0, 0, $x, 0, 1, $sy);
+ imagecopy($image, $image, $x, 0, $max_x - $x, 0, 1, $sy);
+ imagecopy($image, $temp_image, $max_x - $x, 0, 0, 0, 1, $sy);
+ }
+ break;
+ }
+case IMG_FLIP_VERTICAL: {
+ $sx = imagesx($image);
+ $max_y = imagesy($image) - 1;
+ $half_y = $max_y / 2;
+ $temp_image = imageistruecolor($image)? imagecreatetruecolor($sx, 1): imagecreate($sx, 1);
+ for ($y = 0; $y < $half_y; ++$y) {
+ imagecopy($temp_image, $image, 0, 0, 0, $y, $sx, 1);
+ imagecopy($image, $image, 0, $y, 0, $max_y - $y, $sx, 1);
+ imagecopy($image, $temp_image, 0, $max_y - $y, 0, 0, $sx, 1);
+ }
+ break;
+}
+case IMG_FLIP_BOTH: {
+ $sx = imagesx($image);
+ $sy = imagesy($image);
+ $temp_image = imagerotate($image, 180, 0);
+ imagecopy($image, $temp_image, 0, 0, 0, 0, $sx, $sy);
+ break;
+}
+default: {
+ return;
+}
+ }
+ imagedestroy($temp_image);
+ }
+}
+
+/**
+ * PHP Exception used in the ImageResize class
+ */
+class ImageResizeException extends \Exception
+{
+}
\ No newline at end of file
diff --git a/res/ImageResize/index.php b/res/ImageResize/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..1580272ca20148e6cd43366e262c335765ed9b5e
--- /dev/null
+++ b/res/ImageResize/index.php
@@ -0,0 +1,3 @@
+
diff --git a/res/UMSJavaScriptUnpacker.php b/res/UMSJavaScriptUnpacker.php
new file mode 100644
index 0000000000000000000000000000000000000000..acea06b8b3d26106266ce3f217ff7a6e55b6e7df
--- /dev/null
+++ b/res/UMSJavaScriptUnpacker.php
@@ -0,0 +1,174 @@
+.
+ *
+ * Ported to PHP from:
+ * https://github.com/Eldorados/script.module.urlresolver/blob/master/lib/urlresolver/plugins/lib/jsunpack.py
+
+ *
+ * ----------------------------------------------------------------------
+ * changelog:
+ * 1.0 : Initial Release.
+ * 1.1 : Fixed the if-statements within the UMSUnbaser constructor
+ * ----------------------------------------------------------------------
+ *
+ * examples of usage :
+ * $unpacker = new UMSJavaScriptUnPacker();
+ * $unpacker = $myPacker->Unpack($packedJs);
+ * *
+ * The unpack() method returns the uncompressed JavasScript, as a string
+ * that was packed with Dean Edwards JavaScript's Packer method.
+ *
+ * Notes :
+ * # need PHP 5 . Tested with PHP 5.4.7 and 5.5.21
+ */
+
+class UMSJavaScriptUnPacker
+{
+ private $unbaser;
+ private $payload;
+ private $symtab;
+ private $radix;
+ private $count;
+
+ function Detect($source)
+ {
+ $source = preg_replace("/ /","",$source);
+ preg_match("/eval\(function\(p,a,c,k,e,[r|d]?/", $source, $res);
+
+ UMSDebug::Write($res,"detection result");
+
+ return (count($res) > 0);
+ }
+
+ function Unpack($source)
+ {
+ preg_match_all("/}\('(.*)', *(\d+), *(\d+), *'(.*?)'\.split\('\|'\)/",$source,$out);
+
+ UMSDebug::Write($out,"DOTALL", false);
+
+ // Payload
+ $this->payload = $out[1][0];
+ UMSDebug::Write($this->payload,"payload");
+ // Words
+ $this->symtab = preg_split("/\|/",$out[4][0]);
+ UMSDebug::Write($this->symtab,"symtab");
+ // Radix
+ $this->radix = (int)$out[2][0];
+ UMSDebug::Write($this->radix,"radix");
+ // Words Count
+ $this->count = (int)$out[3][0];
+ UMSDebug::Write($this->count,"count");
+
+ if( $this->count != count($this->symtab)) return; // Malformed p.a.c.k.e.r symtab !
+
+ //ToDo: Try catch
+ $this->unbaser = new UMSUnbaser($this->radix);
+
+ $result = preg_replace_callback(
+ '/\b\w+\b/',
+ array($this, 'Lookup')
+ ,
+ $this->payload
+ );
+ $result = str_replace('\\', '', $result);
+ UMSDebug::Write($result);
+ $this->ReplaceStrings($result);
+ return $result;
+ }
+
+ function Lookup($matches)
+ {
+ $word = $matches[0];
+ $ub = $this->symtab[$this->unbaser->Unbase($word)];
+ $ret = !empty($ub) ? $ub : $word;
+ return $ret;
+ }
+
+ function ReplaceStrings($source)
+ {
+ preg_match_all("/var *(_\w+)\=\[\"(.*?)\"\];/",$source,$out);
+ UMSDebug::Write($out);
+ }
+
+}
+
+class UMSUnbaser
+{
+ private $base;
+ private $dict;
+ private $selector = 52;
+ private $ALPHABET = array(
+ 52 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOP',
+ 54 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQR',
+ 62 => '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
+ 95 => ' !"#$%&\'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~'
+ );
+
+
+ function __construct($base)
+ {
+ $this->base = $base;
+
+ if($this->base > 62) $this->selector = 95;
+ else if($this->base > 54) $this->selector = 62;
+ else if($this->base > 52) $this->selector = 54;
+ }
+
+ function Unbase($val)
+ {
+ if( 2 <= $this->base && $this->base <= 36)
+ {
+ return intval($val,$this->base);
+ }else{
+ if(!isset($this->dict)){
+
+ $this->dict = array_flip(str_split($this->ALPHABET[$this->selector]));
+ }
+ $ret = 0;
+ $valArray = array_reverse(str_split($val));
+
+ for($i = 0; $i < count($valArray) ; $i++)
+ {
+ $cipher = $valArray[$i];
+ $ret += pow($this->base, $i) * $this->dict[$cipher];
+ }
+ return $ret;
+ // UnbaseExtended($x, $base)
+ }
+ }
+
+}
+
+
+class UMSDebug
+{
+ public static $debug = false;
+ public static function Write($data, $header = "", $mDebug = true)
+ {
+ if(!self::$debug || !$mDebug) return;
+
+ if(!empty($header))
+ echo "".$header." ";
+
+ echo "";
+ print_r($data);
+ echo " ";
+ }
+
+}
+?>
\ No newline at end of file
diff --git a/res/index.php b/res/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..1580272ca20148e6cd43366e262c335765ed9b5e
--- /dev/null
+++ b/res/index.php
@@ -0,0 +1,3 @@
+
diff --git a/res/mangafox-master/.gitignore b/res/mangafox-master/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..09c35deef83d58501af45a9765740b48ceeb38c3
--- /dev/null
+++ b/res/mangafox-master/.gitignore
@@ -0,0 +1,3 @@
+vendor/
+build/
+\.php_cs\.cache
diff --git a/res/mangafox-master/LICENSE b/res/mangafox-master/LICENSE
new file mode 100644
index 0000000000000000000000000000000000000000..a0bf476a744b3c57c97d3f8fd41e1cc3535ce01c
--- /dev/null
+++ b/res/mangafox-master/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2017
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
\ No newline at end of file
diff --git a/res/mangafox-master/README.md b/res/mangafox-master/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..3ac2502f700fc4e57416090e81c6282a37fd999d
--- /dev/null
+++ b/res/mangafox-master/README.md
@@ -0,0 +1,79 @@
+# MangaFox Scraper
+
+Search and download manga from [mangafox.me](http://mangafox.me/)
+
+MangaFox Scraper is a library that gets all the needed information about manga for a manga-reader
+
+## Requirements
+
+PHP 7.0.0 or later.
+
+## Composer
+
+You can install it via [Composer](https://getcomposer.org/) by typing the following command:
+
+```bash
+composer require railken/mangafox
+```
+
+
+## Dependencies
+
+- [`curl`](https://secure.php.net/manual/en/book.curl.php)
+
+
+## Getting Started
+
+Simple usage looks like:
+
+```php
+
+# Creating a new instance of manager
+$manager = new \Railken\Mangafox\Mangafox();
+
+# Searching a manga
+$results = $manager
+ ->search()
+ ->type('any')
+ ->name('contains', 'One Piece')
+ ->author('contains', 'Oda Eiichiro')
+ ->artist('contains', 'Oda Eiichiro')
+ ->genres('include', ['Action', 'Drama', 'Historical'])
+ ->releasedYear('<', '2017')
+ ->rating('>', 4)
+ ->completed(0)
+ ->sortBy('name', 'ASC')
+ ->page(1)
+ ->get();
+
+# Retrieving all info about a manga
+$manga = $manager
+ ->resource('one_piece')
+ ->get();
+
+
+# Retrieving all scans for a given manga, volume and chapter
+$scans = $manager
+ ->scan('one_piece', 1, 1)
+ ->get();
+
+# Retrieving last updates
+$results = $manager->releases()->page(1)->get();
+
+# Perform a query in the directory
+$results = $manager
+ ->directory()
+ ->browseBy('genre', 'Action')
+ ->sortBy('name')
+ ->page(1)
+ ->get();
+```
+
+
+## License
+
+Open-source software licensed under the [MIT license](https://opensource.org/licenses/MIT).
+
+## Copyright
+
+All the manga are copyrighted to their respective author. Please buy the manga if it's available in your country.
\ No newline at end of file
diff --git a/res/mangafox-master/composer.json b/res/mangafox-master/composer.json
new file mode 100644
index 0000000000000000000000000000000000000000..ea3a4fb7dfd9d485f09215421067a0970ac40a09
--- /dev/null
+++ b/res/mangafox-master/composer.json
@@ -0,0 +1,19 @@
+{
+ "name": "railken/mangafox",
+ "type": "library",
+ "require": {
+ "guzzlehttp/guzzle": "~6.0",
+ "wa72/htmlpagedom": "^1.3",
+ "illuminate/support": "^5.5",
+ "railken/bag": "^1.0"
+ },
+ "autoload": {
+ "psr-4" : {
+ "Railken\\Mangafox\\" : "src/"
+ }
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.2||^7.0||^8.0"
+ },
+ "minimum-stability": "stable"
+}
diff --git a/res/mangafox-master/composer.lock b/res/mangafox-master/composer.lock
new file mode 100644
index 0000000000000000000000000000000000000000..86f2dbdbe1a4475ead4892406fdd09a98abd5e99
--- /dev/null
+++ b/res/mangafox-master/composer.lock
@@ -0,0 +1,2196 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "e0529624b058e9afd86d96c84d1bd3e8",
+ "packages": [
+ {
+ "name": "doctrine/inflector",
+ "version": "v1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/inflector.git",
+ "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/inflector/zipball/e11d84c6e018beedd929cff5220969a3c6d1d462",
+ "reference": "e11d84c6e018beedd929cff5220969a3c6d1d462",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Inflector\\": "lib/Doctrine/Common/Inflector"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "Common String Manipulations with regard to casing and singular/plural rules.",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "inflection",
+ "pluralize",
+ "singularize",
+ "string"
+ ],
+ "time": "2017-07-22T12:18:28+00:00"
+ },
+ {
+ "name": "guzzlehttp/guzzle",
+ "version": "6.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/guzzle.git",
+ "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/guzzle/zipball/f4db5a78a5ea468d4831de7f0bf9d9415e348699",
+ "reference": "f4db5a78a5ea468d4831de7f0bf9d9415e348699",
+ "shasum": ""
+ },
+ "require": {
+ "guzzlehttp/promises": "^1.0",
+ "guzzlehttp/psr7": "^1.4",
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "require-dev": {
+ "ext-curl": "*",
+ "phpunit/phpunit": "^5.5||^7.0||^8.0",
+ "psr/log": "^1.0"
+ },
+ "suggest": {
+ "psr/log": "Required for using the Log middleware"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "6.2-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/functions_include.php"
+ ],
+ "psr-4": {
+ "GuzzleHttp\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle is a PHP HTTP client library",
+ "homepage": "http://guzzlephp.org/",
+ "keywords": [
+ "client",
+ "curl",
+ "framework",
+ "http",
+ "http client",
+ "rest",
+ "web service"
+ ],
+ "time": "2017-06-22T18:50:49+00:00"
+ },
+ {
+ "name": "guzzlehttp/promises",
+ "version": "v1.3.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/promises.git",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/promises/zipball/a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "reference": "a59da6cf61d80060647ff4d3eb2c03a2bc694646",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.5||^7.0||^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Promise\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ }
+ ],
+ "description": "Guzzle promises library",
+ "keywords": [
+ "promise"
+ ],
+ "time": "2016-12-20T10:07:11+00:00"
+ },
+ {
+ "name": "guzzlehttp/psr7",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/guzzle/psr7.git",
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/guzzle/psr7/zipball/f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "reference": "f5b8a8512e2b58b0071a7280e39f14f72e05d87c",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0",
+ "psr/http-message": "~1.0"
+ },
+ "provide": {
+ "psr/http-message-implementation": "1.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.5||^7.0||^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "GuzzleHttp\\Psr7\\": "src/"
+ },
+ "files": [
+ "src/functions_include.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Michael Dowling",
+ "email": "mtdowling@gmail.com",
+ "homepage": "https://github.com/mtdowling"
+ },
+ {
+ "name": "Tobias Schultze",
+ "homepage": "https://github.com/Tobion"
+ }
+ ],
+ "description": "PSR-7 message implementation that also provides common utility methods",
+ "keywords": [
+ "http",
+ "message",
+ "request",
+ "response",
+ "stream",
+ "uri",
+ "url"
+ ],
+ "time": "2017-03-20T17:10:46+00:00"
+ },
+ {
+ "name": "illuminate/contracts",
+ "version": "v5.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/contracts.git",
+ "reference": "e935ac3bcfa32a9d8b9a082e5085f233fa9cf918"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/contracts/zipball/e935ac3bcfa32a9d8b9a082e5085f233fa9cf918",
+ "reference": "e935ac3bcfa32a9d8b9a082e5085f233fa9cf918",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0||^8.0",
+ "psr/container": "~1.0",
+ "psr/simple-cache": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Contracts\\": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Contracts package.",
+ "homepage": "https://laravel.com",
+ "time": "2017-08-27T09:20:20+00:00"
+ },
+ {
+ "name": "illuminate/support",
+ "version": "v5.5.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/illuminate/support.git",
+ "reference": "6a1c08c4e89429a0333ad86c489088ceeadbcced"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/illuminate/support/zipball/6a1c08c4e89429a0333ad86c489088ceeadbcced",
+ "reference": "6a1c08c4e89429a0333ad86c489088ceeadbcced",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/inflector": "~1.1",
+ "ext-mbstring": "*",
+ "illuminate/contracts": "5.5.*",
+ "nesbot/carbon": "^1.20",
+ "php": ">=7.0"
+ },
+ "replace": {
+ "tightenco/collect": "self.version"
+ },
+ "suggest": {
+ "illuminate/filesystem": "Required to use the composer class (5.2.*).",
+ "symfony/process": "Required to use the composer class (~3.3).",
+ "symfony/var-dumper": "Required to use the dd function (~3.3)."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Illuminate\\Support\\": ""
+ },
+ "files": [
+ "helpers.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Taylor Otwell",
+ "email": "taylor@laravel.com"
+ }
+ ],
+ "description": "The Illuminate Support package.",
+ "homepage": "https://laravel.com",
+ "time": "2017-09-04T14:00:07+00:00"
+ },
+ {
+ "name": "nesbot/carbon",
+ "version": "1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/briannesbitt/Carbon.git",
+ "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
+ "reference": "7cdf42c0b1cc763ab7e4c33c47a24e27c66bfccc",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "symfony/translation": "~2.6 || ~3.0"
+ },
+ "require-dev": {
+ "friendsofphp/php-cs-fixer": "~2",
+ "phpunit/phpunit": "~4.0 || ~5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.23-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Carbon\\": "src/Carbon/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Brian Nesbitt",
+ "email": "brian@nesbot.com",
+ "homepage": "http://nesbot.com"
+ }
+ ],
+ "description": "A simple API extension for DateTime.",
+ "homepage": "http://carbon.nesbot.com",
+ "keywords": [
+ "date",
+ "datetime",
+ "time"
+ ],
+ "time": "2017-01-16T07:55:07+00:00"
+ },
+ {
+ "name": "psr/container",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/container.git",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/container/zipball/b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "reference": "b7ce3b176482dbbc1245ebf52b181af44c2cf55f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Container\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common Container Interface (PHP FIG PSR-11)",
+ "homepage": "https://github.com/php-fig/container",
+ "keywords": [
+ "PSR-11",
+ "container",
+ "container-interface",
+ "container-interop",
+ "psr"
+ ],
+ "time": "2017-02-14T16:28:37+00:00"
+ },
+ {
+ "name": "psr/http-message",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/http-message.git",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/http-message/zipball/f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "reference": "f6561bf28d520154e4b0ec72be95418abe6d9363",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\Http\\Message\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interface for HTTP messages",
+ "homepage": "https://github.com/php-fig/http-message",
+ "keywords": [
+ "http",
+ "http-message",
+ "psr",
+ "psr-7",
+ "request",
+ "response"
+ ],
+ "time": "2016-08-06T14:39:51+00:00"
+ },
+ {
+ "name": "psr/simple-cache",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/php-fig/simple-cache.git",
+ "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/php-fig/simple-cache/zipball/753fa598e8f3b9966c886fe13f370baa45ef0e24",
+ "reference": "753fa598e8f3b9966c886fe13f370baa45ef0e24",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Psr\\SimpleCache\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "PHP-FIG",
+ "homepage": "http://www.php-fig.org/"
+ }
+ ],
+ "description": "Common interfaces for simple caching",
+ "keywords": [
+ "cache",
+ "caching",
+ "psr",
+ "psr-16",
+ "simple-cache"
+ ],
+ "time": "2017-01-02T13:31:39+00:00"
+ },
+ {
+ "name": "railken/bag",
+ "version": "v1.2.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/railken/bag.git",
+ "reference": "db0caded04b19e1fb0aee0f57f31ffe768dc6fe6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/railken/bag/zipball/db0caded04b19e1fb0aee0f57f31ffe768dc6fe6",
+ "reference": "db0caded04b19e1fb0aee0f57f31ffe768dc6fe6",
+ "shasum": ""
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "Railken\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "time": "2017-09-26T20:53:42+00:00"
+ },
+ {
+ "name": "symfony/css-selector",
+ "version": "v3.3.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/css-selector.git",
+ "reference": "c5f5263ed231f164c58368efbce959137c7d9488"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/css-selector/zipball/c5f5263ed231f164c58368efbce959137c7d9488",
+ "reference": "c5f5263ed231f164c58368efbce959137c7d9488",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\CssSelector\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jean-François Simon",
+ "email": "jeanfrancois.simon@sensiolabs.com"
+ },
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony CssSelector Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-07-29T21:54:42+00:00"
+ },
+ {
+ "name": "symfony/dom-crawler",
+ "version": "v3.3.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/dom-crawler.git",
+ "reference": "6b511d7329b203a620f09a2288818d27dcc915ae"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/dom-crawler/zipball/6b511d7329b203a620f09a2288818d27dcc915ae",
+ "reference": "6b511d7329b203a620f09a2288818d27dcc915ae",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "require-dev": {
+ "symfony/css-selector": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/css-selector": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\DomCrawler\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony DomCrawler Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-09-11T15:55:22+00:00"
+ },
+ {
+ "name": "symfony/polyfill-mbstring",
+ "version": "v1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/polyfill-mbstring.git",
+ "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/7c8fae0ac1d216eb54349e6a8baa57d515fe8803",
+ "reference": "7c8fae0ac1d216eb54349e6a8baa57d515fe8803",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "suggest": {
+ "ext-mbstring": "For best performance"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.5-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Polyfill\\Mbstring\\": ""
+ },
+ "files": [
+ "bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Nicolas Grekas",
+ "email": "p@tchwork.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony polyfill for the Mbstring extension",
+ "homepage": "https://symfony.com",
+ "keywords": [
+ "compatibility",
+ "mbstring",
+ "polyfill",
+ "portable",
+ "shim"
+ ],
+ "time": "2017-06-14T15:44:48+00:00"
+ },
+ {
+ "name": "symfony/translation",
+ "version": "v3.3.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/translation.git",
+ "reference": "add53753d978f635492dfe8cd6953f6a7361ef90"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/translation/zipball/add53753d978f635492dfe8cd6953f6a7361ef90",
+ "reference": "add53753d978f635492dfe8cd6953f6a7361ef90",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0",
+ "symfony/polyfill-mbstring": "~1.0"
+ },
+ "conflict": {
+ "symfony/config": "<2.8",
+ "symfony/yaml": "<3.3"
+ },
+ "require-dev": {
+ "psr/log": "~1.0",
+ "symfony/config": "~2.8|~3.0",
+ "symfony/intl": "^2.8.18|^3.2.5",
+ "symfony/yaml": "~3.3"
+ },
+ "suggest": {
+ "psr/log": "To use logging capability in translator",
+ "symfony/config": "",
+ "symfony/yaml": ""
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Translation\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Translation Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-07-29T21:54:42+00:00"
+ },
+ {
+ "name": "wa72/htmlpagedom",
+ "version": "v1.3.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/wasinger/htmlpagedom.git",
+ "reference": "6e25a51ff490300b1b04704a90ffb92ff3cf7aab"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/wasinger/htmlpagedom/zipball/6e25a51ff490300b1b04704a90ffb92ff3cf7aab",
+ "reference": "6e25a51ff490300b1b04704a90ffb92ff3cf7aab",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0",
+ "symfony/css-selector": ">=2.3",
+ "symfony/dom-crawler": "^2.3 <2.8 | ^2.8.3 | ^3.0.1"
+ },
+ "require-dev": {
+ "wa72/html-pretty-min": "^0.1.2"
+ },
+ "suggest": {
+ "wa72/html-pretty-min": "Minify or indent HTML documents"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Wa72\\HtmlPageDom\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Christoph Singer",
+ "email": "singer@webagentur72.de",
+ "homepage": "http://www.webagentur72.de"
+ }
+ ],
+ "description": "PHP implementation of the jQuery DOM manipulation API for HTML documents",
+ "homepage": "http://github.com/wasinger/htmlpagedom",
+ "keywords": [
+ "crawler",
+ "dom",
+ "html"
+ ],
+ "time": "2016-10-06T07:57:02+00:00"
+ }
+ ],
+ "packages-dev": [
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/instantiator/zipball/185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
+ "reference": "185b8868aa9bf7159f5f953ed5afb2d7fcdc3bda",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "^6.2.3",
+ "squizlabs/php_codesniffer": "^3.0.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "time": "2017-07-22T11:58:36+00:00"
+ },
+ {
+ "name": "myclabs/deep-copy",
+ "version": "1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/myclabs/DeepCopy.git",
+ "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/8e6e04167378abf1ddb4d3522d8755c5fd90d102",
+ "reference": "8e6e04167378abf1ddb4d3522d8755c5fd90d102",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.4.0"
+ },
+ "require-dev": {
+ "doctrine/collections": "1.*",
+ "phpunit/phpunit": "~4.1"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "DeepCopy\\": "src/DeepCopy/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Create deep copies (clones) of your objects",
+ "homepage": "https://github.com/myclabs/DeepCopy",
+ "keywords": [
+ "clone",
+ "copy",
+ "duplicate",
+ "object",
+ "object graph"
+ ],
+ "time": "2017-04-12T18:52:22+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-common",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionCommon.git",
+ "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+ "reference": "21bdeb5f65d7ebf9f43b1b25d404f87deab5bfb6",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.5"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jaap van Otterdijk",
+ "email": "opensource@ijaap.nl"
+ }
+ ],
+ "description": "Common reflection classes used by phpdocumentor to reflect the code structure",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "FQSEN",
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2017-09-11T18:02:19+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "4.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/2d3d238c433cf69caeb4842e97a3223a116f94b2",
+ "reference": "2d3d238c433cf69caeb4842e97a3223a116f94b2",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.0||^8.0",
+ "phpdocumentor/reflection-common": "^1.0@dev",
+ "phpdocumentor/type-resolver": "^0.4.0",
+ "webmozart/assert": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^4.4"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.",
+ "time": "2017-08-30T18:51:59+00:00"
+ },
+ {
+ "name": "phpdocumentor/type-resolver",
+ "version": "0.4.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/TypeResolver.git",
+ "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/9c977708995954784726e25d0cd1dddf4e65b0f7",
+ "reference": "9c977708995954784726e25d0cd1dddf4e65b0f7",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0",
+ "phpdocumentor/reflection-common": "^1.0"
+ },
+ "require-dev": {
+ "mockery/mockery": "^0.9.4",
+ "phpunit/phpunit": "^5.2||^4.8.24"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "phpDocumentor\\Reflection\\": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "me@mikevanriel.com"
+ }
+ ],
+ "time": "2017-07-14T14:27:02+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.7.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/phpspec/prophecy/zipball/c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6",
+ "reference": "c9b8c6088acd19d769d4cc0ffa60a9fe34344bd6",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.5||^7.0||^8.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2|^4.0",
+ "sebastian/comparator": "^1.1|^2.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.5|^3.2",
+ "phpunit/phpunit": "^4.8 || ^5.6.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.7.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "ever.zet@gmail.com",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "marcello.duarte@gmail.com"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2017-09-04T11:05:03+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "4.0.8",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-code-coverage.git",
+ "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+ "reference": "ef7b2f56815df854e66ceaee8ebe9393ae36a40d",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-xmlwriter": "*",
+ "php": "^5.5||^7.0||^8.0",
+ "phpunit/php-file-iterator": "^1.3",
+ "phpunit/php-text-template": "^1.2",
+ "phpunit/php-token-stream": "^1.4.2 || ^2.0",
+ "sebastian/code-unit-reverse-lookup": "^1.0",
+ "sebastian/environment": "^1.3.2 || ^2.0",
+ "sebastian/version": "^1.0 || ^2.0"
+ },
+ "require-dev": {
+ "ext-xdebug": "^2.1.4",
+ "phpunit/phpunit": "^5.7"
+ },
+ "suggest": {
+ "ext-xdebug": "^2.5.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.",
+ "homepage": "https://github.com/sebastianbergmann/php-code-coverage",
+ "keywords": [
+ "coverage",
+ "testing",
+ "xunit"
+ ],
+ "time": "2017-04-02T07:44:40+00:00"
+ },
+ {
+ "name": "phpunit/php-file-iterator",
+ "version": "1.4.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-file-iterator.git",
+ "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "reference": "3cc8f69b3028d0f96a9078e6295d86e9bf019be5",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "FilterIterator implementation that filters files based on a list of suffixes.",
+ "homepage": "https://github.com/sebastianbergmann/php-file-iterator/",
+ "keywords": [
+ "filesystem",
+ "iterator"
+ ],
+ "time": "2016-10-03T07:40:28+00:00"
+ },
+ {
+ "name": "phpunit/php-text-template",
+ "version": "1.2.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-text-template.git",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "reference": "31f8b717e51d9a2afca6c9f046f5d69fc27c8686",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Simple template engine.",
+ "homepage": "https://github.com/sebastianbergmann/php-text-template/",
+ "keywords": [
+ "template"
+ ],
+ "time": "2015-06-21T13:50:34+00:00"
+ },
+ {
+ "name": "phpunit/php-timer",
+ "version": "1.0.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-timer.git",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "reference": "3dcf38ca72b158baf0bc245e9184d3fdffa9c46f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Utility class for timing",
+ "homepage": "https://github.com/sebastianbergmann/php-timer/",
+ "keywords": [
+ "timer"
+ ],
+ "time": "2017-02-26T11:10:40+00:00"
+ },
+ {
+ "name": "phpunit/php-token-stream",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/php-token-stream.git",
+ "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/php-token-stream/zipball/9a02332089ac48e704c70f6cefed30c224e3c0b0",
+ "reference": "9a02332089ac48e704c70f6cefed30c224e3c0b0",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^6.2.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Wrapper around PHP's tokenizer extension.",
+ "homepage": "https://github.com/sebastianbergmann/php-token-stream/",
+ "keywords": [
+ "tokenizer"
+ ],
+ "time": "2017-08-20T05:47:52+00:00"
+ },
+ {
+ "name": "phpunit/phpunit",
+ "version": "5.7.22",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit.git",
+ "reference": "10df877596c9906d4110b5b905313829043f2ada"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/10df877596c9906d4110b5b905313829043f2ada",
+ "reference": "10df877596c9906d4110b5b905313829043f2ada",
+ "shasum": ""
+ },
+ "require": {
+ "ext-dom": "*",
+ "ext-json": "*",
+ "ext-libxml": "*",
+ "ext-mbstring": "*",
+ "ext-xml": "*",
+ "myclabs/deep-copy": "~1.3",
+ "php": "^5.5||^7.0||^8.0",
+ "phpspec/prophecy": "^1.6.2",
+ "phpunit/php-code-coverage": "^4.0.4",
+ "phpunit/php-file-iterator": "~1.4",
+ "phpunit/php-text-template": "~1.2",
+ "phpunit/php-timer": "^1.0.6",
+ "phpunit/phpunit-mock-objects": "^3.2",
+ "sebastian/comparator": "^1.2.4",
+ "sebastian/diff": "^1.4.3",
+ "sebastian/environment": "^1.3.4 || ^2.0",
+ "sebastian/exporter": "~2.0",
+ "sebastian/global-state": "^1.1",
+ "sebastian/object-enumerator": "~2.0",
+ "sebastian/resource-operations": "~1.0",
+ "sebastian/version": "~1.0.3|~2.0",
+ "symfony/yaml": "~2.1|~3.0"
+ },
+ "conflict": {
+ "phpdocumentor/reflection-docblock": "3.0.2"
+ },
+ "require-dev": {
+ "ext-pdo": "*"
+ },
+ "suggest": {
+ "ext-xdebug": "*",
+ "phpunit/php-invoker": "~1.1"
+ },
+ "bin": [
+ "phpunit"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "5.7.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "The PHP Unit Testing framework.",
+ "homepage": "https://phpunit.de/",
+ "keywords": [
+ "phpunit",
+ "testing",
+ "xunit"
+ ],
+ "time": "2017-09-24T07:23:38+00:00"
+ },
+ {
+ "name": "phpunit/phpunit-mock-objects",
+ "version": "3.4.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/phpunit-mock-objects.git",
+ "reference": "a23b761686d50a560cc56233b9ecf49597cc9118"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/phpunit-mock-objects/zipball/a23b761686d50a560cc56233b9ecf49597cc9118",
+ "reference": "a23b761686d50a560cc56233b9ecf49597cc9118",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.5||^7.0||^8.0",
+ "phpunit/php-text-template": "^1.2",
+ "sebastian/exporter": "^1.2 || ^2.0"
+ },
+ "conflict": {
+ "phpunit/phpunit": "<5.4.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.4"
+ },
+ "suggest": {
+ "ext-soap": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sb@sebastian-bergmann.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Mock Object library for PHPUnit",
+ "homepage": "https://github.com/sebastianbergmann/phpunit-mock-objects/",
+ "keywords": [
+ "mock",
+ "xunit"
+ ],
+ "time": "2017-06-30T09:13:00+00:00"
+ },
+ {
+ "name": "sebastian/code-unit-reverse-lookup",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "reference": "4419fcdb5eabb9caa61a27c7a1db532a6b55dd18",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.7 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Looks up which function or method a line of code belongs to",
+ "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/",
+ "time": "2017-03-04T06:30:41+00:00"
+ },
+ {
+ "name": "sebastian/comparator",
+ "version": "1.2.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/comparator.git",
+ "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+ "reference": "2b7424b55f5047b47ac6e5ccb20b2aea4011d9be",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/diff": "~1.2",
+ "sebastian/exporter": "~1.2 || ~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.2.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides the functionality to compare PHP values for equality",
+ "homepage": "http://www.github.com/sebastianbergmann/comparator",
+ "keywords": [
+ "comparator",
+ "compare",
+ "equality"
+ ],
+ "time": "2017-01-29T09:50:25+00:00"
+ },
+ {
+ "name": "sebastian/diff",
+ "version": "1.4.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/diff.git",
+ "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+ "reference": "7f066a26a962dbe58ddea9f72a4e82874a3975a4",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Kore Nordmann",
+ "email": "mail@kore-nordmann.de"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Diff implementation",
+ "homepage": "https://github.com/sebastianbergmann/diff",
+ "keywords": [
+ "diff"
+ ],
+ "time": "2017-05-22T07:24:03+00:00"
+ },
+ {
+ "name": "sebastian/environment",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/environment.git",
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "reference": "5795ffe5dc5b02460c3e34222fee8cbe245d8fac",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^5.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides functionality to handle HHVM/PHP environments",
+ "homepage": "http://www.github.com/sebastianbergmann/environment",
+ "keywords": [
+ "Xdebug",
+ "environment",
+ "hhvm"
+ ],
+ "time": "2016-11-26T07:53:53+00:00"
+ },
+ {
+ "name": "sebastian/exporter",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/exporter.git",
+ "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+ "reference": "ce474bdd1a34744d7ac5d6aad3a46d48d9bac4c4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "sebastian/recursion-context": "~2.0"
+ },
+ "require-dev": {
+ "ext-mbstring": "*",
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Volker Dusch",
+ "email": "github@wallbash.com"
+ },
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@2bepublished.at"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides the functionality to export PHP variables for visualization",
+ "homepage": "http://www.github.com/sebastianbergmann/exporter",
+ "keywords": [
+ "export",
+ "exporter"
+ ],
+ "time": "2016-11-19T08:54:04+00:00"
+ },
+ {
+ "name": "sebastian/global-state",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/global-state.git",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "reference": "bc37d50fea7d017d3d340f230811c9f1d7280af4",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.2"
+ },
+ "suggest": {
+ "ext-uopz": "*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Snapshotting of global state",
+ "homepage": "http://www.github.com/sebastianbergmann/global-state",
+ "keywords": [
+ "global state"
+ ],
+ "time": "2015-10-12T03:26:01+00:00"
+ },
+ {
+ "name": "sebastian/object-enumerator",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/object-enumerator.git",
+ "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/1311872ac850040a79c3c058bea3e22d0f09cbb7",
+ "reference": "1311872ac850040a79c3c058bea3e22d0f09cbb7",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0",
+ "sebastian/recursion-context": "~2.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Traverses array structures and object graphs to enumerate all referenced objects",
+ "homepage": "https://github.com/sebastianbergmann/object-enumerator/",
+ "time": "2017-02-18T15:18:39+00:00"
+ },
+ {
+ "name": "sebastian/recursion-context",
+ "version": "2.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/recursion-context.git",
+ "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+ "reference": "2c3ba150cbec723aa057506e73a8d33bdb286c9a",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.4"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Jeff Welch",
+ "email": "whatthejeff@gmail.com"
+ },
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ },
+ {
+ "name": "Adam Harvey",
+ "email": "aharvey@php.net"
+ }
+ ],
+ "description": "Provides functionality to recursively process PHP variables",
+ "homepage": "http://www.github.com/sebastianbergmann/recursion-context",
+ "time": "2016-11-19T07:33:16+00:00"
+ },
+ {
+ "name": "sebastian/resource-operations",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/resource-operations.git",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "reference": "ce990bb21759f94aeafd30209e8cfcdfa8bc3f52",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de"
+ }
+ ],
+ "description": "Provides a list of PHP built-in functions that operate on resources",
+ "homepage": "https://www.github.com/sebastianbergmann/resource-operations",
+ "time": "2015-07-28T20:34:47+00:00"
+ },
+ {
+ "name": "sebastian/version",
+ "version": "2.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/sebastianbergmann/version.git",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "reference": "99732be0ddb3361e16ad77b68ba41efc8e979019",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "classmap": [
+ "src/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Sebastian Bergmann",
+ "email": "sebastian@phpunit.de",
+ "role": "lead"
+ }
+ ],
+ "description": "Library that helps with managing the version number of Git-hosted PHP projects",
+ "homepage": "https://github.com/sebastianbergmann/version",
+ "time": "2016-10-03T07:35:21+00:00"
+ },
+ {
+ "name": "symfony/yaml",
+ "version": "v3.3.9",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/symfony/yaml.git",
+ "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/symfony/yaml/zipball/1d8c2a99c80862bdc3af94c1781bf70f86bccac0",
+ "reference": "1d8c2a99c80862bdc3af94c1781bf70f86bccac0",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "require-dev": {
+ "symfony/console": "~2.8|~3.0"
+ },
+ "suggest": {
+ "symfony/console": "For validating YAML files using the lint command"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "3.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Symfony\\Component\\Yaml\\": ""
+ },
+ "exclude-from-classmap": [
+ "/Tests/"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Fabien Potencier",
+ "email": "fabien@symfony.com"
+ },
+ {
+ "name": "Symfony Community",
+ "homepage": "https://symfony.com/contributors"
+ }
+ ],
+ "description": "Symfony Yaml Component",
+ "homepage": "https://symfony.com",
+ "time": "2017-07-29T21:54:42+00:00"
+ },
+ {
+ "name": "webmozart/assert",
+ "version": "1.2.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/webmozart/assert.git",
+ "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/webmozart/assert/zipball/2db61e59ff05fe5126d152bd0655c9ea113e550f",
+ "reference": "2db61e59ff05fe5126d152bd0655c9ea113e550f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^5.5||^7.0||^8.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "^4.6",
+ "sebastian/version": "^1.0.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Webmozart\\Assert\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Bernhard Schussek",
+ "email": "bschussek@gmail.com"
+ }
+ ],
+ "description": "Assertions to validate method input/output with nice error messages.",
+ "keywords": [
+ "assert",
+ "check",
+ "validate"
+ ],
+ "time": "2016-11-23T20:04:58+00:00"
+ }
+ ],
+ "aliases": [],
+ "minimum-stability": "stable",
+ "stability-flags": [],
+ "prefer-stable": false,
+ "prefer-lowest": false,
+ "platform": [],
+ "platform-dev": []
+}
diff --git a/res/mangafox-master/phpunit.xml b/res/mangafox-master/phpunit.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b0cd210808fda2705165edad11e789a41b102697
--- /dev/null
+++ b/res/mangafox-master/phpunit.xml
@@ -0,0 +1,22 @@
+
+
+
+
+ ./tests
+
+
+
+
+ src/
+ tests/
+
+
+
\ No newline at end of file
diff --git a/res/mangafox-master/src/Exceptions/MangafoxDirectoryBuilderInvalidBrowseByFilterException.php b/res/mangafox-master/src/Exceptions/MangafoxDirectoryBuilderInvalidBrowseByFilterException.php
new file mode 100644
index 0000000000000000000000000000000000000000..7602f84800d0472de2e412cfee71f6203c92bb30
--- /dev/null
+++ b/res/mangafox-master/src/Exceptions/MangafoxDirectoryBuilderInvalidBrowseByFilterException.php
@@ -0,0 +1,11 @@
+message = sprintf("invalid value '%s' for method %s(), expects: 4 digits year (e.g. 2017 or 'older')", $value, 'browseBy');
+ }
+}
diff --git a/res/mangafox-master/src/Exceptions/MangafoxDirectoryBuilderInvalidBrowseByStatusValueException.php b/res/mangafox-master/src/Exceptions/MangafoxDirectoryBuilderInvalidBrowseByStatusValueException.php
new file mode 100644
index 0000000000000000000000000000000000000000..921eff31521c1f66a9e17ccbab3c567b9afd8f81
--- /dev/null
+++ b/res/mangafox-master/src/Exceptions/MangafoxDirectoryBuilderInvalidBrowseByStatusValueException.php
@@ -0,0 +1,11 @@
+message = sprintf("invalid value '%s' for method %s(), expects: ".implode(', ', $suggestions).'', $value, $field);
+ }
+}
diff --git a/res/mangafox-master/src/Exceptions/MangafoxParserDateNotSupportedException.php b/res/mangafox-master/src/Exceptions/MangafoxParserDateNotSupportedException.php
new file mode 100644
index 0000000000000000000000000000000000000000..53b5d1aadca062401c02b2d41fdfaedf2fb7d08c
--- /dev/null
+++ b/res/mangafox-master/src/Exceptions/MangafoxParserDateNotSupportedException.php
@@ -0,0 +1,11 @@
+message = sprintf('Format %s not supported', $date);
+ }
+}
diff --git a/res/mangafox-master/src/Exceptions/MangafoxResourceParserInvalidUrlException.php b/res/mangafox-master/src/Exceptions/MangafoxResourceParserInvalidUrlException.php
new file mode 100644
index 0000000000000000000000000000000000000000..8e8930ddbbb9fe4de868d87f1c9688d8a9bd05fb
--- /dev/null
+++ b/res/mangafox-master/src/Exceptions/MangafoxResourceParserInvalidUrlException.php
@@ -0,0 +1,10 @@
+message = sprintf("The resource %s doesn't exist or is invalid", $uid);
+ }
+}
diff --git a/res/mangafox-master/src/Exceptions/MangafoxScanBuilderInvalidUrlException.php b/res/mangafox-master/src/Exceptions/MangafoxScanBuilderInvalidUrlException.php
new file mode 100644
index 0000000000000000000000000000000000000000..14b29123cd1e3f8b24c14578a2ec806c56a46f12
--- /dev/null
+++ b/res/mangafox-master/src/Exceptions/MangafoxScanBuilderInvalidUrlException.php
@@ -0,0 +1,11 @@
+message = sprintf("invalid value '%s' for method %s(), e.g (%s)", $url, 'url', $suggestion);
+ }
+}
diff --git a/res/mangafox-master/src/Exceptions/MangafoxSearchBuilderInvalidArtistFilterException.php b/res/mangafox-master/src/Exceptions/MangafoxSearchBuilderInvalidArtistFilterException.php
new file mode 100644
index 0000000000000000000000000000000000000000..ca62178047fd1cbe6b6496f0630c17e4ddfc6bdb
--- /dev/null
+++ b/res/mangafox-master/src/Exceptions/MangafoxSearchBuilderInvalidArtistFilterException.php
@@ -0,0 +1,11 @@
+message = sprintf("invalid value '%s' for method %s(), expects: 4 digits year (e.g. 2017)", $value, 'releasedYear');
+ }
+}
diff --git a/res/mangafox-master/src/Exceptions/MangafoxSearchBuilderInvalidSortByDirectionException.php b/res/mangafox-master/src/Exceptions/MangafoxSearchBuilderInvalidSortByDirectionException.php
new file mode 100644
index 0000000000000000000000000000000000000000..c5fac4538c07d91a397cdeb36ec01936404fc596
--- /dev/null
+++ b/res/mangafox-master/src/Exceptions/MangafoxSearchBuilderInvalidSortByDirectionException.php
@@ -0,0 +1,11 @@
+client = new Client([
+ 'base_uri' => $this->urls['app'],
+ 'cookies' => CookieJar::fromArray([
+ 'isAdult' => '1',
+ ], parse_url($this->urls['app'])['host']),
+ ]);
+ }
+
+ /**
+ * Send a request.
+ *
+ * @param string $method
+ * @param string $url
+ * @param array $data
+ */
+ public function request($method, $url, $data, $retry = 1)
+ {
+ $params = [];
+ $params['http_errors'] = false;
+ // $params['debug'] = true;
+
+ switch ($method) {
+ case 'POST': case 'PUT':
+ $params['form_params'] = $data;
+
+ break;
+
+ default:
+ $params['query'] = $data;
+ break;
+ }
+
+ $response = $this->client->request($method, $url, $params);
+
+ $contents = $response->getBody()->getContents();
+
+ if ($response->getStatusCode() == '502' and $retry > 0) {
+ sleep(10);
+
+ return $this->request($method, $url, $data, $retry - 1);
+ }
+
+ if ($response->getStatusCode() != '200' and $retry > 0) {
+ return $this->request($method, $url, $data, $retry - 1);
+ }
+
+ return $contents;
+ }
+
+ /**
+ * Send a request.
+ *
+ * @param string $method
+ * @param string $url
+ * @param array $data
+ */
+ public function requestMobile($method, $url, $data)
+ {
+ return $this->request($method, $this->urls['mobile'].$url, $data);
+ }
+}
diff --git a/res/mangafox-master/src/MangaReaderContract.php b/res/mangafox-master/src/MangaReaderContract.php
new file mode 100644
index 0000000000000000000000000000000000000000..c59e6f3a3c13b6ee64bb46166f1413b7d47ec104
--- /dev/null
+++ b/res/mangafox-master/src/MangaReaderContract.php
@@ -0,0 +1,8 @@
+ 'https://fanfox.net',
+ 'mobile' => 'https://m.fanfox.net',
+ ];
+
+ /**
+ * List of genres available on mangafox.
+ *
+ * @var string[]
+ */
+ protected $genres = [
+ 'Action',
+ 'Adult',
+ 'Adventure',
+ 'Comedy',
+ 'Doujinshi',
+ 'Drama',
+ 'Ecchi',
+ 'Fantasy',
+ 'Gender Bender',
+ 'Harem',
+ 'Historical',
+ 'Horror',
+ 'Josei',
+ 'Martial Arts',
+ 'Mature',
+ 'Mecha',
+ 'Mystery',
+ 'One Shot',
+ 'Psychological',
+ 'Romance',
+ 'School Life',
+ 'Sci-fi',
+ 'Seinen',
+ 'Shoujo',
+ 'Shoujo Ai',
+ 'Shounen',
+ 'Shounen Ai',
+ 'Slice of Life',
+ 'Smut',
+ 'Sports',
+ 'Supernatural',
+ 'Tragedy',
+ 'Webtoons',
+ 'Yaoi',
+ 'Yuri',
+ ];
+
+ /**
+ * Retrieve base url.
+ *
+ * @return string
+ */
+ public function getUrl()
+ {
+ return $this->url;
+ }
+
+ /**
+ * Retrieve base url.
+ *
+ * @param string $path
+ *
+ * @return string
+ */
+ public function getAppUrl($path)
+ {
+ return $this->urls['app'].$path;
+ }
+
+ /**
+ * Perform a search.
+ *
+ * @return MangafoxSearchBuilder
+ */
+ public function search()
+ {
+ return new MangafoxSearchBuilder($this);
+ }
+
+ /**
+ * Request a specific resource.
+ *
+ * @param string $uid
+ *
+ * @return MangafoxResourceBuilder
+ */
+ public function resource($uid = null)
+ {
+ return (new MangafoxResourceBuilder($this))->uid($uid);
+ }
+
+ /**
+ * Request all scans for a chapter.
+ *
+ * @param string $manga_uid
+ * @param string $volume_number
+ * @param string $chapter_number
+ *
+ * @return MangafoxScanBuilder
+ */
+ public function scan($manga_uid, $volume_number, $chapter_number)
+ {
+ return (new MangafoxScanBuilder($this))->mangaUid($manga_uid)->volumeNumber($volume_number)->chapterNumber($chapter_number);
+ }
+
+ /**
+ * Perform a search in last releases.
+ *
+ * @return MangafoxReleasesBuilder
+ */
+ public function releases()
+ {
+ return new MangafoxReleasesBuilder($this);
+ }
+
+ /**
+ * Perform a search in directory.
+ *
+ * @return MangafoxDirectoryBuilder
+ */
+ public function directory()
+ {
+ return new MangafoxDirectoryBuilder($this);
+ }
+
+ /**
+ * Retrieve a list of all resources.
+ *
+ * @return MangafoxIndexBuilder
+ */
+ public function index()
+ {
+ return new MangafoxIndexBuilder($this);
+ }
+
+ /**
+ * Retrieve genres available on mangafox.
+ *
+ * @return array
+ */
+ public function getGenres()
+ {
+ return $this->genres;
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxDirectoryBuilder.php b/res/mangafox-master/src/MangafoxDirectoryBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..46d41da215e0b57d52c9ff42dfd04db24758fd8e
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxDirectoryBuilder.php
@@ -0,0 +1,181 @@
+manager = $manager;
+ $this->browse_by = new Bag();
+ $this->sort_by = new Bag();
+ }
+
+ /**
+ * Throw an exceptions if value doesn't match with suggestion.
+ *
+ * @param string $class
+ * @param mixed $value
+ * @param array $suggestions
+ */
+ public function throwExceptionInvalidValue($class, $value, $suggestions)
+ {
+ if (is_array($value)) {
+ if (count(array_diff($value, $suggestions)) != 0) {
+ throw new $class($value, $suggestions);
+ }
+ } else {
+ if (!in_array($value, $suggestions)) {
+ throw new $class($value, $suggestions);
+ }
+ }
+ }
+
+ /**
+ * Sorts.
+ *
+ * @param string $value
+ *
+ * @return $this
+ */
+ public function sortBy($value)
+ {
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxDirectoryBuilderInvalidSortByValueException::class, $value, ['name', 'popularity', 'rating', 'latest_chapter']);
+
+ $this->sort_by
+ ->set('field', $value);
+
+ return $this;
+ }
+
+ /**
+ * Retrieve sort.
+ *
+ * @return string
+ */
+ public function getSortBy()
+ {
+ return $this->sort_by;
+ }
+
+ /**
+ * Browse by.
+ *
+ * @param string $filter
+ * @param string $value
+ *
+ * @return $this
+ */
+ public function browseBy($filter, $value)
+ {
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxDirectoryBuilderInvalidBrowseByFilterException::class, $filter, ['genre', 'initial', 'released_year', 'status']);
+
+ switch ($filter) {
+ case 'genre':
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxDirectoryBuilderInvalidBrowseByGenreValueException::class, $value, array_merge(['All'], $this->manager->getGenres()));
+ break;
+
+ case 'initial':
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxDirectoryBuilderInvalidBrowseByInitialValueException::class, $value, array_merge(['#'], range('A', 'Z')));
+ break;
+
+ case 'released_year':
+
+ if ($value != 'older' && !checkdate(1, 1, (int) $value)) {
+ throw new Exceptions\MangafoxDirectoryBuilderInvalidBrowseByReleasedYearValueException($value);
+ }
+
+ break;
+
+ case 'status':
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxDirectoryBuilderInvalidBrowseByStatusValueException::class, $value, ['New', 'Updated', 'Completed', 'Ongoing']);
+ break;
+ }
+
+ $this->browse_by
+ ->set('filter', $filter)
+ ->set('value', $value);
+
+ return $this;
+ }
+
+ /**
+ * Retrieve sort.
+ *
+ * @return string
+ */
+ public function getBrowseBy()
+ {
+ return $this->browse_by;
+ }
+
+ /**
+ * The page.
+ *
+ * @param string $page
+ *
+ * @return $this
+ */
+ public function page($page)
+ {
+ $this->page = $page;
+
+ return $this;
+ }
+
+ /**
+ * Return page.
+ *
+ * @return string
+ */
+ public function getPage()
+ {
+ return $this->page;
+ }
+
+ /**
+ * Send request.
+ *
+ * @return Response
+ */
+ public function get()
+ {
+ $request = new MangafoxDirectoryRequest($this->manager);
+
+ return $request->send($this);
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxDirectoryParser.php b/res/mangafox-master/src/MangafoxDirectoryParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..ecab5e0de31effda621bb7f6c2d14d4de9514bf2
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxDirectoryParser.php
@@ -0,0 +1,63 @@
+set('pages', $node->filter('.pager-list-left a:nth-last-child(2)')->text());
+ $bag->set('results', new Collection($node->filter('.manga-' . $listid . '-list > li')->each(function ($node) {
+ $bag = new Bag();
+
+ $title = $node->filter('.manga-' . $listid . '-item-title > a');
+
+ return $bag
+ ->set('uid', basename($title->attr('href')))
+ ->set('name', $title->html())
+ ->set('url', $this->manager->getAppUrl($title->attr('href')))
+ ->set('cover', $node->filter('img')->attr('src'))
+ ->set('latest', $this->manager->getAppUrl($node->filter('.manga-' . $listid . '-item-subtitle > a')->attr('href')))
+ ->set('rating', $node->filter('.item-score')->text())
+ ;
+ })));
+
+ $bag->set('page', $node->filter('.pager-list-left .active')->text());
+
+ return $bag;
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxDirectoryRequest.php b/res/mangafox-master/src/MangafoxDirectoryRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..ec4c90289ddc7252fa918c16517b9fe6176797ce
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxDirectoryRequest.php
@@ -0,0 +1,70 @@
+manager = $manager;
+ }
+
+ /**
+ * Parse sort.
+ *
+ * @param string $sort
+ *
+ * @return string
+ */
+ public function parseSort($sort)
+ {
+ switch ($sort) {
+ case 'name':
+ return 'az';
+ break;
+ case 'latest_chapter':
+ return 'latest';
+ break;
+ case 'popularity':
+ return '';
+ break;
+ case 'rating':
+ return 'rating';
+ break;
+ }
+ }
+
+ /**
+ * Send the request.
+ *
+ * @param MangafoxDirectoryBuilder $builder
+ *
+ * @return MangafoxDirectoryResponse
+ */
+ public function send(MangafoxDirectoryBuilder $builder)
+ {
+ $params = [];
+
+ $sort = $this->parseSort($builder->getSortBy()->value);
+
+ if ($sort) {
+ $params[$sort] = '';
+ }
+
+ $results = $this->manager->request('GET', '/directory/'.strtolower($builder->getBrowseBy()->get('value')).'/'.$builder->getPage().'.htm', $params);
+
+ $parser = new MangafoxDirectoryParser($this->manager);
+
+ return $parser->parse($results);
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxIndexBuilder.php b/res/mangafox-master/src/MangafoxIndexBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..f929cdca837b71d02bb06459438157e3beb5c1b5
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxIndexBuilder.php
@@ -0,0 +1,33 @@
+manager = $manager;
+ }
+
+ /**
+ * Send request.
+ *
+ * @return Response
+ */
+ public function get()
+ {
+ $request = new MangafoxIndexRequest($this->manager);
+
+ return $request->send($this);
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxIndexParser.php b/res/mangafox-master/src/MangafoxIndexParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..64e040c57b25729b8fa3648325daeb1cde634640
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxIndexParser.php
@@ -0,0 +1,21 @@
+manager = $manager;
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxIndexRequest.php b/res/mangafox-master/src/MangafoxIndexRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..1996c3661b7243c1a161267a6ae4eb500c55a9b4
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxIndexRequest.php
@@ -0,0 +1,37 @@
+manager = $manager;
+ }
+
+ /**
+ * Send the request.
+ *
+ * @param MangafoxIndexBuilder $builder
+ *
+ * @return MangafoxIndexResponse
+ */
+ public function send(MangafoxIndexBuilder $builder)
+ {
+ $results = $this->manager->request('GET', '/manga/', []);
+
+ $parser = new MangafoxIndexParser($this->manager);
+
+ return $parser->parse($results);
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxReleasesBuilder.php b/res/mangafox-master/src/MangafoxReleasesBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..5fafb811b73aba52f1c9fbf641cb2fcc560e5f10
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxReleasesBuilder.php
@@ -0,0 +1,62 @@
+manager = $manager;
+ }
+
+ /**
+ * The page.
+ *
+ * @param string $page
+ *
+ * @return $this
+ */
+ public function page($page)
+ {
+ $this->page = $page;
+
+ return $this;
+ }
+
+ /**
+ * Return page.
+ *
+ * @return string
+ */
+ public function getPage()
+ {
+ return $this->page;
+ }
+
+ /**
+ * Send request.
+ *
+ * @return Response
+ */
+ public function get()
+ {
+ $request = new MangafoxReleasesRequest($this->manager);
+
+ return $request->send($this);
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxReleasesParser.php b/res/mangafox-master/src/MangafoxReleasesParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..860b4ba28dd17920235d20863de40dbdba88447f
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxReleasesParser.php
@@ -0,0 +1,74 @@
+manager = $manager;
+ }
+
+ /**
+ * Parse the response.
+ *
+ * @return string $html
+ * @return MangafoxSearchResponse
+ */
+ public function parse($html)
+ {
+ $node = HtmlPageCrawler::create($html);
+
+ $bag = new Bag();
+
+ $bag->set('pages', $node->filter('.pager-list-left a:nth-last-child(2)')->text());
+ $bag->set('results', new Collection($node->filter('.manga-list-4-list > li')->each(function ($node) {
+ $bag = new Bag();
+
+ $title = $node->filter('.manga-list-4-item-title > a');
+
+ $bag
+ ->set('uid', basename($title->attr('href')))
+ ->set('name', $title->html())
+ ->set('url', $this->manager->getAppUrl($title->attr('href')))
+ ->set('cover', $node->filter('img')->attr('src'))
+ ->set('updated_at', $this->parseDate($node->filter('.manga-list-4-item-subtitle > span')->text()))
+ ;
+
+ $bag->set('chapters', Collection::make($node->filter('ul.manga-list-4-item-part > li')->each(function ($node) {
+ $bag = new Bag();
+
+ $bag->set('url', $this->manager->getAppUrl($node->filter('a')->attr('href')));
+
+ return $bag;
+ }))->filter(function ($bag) {
+ $ext = pathinfo(basename($bag->get('url')), PATHINFO_EXTENSION);
+
+ return !empty($ext);
+ }));
+
+ return $bag;
+ })));
+
+ $bag->set('page', $node->filter('.pager-list-left .active')->text());
+
+ return $bag;
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxReleasesRequest.php b/res/mangafox-master/src/MangafoxReleasesRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..abb63761bceb608f8d8fa6aa9c895b7d92a4f707
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxReleasesRequest.php
@@ -0,0 +1,37 @@
+manager = $manager;
+ }
+
+ /**
+ * Send the request for the reReleases.
+ *
+ * @param MangafoxReleasesBuilder $builder
+ *
+ * @return MangafoxReleasesResponse
+ */
+ public function send(MangafoxReleasesBuilder $builder)
+ {
+ $results = $this->manager->request('GET', "/releases/{$builder->getPage()}.htm", []);
+
+ $parser = new MangafoxReleasesParser($this->manager);
+
+ return $parser->parse($results);
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxResourceBuilder.php b/res/mangafox-master/src/MangafoxResourceBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..c2b729a1069c1963d4577684562092e1e86a07ba
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxResourceBuilder.php
@@ -0,0 +1,62 @@
+manager = $manager;
+ }
+
+ /**
+ * The uid.
+ *
+ * @param string $uid
+ *
+ * @return $this
+ */
+ public function uid($uid)
+ {
+ $this->uid = $uid;
+
+ return $this;
+ }
+
+ /**
+ * Return uid.
+ *
+ * @return string
+ */
+ public function getUid()
+ {
+ return $this->uid;
+ }
+
+ /**
+ * Send request.
+ *
+ * @return Response
+ */
+ public function get()
+ {
+ $request = new MangafoxResourceRequest($this->manager);
+
+ return $request->send($this);
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxResourceParser.php b/res/mangafox-master/src/MangafoxResourceParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..ac327a1bd56958eaa4bb4eed434d0d2b5ffae6d1
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxResourceParser.php
@@ -0,0 +1,102 @@
+manager = $manager;
+ }
+
+ /**
+ * Parse the response.
+ *
+ * @return string $html
+ * @return MangafoxSearchResponse
+ */
+ public function parse($html)
+ {
+ $node = HtmlPageCrawler::create($html);
+
+ $head = $node->filter('head');
+ $title = $node->filter('div#title');
+ $listid = '';
+ if (strpos($head->filter("[name='og:url']")->attr('content'), 'http://mangafox.me/manga/') === false) {
+ throw new Exceptions\MangafoxResourceParserInvalidUrlException();
+ }
+ if(strstr($html, 'id="list-1"') !== false)
+ {
+ $listid .= '#chapterlist > #list-1 > ul > li,';
+ }
+ if(strstr($html, 'id="list-2"') !== false)
+ {
+ $listid .= '#chapterlist > #list-2 > ul > li,';
+ }
+ if(strstr($html, 'id="list-3"') !== false)
+ {
+ $listid .= '#chapterlist > #list-3 > ul > li,';
+ }
+ if(strstr($html, 'id="list-4"') !== false)
+ {
+ $listid .= '#chapterlist > #list-4 > ul > li,';
+ }
+ if($listid == '')
+ {
+ $listid = '#chapterlist > #list-1 > ul > li,';
+ }
+ $listid = trim($listid, ',');
+ $bag = new Bag();
+ $bag
+ ->set('url', $this->manager->getAppUrl('/manga/'.basename($head->filter("[name='og:url']")->attr('content'))))
+ ->set('uid', basename($bag->get('url')))
+ ->set('name', $node->filter('.detail-info-cover-img')->attr('alt'))
+ ->set('cover', $node->filter('.detail-info-cover-img')->attr('src'))
+ ->set('description', $node->filter('.fullcontent')->text())
+ ->set('author', $node->filter('.detail-info-right-say > a')->text())
+ ->set('genres', explode(' ', trim($node->filter('.detail-info-right-tag-list')->text())))
+ ->set('status', $node->filter('.detail-info-right-title .detail-info-right-title-tip')->text())
+ ->set('rating', $node->filter('.detail-info-right-title .detail-info-right-title-star .item-score')->text())
+ ->set('chapters', new Collection($node->filter($listid)->each(function ($node) {
+ $bag = new Bag();
+
+ $chapterTitles = $node->filter('.title3')->text();
+
+ $bag->set('url', $this->manager->getAppUrl($node->filter('a')->attr('href')));
+ $bag->set('title', trim($chapterTitles));
+ $bag->set('released_at', $this->parseDate(trim($node->filter('.title2')->text())));
+
+ $number = floatval(preg_replace('/[c]/', '', basename(dirname($bag->get('url')))));
+ $volume = basename(dirname(dirname($bag->get('url'))));
+
+ $volume = preg_match('/^v([0-9]*)$/', $volume) || $volume == 'vTBD'
+ ? preg_replace('/[v]/', '', $volume)
+ : -1;
+
+ $bag->set('volume', $volume);
+ $bag->set('number', $number);
+
+ return $bag;
+ })))
+ ;
+
+ return $bag;
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxResourceRequest.php b/res/mangafox-master/src/MangafoxResourceRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..a915d1f74e9b09d57cdab666d89f6a22d8dd88c5
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxResourceRequest.php
@@ -0,0 +1,46 @@
+manager = $manager;
+ }
+
+ /**
+ * Send the request for the research.
+ *
+ * @param MangafoxResourceBuilder $builder
+ *
+ * @return MangafoxResourceBuilder
+ */
+ public function send(MangafoxResourceBuilder $builder)
+ {
+ $results = $this->manager->request('GET', "/manga/{$builder->getUid()}", []);
+ if($results === false)
+ {
+ throw new Exceptions\MangafoxResourceRequestNotFoundException('Failed to download ' . $builder->getUid());
+ }
+ $parser = new MangafoxResourceParser($this->manager);
+
+ try {
+ return $parser->parse($results);
+ } catch (Exceptions\MangafoxResourceParserInvalidUrlException $e) {
+ throw new Exceptions\MangafoxResourceRequestNotFoundException($builder->getUid());
+ }
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxScanBuilder.php b/res/mangafox-master/src/MangafoxScanBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..76f53e1f27607226bacbc911c91254775d3ea501
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxScanBuilder.php
@@ -0,0 +1,120 @@
+manager = $manager;
+ }
+
+ /**
+ * manga_uid.
+ *
+ * @param string $manga_uid
+ *
+ * @return $this
+ */
+ public function mangaUid($manga_uid)
+ {
+ $this->manga_uid = $manga_uid;
+
+ return $this;
+ }
+
+ /**
+ * Return manga_uid.
+ *
+ * @return string
+ */
+ public function getMangaUid()
+ {
+ return $this->manga_uid;
+ }
+
+ /**
+ * volume_number.
+ *
+ * @param string $volume_number
+ *
+ * @return $this
+ */
+ public function volumeNumber($volume_number)
+ {
+ $this->volume_number = $volume_number;
+
+ return $this;
+ }
+
+ /**
+ * Return volume_number.
+ *
+ * @return string
+ */
+ public function getVolumeNumber()
+ {
+ return $this->volume_number;
+ }
+
+ /**
+ * chapter_number.
+ *
+ * @param string $chapter_number
+ *
+ * @return $this
+ */
+ public function chapterNumber($chapter_number)
+ {
+ $this->chapter_number = $chapter_number;
+
+ return $this;
+ }
+
+ /**
+ * Return chapter_number.
+ *
+ * @return string
+ */
+ public function getChapterNumber()
+ {
+ return $this->chapter_number;
+ }
+
+ /**
+ * Send request.
+ *
+ * @return Response
+ */
+ public function get()
+ {
+ $request = new MangafoxScanRequest($this->manager);
+
+ return $request->send($this);
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxScanParser.php b/res/mangafox-master/src/MangafoxScanParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..fff2120e6d444a270f191a3cb3dac2223fb0b263
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxScanParser.php
@@ -0,0 +1,44 @@
+manager = $manager;
+ }
+
+ /**
+ * Parse the response.
+ *
+ * @return string $html
+ * @return MangafoxScanResponse
+ */
+ public function parse($html)
+ {
+ $node = HtmlPageCrawler::create($html);
+
+ return new Collection($node->filter('#viewer img')->each(function ($node) {
+ $bag = new Bag();
+
+ $bag->set('scan', "https:" . $node->attr('data-original'));
+
+ return $bag;
+ }));
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxScanRequest.php b/res/mangafox-master/src/MangafoxScanRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..648f23908faa9ad8b7cbb057a52afcff4bb1f9cc
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxScanRequest.php
@@ -0,0 +1,43 @@
+manager = $manager;
+ }
+
+ /**
+ * Send the request for scans.
+ *
+ * @param MangafoxScanBuilder $builder
+ *
+ * @return MangafoxScanResponse
+ */
+ public function send(MangafoxScanBuilder $builder)
+ {
+ $volume = $builder->getVolumeNumber() !== '-1' ? "/v{$builder->getVolumeNumber()}" : '';
+
+ $chapter = '/c'.str_pad($builder->getChapterNumber(), 3, '0', STR_PAD_LEFT);
+
+ $url = "/roll_manga/{$builder->getMangaUid()}{$volume}{$chapter}";
+
+ $results = $this->manager->requestMobile('GET', $url, []);
+
+ $parser = new MangafoxScanParser($this->manager);
+
+ return $parser->parse($results);
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxSearchBuilder.php b/res/mangafox-master/src/MangafoxSearchBuilder.php
new file mode 100644
index 0000000000000000000000000000000000000000..989549c91e7c1ab33bea29b53d0a3fc72670f1b9
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxSearchBuilder.php
@@ -0,0 +1,431 @@
+manager = $manager;
+ $this->name = new Bag();
+ $this->artist = new Bag();
+ $this->author = new Bag();
+ $this->rating = new Bag();
+ $this->released_year = new Bag();
+ $this->genres = new Bag();
+ $this->sort_by = new Bag();
+ $this->genres->set('value', new Collection());
+ }
+
+ /**
+ * The page.
+ *
+ * @param string $page
+ *
+ * @return $this
+ */
+ public function page($page)
+ {
+ $this->page = $page;
+
+ return $this;
+ }
+
+ /**
+ * Return page.
+ *
+ * @return string
+ */
+ public function getPage()
+ {
+ return $this->page;
+ }
+
+ /**
+ * Throw an exceptions if value doesn't match with suggestion.
+ *
+ * @param string $class
+ * @param mixed $value
+ * @param array $suggestions
+ */
+ public function throwExceptionInvalidValue($class, $value, $suggestions)
+ {
+ if (is_array($value)) {
+ if (count(array_diff($value, $suggestions)) != 0) {
+ throw new $class($value, $suggestions);
+ }
+ } else {
+ if (!in_array($value, $suggestions)) {
+ throw new $class($value, $suggestions);
+ }
+ }
+ }
+
+ /**
+ * The type of manga: "any"|"manga"|"chinese"|"korean".
+ *
+ * @param string $type
+ *
+ * @return $this
+ */
+ public function type($type)
+ {
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxSearchBuilderInvalidTypeException::class, $type, ['any', 'manga', 'chinese', 'korean']);
+
+ $this->type = $type;
+
+ return $this;
+ }
+
+ /**
+ * Return type.
+ *
+ * @return string
+ */
+ public function getType()
+ {
+ return $this->type;
+ }
+
+ /**
+ * Set the name of resource searched.
+ *
+ * @param string $filter
+ * @param string $name
+ *
+ * @return $this
+ */
+ public function name($filter, $name)
+ {
+ $this->throwExceptionInvalidFilter(Exceptions\MangafoxSearchBuilderInvalidNameFilterException::class, $filter);
+
+ $this->name
+ ->set('value', $name)
+ ->set('filter', $filter);
+
+ return $this;
+ }
+
+ /**
+ * Retrieve name.
+ *
+ * @return string
+ */
+ public function getName()
+ {
+ return $this->name;
+ }
+
+ /**
+ * Set the author of resource searched.
+ *
+ * @param string $filter
+ * @param string $author
+ *
+ * @return $this
+ */
+ public function author($filter, $author)
+ {
+ $this->throwExceptionInvalidFilter(Exceptions\MangafoxSearchBuilderInvalidAuthorFilterException::class, $filter);
+
+ $this->author
+ ->set('value', $author)
+ ->set('filter', $filter);
+
+ return $this;
+ }
+
+ /**
+ * Retrieve author.
+ *
+ * @return string
+ */
+ public function getAuthor()
+ {
+ return $this->author;
+ }
+
+ /**
+ * Set the artist of resource searched.
+ *
+ * @param string $filter
+ * @param string $artist
+ *
+ * @return $this
+ */
+ public function artist($filter, $artist)
+ {
+ $this->throwExceptionInvalidFilter(Exceptions\MangafoxSearchBuilderInvalidArtistFilterException::class, $filter);
+
+ $this->artist
+ ->set('value', $artist)
+ ->set('filter', $filter);
+
+ return $this;
+ }
+
+ /**
+ * Retrieve artist.
+ *
+ * @return string
+ */
+ public function getArtist()
+ {
+ return $this->artist;
+ }
+
+ /**
+ * Set the sort of resource searched.
+ *
+ * @param string $filter
+ * @param string $sort
+ *
+ * @return $this
+ */
+ public function sortBy($value, $direction)
+ {
+ $direction = strtolower($direction);
+
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxSearchBuilderInvalidSortByValueException::class, $value, ['name', 'rating', 'views', 'chapters', 'latest_chapter']);
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxSearchBuilderInvalidSortByDirectionException::class, $direction, ['asc', 'desc']);
+
+ $this->sort_by
+ ->set('field', $value)
+ ->set('direction', $direction);
+
+ return $this;
+ }
+
+ /**
+ * Retrieve sort.
+ *
+ * @return string
+ */
+ public function getSortBy()
+ {
+ return $this->sort_by;
+ }
+
+ /**
+ * Set genres.
+ *
+ * @param string $filter
+ * @param array $genres
+ */
+ public function genres($filter, $genres)
+ {
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxSearchBuilderInvalidGenresFilterException::class, $filter, ['include', 'exclude']);
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxSearchBuilderInvalidGenresValueException::class, $genres, $this->manager->getGenres());
+
+ $this->genres
+ ->set('filter', $filter)
+ ->set('value', new Collection($genres));
+
+ return $this;
+ }
+
+ /**
+ * Retrieve genres.
+ *
+ * @return Bag
+ */
+ public function getGenres()
+ {
+ return $this->genres;
+ }
+
+ /**
+ * Set the sort of resource searched.
+ *
+ * @param string $filter
+ * @param string $sort
+ *
+ * @return $this
+ */
+ public function releasedYear($filter, $value)
+ {
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxSearchBuilderInvalidReleasedYearFilterException::class, $filter, ['<', '=', '>']);
+
+ if (!checkdate(1, 1, (int) $value)) {
+ throw new Exceptions\MangafoxSearchBuilderInvalidReleasedYearValueException($value);
+ }
+
+ $this->released_year
+ ->set('filter', $filter)
+ ->set('value', $value);
+
+ return $this;
+ }
+
+ /**
+ * Retrieve sort.
+ *
+ * @return string
+ */
+ public function getReleasedYear()
+ {
+ return $this->released_year;
+ }
+
+ /**
+ * Set the sort of resource searched.
+ *
+ * @param string $filter
+ * @param string $sort
+ *
+ * @return $this
+ */
+ public function rating($filter, $value)
+ {
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxSearchBuilderInvalidRatingFilterException::class, $filter, ['<', '=', '>']);
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxSearchBuilderInvalidRatingValueException::class, $value, [null, '0', '1', '2', '3', '4', '5']);
+
+ $this->rating
+ ->set('filter', $filter)
+ ->set('value', $value);
+
+ return $this;
+ }
+
+ /**
+ * Retrieve sort.
+ *
+ * @return string
+ */
+ public function getRating()
+ {
+ return $this->rating;
+ }
+
+ /**
+ * Set the sort of resource searched.
+ *
+ * @param string $value
+ *
+ * @return $this
+ */
+ public function completed($value)
+ {
+ $this->throwExceptionInvalidValue(Exceptions\MangafoxSearchBuilderInvalidCompletedValueException::class, $value, [null, '1', '0']);
+
+ $this->completed = (bool) $value;
+
+ return $this;
+ }
+
+ /**
+ * Retrieve sort.
+ *
+ * @return string
+ */
+ public function getCompleted()
+ {
+ return $this->completed;
+ }
+
+ /**
+ * Send request.
+ *
+ * @return Response
+ */
+ public function get()
+ {
+ $request = new MangafoxSearchRequest($this->manager);
+
+ return $request->send($this);
+ }
+
+ /**
+ * Set common filter for "contains"|"begin"|"end" for name, author and artist.
+ *
+ * @param string $class
+ * @param string $method
+ * @param string $value
+ */
+ private function throwExceptionInvalidFilter($class, $value)
+ {
+ return $this->throwExceptionInvalidValue($class, $value, ['contains', 'begin', 'end']);
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxSearchParser.php b/res/mangafox-master/src/MangafoxSearchParser.php
new file mode 100644
index 0000000000000000000000000000000000000000..fb2fc133fdde4195d632a531734522dd97039f18
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxSearchParser.php
@@ -0,0 +1,57 @@
+manager = $manager;
+ }
+
+ /**
+ * Parse the response.
+ *
+ * @return string $html
+ * @return MangafoxSearchResponse
+ */
+ public function parse($html)
+ {
+ $node = HtmlPageCrawler::create($html);
+
+ $bag = new Bag();
+
+ $bag->set('pages', $node->filter('.pager-list-left a:nth-last-child(2)')->text());
+ $bag->set('results', new Collection($node->filter('.manga-list-4-list > li')->each(function ($node) {
+ $bag = new Bag();
+
+ $title = $node->filter('.manga-list-4-item-title > a');
+
+ return $bag
+ ->set('uid', basename($title->attr('href')))
+ ->set('name', $title->html())
+ ->set('url', $this->manager->getAppUrl($title->attr('href')))
+ ->set('cover', $node->filter('img')->attr('src'))
+ ->set('latest', $this->manager->getAppUrl($node->filter('p:nth-child(4) > a')->attr('href')))
+ ;
+ })));
+
+ $bag->set('page', $node->filter('.pager-list-left .active')->text());
+
+ return $bag;
+ }
+}
diff --git a/res/mangafox-master/src/MangafoxSearchRequest.php b/res/mangafox-master/src/MangafoxSearchRequest.php
new file mode 100644
index 0000000000000000000000000000000000000000..e66e07090cee61b7aa2c39704bee494ec0c7c27d
--- /dev/null
+++ b/res/mangafox-master/src/MangafoxSearchRequest.php
@@ -0,0 +1,128 @@
+manager = $manager;
+ }
+
+ /**
+ * Convert the raw for request.
+ *
+ * @param string $filter
+ *
+ * @return string
+ */
+ public function getRawCommonFilter($filter)
+ {
+ switch ($filter) {
+ case 'begin':
+ return 'bw';
+ break;
+
+ case 'contains':
+ return 'cw';
+ break;
+
+ case 'end':
+ return 'ew';
+ break;
+ }
+ }
+
+ /**
+ * Convert the raw for request.
+ *
+ * @param string $filter
+ *
+ * @return string
+ */
+ public function getRawCommonFilter2($filter)
+ {
+ switch ($filter) {
+ case '=':
+ return 'eq';
+ break;
+
+ case '<':
+ return 'lt';
+ break;
+
+ case '>':
+ return 'gt';
+ break;
+ }
+ }
+
+ /**
+ * Send the request for the research.
+ *
+ * @param MangafoxSearchBuilder $builder
+ *
+ * @return MangafoxSearchResponse
+ */
+ public function send(MangafoxSearchBuilder $builder)
+ {
+ $params = [];
+
+ $params['advopts'] = 1;
+
+ // Name
+ $params['name_method'] = $this->getRawCommonFilter($builder->getName()->get('filter'));
+ $params['name'] = str_replace('%20', ' ', $builder->getName()->get('value'));
+
+ // Type
+ $params['type'] = $builder->getType();
+
+ // Author
+ $params['author_method'] = $this->getRawCommonFilter($builder->getAuthor()->get('filter'));
+ $params['author'] = $builder->getAuthor()->get('value');
+
+ // Artist
+ $params['artist_method'] = $this->getRawCommonFilter($builder->getArtist()->get('filter'));
+ $params['artist'] = $builder->getArtist()->get('value');
+
+ // Sort
+ $params['sort'] = $builder->getSortBy()->get('field');
+ $params['order'] = $builder->getSortBy()->get('direction') == 'desc' ? 'za' : 'az';
+
+ // Genres
+ $params['genres'] = $builder->getGenres()->get('value')->mapWithKeys(function ($item) use ($builder) {
+ return [$item => $builder->getGenres()->get('filter') == 'include' ? 1 : 2];
+ })->toArray();
+
+ // Released
+ $params['released_method'] = $this->getRawCommonFilter2($builder->getReleasedYear()->get('filter'));
+ $params['released'] = $builder->getReleasedYear()->get('value');
+
+ // Rating
+ $params['rating_method'] = $this->getRawCommonFilter2($builder->getRating()->get('filter'));
+ $params['rating'] = $builder->getRating()->get('value');
+
+ // Is completed?
+ if ($builder->getCompleted() !== null) {
+ $params['is_completed'] = $builder->getCompleted() === true ? '1' : '0';
+ }
+
+ $params['page'] = $builder->getPage();
+
+ $results = $this->manager->request('GET', '/search', $params);
+
+ $parser = new MangafoxSearchParser($this->manager);
+
+ return $parser->parse($results);
+ }
+}
diff --git a/res/mangafox-master/src/Traits/ParseDateTrait.php b/res/mangafox-master/src/Traits/ParseDateTrait.php
new file mode 100644
index 0000000000000000000000000000000000000000..6aedc19ce73de5cd13f327510a914d475e0a1508
--- /dev/null
+++ b/res/mangafox-master/src/Traits/ParseDateTrait.php
@@ -0,0 +1,50 @@
+modify('-'.$res[1].' '.$res[2])->format('Y-m-d H:i:s');
+ } else {
+ throw new Exceptions\MangafoxParserDateNotSupportedException($res[2]);
+ }
+ }
+
+ $today = $now->setTime(00, 00, 00);
+
+ if ($original == 'Today') {
+ return $today->format('Y-m-d H:i:s');
+ }
+
+ if ($original == 'Yesterday') {
+ return $today->modify('-1 days')->format('Y-m-d H:i:s');
+ }
+
+ $date = DateTime::createFromFormat('M d,Y', $original);
+
+ if (!$date) {
+ throw new \Exception(sprintf('Cannot convert: %s', $original));
+ }
+
+ return $date->setTime(00, 00, 00)->format('Y-m-d H:i:s');
+ }
+}
diff --git a/res/mangafox-master/tests/DirectoryTest.php b/res/mangafox-master/tests/DirectoryTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..f2d09ff78b1aed4575c661516cf3edd7b3f74d65
--- /dev/null
+++ b/res/mangafox-master/tests/DirectoryTest.php
@@ -0,0 +1,81 @@
+manager = new Mangafox();
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxDirectoryBuilderInvalidSortByValueException
+ */
+ public function testMangafoxDirectoryBuilderInvalidSortByValueException()
+ {
+ $this->manager->directory()->sortBy('wrong');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxDirectoryBuilderInvalidBrowseByFilterException
+ */
+ public function testMangafoxDirectoryBuilderInvalidBrowseByFilterException()
+ {
+ $this->manager->directory()->browseBy('wrong', 'Action');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxDirectoryBuilderInvalidBrowseByGenreValueException
+ */
+ public function testMangafoxDirectoryBuilderInvalidBrowseByGenreValueException()
+ {
+ $this->manager->directory()->browseBy('genre', 'wrong');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxDirectoryBuilderInvalidBrowseByStatusValueException
+ */
+ public function testMangafoxDirectoryBuilderInvalidBrowseByStatusValueException()
+ {
+ $this->manager->directory()->browseBy('status', 'wrong');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxDirectoryBuilderInvalidBrowseByReleasedYearValueException
+ */
+ public function testMangafoxDirectoryBuilderInvalidBrowseByReleasedYearValueException()
+ {
+ $this->manager->directory()->browseBy('released_year', 'wrong');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxDirectoryBuilderInvalidBrowseByInitialValueException
+ */
+ public function testMangafoxDirectoryBuilderInvalidBrowseByInitialValueException()
+ {
+ $this->manager->directory()->browseBy('initial', 'wrong');
+ }
+
+ public function testDirectoryBase()
+ {
+ $result = $this->manager
+ ->directory()
+ ->browseBy('genre', 'Action')
+ ->sortBy('name')
+ ->page(2)
+ ->get();
+
+ $this->assertTrue($result->results->count() > 0);
+ $this->assertEquals(2, $result->page);
+ }
+}
diff --git a/res/mangafox-master/tests/IndexTest.php b/res/mangafox-master/tests/IndexTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..3e4f001820f27dca9ac8c30a6a134a9a1d7253da
--- /dev/null
+++ b/res/mangafox-master/tests/IndexTest.php
@@ -0,0 +1,27 @@
+manager = new Mangafox();
+ }
+
+ public function testIndexBase()
+ {
+ $results = $this->manager
+ ->index()
+ ->get();
+ }
+}
diff --git a/res/mangafox-master/tests/ReleasesTest.php b/res/mangafox-master/tests/ReleasesTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..87cf06fd1cefae5d7b994c4bfc9ca7b1f24c4061
--- /dev/null
+++ b/res/mangafox-master/tests/ReleasesTest.php
@@ -0,0 +1,25 @@
+manager = new Mangafox();
+ }
+
+ public function testReleasesBase()
+ {
+ $results = $this->manager->releases()->page(1)->get();
+ }
+}
diff --git a/res/mangafox-master/tests/ResourceTest.php b/res/mangafox-master/tests/ResourceTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..5062316ddc512fafc1fe5792e4cf38e64dd4b127
--- /dev/null
+++ b/res/mangafox-master/tests/ResourceTest.php
@@ -0,0 +1,40 @@
+manager = new Mangafox();
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxResourceRequestNotFoundException
+ */
+ public function testMangafoxResourceRequestNotFoundException()
+ {
+ $manga = $this->manager->resource('wrong')->get();
+ }
+
+ public function testResourceBasics()
+ {
+ $manga = $this->manager->resource('fairy_tail')->get();
+
+ $this->assertEquals('fairy_tail', $manga->uid);
+ $this->assertEquals('https://fanfox.net/manga/fairy_tail', $manga->url);
+ $this->assertEquals('Fairy Tail', $manga->name);
+ $this->assertEquals('https://s.fanfox.net/store/manga/246/cover.jpg', $manga->cover);
+ $this->assertEquals('MASHIMA Hiro', $manga->author);
+ $this->assertEquals('Completed', $manga->status);
+ }
+}
diff --git a/res/mangafox-master/tests/ScanTest.php b/res/mangafox-master/tests/ScanTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..66616580a6be882b1c822efcdf86df987451c3b5
--- /dev/null
+++ b/res/mangafox-master/tests/ScanTest.php
@@ -0,0 +1,31 @@
+manager = new Mangafox();
+ }
+
+ public function testScanBasics()
+ {
+ $manga = $this->manager->resource('fairy_tail')->get();
+
+ $chapter = $manga->chapters[0];
+
+ $this->manager->scan($manga->uid, $chapter->volume, $chapter->number)->get()->each(function ($scan) {
+ $this->assertTrue(filter_var($scan->scan, FILTER_VALIDATE_URL) !== false);
+ });
+ }
+}
diff --git a/res/mangafox-master/tests/SearchTest.php b/res/mangafox-master/tests/SearchTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..63021d02cf0440adcc2eb94b004733f977c9c202
--- /dev/null
+++ b/res/mangafox-master/tests/SearchTest.php
@@ -0,0 +1,157 @@
+manager = new Mangafox();
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidTypeException
+ */
+ public function testMangafoxSearchBuilderInvalidTypeException()
+ {
+ $this->manager->search()->type('wrong');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidNameFilterException
+ */
+ public function testMangafoxSearchBuilderInvalidNameFilterException()
+ {
+ $this->manager->search()->name('wrong', 'One Piece');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidAuthorFilterException
+ */
+ public function testMangafoxSearchBuilderInvalidAuthorFilterException2()
+ {
+ $this->manager->search()->author('wrong', 'Oda Eiichiro');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidArtistFilterException
+ */
+ public function testMangafoxSearchBuilderInvalidArtistFilterException3()
+ {
+ $this->manager->search()->artist('wrong', 'Oda Eiichiro');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidGenresFilterException
+ */
+ public function testMangafoxSearchBuilderInvalidGenresFilterException()
+ {
+ $this->manager->search()->genres('wrong', ['Action']);
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidGenresValueException
+ */
+ public function testMangafoxSearchBuilderInvalidGenresValueException()
+ {
+ $this->manager->search()->genres('include', ['Food']);
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidSortByDirectionException
+ */
+ public function testMangafoxSearchBuilderInvalidSortByDirectionException()
+ {
+ $this->manager->search()->sortBy('name', 'wrong');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidSortByValueException
+ */
+ public function testMangafoxSearchBuilderInvalidSortByValueException()
+ {
+ $this->manager->search()->sortBy('wrong', 'asc');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidReleasedYearFilterException
+ */
+ public function testMangafoxSearchBuilderInvalidReleasedYearFilterException()
+ {
+ $this->manager->search()->releasedYear('wrong', '2017');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidReleasedYearValueException
+ */
+ public function testMangafoxSearchBuilderInvalidReleasedYearValueException()
+ {
+ $this->manager->search()->releasedYear('<', 'wrong');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidRatingFilterException
+ */
+ public function testMangafoxSearchBuilderInvalidRatingFilterException()
+ {
+ $this->manager->search()->rating('wrong', '5');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidRatingValueException
+ */
+ public function testMangafoxSearchBuilderInvalidRatingValueException()
+ {
+ $this->manager->search()->rating('<', 'wrong');
+ }
+
+ /**
+ * @expectedException \Railken\Mangafox\Exceptions\MangafoxSearchBuilderInvalidCompletedValueException
+ */
+ public function testMangafoxSearchBuilderInvalidCompletedValueException()
+ {
+ $this->manager->search()->completed('wrong');
+ }
+
+ public function testSearchBase()
+ {
+ $m = $this->manager;
+
+ // Search manga
+ $result = $m
+ ->search()
+ ->type('any')
+ ->name('contains', 'One Piece')
+ ->author('contains', 'Oda Eiichiro')
+ ->artist('contains', 'Oda Eiichiro')
+ ->genres('include', ['Action', 'Drama', 'Historical'])
+ ->releasedYear('<', '2017')
+ ->rating('>', 4)
+ ->completed(0)
+ ->page(1)
+ ->sortBy('name', 'ASC')
+ ->get();
+
+ $results = $result->results;
+
+ $manga = $results->filter(function ($v) {
+ return $v->uid == 'one_piece';
+ })->first();
+
+ $this->assertEquals('One Piece', $manga->name);
+
+ // Send an empty request
+ $results = $m
+ ->search()
+ ->get();
+ }
+}
diff --git a/res/other/plugin-dash.php b/res/other/plugin-dash.php
new file mode 100644
index 0000000000000000000000000000000000000000..7d51d6efe79267bc91facda814d572917144bd0b
--- /dev/null
+++ b/res/other/plugin-dash.php
@@ -0,0 +1,543 @@
+quick )
+ {
+ add_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'update_feed_quickly' ) );
+ }
+ else
+ {
+ add_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'default_update_feed_quickly' ) );
+ }
+ $rss = fetch_feed( $this->feed );
+ if( $this->quick )
+ {
+ remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'update_feed_quickly' ) );
+ }
+ else
+ {
+ remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'default_update_feed_quickly' ) );
+ }
+ if ( is_wp_error($rss) ) {
+ if ( is_admin() || current_user_can('manage_options') ) {
+ echo '';
+ printf('' . esc_html__( 'Error getting content: ', 'playomatic-google-play-post-generator' ) . ' : %s', $rss->get_error_message());
+ echo '
';
+ }
+ return;
+ }
+
+ if ( !$rss->get_item_quantity() ) {
+ echo '' . esc_html__( 'Apparently, there are no updates to show!', 'playomatic-google-play-post-generator' ) . '
';
+ $rss->__destruct();
+ unset($rss);
+ return;
+ }
+ $str .= '';
+
+ if ( !isset($items) )
+ foreach ( $rss->get_items(0, $this->num_items) as $item ) {
+ $date = '';
+ $link = esc_url_raw( strip_tags( $item->get_link() ) );
+ $title = esc_html( $item->get_title() );
+ $cat = $item->get_item_tags('', 'thumbnail');
+ if(isset($cat[0]['data'])){$thumbnail_img = $cat[0]['data'];}else{$thumbnail_img = '';}
+ $content = $item->get_content();
+ $content = wp_html_excerpt($content, 300, '[...]');
+ $content .= "" . esc_html__( 'Learn more', 'playomatic-google-play-post-generator' ) . "
";
+
+ $str .= "";
+ if($thumbnail_img != '')
+ {
+ $str .= "";
+ }
+ $str .= "$title\n
+
+ \n ";
+ }
+
+ $str .= '
' . esc_html__( 'FAQ', 'playomatic-google-play-post-generator' ) . ' ' . esc_html__( 'Support', 'playomatic-google-play-post-generator' ) . ' + ' . esc_html__( 'View More', 'playomatic-google-play-post-generator' ) . ' ' . esc_html__( 'Don\'t show this widget', 'playomatic-google-play-post-generator' ) . '
';
+ wp_enqueue_script('coderevo-other-script', plugins_url('script.js', __FILE__), array('jquery'));
+ echo $str;
+ $rss->__destruct();
+ unset($rss);
+ }
+ function update_feed_quickly( $seconds ) {
+ return 5;
+ }
+ function default_update_feed_quickly( $seconds ) {
+ return 2592000;
+ }
+ }
+ new CodeRevoDashboard( );
+}
+
+if ( !class_exists( 'CodeRevoNewsDashboard' ) ) {
+ class CodeRevoNewsDashboard {
+ var $feed = 'https://coderevolution.ro/feed/';
+ var $num_items = 5;
+ var $quick = 0;
+ function __construct( ) {
+ add_action('wp_dashboard_setup', array( $this, 'add_dashboard_widget' ) );
+ add_action('wp_user_dashboard_setup', array( $this, 'add_dashboard_widget' ) );
+ add_action('wp_newtwork_dashboard_setup', array( $this, 'add_dashboard_widget' ) );
+ }
+
+ function add_dashboard_widget() {
+ add_meta_box( 'coderevonewsdashboard-widget', esc_html__( 'Latest News', 'playomatic-google-play-post-generator' ), array( $this, 'show_dashboard_widget' ), 'dashboard', 'side', 'high');
+ $reg_css_code = '.cr_float_right{float:right}.cr_al_right{text-align:right}.cr_mixedx{float:left;width:18%;margin-right:4%;display:block;padding-top:4px}.cr_widthf{width:100%;height:auto}.cr_float_left{float:left;}.cr_width_78{width:78%}.cr_clear{clear:both}';
+ wp_register_style( 'coderevo-plugin-dash-style', false );
+ wp_enqueue_style( 'coderevo-plugin-dash-style' );
+ wp_add_inline_style( 'coderevo-plugin-dash-style', $reg_css_code );
+ }
+
+ function show_dashboard_widget() {
+ $str = '';
+ if( $this->quick )
+ {
+ add_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'update_feed_quickly' ) );
+ }
+ else
+ {
+ add_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'default_update_feed_quickly' ) );
+ }
+ $rss = fetch_feed( $this->feed );
+ if( $this->quick )
+ {
+ remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'update_feed_quickly' ) );
+ }
+ else
+ {
+ remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'default_update_feed_quickly' ) );
+ }
+
+ if ( is_wp_error($rss) ) {
+ if ( is_admin() || current_user_can('manage_options') ) {
+ echo '';
+ printf('' . esc_html__( 'Error getting content: ', 'playomatic-google-play-post-generator' ) . ' : %s', $rss->get_error_message());
+ echo '
';
+ }
+ return;
+ }
+
+ if ( !$rss->get_item_quantity() ) {
+ echo '' . esc_html__( 'Apparently, there are no updates to show!', 'playomatic-google-play-post-generator' ) . '
';
+ $rss->__destruct();
+ unset($rss);
+ return;
+ }
+
+ $str .= '';
+
+ if ( !isset($items) )
+ foreach ( $rss->get_items(0, $this->num_items) as $item ) {
+ $link = esc_url_raw( strip_tags( $item->get_link() ) );
+ $title = esc_html( $item->get_title() );
+ $cat = $item->get_item_tags('', 'thumbnail');
+ if(isset($cat[0]['data'])){$thumbnail_img = $cat[0]['data'];}else{$thumbnail_img = '';}
+ $content = $item->get_content();
+ $content = wp_html_excerpt($content, 300, '[...]');
+ $content .= "" . esc_html__( 'Learn more', 'playomatic-google-play-post-generator' ) . "
";
+
+ $str .= "";
+ if($thumbnail_img != '')
+ {
+ $str .= "";
+ }
+ $str .= "$title\n
+
+ \n ";
+ }
+
+ $str .= '
' . esc_html__( '+ More', 'playomatic-google-play-post-generator' ) . ' ' . esc_html__( 'Don\'t show this widget', 'playomatic-google-play-post-generator' ) . '
';
+ wp_enqueue_script('coderevo-other-script-news', plugins_url('scriptnews.js', __FILE__), array('jquery'));
+ echo $str;
+ $rss->__destruct();
+ unset($rss);
+ }
+ function update_feed_quickly( $seconds ) {
+ return 5;
+ }
+ function default_update_feed_quickly( $seconds ) {
+ return 2592000;
+ }
+ }
+ new CodeRevoNewsDashboard( );
+}
+
+if ( !class_exists( 'CodeRevoDashboardPlugins' ) ) {
+ class CodeRevoDashboardPlugins {
+ var $feed = 'https://wpinitiate.com/custom-feeds/products.xml';
+ var $num_items = 8;
+ var $quick = 0;
+ function __construct() {
+ add_filter( 'plugin_install_action_links', array( $this, 'plugin_links' ), 10, 2 );
+ add_filter( 'install_plugins_tabs', array( $this, 'plugin_tabs' ), 10, 2 );
+ add_action( 'install_plugins_coderevolutionplugins', array( $this, 'install_plugins_im' ), 10, 1 );
+ add_action( 'install_plugins_pre_coderevolutionplugins', array( $this, 'get_favorites' ) );
+ add_action( 'install_plugins_coderevolutionplugins', 'display_plugins_table');
+ add_filter( 'plugins_api', array( $this, 'inject_plugin_info' ), 20, 3 );
+ }
+
+ function update_feed_quickly( $seconds ) {
+ return 5;
+ }
+ function default_update_feed_quickly( $seconds ) {
+ return 2592000;
+ }
+ function plugin_tabs( $tabs ) {
+ $plugins = $this->check_remote_plugins();
+ if( $plugins )
+ $tabs = array( 'coderevolutionplugins' => __( 'Highlighted' ) ) + $tabs;
+ return $tabs;
+ }
+
+ function install_plugins_im() {
+?>
+
+ query_server();
+ $wp_list_table->items = $api->plugins;
+ $wp_list_table->set_pagination_args(
+ array(
+ 'total_items' => $api->info['results'],
+ 'per_page' => $api->info['per_page'],
+ )
+ );
+ }
+
+ function query_server() {
+ $res = new stdclass();
+ $res->plugins = array();
+
+ $res->plugins = $this->get_remote_plugins();
+ $num_res = 0;
+ if( $res->plugins )
+ $num_res = count( $res->plugins );
+ $res->info = array(
+ 'results' => $num_res,
+ 'per_page' => 20
+ );
+ return $res;
+ }
+
+ function check_remote_plugins( $force_check = 0 ) {
+ $plugins = $this->get_remote_plugins();
+ if( empty( $plugins ) )
+ return false;
+ return true;
+ }
+
+ private function get_remote_plugins() {
+ if( $this->quick )
+ delete_transient( 'coderevolution_plugins' );
+ if ( false === ( $coderevolution_plugins = get_transient( 'coderevolution_plugins' ) ) || empty( $coderevolution_plugins ) ) {
+ $coderevolution_plugins = $this->do_get_remote_plugins();
+ set_transient( 'coderevolution_plugins', $coderevolution_plugins, 12 * HOUR_IN_SECONDS );
+ }
+ return $coderevolution_plugins;
+ }
+
+ private function do_get_remote_plugins() {
+ $i = 0;
+ $myposts = array();
+ $url = add_query_arg( 'paged', $i, $this->feed );
+ if( $this->quick )
+ {
+ add_filter( 'wp_feed_cache_transient_lifetime' , array( $this, 'update_feed_quickly' ) );
+ }
+ else
+ {
+ add_filter( 'wp_feed_cache_transient_lifetime' , array( $this, 'default_update_feed_quickly' ) );
+ }
+ $rss = fetch_feed( $url );
+ if ( is_wp_error( $rss ) ) {
+ if( !empty( $myposts ) )
+ return $myposts;
+ return false;
+ }
+
+ if( $this->quick )
+ {
+ remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'update_feed_quickly' ) );
+ }
+ else
+ {
+ remove_filter( 'wp_feed_cache_transient_lifetime', array( $this, 'default_update_feed_quickly' ) );
+ }
+ $strip_htmltags = $rss->strip_htmltags;
+ array_splice( $strip_htmltags, array_search('iframe', $strip_htmltags), 1 );
+ array_splice( $strip_htmltags, array_search('param', $strip_htmltags), 1 );
+ array_splice( $strip_htmltags, array_search('embed', $strip_htmltags), 1 );
+
+ if( !is_wp_error( $rss ) )
+ $rss->strip_htmltags( $strip_htmltags );
+ $maxitems = $rss->get_item_quantity( 50 );
+ if ( is_wp_error($rss) ) {
+ if( !empty( $myposts ) )
+ return $myposts;
+ return false;
+ }
+ if ( !$rss->get_item_quantity() ) {
+ $rss->__destruct();
+ unset($rss);
+ if( !empty( $myposts ) )
+ return $myposts;
+ return false;
+ }
+ foreach ( $rss->get_items() as $item ) {
+ $purchaseurl = esc_url_raw( strip_tags( $item->get_link() ) );
+ $title = esc_html( $item->get_title() );
+ $slug = $this->get_rss_field( $item, 'autors_slug' );
+ if( empty( $slug ) )
+ continue;
+ if( 1 && $this->coderevolution_plugin_installed( $slug ) )
+ continue;
+ $installs = $this->get_rss_field( $item, 'autors_installs' );
+ $lastupdated = $this->get_rss_field( $item, 'autors_lastupdated' );
+ $rating = $this->get_rss_field( $item, 'autors_rating' );
+ $reviews = $this->get_rss_field( $item, 'autors_reviews' );
+ $authorname = $this->get_rss_field( $item, 'autors_authorname' );
+ $authorurl = $this->get_rss_field( $item, 'autors_authorurl' );
+ $description = $this->get_rss_field( $item, 'autors_description' );
+ $version = $this->get_rss_field( $item, 'autors_version' );
+ $previews = array();
+ $rfields = array( 'review1_name', 'review1_txt', 'review2_name', 'review2_txt', 'review3_name', 'review3_txt' );
+ foreach( $rfields as $rfield ) {
+ $val = $this->get_rss_field( $item, $rfield );
+ $previews[ $rfield ] = $val;
+ }
+ $content = $item->get_content();
+ if( empty( $authorname ) ) {
+ $authorname = 'CodeRevolution';
+ }
+ if( empty( $authorurl ) ) {
+ $authorurl = 'https://coderevolution.ro/';
+ }
+ if( empty( $lastupdated ) ) {
+ $lastupdated = date( 'Y' ).'-'.date( 'm' ).'-01 8:49pm GMT';
+ }
+ if( empty( $version ) ) {
+ $version = 1.8;
+ }
+ if( empty( $rating ) )
+ $rating = rand( 90, 99);
+ if( empty( $reviews ) )
+ $reviews = rand( 237, 1283 );
+ if( empty( $installs ) )
+ $installs = rand( 3678, 13372 );
+ $thumbnail = $item->get_item_tags( '', 'featured_image' );
+ $thumbnail2 = $thumbnail[0]['data'];
+
+ $vers = get_bloginfo( 'version' );
+ if(is_numeric($vers))
+ {
+ $vers = floatval($vers);
+ }
+ else
+ {
+ $vers = 6.0;
+ }
+ $myposts[] = array(
+ 'name' => $title,
+ 'slug' => $slug,
+ 'crtype' => 'coderevolution',
+ 'version' => $version,
+ 'author' => ''.$authorname.' ',
+ 'author_profile' => $authorurl,
+ 'homepage' => $purchaseurl,
+ 'download_link' => $purchaseurl,
+ 'requires' => '3.5',
+ 'tested' => ceil( $vers ).'.0',
+ 'requires_php' => false,
+ 'rating' => $rating,
+ 'num_ratings' => $reviews,
+ 'active_installs' => $installs,
+ 'last_updated' => $lastupdated,
+ 'downloaded' => $installs,
+ 'description' => $content,
+ 'short_description' => $description,
+ 'apreviews' => $previews,
+ 'icons' => array(
+ '1x' => $thumbnail2,
+ '2x' => $thumbnail2
+ ),
+ 'author_block_count' => 2,
+ 'author_block_rating' => 94,
+ );
+
+ }
+ return $myposts;
+ }
+ function plugin_links( $links, $plugin ) {
+ if( isset( $plugin[ 'crtype' ] ) && ( $plugin[ 'crtype' ] == 'coderevolution' ) ) {
+ $links[0] = ''.esc_html__( 'Download Now', 'playomatic-google-play-post-generator' ).' ';
+ $links[1] = ''.esc_html__( 'More Details', 'playomatic-google-play-post-generator' ).' ';
+ }
+ return $links;
+ }
+
+ public function inject_plugin_info($result, $action = null, $args = null){
+ if( $action !== 'plugin_information' )
+ return $result;
+ $our_plugin_info = $this->is_our_plugin( $args->slug );
+ if( !$our_plugin_info )
+ return $result;
+
+ $pluginInfo = $this->requestPluginInfo( $our_plugin_info );
+ if ( $pluginInfo ) {
+ return $pluginInfo;
+ }
+
+ return $result;
+ }
+
+ private function is_our_plugin( $slug ) {
+ $plugins = $this->get_remote_plugins();
+ if( empty( $plugins ) )
+ return false;
+ foreach( $plugins as $plugin ) {
+ if( $plugin['slug'] === $slug )
+ return $plugin;
+ }
+ return false;
+ }
+
+ public function requestPluginInfo( $info ) {
+ $description = isset( $info[ 'description' ] ) ? trim( $info[ 'description' ] ) : '';
+ $intro = '';
+ $outro = '' . esc_html__( 'Download the plugin here', 'playomatic-google-play-post-generator' ) . ' ';
+
+ $ret = array(
+ 'name' => isset( $info[ 'name' ] ) ? trim( $info[ 'name' ] ) : '',
+ 'slug' => isset( $info[ 'slug' ] ) ? trim( $info[ 'slug' ] ) : '',
+ 'homepage' => isset( $info[ 'homepage' ] ) ? trim( $info[ 'homepage' ] ) : '',
+ 'download_url' => isset( $info[ 'download_link' ] ) ? trim( $info[ 'download_link' ] ) : '',
+ 'version' => isset( $info[ 'version' ] ) ? trim( $info[ 'version' ] ) : '',
+ 'required' => isset( $info[ 'required' ] ) ? trim( $info[ 'required' ] ) : '',
+ 'tested' => isset( $info[ 'tested' ] ) ? trim( $info[ 'tested' ] ) : '',
+ 'last_updated' => isset( $info[ 'last_updated' ] ) ? trim( $info[ 'last_updated' ] ) : '',
+ 'author' => isset( $info[ 'author' ] ) ? trim( $info[ 'author' ] ) : '',
+ 'author_homepage' => isset( $info[ 'author_profile' ] ) ? trim( $info[ 'author_profile' ] ) : '',
+ 'rating' => isset( $info[ 'rating' ] ) ? intval( $info[ 'rating' ] ) : '',
+ 'num_ratings' => isset( $info[ 'num_ratings' ] ) ? intval( $info[ 'num_ratings' ] ) : '',
+ 'active_installs' => isset( $info[ 'active_installs' ] ) ? intval( $info[ 'active_installs' ] ) . '+' : '',
+ 'downloaded' => isset( $info[ 'downloaded' ] ) ? intval( $info[ 'downloaded' ] ) : '',
+ 'sections' => array(
+ 'description' => $intro . $description . $outro,
+ 'installation' => '' . esc_html__( 'Just download the plugin from CodeCanyon and install it to your site in a few seconds.', 'playomatic-google-play-post-generator' ) . '
+ ' . esc_html__( 'Click here to get the plugin', 'playomatic-google-play-post-generator' ) . '
'
+ )
+ );
+
+ $reviews = isset( $info[ 'apreviews' ] ) ? $info[ 'apreviews' ] : false;
+ if( !empty( $reviews ) && isset( $reviews[ 'review1_name' ] ) && !empty( $reviews[ 'review1_name' ] ) )
+ $ret[ 'sections' ][ 'review' ] = $this->format_reviews( $reviews );
+ return (object) $ret;
+ }
+
+ private function format_reviews( $reviews ) {
+ if( empty( $reviews ) )
+ return '';
+ $ret = '';
+ $review1_name = isset( $reviews[ 'review1_name' ] ) ? trim( $reviews[ 'review1_name' ] ) : '';
+ $review1_txt = isset( $reviews[ 'review1_txt' ] ) ? trim( $reviews[ 'review1_txt' ] ) : '';
+ if( !empty( $review1_txt ) ) {
+ $ret .= $this->format_review( $review1_name, $review1_txt );
+ }
+ $review2_name = isset( $reviews[ 'review2_name' ] ) ? trim( $reviews[ 'review2_name' ] ) : '';
+ $review2_txt = isset( $reviews[ 'review2_txt' ] ) ? trim( $reviews[ 'review2_txt' ] ) : '';
+ if( !empty( $review2_txt ) ) {
+ $ret .= $this->format_review( $review2_name, $review2_txt );
+ }
+ $review3_name = isset( $reviews[ 'review3_name' ] ) ? trim( $reviews[ 'review3_name' ] ) : '';
+ $review3_txt = isset( $reviews[ 'review3_txt' ] ) ? trim( $reviews[ 'review3_txt' ] ) : '';
+ if( !empty( $review3_txt ) ) {
+ $ret .= $this->format_review( $review3_name, $review3_txt );
+ }
+ return $ret;
+ ;
+
+ }
+
+ private function format_review( $name, $content ) {
+ return '
+
+
+
+
' . esc_html($name) . '
+
+
+
+
+
' . esc_html($content) . '
+
';
+ }
+ private function get_rss_field( $item, $field ) {
+ $value = $item->get_item_tags( '', $field );
+ if(isset($value[0]['data']))
+ {
+ $val = $value[0]['data'];
+ }
+ else
+ {
+ return '';
+ }
+ return trim( html_entity_decode( $val ) );
+ }
+
+ private function coderevolution_plugin_installed( $slug ) {
+ return $this->is_plugin_there( $slug );
+ }
+
+ private function is_plugin_there( $plugin_dir ) {
+ $plugins = get_plugins( '/'.$plugin_dir );
+ if ( $plugins )
+ return $plugins;
+ return false;
+ }
+
+ }
+ //new CodeRevoDashboardPlugins();
+}
+?>
\ No newline at end of file
diff --git a/res/other/script.js b/res/other/script.js
new file mode 100644
index 0000000000000000000000000000000000000000..d7a4a2f81926090dc751ad7abca59f29acbd762d
--- /dev/null
+++ b/res/other/script.js
@@ -0,0 +1,7 @@
+"use strict";
+jQuery( document ).ready(function() {
+ jQuery("#wp_coderevodashboard_hide").click(function( e ){
+ e.preventDefault();
+ jQuery("#coderevodashboard-widget-hide").trigger("click");
+ });
+});
\ No newline at end of file
diff --git a/res/other/scriptnews.js b/res/other/scriptnews.js
new file mode 100644
index 0000000000000000000000000000000000000000..e282056680edc1b53003610bf397dec9d6b38247
--- /dev/null
+++ b/res/other/scriptnews.js
@@ -0,0 +1,7 @@
+"use strict";
+jQuery( document ).ready(function() {
+ jQuery("#wp_coderevonewsdashboard_hide").click(function( e ){
+ e.preventDefault();
+ jQuery("#coderevonewsdashboard-widget-hide").trigger("click");
+ });
+});
\ No newline at end of file
diff --git a/res/phantomjs/index.php b/res/phantomjs/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..1580272ca20148e6cd43366e262c335765ed9b5e
--- /dev/null
+++ b/res/phantomjs/index.php
@@ -0,0 +1,3 @@
+
diff --git a/res/phantomjs/phantom.js b/res/phantomjs/phantom.js
new file mode 100644
index 0000000000000000000000000000000000000000..8ed70d0260116e786c3d39055ede679c500e377a
--- /dev/null
+++ b/res/phantomjs/phantom.js
@@ -0,0 +1,80 @@
+"use strict";
+var system = require('system');
+if (system.args.length === 1) {
+ phantom.exit();
+}
+var page = require("webpage").create(),
+ url = system.args[1];
+page.settings.resourceTimeout = system.args[2];
+if(system.args[3] != 'default')
+{
+ page.settings.userAgent = system.args[3];
+}
+if(system.args[4] != 'default')
+{
+ document.cookie = system.args[4];
+}
+if(system.args[5] != 'default')
+{
+ var xres = system.args[5].split(":");
+ if(xres[1] != undefined)
+ {
+ page.settings.userName = xres[0];
+ page.settings.password = xres[1];
+ }
+}
+var sleeptime = 0;
+if(system.args[6] != '0')
+{
+ sleeptime = parseInt(system.args[6]);
+ if(sleeptime === NaN)
+ {
+ sleeptime = 0;
+ }
+}
+page.onResourceTimeout = function(e) {
+ console.log('timeout');
+ phantom.exit(1);
+};
+function onPageReady() {
+ var htmlContent = page.evaluate(function () {
+ return document.documentElement.outerHTML;
+ });
+ console.log(htmlContent);
+ phantom.exit();
+}
+
+page.onError = function(msg, trace) {
+ var msgStack = ['ERROR: ' + msg];
+ if (trace && trace.length) {
+ msgStack.push('TRACE:');
+ trace.forEach(function(t) {
+ msgStack.push(' -> ' + t.file + ': ' + t.line + (t.function ? ' (in function "' + t.function + '")' : ''));
+ });
+ }
+ // uncomment to log into the console
+ // console.error(msgStack.join('\n'));
+};
+page.open(encodeURI(url), function (status) {
+ function checkReadyState() {
+ setTimeout(function () {
+ var readyState = page.evaluate(function () {
+ return document.readyState;
+ });
+
+ if ("complete" === readyState) {
+ if(sleeptime != 0)
+ {
+ setTimeout(onPageReady, sleeptime);
+ }
+ else
+ {
+ onPageReady();
+ }
+ } else {
+ checkReadyState();
+ }
+ });
+ }
+ checkReadyState();
+});
\ No newline at end of file
diff --git a/res/puppeteer/index.php b/res/puppeteer/index.php
new file mode 100644
index 0000000000000000000000000000000000000000..1580272ca20148e6cd43366e262c335765ed9b5e
--- /dev/null
+++ b/res/puppeteer/index.php
@@ -0,0 +1,3 @@
+
diff --git a/res/puppeteer/puppeteer.js b/res/puppeteer/puppeteer.js
new file mode 100644
index 0000000000000000000000000000000000000000..c6a2561f425819d7cc21fe1b848577656b8de82a
--- /dev/null
+++ b/res/puppeteer/puppeteer.js
@@ -0,0 +1,114 @@
+"use strict";
+const puppeteer = require('puppeteer');
+(async () => {
+ var args = process.argv.slice(2);
+ process.on('unhandledRejection', up => { throw up })
+ var argarr = ['--no-sandbox', '--disable-setuid-sandbox'];
+ var auth_user = '';
+ var auth_pass = '';
+ if(args[1] !== undefined && args[1] !== 'null')
+ {
+ const proxarr = args[1].split("~~~");
+ if(proxarr[1] !== undefined)
+ {
+ const userpass = proxarr[1].split(":");
+ if(userpass[1] !== undefined)
+ {
+ auth_user = userpass[0];
+ auth_pass = userpass[1];
+ }
+ argarr.push("--proxy-server=" + proxarr[0]);
+ }
+ else
+ {
+ argarr.push("--proxy-server=" + args[1]);
+ }
+ }
+ if(args[2] != 'default')
+ {
+ argarr.push("--user-agent=" + args[2]);
+ }
+ const browser = await puppeteer.launch({ignoreHTTPSErrors:true, args: argarr});
+ const page = (await browser.pages())[0];
+ if(auth_pass != '')
+ {
+ await page.authenticate({
+ username: auth_user,
+ password: auth_pass
+ });
+ }
+ if(args[3] != 'default')
+ {
+ var kkarr = args[3].split(';');
+ kkarr.forEach(async function (value)
+ {
+ var cookiesobje = '';
+ var splitCookie = value.split('=');
+ if(splitCookie[1] !== undefined)
+ {
+ try {
+ cookiesobje += '{"name": "' + splitCookie[0].trim() + '","value": "' + decodeURIComponent(splitCookie[1]) + '", "url": "' + args[0] + '"}';
+ } catch (error) {
+ cookiesobje += '{"name": "' + splitCookie[0].trim() + '","value": "' + splitCookie[1] + '", "url": "' + args[0] + '"}';
+ }
+ if(cookiesobje != '')
+ {
+ try
+ {
+ var cookiesobjex = JSON.parse(cookiesobje);
+ await page.setCookie(cookiesobjex);
+ }
+ catch(error)
+ {
+ }
+ }
+ }
+ });
+ }
+ if(args[4] != 'default')
+ {
+ var xres = args[4].split(":");
+ if(xres[1] != undefined)
+ {
+ var user = xres[0];
+ var pass = xres[1];
+ const auth = new Buffer(`${user}:${pass}`).toString('base64');
+ await page.setExtraHTTPHeaders({
+ 'Authorization': `Basic ${auth}`
+ });
+ }
+ }
+ const isImage = await page.evaluate((url) => {
+ const imageExtensions = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.jpe', '.webp'];
+ var lowercasedUrl = url.toLowerCase();
+ lowercasedUrl = lowercasedUrl.split('?')[0].split('#')[0];
+ return imageExtensions.some((extension) => lowercasedUrl.endsWith(extension));
+ }, args[0]);
+
+ await page.goto(args[0], {waitUntil: 'networkidle2'});
+
+ if (!isImage)
+ {
+ const bodyWidth = await page.evaluate(() => document.body.scrollWidth);
+ const bodyHeight = await page.evaluate(() => document.body.scrollHeight);
+ await page.setViewport({ width: bodyWidth, height: bodyHeight });
+ let bodyHTML = await page.content();
+ console.log(bodyHTML);
+ }
+ else
+ {
+ const imageData = await page.evaluate(async () => {
+ const response = await fetch(window.location.href);
+ const blob = await response.blob();
+ return new Promise((resolve, reject) => {
+ const reader = new FileReader();
+ reader.onloadend = () => resolve(reader.result);
+ reader.onerror = reject;
+ reader.readAsDataURL(blob);
+ });
+ });
+ const base64Data = imageData.split(',')[1];
+ console.log(base64Data);
+ }
+ await browser.close();
+})();
\ No newline at end of file
diff --git a/res/simple_html_dom.php b/res/simple_html_dom.php
new file mode 100644
index 0000000000000000000000000000000000000000..8fd269c450af175e523d780dbcbf4f9297f2c273
--- /dev/null
+++ b/res/simple_html_dom.php
@@ -0,0 +1,2207 @@
+size is the "real" number of bytes the dom was created from.
+ * but for most purposes, it's a really good estimation.
+ * Paperg - Added the forceTagsClosed to the dom constructor. Forcing tags closed is great for malformed html, but it CAN lead to parsing errors.
+ * Allow the user to tell us how much they trust the html.
+ * Paperg add the text and plaintext to the selectors for the find syntax. plaintext implies text in the innertext of a node. text implies that the tag is a text node.
+ * This allows for us to find tags based on the text they contain.
+ * Create find_ancestor_tag to see if a tag is - at any level - inside of another specific tag.
+ * Paperg: added parse_charset so that we know about the character set of the source document.
+ * NOTE: If the user's system has a routine called get_last_retrieve_url_contents_content_type availalbe, we will assume it's returning the content-type header from the
+ * last transfer or curl_exec, and we will parse that and use it in preference to any other method of charset detection.
+ *
+ * Found infinite loop in the case of broken html in restore_noise. Rewrote to protect from that.
+ * PaperG (John Schlick) Added get_display_size for "IMG" tags.
+ *
+ * Licensed under The MIT License
+ * Redistributions of files must retain the above copyright notice.
+ *
+ * @author S.C. Chen
+ * @author John Schlick
+ * @author Rus Carroll
+ * @version Rev. 1.7 (214)
+ * @package PlaceLocalInclude
+ * @subpackage ums_simple_html_dom
+ */
+
+/**
+ * All of the Defines for the classes below.
+ * @author S.C. Chen
+ */
+define('HDOM_TYPE_ELEMENT', 1);
+define('HDOM_TYPE_COMMENT', 2);
+define('HDOM_TYPE_TEXT', 3);
+define('HDOM_TYPE_ENDTAG', 4);
+define('HDOM_TYPE_ROOT', 5);
+define('HDOM_TYPE_UNKNOWN', 6);
+define('HDOM_QUOTE_DOUBLE', 0);
+define('HDOM_QUOTE_SINGLE', 1);
+define('HDOM_QUOTE_NO', 3);
+define('HDOM_INFO_BEGIN', 0);
+define('HDOM_INFO_END', 1);
+define('HDOM_INFO_QUOTE', 2);
+define('HDOM_INFO_SPACE', 3);
+define('HDOM_INFO_TEXT', 4);
+define('HDOM_INFO_INNER', 5);
+define('HDOM_INFO_OUTER', 6);
+define('HDOM_INFO_ENDSPACE',7);
+define('DEFAULT_TARGET_CHARSET', 'UTF-8');
+define('DEFAULT_BR_TEXT', "\r\n");
+define('DEFAULT_SPAN_TEXT', " ");
+define('MAX_FILE_SIZE', 10485760);
+
+/** Contents between curly braces "{" and "}" are interpreted as text */
+define('HDOM_SMARTY_AS_TEXT', 1);
+
+// helper functions
+// -----------------------------------------------------------------------------
+// get html dom from file
+// $maxlen is defined in the code as PHP_STREAM_COPY_ALL which is defined as -1.
+function ums_file_get_html($url, $use_include_path = false, $context=null, $offset = 0, $maxLen=-1, $lowercase = true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
+{
+ // Ensure maximum length is greater than zero
+ if($maxLen <= 0) { $maxLen = MAX_FILE_SIZE; }
+
+ // We DO force the tags to be terminated.
+ $dom = new ums_simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
+ // For sourceforge users: uncomment the next line and comment the retrieve_url_contents line 2 lines down if it is not already done.
+ global $wp_filesystem;
+ if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
+ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
+ wp_filesystem($creds);
+ }
+ $contents = $wp_filesystem->get_contents($url);
+ // Paperg - use our own mechanism for getting the contents as we want to control the timeout.
+
+ if (empty($contents) || strlen($contents) > $maxLen)
+ {
+ return false;
+ }
+ // The second parameter can force the selectors to all be lowercase.
+ $dom->load($contents, $lowercase, $stripRN);
+ return $dom;
+}
+
+// get html dom from string
+function ums_str_get_html($str, $lowercase=true, $forceTagsClosed=true, $target_charset = DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT)
+{
+ $dom = new ums_simple_html_dom(null, $lowercase, $forceTagsClosed, $target_charset, $stripRN, $defaultBRText, $defaultSpanText);
+ if (empty($str) || strlen($str) > MAX_FILE_SIZE)
+ {
+ $dom->clear();
+ return false;
+ }
+ $dom->load($str, $lowercase, $stripRN);
+ return $dom;
+}
+
+// dump html dom tree
+function ums_dump_html_tree($node, $show_attr=true, $deep=0)
+{
+ $node->dump($node);
+}
+
+
+/**
+ * simple html dom node
+ * PaperG - added ability for "find" routine to lowercase the value of the selector.
+ * PaperG - added $tag_start to track the start position of the tag in the total byte index
+ *
+ * @package PlaceLocalInclude
+ */
+class ums_simple_html_dom_node
+{
+ /**
+ * Node type
+ *
+ * Default is {@see HDOM_TYPE_TEXT}
+ *
+ * @var int
+ */
+ public $nodetype = HDOM_TYPE_TEXT;
+
+ /**
+ * Tag name
+ *
+ * Default is 'text'
+ *
+ * @var string
+ */
+ public $tag = 'text';
+
+ /**
+ * List of attributes
+ *
+ * @var array
+ */
+ public $attr = array();
+
+ /**
+ * List of child node objects
+ *
+ * @var array
+ */
+ public $children = array();
+ public $nodes = array();
+
+ /**
+ * The parent node object
+ *
+ * @var object|null
+ */
+ public $parent = null;
+
+ // The "info" array - see HDOM_INFO_... for what each element contains.
+ public $_ = array();
+
+ /**
+ * Start position of the tag in the document
+ *
+ * @var int
+ */
+ public $tag_start = 0;
+
+ /**
+ * The DOM object
+ *
+ * @var object|null
+ */
+ private $dom = null;
+
+ /**
+ * Construct new node object
+ *
+ * Adds itself to the list of DOM Nodes {@see ums_simple_html_dom::$nodes}
+ */
+ function __construct($dom)
+ {
+ $this->dom = $dom;
+ $dom->nodes[] = $this;
+ }
+
+ function __destruct()
+ {
+ $this->clear();
+ }
+
+ function __toString()
+ {
+ return $this->outertext();
+ }
+
+ // clean up memory due to php5 circular references memory leak...
+ function clear()
+ {
+ $this->dom = null;
+ $this->nodes = null;
+ $this->parent = null;
+ $this->children = null;
+ }
+
+ // dump node's tree
+ function dump($show_attr=true, $deep=0)
+ {
+ $lead = str_repeat(' ', $deep);
+
+ echo $lead.$this->tag;
+ if ($show_attr && count($this->attr)>0)
+ {
+ echo '(';
+ foreach ($this->attr as $k=>$v)
+ echo "[$k]=>\"".$this->$k.'", ';
+ echo ')';
+ }
+ echo "\n";
+
+ if ($this->nodes)
+ {
+ foreach ($this->nodes as $c)
+ {
+ $c->dump($show_attr, $deep+1);
+ }
+ }
+ }
+
+
+ // Debugging function to dump a single dom node with a bunch of information about it.
+ function dump_node($echo=true)
+ {
+
+ $string = $this->tag;
+ if (count($this->attr)>0)
+ {
+ $string .= '(';
+ foreach ($this->attr as $k=>$v)
+ {
+ $string .= "[$k]=>\"".$this->$k.'", ';
+ }
+ $string .= ')';
+ }
+ if (count($this->_)>0)
+ {
+ $string .= ' $_ (';
+ foreach ($this->_ as $k=>$v)
+ {
+ if (is_array($v))
+ {
+ $string .= "[$k]=>(";
+ foreach ($v as $k2=>$v2)
+ {
+ $string .= "[$k2]=>\"".$v2.'", ';
+ }
+ $string .= ")";
+ } else {
+ $string .= "[$k]=>\"".$v.'", ';
+ }
+ }
+ $string .= ")";
+ }
+
+ if (isset($this->text))
+ {
+ $string .= " text: (" . $this->text . ")";
+ }
+
+ $string .= " HDOM_INNER_INFO: '";
+ if (isset($node->_[HDOM_INFO_INNER]))
+ {
+ $string .= $node->_[HDOM_INFO_INNER] . "'";
+ }
+ else
+ {
+ $string .= ' NULL ';
+ }
+
+ $string .= " children: " . count($this->children);
+ $string .= " nodes: " . count($this->nodes);
+ $string .= " tag_start: " . $this->tag_start;
+ $string .= "\n";
+
+ if ($echo)
+ {
+ echo $string;
+ return;
+ }
+ else
+ {
+ return $string;
+ }
+ }
+
+ /**
+ * Return or set parent node
+ *
+ * @param object|null $parent (optional) The parent node, `null` to return
+ * the current parent node.
+ * @return object|null The parent node
+ */
+ function parent($parent=null)
+ {
+ // I am SURE that this doesn't work properly.
+ // It fails to unset the current node from it's current parents nodes or children list first.
+ if ($parent !== null)
+ {
+ $this->parent = $parent;
+ $this->parent->nodes[] = $this;
+ $this->parent->children[] = $this;
+ }
+
+ return $this->parent;
+ }
+
+ /**
+ * @return bool True if the node has at least one child node
+ */
+ function has_child()
+ {
+ return !empty($this->children);
+ }
+
+ /**
+ * Get child node at specified index
+ *
+ * @param int $idx The index of the child node to return, `-1` to return all
+ * child nodes.
+ * @return object|array|null The child node at the specified index, all child
+ * nodes or null if the index is invalid.
+ */
+ function children($idx=-1)
+ {
+ if ($idx===-1)
+ {
+ return $this->children;
+ }
+ if (isset($this->children[$idx]))
+ {
+ return $this->children[$idx];
+ }
+ return null;
+ }
+
+ /**
+ * Get first child node
+ *
+ * @return object|null The first child node or null if the current node has
+ * no child nodes.
+ *
+ * @todo Use `empty()` instead of `count()` to improve performance on large
+ * arrays.
+ */
+ function first_child()
+ {
+ if (count($this->children)>0)
+ {
+ return $this->children[0];
+ }
+ return null;
+ }
+
+ /**
+ * Get last child node
+ *
+ * @return object|null The last child node or null if the current node has
+ * no child nodes.
+ *
+ * @todo Use `end()` to slightly improve performance on large arrays.
+ */
+ function last_child()
+ {
+ if (($count=count($this->children))>0)
+ {
+ return $this->children[$count-1];
+ }
+ return null;
+ }
+
+ /**
+ * Get next sibling node
+ *
+ * @return object|null The sibling node or null if the current node has no
+ * sibling nodes.
+ */
+ function next_sibling()
+ {
+ if ($this->parent===null)
+ {
+ return null;
+ }
+
+ $idx = 0;
+ $count = count($this->parent->children);
+ while ($idx<$count && $this!==$this->parent->children[$idx])
+ {
+ ++$idx;
+ }
+ if (++$idx>=$count)
+ {
+ return null;
+ }
+ return $this->parent->children[$idx];
+ }
+
+ /**
+ * Get previous sibling node
+ *
+ * @return object|null The sibling node or null if the current node has no
+ * sibling nodes.
+ */
+ function prev_sibling()
+ {
+ if ($this->parent===null) return null;
+ $idx = 0;
+ $count = count($this->parent->children);
+ while ($idx<$count && $this!==$this->parent->children[$idx])
+ ++$idx;
+ if (--$idx<0) return null;
+ return $this->parent->children[$idx];
+ }
+
+ /**
+ * Traverse ancestors to the first matching tag.
+ *
+ * @param string $tag Tag to find
+ * @return object|null First matching node in the DOM tree or null if no
+ * match was found.
+ *
+ * @todo Null is returned implicitly by calling ->parent on the root node.
+ * This behaviour could change at any time, rendering this function invalid.
+ */
+ function find_ancestor_tag($tag)
+ {
+ global $debug_object;
+ if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
+
+ // Start by including ourselves in the comparison.
+ $returnDom = $this;
+
+ while (!is_null($returnDom))
+ {
+ if (is_object($debug_object)) { $debug_object->debug_log(2, "Current tag is: " . $returnDom->tag); }
+
+ if ($returnDom->tag == $tag)
+ {
+ break;
+ }
+ $returnDom = $returnDom->parent;
+ }
+ return $returnDom;
+ }
+
+ /**
+ * Get node's inner text (everything inside the opening and closing tags)
+ *
+ * @return string
+ */
+ function innertext()
+ {
+ if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
+
+ $ret = '';
+ foreach ($this->nodes as $n)
+ $ret .= $n->outertext();
+ return $ret;
+ }
+
+ /**
+ * Get node's outer text (everything including the opening and closing tags)
+ *
+ * @return string
+ */
+ function outertext()
+ {
+ global $debug_object;
+ if (is_object($debug_object))
+ {
+ $text = '';
+ if ($this->tag == 'text')
+ {
+ if (!empty($this->text))
+ {
+ $text = " with text: " . $this->text;
+ }
+ }
+ $debug_object->debug_log(1, 'Innertext of tag: ' . $this->tag . $text);
+ }
+
+ if ($this->tag==='root') return $this->innertext();
+
+ // trigger callback
+ if ($this->dom && $this->dom->callback!==null)
+ {
+ call_user_func_array($this->dom->callback, array($this));
+ }
+
+ if (isset($this->_[HDOM_INFO_OUTER])) return $this->_[HDOM_INFO_OUTER];
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
+
+ // render begin tag
+ if ($this->dom && $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]])
+ {
+ $ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup();
+ } else {
+ $ret = "";
+ }
+
+ // render inner text
+ if (isset($this->_[HDOM_INFO_INNER]))
+ {
+ // If it's a br tag... don't return the HDOM_INNER_INFO that we may or may not have added.
+ if ($this->tag != "br")
+ {
+ $ret .= $this->_[HDOM_INFO_INNER];
+ }
+ } else {
+ if ($this->nodes)
+ {
+ foreach ($this->nodes as $n)
+ {
+ $ret .= $this->convert_text($n->outertext());
+ }
+ }
+ }
+
+ // render end tag
+ if (isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END]!=0)
+ $ret .= ''.$this->tag.'>';
+ return $ret;
+ }
+
+ /**
+ * Get node's plain text (everything excluding all tags)
+ *
+ * @return string
+ */
+ function text()
+ {
+ if (isset($this->_[HDOM_INFO_INNER])) return $this->_[HDOM_INFO_INNER];
+ switch ($this->nodetype)
+ {
+ case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
+ case HDOM_TYPE_COMMENT: return '';
+ case HDOM_TYPE_UNKNOWN: return '';
+ }
+ if (strcasecmp($this->tag, 'script')===0) return '';
+ if (strcasecmp($this->tag, 'style')===0) return '';
+
+ $ret = '';
+ // In rare cases, (always node type 1 or HDOM_TYPE_ELEMENT - observed for some span tags, and some p tags) $this->nodes is set to NULL.
+ // NOTE: This indicates that there is a problem where it's set to NULL without a clear happening.
+ // WHY is this happening?
+ if (!is_null($this->nodes))
+ {
+ foreach ($this->nodes as $n)
+ {
+ // Start paragraph after a blank line
+ if ($n->tag == 'p')
+ {
+ $ret .= "\n\n";
+ }
+
+ $ret .= $this->convert_text($n->text());
+
+ // If this node is a span... add a space at the end of it so multiple spans don't run into each other. This is plaintext after all.
+ if ($n->tag == "span")
+ {
+ $ret .= $this->dom->default_span_text;
+ }
+ }
+ }
+ return trim($ret);
+ }
+
+ /**
+ * Get node's xml text (inner text as a CDATA section)
+ *
+ * @return string
+ */
+ function xmltext()
+ {
+ $ret = $this->innertext();
+ $ret = str_ireplace('', '', $ret);
+ return $ret;
+ }
+
+ // build node's text with tag
+ function makeup()
+ {
+ // text, comment, unknown
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]);
+
+ $ret = '<'.$this->tag;
+ $i = -1;
+
+ foreach ($this->attr as $key=>$val)
+ {
+ ++$i;
+
+ // skip removed attribute
+ if ($val===null || $val===false)
+ continue;
+
+ $ret .= $this->_[HDOM_INFO_SPACE][$i][0];
+ //no value attr: nowrap, checked selected...
+ if ($val===true)
+ $ret .= $key;
+ else {
+ switch ($this->_[HDOM_INFO_QUOTE][$i])
+ {
+ case HDOM_QUOTE_DOUBLE: $quote = '"'; break;
+ case HDOM_QUOTE_SINGLE: $quote = '\''; break;
+ default: $quote = '';
+ }
+ $ret .= $key.$this->_[HDOM_INFO_SPACE][$i][1].'='.$this->_[HDOM_INFO_SPACE][$i][2].$quote.$val.$quote;
+ }
+ }
+ $ret = $this->dom->restore_noise($ret);
+ return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>';
+ }
+
+ // find elements by css selector
+ //PaperG - added ability for find to lowercase the value of the selector.
+ function find($selector, $idx=null, $lowercase=false)
+ {
+ $selectors = $this->parse_selector($selector);
+ if (($count=count($selectors))===0) return array();
+ $found_keys = array();
+
+ // find each selector
+ for ($c=0; $c<$count; ++$c)
+ {
+ // The change on the below line was documented on the sourceforge code tracker id 2788009
+ // used to be: if (($levle=count($selectors[0]))===0) return array();
+ if (($levle=count($selectors[$c]))===0) return array();
+ if (!isset($this->_[HDOM_INFO_BEGIN])) return array();
+
+ $head = array($this->_[HDOM_INFO_BEGIN]=>1);
+
+ // handle descendant selectors, no recursive!
+ for ($l=0; $l<$levle; ++$l)
+ {
+ $ret = array();
+ foreach ($head as $k=>$v)
+ {
+ $n = ($k===-1) ? $this->dom->root : $this->dom->nodes[$k];
+ //PaperG - Pass this optional parameter on to the seek function.
+ $n->seek($selectors[$c][$l], $ret, $lowercase);
+ }
+ $head = $ret;
+ }
+
+ foreach ($head as $k=>$v)
+ {
+ if (!isset($found_keys[$k]))
+ {
+ $found_keys[$k] = 1;
+ }
+ }
+ }
+
+ // sort keys
+ ksort($found_keys);
+
+ $found = array();
+ foreach ($found_keys as $k=>$v)
+ $found[] = $this->dom->nodes[$k];
+
+ // return nth-element or array
+ if (is_null($idx)) return $found;
+ else if ($idx<0) $idx = count($found) + $idx;
+ return (isset($found[$idx])) ? $found[$idx] : null;
+ }
+
+ // seek for given conditions
+ // PaperG - added parameter to allow for case insensitive testing of the value of a selector.
+ protected function seek($selector, &$ret, $lowercase=false)
+ {
+ global $debug_object;
+ if (is_object($debug_object)) { $debug_object->debug_log_entry(1); }
+
+ list($tag, $key, $val, $exp, $no_key) = $selector;
+
+ // xpath index
+ if ($tag && $key && is_numeric($key))
+ {
+ $count = 0;
+ foreach ($this->children as $c)
+ {
+ if ($tag==='*' || $tag===$c->tag) {
+ if (++$count==$key) {
+ $ret[$c->_[HDOM_INFO_BEGIN]] = 1;
+ return;
+ }
+ }
+ }
+ return;
+ }
+
+ $end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0;
+ if ($end==0) {
+ $parent = $this->parent;
+ while (!isset($parent->_[HDOM_INFO_END]) && $parent!==null) {
+ $end -= 1;
+ $parent = $parent->parent;
+ }
+ $end += $parent->_[HDOM_INFO_END];
+ }
+
+ for ($i=$this->_[HDOM_INFO_BEGIN]+1; $i<$end; ++$i) {
+ $node = $this->dom->nodes[$i];
+
+ $pass = true;
+
+ if ($tag==='*' && !$key) {
+ if (in_array($node, $this->children, true))
+ $ret[$i] = 1;
+ continue;
+ }
+
+ // compare tag
+ if ($tag && $tag!=$node->tag && $tag!=='*') {$pass=false;}
+ // compare key
+ if ($pass && $key) {
+ if ($no_key) {
+ if (isset($node->attr[$key])) $pass=false;
+ } else {
+ if (($key != "plaintext") && !isset($node->attr[$key])) $pass=false;
+ }
+ }
+ // compare value
+ if ($pass && $key && $val && $val!=='*') {
+ // If they have told us that this is a "plaintext" search then we want the plaintext of the node - right?
+ if ($key == "plaintext") {
+ // $node->plaintext actually returns $node->text();
+ $nodeKeyValue = $node->text();
+ } else {
+ // this is a normal search, we want the value of that attribute of the tag.
+ $nodeKeyValue = $node->attr[$key];
+ }
+ if (is_object($debug_object)) {$debug_object->debug_log(2, "testing node: " . $node->tag . " for attribute: " . $key . $exp . $val . " where nodes value is: " . $nodeKeyValue);}
+
+ //PaperG - If lowercase is set, do a case insensitive test of the value of the selector.
+ if ($lowercase) {
+ $check = $this->match($exp, strtolower($val), strtolower($nodeKeyValue));
+ } else {
+ $check = $this->match($exp, $val, $nodeKeyValue);
+ }
+ if (is_object($debug_object)) {$debug_object->debug_log(2, "after match: " . ($check ? "true" : "false"));}
+
+ // handle multiple class
+ if (!$check && strcasecmp($key, 'class')===0) {
+ foreach (explode(' ',$node->attr[$key]) as $k) {
+ // Without this, there were cases where leading, trailing, or double spaces lead to our comparing blanks - bad form.
+ if (!empty($k)) {
+ if ($lowercase) {
+ $check = $this->match($exp, strtolower($val), strtolower($k));
+ } else {
+ $check = $this->match($exp, $val, $k);
+ }
+ if ($check) break;
+ }
+ }
+ }
+ if (!$check) $pass = false;
+ }
+ if ($pass) $ret[$i] = 1;
+ unset($node);
+ }
+ // It's passed by reference so this is actually what this function returns.
+ if (is_object($debug_object)) {$debug_object->debug_log(1, "EXIT - ret: ", $ret);}
+ }
+
+ protected function match($exp, $pattern, $value) {
+ global $debug_object;
+ if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
+
+ switch ($exp) {
+ case '=':
+ return ($value===$pattern);
+ case '!=':
+ return ($value!==$pattern);
+ case '^=':
+ return preg_match("/^".preg_quote($pattern,'/')."/", $value);
+ case '$=':
+ return preg_match("/".preg_quote($pattern,'/')."$/", $value);
+ case '*=':
+ if ($pattern[0]=='/') {
+ return preg_match($pattern, $value);
+ }
+ return preg_match("/".$pattern."/i", $value);
+ }
+ return false;
+ }
+
+ protected function parse_selector($selector_string) {
+ global $debug_object;
+ if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
+
+ // pattern of CSS selectors, modified from mootools
+ // Paperg: Add the colon to the attrbute, so that it properly finds like google does.
+ // Note: if you try to look at this attribute, yo MUST use getAttribute since $dom->x:y will fail the php syntax check.
+// Notice the \[ starting the attbute? and the @? following? This implies that an attribute can begin with an @ sign that is not captured.
+// This implies that an html attribute specifier may start with an @ sign that is NOT captured by the expression.
+// farther study is required to determine of this should be documented or removed.
+// $pattern = "/([\w-:\*]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is";
+ $pattern = "/([\w:\*-]*)(?:\#([\w-]+)|\.([\w-]+))?(?:\[@?(!?[\w:-]+)(?:([!*^$]?=)[\"']?(.*?)[\"']?)?\])?([\/, ]+)/is";
+ preg_match_all($pattern, trim($selector_string).' ', $matches, PREG_SET_ORDER);
+ if (is_object($debug_object)) {$debug_object->debug_log(2, "Matches Array: ", $matches);}
+
+ $selectors = array();
+ $result = array();
+ //print_r($matches);
+
+ foreach ($matches as $m) {
+ $m[0] = trim($m[0]);
+ if ($m[0]==='' || $m[0]==='/' || $m[0]==='//') continue;
+ // for browser generated xpath
+ if ($m[1]==='tbody') continue;
+
+ list($tag, $key, $val, $exp, $no_key) = array($m[1], null, null, '=', false);
+ if (!empty($m[2])) {$key='id'; $val=$m[2];}
+ if (!empty($m[3])) {$key='class'; $val=$m[3];}
+ if (!empty($m[4])) {$key=$m[4];}
+ if (!empty($m[5])) {$exp=$m[5];}
+ if (!empty($m[6])) {$val=$m[6];}
+ if($tag === null)
+ {
+ $tag = '';
+ }
+ if($key === null)
+ {
+ $key = '';
+ }
+ // convert to lowercase
+ if ($this->dom->lowercase) {$tag=strtolower($tag); $key=strtolower($key);}
+ //elements that do NOT have the specified attribute
+ if (isset($key[0]) && $key[0]==='!') {$key=substr($key, 1); $no_key=true;}
+
+ $result[] = array($tag, $key, $val, $exp, $no_key);
+ if (trim($m[7])===',') {
+ $selectors[] = $result;
+ $result = array();
+ }
+ }
+ if (count($result)>0)
+ $selectors[] = $result;
+ return $selectors;
+ }
+
+ function __get($name)
+ {
+ if (isset($this->attr[$name]))
+ {
+ return $this->convert_text($this->attr[$name]);
+ }
+ switch ($name)
+ {
+ case 'outertext': return $this->outertext();
+ case 'innertext': return $this->innertext();
+ case 'plaintext': return $this->text();
+ case 'xmltext': return $this->xmltext();
+ default: return array_key_exists($name, $this->attr);
+ }
+ }
+
+ function __set($name, $value)
+ {
+ global $debug_object;
+ if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
+
+ switch ($name)
+ {
+ case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value;
+ case 'innertext':
+ if (isset($this->_[HDOM_INFO_TEXT])) return $this->_[HDOM_INFO_TEXT] = $value;
+ return $this->_[HDOM_INFO_INNER] = $value;
+ }
+ if (!isset($this->attr[$name]))
+ {
+ $this->_[HDOM_INFO_SPACE][] = array(' ', '', '');
+ $this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE;
+ }
+ $this->attr[$name] = $value;
+ }
+
+ function __isset($name)
+ {
+ switch ($name)
+ {
+ case 'outertext': return true;
+ case 'innertext': return true;
+ case 'plaintext': return true;
+ }
+ //no value attr: nowrap, checked selected...
+ return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]);
+ }
+
+ function __unset($name) {
+ if (isset($this->attr[$name]))
+ unset($this->attr[$name]);
+ }
+
+ // PaperG - Function to convert the text from one character set to another if the two sets are not the same.
+ function convert_text($text)
+ {
+ global $debug_object;
+ if (is_object($debug_object)) {$debug_object->debug_log_entry(1);}
+
+ $converted_text = $text;
+
+ $sourceCharset = "";
+ $targetCharset = "";
+
+ if ($this->dom)
+ {
+ $sourceCharset = strtoupper($this->dom->_charset);
+ $targetCharset = strtoupper($this->dom->_target_charset);
+ }
+ if (is_object($debug_object)) {$debug_object->debug_log(3, "source charset: " . $sourceCharset . " target charaset: " . $targetCharset);}
+
+ if (!empty($sourceCharset) && !empty($targetCharset) && (strcasecmp($sourceCharset, $targetCharset) != 0))
+ {
+ // Check if the reported encoding could have been incorrect and the text is actually already UTF-8
+ if ((strcasecmp($targetCharset, 'UTF-8') == 0) && ($this->is_utf8($text)))
+ {
+ $converted_text = $text;
+ }
+ else
+ {
+ $converted_text = iconv($sourceCharset, $targetCharset, $text);
+ }
+ }
+
+ // Lets make sure that we don't have that silly BOM issue with any of the utf-8 text we output.
+ if ($targetCharset == 'UTF-8')
+ {
+ if (substr($converted_text, 0, 3) == "\xef\xbb\xbf")
+ {
+ $converted_text = substr($converted_text, 3);
+ }
+ if (substr($converted_text, -3) == "\xef\xbb\xbf")
+ {
+ $converted_text = substr($converted_text, 0, -3);
+ }
+ }
+
+ return $converted_text;
+ }
+
+ /**
+ * Returns true if $string is valid UTF-8 and false otherwise.
+ *
+ * @param mixed $str String to be tested
+ * @return boolean
+ */
+ static function is_utf8($str)
+ {
+ $c=0; $b=0;
+ $bits=0;
+ $len=strlen($str);
+ for($i=0; $i<$len; $i++)
+ {
+ $c=ord($str[$i]);
+ if($c > 128)
+ {
+ if(($c >= 254)) return false;
+ elseif($c >= 252) $bits=6;
+ elseif($c >= 248) $bits=5;
+ elseif($c >= 240) $bits=4;
+ elseif($c >= 224) $bits=3;
+ elseif($c >= 192) $bits=2;
+ else return false;
+ if(($i+$bits) > $len) return false;
+ while($bits > 1)
+ {
+ $i++;
+ $b=ord($str[$i]);
+ if($b < 128 || $b > 191) return false;
+ $bits--;
+ }
+ }
+ }
+ return true;
+ }
+ /*
+ function is_utf8($string)
+ {
+ //this is buggy
+ return (utf8_encode(utf8_decode($string)) == $string);
+ }
+ */
+
+ /**
+ * Function to try a few tricks to determine the displayed size of an img on the page.
+ * NOTE: This will ONLY work on an IMG tag. Returns FALSE on all other tag types.
+ *
+ * @author John Schlick
+ * @version April 19 2012
+ * @return array an array containing the 'height' and 'width' of the image on the page or -1 if we can't figure it out.
+ */
+ function get_display_size()
+ {
+ global $debug_object;
+
+ $width = -1;
+ $height = -1;
+
+ if ($this->tag !== 'img')
+ {
+ return false;
+ }
+
+ // See if there is aheight or width attribute in the tag itself.
+ if (isset($this->attr['width']))
+ {
+ $width = $this->attr['width'];
+ }
+
+ if (isset($this->attr['height']))
+ {
+ $height = $this->attr['height'];
+ }
+
+ // Now look for an inline style.
+ if (isset($this->attr['style']))
+ {
+ // Thanks to user gnarf from stackoverflow for this regular expression.
+ $attributes = array();
+ preg_match_all("/([\w-]+)\s*:\s*([^;]+)\s*;?/", $this->attr['style'], $matches, PREG_SET_ORDER);
+ foreach ($matches as $match) {
+ $attributes[$match[1]] = $match[2];
+ }
+
+ // If there is a width in the style attributes:
+ if (isset($attributes['width']) && $width == -1)
+ {
+ // check that the last two characters are px (pixels)
+ if (strtolower(substr($attributes['width'], -2)) == 'px')
+ {
+ $proposed_width = substr($attributes['width'], 0, -2);
+ // Now make sure that it's an integer and not something stupid.
+ if (filter_var($proposed_width, FILTER_VALIDATE_INT))
+ {
+ $width = $proposed_width;
+ }
+ }
+ }
+
+ // If there is a width in the style attributes:
+ if (isset($attributes['height']) && $height == -1)
+ {
+ // check that the last two characters are px (pixels)
+ if (strtolower(substr($attributes['height'], -2)) == 'px')
+ {
+ $proposed_height = substr($attributes['height'], 0, -2);
+ // Now make sure that it's an integer and not something stupid.
+ if (filter_var($proposed_height, FILTER_VALIDATE_INT))
+ {
+ $height = $proposed_height;
+ }
+ }
+ }
+
+ }
+
+ // Future enhancement:
+ // Look in the tag to see if there is a class or id specified that has a height or width attribute to it.
+
+ // Far future enhancement
+ // Look at all the parent tags of this image to see if they specify a class or id that has an img selector that specifies a height or width
+ // Note that in this case, the class or id will have the img subselector for it to apply to the image.
+
+ // ridiculously far future development
+ // If the class or id is specified in a SEPARATE css file thats not on the page, go get it and do what we were just doing for the ones on the page.
+
+ $result = array('height' => $height,
+ 'width' => $width);
+ return $result;
+ }
+
+ // camel naming conventions
+ function getAllAttributes() {return $this->attr;}
+ function getAttribute($name) {return $this->__get($name);}
+ function setAttribute($name, $value) {$this->__set($name, $value);}
+ function hasAttribute($name) {return $this->__isset($name);}
+ function removeAttribute($name) {$this->__set($name, null);}
+ function getElementById($id) {return $this->find("#$id", 0);}
+ function getElementsById($id, $idx=null) {return $this->find("#$id", $idx);}
+ function getElementByTagName($name) {return $this->find($name, 0);}
+ function getElementsByTagName($name, $idx=null) {return $this->find($name, $idx);}
+ function parentNode() {return $this->parent();}
+ function childNodes($idx=-1) {return $this->children($idx);}
+ function firstChild() {return $this->first_child();}
+ function lastChild() {return $this->last_child();}
+ function nextSibling() {return $this->next_sibling();}
+ function previousSibling() {return $this->prev_sibling();}
+ function hasChildNodes() {return $this->has_child();}
+ function nodeName() {return $this->tag;}
+ function appendChild($node) {$node->parent($this); return $node;}
+
+}
+
+/**
+ * simple html dom parser
+ * Paperg - in the find routine: allow us to specify that we want case insensitive testing of the value of the selector.
+ * Paperg - change $size from protected to public so we can easily access it
+ * Paperg - added ForceTagsClosed in the constructor which tells us whether we trust the html or not. Default is to NOT trust it.
+ *
+ * @package PlaceLocalInclude
+ */
+class ums_simple_html_dom
+{
+ /**
+ * The root node of the document
+ *
+ * @var object
+ */
+ public $root = null;
+
+ /**
+ * List of nodes in the current DOM
+ *
+ * @var array
+ */
+ public $nodes = array();
+
+ /**
+ * Callback function to run for each element in the DOM.
+ *
+ * @var callable|null
+ */
+ public $callback = null;
+
+ /**
+ * Indicates how tags and attributes are matched
+ *
+ * @var bool When set to **true** tags and attributes will be converted to
+ * lowercase before matching.
+ */
+ public $lowercase = false;
+
+ /**
+ * Original document size
+ *
+ * Holds the original document size.
+ *
+ * @var int
+ */
+ public $original_size;
+
+ /**
+ * Current document size
+ *
+ * Holds the current document size. The document size is determined by the
+ * string length of ({@see ums_simple_html_dom::$doc}).
+ *
+ * _Note_: Using this variable is more efficient than calling `strlen($doc)`
+ *
+ * @var int
+ * */
+ public $size;
+
+ /**
+ * Current position in the document
+ *
+ * @var int
+ */
+ protected $pos;
+
+ /**
+ * The document
+ *
+ * @var string
+ */
+ protected $doc;
+
+ /**
+ * Current character
+ *
+ * Holds the current character at position {@see ums_simple_html_dom::$pos} in
+ * the document {@see ums_simple_html_dom::$doc}
+ *
+ * _Note_: Using this variable is more efficient than calling `substr($doc, $pos, 1)`
+ *
+ * @var string
+ */
+ protected $char;
+
+ protected $cursor;
+
+ /**
+ * Parent node of the next node detected by the parser
+ *
+ * @var object
+ */
+ protected $parent;
+ protected $noise = array();
+
+ /**
+ * Tokens considered blank in HTML
+ *
+ * @var string
+ */
+ protected $token_blank = " \t\r\n";
+
+ /**
+ * Tokens to identify the equal sign for attributes, stopping either at the
+ * closing tag ("/" i.e. " ") or the end of an opening tag (">" i.e.
+ * "")
+ *
+ * @var string
+ */
+ protected $token_equal = ' =/>';
+
+ /**
+ * Tokens to identify the end of a tag name. A tag name either ends on the
+ * ending slash ("/" i.e. " ") or whitespace ("\s\r\n\t")
+ *
+ * @var string
+ */
+ protected $token_slash = " />\r\n\t";
+
+ /**
+ * Tokens to identify the end of an attribute
+ *
+ * @var string
+ */
+ protected $token_attr = ' >';
+
+ // Note that this is referenced by a child node, and so it needs to be public for that node to see this information.
+ public $_charset = '';
+ public $_target_charset = '';
+
+ /**
+ * Innertext for elements
+ *
+ * @var string
+ */
+ protected $default_br_text = "";
+
+ /**
+ * Suffix for elements
+ *
+ * @var string
+ */
+ public $default_span_text = "";
+
+ /**
+ * Defines a list of self-closing tags (Void elements) according to the HTML
+ * Specification
+ *
+ * _Remarks_:
+ * - Use `isset()` instead of `in_array()` on array elements to boost
+ * performance about 30%
+ * - Sort elements by name for better readability!
+ *
+ * @link https://www.w3.org/TR/html HTML Specification
+ * @link https://www.w3.org/TR/html/syntax.html#void-elements Void elements
+ */
+ protected $self_closing_tags = array(
+ 'area'=>1,
+ 'base'=>1,
+ 'br'=>1,
+ 'col'=>1,
+ 'embed'=>1,
+ 'hr'=>1,
+ 'img'=>1,
+ 'input'=>1,
+ 'link'=>1,
+ 'meta'=>1,
+ 'param'=>1,
+ 'source'=>1,
+ 'track'=>1,
+ 'wbr'=>1
+ );
+
+ /**
+ * Defines a list of tags which - if closed - close all optional closing
+ * elements within if they haven't been closed yet. (So, an element where
+ * neither opening nor closing tag is omissible consistently closes every
+ * optional closing element within)
+ *
+ * _Remarks_:
+ * - Use `isset()` instead of `in_array()` on array elements to boost
+ * performance about 30%
+ * - Sort elements by name for better readability!
+ */
+ protected $block_tags = array(
+ 'body'=>1,
+ 'div'=>1,
+ 'form'=>1,
+ 'root'=>1,
+ 'span'=>1,
+ 'table'=>1
+ );
+
+ /**
+ * Defines elements whose end tag is omissible.
+ *
+ * * key = Name of an element whose end tag is omissible.
+ * * value = Names of elements whose end tag is omissible, that are closed
+ * by the current element.
+ *
+ * _Remarks_:
+ * - Use `isset()` instead of `in_array()` on array elements to boost
+ * performance about 30%
+ * - Sort elements by name for better readability!
+ *
+ * **Example**
+ *
+ * An `li` element???s end tag may be omitted if the `li` element is immediately
+ * followed by another `li` element. To do that, add following element to the
+ * array:
+ *
+ * ```php
+ * 'li' => array('li'),
+ * ```
+ *
+ * With this, the following two examples are considered equal. Note that the
+ * second example is missing the closing tags on `li` elements.
+ *
+ * ```html
+ *
+ * ```
+ *
+ *
+ *
+ * ```html
+ *
+ * ```
+ *
+ *
+ *
+ * @var array A two-dimensional array where the key is the name of an
+ * element whose end tag is omissible and the value is an array of elements
+ * whose end tag is omissible, that are closed by the current element.
+ *
+ * @link https://www.w3.org/TR/html/syntax.html#optional-tags Optional tags
+ *
+ * @todo The implementation of optional closing tags doesn't work in all cases
+ * because it only consideres elements who close other optional closing
+ * tags, not taking into account that some (non-blocking) tags should close
+ * these optional closing tags. For example, the end tag for "p" is omissible
+ * and can be closed by an "address" element, whose end tag is NOT omissible.
+ * Currently a "p" element without closing tag stops at the next "p" element
+ * or blocking tag, even if it contains other elements.
+ *
+ * @todo Known sourceforge issue #2977341
+ * B tags that are not closed cause us to return everything to the end of
+ * the document.
+ */
+ protected $optional_closing_tags = array(
+ 'b'=>array('b'=>1), // Not optional, see https://www.w3.org/TR/html/textlevel-semantics.html#the-b-element
+ 'dd'=>array('dd'=>1, 'dt'=>1),
+ 'dl'=>array('dd'=>1, 'dt'=>1), // Not optional, see https://www.w3.org/TR/html/grouping-content.html#the-dl-element
+ 'dt'=>array('dd'=>1, 'dt'=>1),
+ 'li'=>array('li'=>1),
+ 'optgroup'=>array('optgroup'=>1, 'option'=>1),
+ 'option'=>array('optgroup'=>1, 'option'=>1),
+ 'p'=>array('p'=>1),
+ 'rp'=>array('rp'=>1, 'rt'=>1),
+ 'rt'=>array('rp'=>1, 'rt'=>1),
+ 'td'=>array('td'=>1, 'th'=>1),
+ 'th'=>array('td'=>1, 'th'=>1),
+ 'tr'=>array('td'=>1, 'th'=>1, 'tr'=>1),
+ );
+
+ function __construct($str=null, $lowercase=true, $forceTagsClosed=true, $target_charset=DEFAULT_TARGET_CHARSET, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT, $options=0)
+ {
+ if ($str)
+ {
+ global $wp_filesystem;
+ if ( ! is_a( $wp_filesystem, 'WP_Filesystem_Base') ){
+ include_once(ABSPATH . 'wp-admin/includes/file.php');$creds = request_filesystem_credentials( site_url() );
+ wp_filesystem($creds);
+ }
+ if (preg_match("/^http:\/\//i",$str) || $wp_filesystem->is_file($str))
+ {
+ $this->load_file($str);
+ }
+ else
+ {
+ $this->load($str, $lowercase, $stripRN, $defaultBRText, $defaultSpanText, $options);
+ }
+ }
+ // Forcing tags to be closed implies that we don't trust the html, but it can lead to parsing errors if we SHOULD trust the html.
+ if (!$forceTagsClosed) {
+ $this->optional_closing_array=array();
+ }
+ $this->_target_charset = $target_charset;
+ }
+
+ function __destruct()
+ {
+ $this->clear();
+ }
+
+ // load html from string
+ function load($str, $lowercase=true, $stripRN=true, $defaultBRText=DEFAULT_BR_TEXT, $defaultSpanText=DEFAULT_SPAN_TEXT, $options=0)
+ {
+ global $debug_object;
+
+ // prepare
+ $this->prepare($str, $lowercase, $defaultBRText, $defaultSpanText);
+
+ // Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037
+ // Script tags removal now preceeds style tag removal.
+ // strip out