text:
<?php /** @file */

namespace Zotlabs\Module;

use \Zotlabs\Lib as Zlib;
use \Michelf\MarkdownExtra;

require_once('include/acl_selectors.php');
require_once('include/conversation.php');
require_once('include/bbcode.php');

class Wiki extends \Zotlabs\Web\Controller {

	private $wiki = null;

	function init() {
		// Determine which channel's wikis to display to the observer
		$nick = null;
		if (argc() > 1)
			$nick = argv(1); // if the channel name is in the URL, use that
		if (! $nick && local_channel()) { // if no channel name was provided, assume the current logged in channel
			$channel = \App::get_channel();
			if ($channel && $channel['channel_address']) {
				$nick = $channel['channel_address'];
				goaway(z_root() . '/wiki/' . $nick);
			}
		}
		if (! $nick) {
			notice( t('Profile Unavailable.') . EOL);
			goaway(z_root());
		}

		profile_load($nick);
	}

	function get() {

		if(observer_prohibited(true)) {
			return login();
		}

		if(! feature_enabled(\App::$profile_uid,'wiki')) {
			notice( t('Not found') . EOL);
			return;
 		}

		if(! perm_is_allowed(\App::$profile_uid,get_observer_hash(),'view_wiki')) {
			notice( t('Permission denied.') . EOL);
			return;
		}

		// TODO: Combine the interface configuration into a unified object
		// Something like $interface = array('new_page_button' => false, 'new_wiki_button' => false, ...)

		$wiki_owner = false;
		$showNewWikiButton = false;
		$pageHistory = array();
		$local_observer = null;
		$resource_id = '';

		// init() should have forced the URL to redirect to /wiki/channel so assume argc() > 1

		$nick = argv(1);
		$owner = channelx_by_nick($nick);  // The channel who owns the wikis being viewed
		if(! $owner) {
			notice( t('Invalid channel') . EOL);
			goaway('/' . argv(0));
		}

		$observer_hash = get_observer_hash();

		// Determine if the observer is the channel owner so the ACL dialog can be populated
		if (local_channel() === intval($owner['channel_id'])) {

			$wiki_owner = true;

			nav_set_selected('Wiki');

			// Obtain the default permission settings of the channel
			$owner_acl = array(
				'allow_cid' => $owner['channel_allow_cid'],
				'allow_gid' => $owner['channel_allow_gid'],
				'deny_cid' => $owner['channel_deny_cid'],
				'deny_gid' => $owner['channel_deny_gid']
			);

			// Initialize the ACL to the channel default permissions

			$x = array(
					'lockstate' => (( $owner['channel_allow_cid'] ||
						$owner['channel_allow_gid'] ||
						$owner['channel_deny_cid'] ||
						$owner['channel_deny_gid'])
						? 'lock' : 'unlock'
					),
					'acl' => populate_acl($owner_acl),
					'allow_cid' => acl2json($owner_acl['allow_cid']),
					'allow_gid' => acl2json($owner_acl['allow_gid']),
					'deny_cid'  => acl2json($owner_acl['deny_cid']),
					'deny_gid'  => acl2json($owner_acl['deny_gid']),
					'bang' => ''
			);
		}
		else {
			// Not the channel owner
			$owner_acl = $x = array();
		}

		$is_owner = ((local_channel()) && (local_channel() == \App::$profile['profile_uid']) ? true : false);
		//$o = profile_tabs($a, $is_owner, \App::$profile['channel_address']);
		$o = '';

		// Download a wiki

		if((argc() > 3) && (argv(2) === 'download') && (argv(3) === 'wiki')) {

			$resource_id = argv(4);
			$w = Zlib\NativeWiki::get_wiki($owner['channel_id'],$observer_hash,$resource_id);

//			$w = Zlib\NativeWiki::get_wiki($owner,$observer_hash,$resource_id);
			if(! $w['htmlName']) {
				notice(t('Error retrieving wiki') . EOL);
			}

			$zip_folder_name = random_string(10);
			$zip_folderpath = '/tmp/' . $zip_folder_name;
			if(!mkdir($zip_folderpath, 0770, false)) {
				logger('Error creating zip file export folder: ' . $zip_folderpath, LOGGER_NORMAL);
				notice(t('Error creating zip file export folder') . EOL);
			}

			$zip_filename = $w['urlName'];
			$zip_filepath = '/tmp/' . $zip_folder_name . '/' . $zip_filename;

			// Generate the zip file

			$zip = new \ZipArchive;
			$r = $zip->open($zip_filepath, \ZipArchive::CREATE);
			if($r === true) {
				$pages = [];
				$i = q("select * from item where resource_type = 'nwikipage' and resource_id = '%s' order by revision desc",
					dbesc($resource_id)
				);

				if($i) {
					foreach($i as $iv) {
						if(in_array($iv['mid'],$pages))
							continue;

						if($iv['mimetype'] === 'text/plain') {
							$content = html_entity_decode($iv['body'],ENT_COMPAT,'UTF-8');
						}
						elseif($iv['mimetype'] === 'text/bbcode') {
							$content = html_entity_decode($iv['body'],ENT_COMPAT,'UTF-8');
						}
						elseif($iv['mimetype'] === 'text/markdown') {
							$content = html_entity_decode(Zlib\MarkdownSoap::unescape($iv['body']),ENT_COMPAT,'UTF-8');
						}
						$fname = get_iconfig($iv['id'],'nwikipage','pagetitle') . Zlib\NativeWikiPage::get_file_ext($iv);
						$zip->addFromString($fname,$content);
						$pages[] = $iv['mid'];
					}

				}

			}
			$zip->close();

			// Output the file for download

			header('Content-disposition: attachment; filename="' . $zip_filename . '.zip"');
			header('Content-Type: application/zip');

			$success = readfile($zip_filepath);

			if(!$success) {
				logger('Error downloading wiki: ' . $resource_id);
				notice(t('Error downloading wiki: ' . $resource_id) . EOL);
			}

			// delete temporary files
			rrmdir($zip_folderpath);
			killme();

		}

		switch(argc()) {
			case 2:
				$wikis = Zlib\NativeWiki::listwikis($owner, get_observer_hash());

				if($wikis) {
					$o .= replace_macros(get_markup_template('wikilist.tpl'), array(
						'$header' => t('Wikis'),
						'$channel' => $owner['channel_address'],
						'$wikis' => $wikis['wikis'],
						// If the observer is the local channel owner, show the wiki controls
						'$owner' => ((local_channel() && local_channel() === intval(\App::$profile['uid'])) ? true : false),
						'$edit' => t('Edit'),
						'$download' => t('Download'),
						'$view' => t('View'),
						'$create' => t('Create New'),
						'$submit' => t('Submit'),
						'$wikiName' => array('wikiName', t('Wiki name')),
						'$mimeType' => array('mimeType', t('Content type'), '', '', ['text/markdown' => t('Markdown'), 'text/bbcode' => t('BBcode'), 'text/plain' => t('Text') ]),
						'$name' => t('Name'),
						'$type' => t('Type'),
						'$unlocked' => t('Any type'),
						'$lockstate' => $x['lockstate'],
						'$acl' => $x['acl'],
						'$allow_cid' => $x['allow_cid'],
						'$allow_gid' => $x['allow_gid'],
						'$deny_cid' => $x['deny_cid'],
						'$deny_gid' => $x['deny_gid'],
						'$typelock' => array('typelock', t('Lock content type'), '', '', array(t('No'), t('Yes'))),
						'$notify' => array('postVisible', t('Create a status post for this wiki'), '', '', array(t('No'), t('Yes'))),
						'$edit_wiki_name' => t('Edit Wiki Name')
					));

					return $o;
				}
				break;

			case 3:

				// /wiki/channel/wiki -> No page was specified, so redirect to Home.md

				$wikiUrlName = urlencode(argv(2));
				goaway(z_root() . '/' . argv(0) . '/' . argv(1) . '/' . $wikiUrlName . '/Home');

			case 4:
			default:

				// GET /wiki/channel/wiki/page
				// Fetch the wiki info and determine observer permissions

				$wikiUrlName = urldecode(argv(2));

				$page_name = '';
				$ignore_language = false;

				for($x = 3; $x < argc(); $x ++) {
					if($page_name === '' && argv($x) === '-') {
						$ignore_language = true;
						continue;
					}
					if($page_name) {
						$page_name .= '/';
					}
					$page_name .= argv($x);
				}

				$pageUrlName = urldecode($page_name);
				$langPageUrlName = urldecode(\App::$language . '/' . $page_name);

				$w = Zlib\NativeWiki::exists_by_name($owner['channel_id'], $wikiUrlName);

				if(! $w['resource_id']) {
					notice(t('Wiki not found') . EOL);
					goaway(z_root() . '/' . argv(0) . '/' . argv(1));
				}

				$resource_id = $w['resource_id'];

				if(! $wiki_owner) {
					// Check for observer permissions
					$observer_hash = get_observer_hash();
					$perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
					if(! $perms['read']) {
						notice(t('Permission denied.') . EOL);
						goaway(z_root() . '/' . argv(0) . '/' . argv(1));
						return; //not reached
					}
					$wiki_editor = (($perms['write']) ? true : false);
				}
				else {
					$wiki_editor = true;
				}

				$wikiheaderName = urldecode($wikiUrlName);
				$wikiheaderPage = urldecode($pageUrlName);

				$renamePage = (($wikiheaderPage === 'Home') ? '' : t('Rename page'));
				$p = [];

				if(! $ignore_language) {
					$p = Zlib\NativeWikiPage::get_page_content(array('channel_id' => $owner['channel_id'], 'observer_hash' => $observer_hash, 'resource_id' => $resource_id, 'pageUrlName' => $langPageUrlName));
				}
				if(! ($p && $p['success'])) {
					$p = Zlib\NativeWikiPage::get_page_content(array('channel_id' => $owner['channel_id'], 'observer_hash' => $observer_hash, 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
				}
				if(! ($p && $p['success'])) {
			                $x = new \Zotlabs\Widget\Wiki_pages();

			                $html = $x->create_missing_page([
				                'resource_id' => $resource_id,
				                'channel_id' => $owner['channel_id'],
				                'channel_address' => $owner['channel_address'],
				                'refresh' => true
			                ]);
			                //json_return_and_die(array('pages' => $page_list_html, 'message' => '', 'success' => true));
					notice( t('Error retrieving page content') . EOL);
					//goaway(z_root() . '/' . argv(0) . '/' . argv(1) );
				        $renderedContent = Zlib\NativeWikiPage::convert_links($html, argv(0) . '/' . argv(1) . '/' . $wikiUrlName);
				        $showPageControls = $wiki_editor;
				}
                                else {
				    $mimeType = $p['pageMimeType'];

				    $sampleContent = (($mimeType == 'text/bbcode') ? '[h3]' . t('New page') . '[/h3]' : '### ' . t('New page'));
				    if($mimeType === 'text/plain')
				        $sampleContent = t('New page');

				    $content = (($p['content'] == '') ? $sampleContent : $p['content']);

				    // Render the Markdown-formatted page content in HTML
				    if($mimeType == 'text/bbcode') {
				        $renderedContent = Zlib\NativeWikiPage::convert_links(zidify_links(smilies(bbcode($content))), argv(0) . '/' . argv(1) . '/' . $wikiUrlName);
				    }
			 	    elseif($mimeType === 'text/plain') {
				        $renderedContent = str_replace(["\n",' ',"\t"],[EOL,' ','    '],htmlentities($content,ENT_COMPAT,'UTF-8',false));
				    }
				    elseif($mimeType === 'text/markdown') {
				     $content = Zlib\MarkdownSoap::unescape($content);
				     $html = Zlib\NativeWikiPage::generate_toc(zidify_text(MarkdownExtra::defaultTransform(Zlib\NativeWikiPage::bbcode($content))));
				     $renderedContent = Zlib\NativeWikiPage::convert_links($html, argv(0) . '/' . argv(1) . '/' . $wikiUrlName);
				    }
				    $showPageControls = $wiki_editor;
                                }
				break;
//			default:	// Strip the extraneous URL components
//				goaway('/' . argv(0) . '/' . argv(1) . '/' . $wikiUrlName . '/' . $pageUrlName);
		}

		$wikiModalID = random_string(3);

		$wikiModal = replace_macros(get_markup_template('generic_modal.tpl'), array(
			'$id' => $wikiModalID,
			'$title' => t('Revision Comparison'),
			'$ok' => (($showPageControls) ? t('Revert') : ''),
			'$cancel' => t('Cancel')
		));

		$types = [ 'text/bbcode' => t('BBcode'), 'text/markdown' => t('Markdown'), 'text/plain' => 'Text' ];
		$currenttype = $types[$mimeType];

		$placeholder = t('Short description of your changes (optional)');

		$o .= replace_macros(get_markup_template('wiki.tpl'),array(
			'$wikiheaderName' => $wikiheaderName,
			'$wikiheaderPage' => $wikiheaderPage,
			'$renamePage' => $renamePage,
			'$showPageControls' => $showPageControls,
			'$editOrSourceLabel' => (($showPageControls) ? t('Edit') : t('Source')),
			'$tools_label' => 'Page Tools',
			'$channel_address' => $owner['channel_address'],
			'$channel_id' => $owner['channel_id'],
			'$resource_id' => $resource_id,
			'$page' => $pageUrlName,
			'$mimeType' => $mimeType,
			'$typename' => $currenttype,
			'$content' => $content,
			'$renderedContent' => $renderedContent,
			'$pageRename' => array('pageRename', t('New page name'), '', ''),
			'$commitMsg' => array('commitMsg', '', '', '', '', 'placeholder="' . $placeholder . '"'),
			'$wikiModal' => $wikiModal,
			'$wikiModalID' => $wikiModalID,
			'$commit' => 'HEAD',
			'$embedPhotos' => t('Embed image from photo albums'),
			'$embedPhotosModalTitle' => t('Embed an image from your albums'),
			'$embedPhotosModalCancel' => t('Cancel'),
			'$embedPhotosModalOK' => t('OK'),
			'$modalchooseimages' => t('Choose images to embed'),
			'$modalchoosealbum' => t('Choose an album'),
			'$modaldiffalbum' => t('Choose a different album'),
			'$modalerrorlist' => t('Error getting album list'),
			'$modalerrorlink' => t('Error getting photo link'),
			'$modalerroralbum' => t('Error getting album'),
		));

		if($p['pageMimeType'] === 'text/markdown')
			head_add_js('/library/ace/ace.js');	// Ace Code Editor

		return $o;
	}

	function post() {

		require_once('include/bbcode.php');

		$nick = argv(1);
		$owner = channelx_by_nick($nick);
		$observer_hash = get_observer_hash();

		if(! $owner) {
			notice( t('Permission denied.') . EOL);
			return;
		}

		// /wiki/channel/preview
		// Render mardown-formatted text in HTML for preview
		if((argc() > 2) && (argv(2) === 'preview')) {
			$content = $_POST['content'];
			$resource_id = $_POST['resource_id'];

			$w = Zlib\NativeWiki::get_wiki($owner['channel_id'],$observer_hash,$resource_id);

			$wikiURL = argv(0) . '/' . argv(1) . '/' . $w['urlName'];

			$mimeType = $_POST['mimetype'];

			if($mimeType === 'text/bbcode') {
				$html = Zlib\NativeWikiPage::convert_links(zidify_links(smilies(bbcode($content))),$wikiURL);
			}
			elseif($mimeType === 'text/markdown') {
				$bb = Zlib\NativeWikiPage::bbcode($content);
				$x = new ZLib\MarkdownSoap($bb);
				$md = $x->clean();
				$md = ZLib\MarkdownSoap::unescape($md);
				$html = MarkdownExtra::defaultTransform($md);
				$html = Zlib\NativeWikiPage::generate_toc(zidify_text($html));
				$html = Zlib\NativeWikiPage::convert_links($html,$wikiURL);
			}
			elseif($mimeType === 'text/plain') {
				$html = str_replace(["\n",' ',"\t"],[EOL,' ','    '],htmlentities($content,ENT_COMPAT,'UTF-8',false));
			}
			json_return_and_die(array('html' => $html, 'success' => true));
		}

		// Create a new wiki
		// /wiki/channel/create/wiki
		if ((argc() > 3) && (argv(2) === 'create') && (argv(3) === 'wiki')) {

			// Only the channel owner can create a wiki, at least until we create a
			// more detail permissions framework

			if (local_channel() !== intval($owner['channel_id'])) {
				goaway('/' . argv(0) . '/' . $nick . '/');
			}
			$wiki = array();

			// backslashes won't work well in the javascript functions
			$name = str_replace('\\','',$_POST['wikiName']);

			// Generate new wiki info from input name
			$wiki['postVisible'] = ((intval($_POST['postVisible'])) ? 1 : 0);
			$wiki['rawName']     = $name;
			$wiki['htmlName']    = escape_tags($name);
			$wiki['urlName']     = urlencode(urlencode($name));
			$wiki['mimeType']    = $_POST['mimeType'];
			$wiki['typelock']    = $_POST['typelock'];

			if($wiki['urlName'] === '') {
				notice( t('Error creating wiki. Invalid name.') . EOL);
				goaway('/wiki');
				return; //not reached
			}

			$exists = Zlib\NativeWiki::exists_by_name($owner['channel_id'], $wiki['urlName']);
			if($exists['id']) {
				notice( t('A wiki with this name already exists.') . EOL);
				goaway('/wiki');
				return; //not reached
			}

			// Get ACL for permissions
			$acl = new \Zotlabs\Access\AccessList($owner);
			$acl->set_from_array($_POST);
			$r = Zlib\NativeWiki::create_wiki($owner, $observer_hash, $wiki, $acl);
			if($r['success']) {
				Zlib\NativeWiki::sync_a_wiki_item($owner['channel_id'],$r['item_id'],$r['item']['resource_id']);
				$homePage = Zlib\NativeWikiPage::create_page($owner['channel_id'],$observer_hash,'Home', $r['item']['resource_id'], $wiki['mimeType']);
				if(! $homePage['success']) {
					notice( t('Wiki created, but error creating Home page.'));
					goaway(z_root() . '/wiki/' . $nick . '/' . $wiki['urlName']);
				}
				Zlib\NativeWiki::sync_a_wiki_item($owner['channel_id'],$homePage['item_id'],$r['item']['resource_id']);
				goaway(z_root() . '/wiki/' . $nick . '/' . $wiki['urlName'] . '/' . $homePage['page']['urlName']);
			}
			else {
				notice( t('Error creating wiki'));
				goaway(z_root() . '/wiki');
			}
		}

		// Update a wiki
		// /wiki/channel/update/wiki
		if ((argc() > 3) && (argv(2) === 'update') && (argv(3) === 'wiki')) {
			// Only the channel owner can update a wiki, at least until we create a
			// more detail permissions framework

			if (local_channel() !== intval($owner['channel_id'])) {
				goaway('/' . argv(0) . '/' . $nick . '/');
			}

			$arr = [];

			$arr['urlName'] = urlencode(urlencode($_POST['origRawName']));

			if($_POST['updateRawName'])
				$arr['updateRawName'] = $_POST['updateRawName'];

			if(($arr['urlName'] || $arr['updateRawName']) === '') {
				notice( t('Error updating wiki. Invalid name.') . EOL);
				goaway('/wiki');
				return; //not reached
			}

			$wiki = Zlib\NativeWiki::exists_by_name($owner['channel_id'], urldecode($arr['urlName']));

			if($wiki['resource_id']) {

				$arr['resource_id'] = $wiki['resource_id'];

				$acl = new \Zotlabs\Access\AccessList($owner);
				$acl->set_from_array($_POST);

				$r = Zlib\NativeWiki::update_wiki($owner['channel_id'], $observer_hash, $arr, $acl);
				if($r['success']) {
					Zlib\NativeWiki::sync_a_wiki_item($owner['channel_id'],$r['item_id'],$r['item']['resource_id']);
					goaway(z_root() . '/wiki/' . $nick);
				}
				else {
					notice( t('Error updating wiki'));
					goaway(z_root() . '/wiki');
				}

			}
			goaway(z_root() . '/wiki');
		}

		// Delete a wiki
		if ((argc() > 3) && (argv(2) === 'delete') && (argv(3) === 'wiki')) {

			// Only the channel owner can delete a wiki, at least until we create a
			// more detail permissions framework
			if (local_channel() !== intval($owner['channel_id'])) {
				logger('Wiki delete permission denied.');
				json_return_and_die(array('message' => t('Wiki delete permission denied.'), 'success' => false));
			}
			$resource_id = $_POST['resource_id'];
			$deleted = Zlib\NativeWiki::delete_wiki($owner['channel_id'],$observer_hash,$resource_id);
			if ($deleted['success']) {
				Zlib\NativeWiki::sync_a_wiki_item($owner['channel_id'],$deleted['item_id'],$resource_id);
				json_return_and_die(array('message' => '', 'success' => true));
			}
			else {
				logger('Error deleting wiki: ' . $resource_id . ' ' . $deleted['message']);
				json_return_and_die(array('message' => t('Error deleting wiki'), 'success' => false));
			}
		}

		// Create a page
		if ((argc() === 4) && (argv(2) === 'create') && (argv(3) === 'page')) {

			$mimetype = $_POST['mimetype'];

			$resource_id = $_POST['resource_id'];
			// Determine if observer has permission to create a page

			$perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash, $mimetype);
			if(! $perms['write']) {
				logger('Wiki write permission denied. ' . EOL);
				json_return_and_die(array('success' => false));
			}

			$name = $_POST['pageName']; //Get new page name

			// backslashes won't work well in the javascript functions
			$name = str_replace('\\','',$name);

			if(urlencode(escape_tags($name)) === '') {
				json_return_and_die(array('message' => 'Error creating page. Invalid name (' . print_r($_POST,true) . ').', 'success' => false));
			}

			$page = Zlib\NativeWikiPage::create_page($owner['channel_id'],$observer_hash, $name, $resource_id, $mimetype);

			if($page['item_id']) {
				$commit = Zlib\NativeWikiPage::commit(array(
					'commit_msg'    => t('New page created'),
					'resource_id'   => $resource_id,
					'channel_id'    => $owner['channel_id'],
					'observer_hash' => $observer_hash,
					'pageUrlName'   => $name
				));

				if($commit['success']) {
					Zlib\NativeWiki::sync_a_wiki_item($owner['channel_id'],$commit['item_id'],$resource_id);
					json_return_and_die(array('url' => '/' . argv(0) . '/' . argv(1) . '/' . urlencode($page['wiki']['urlName']) . '/' . urlencode($page['page']['urlName']), 'success' => true));
				}
				else {
					json_return_and_die(array('message' => 'Error making git commit','url' => '/' . argv(0) . '/' . argv(1) . '/' . urlencode($page['wiki']['urlName']) . '/' . urlencode($page['page']['urlName']),'success' => false));
				}

			}
			else {
				logger('Error creating page');
				json_return_and_die(array('message' => 'Error creating page.', 'success' => false));
			}
		}

		// Fetch page list for a wiki
		if((argc() === 5) && (argv(2) === 'get') && (argv(3) === 'page') && (argv(4) === 'list')) {
			$resource_id = $_POST['resource_id']; // resource_id for wiki in db

			$perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
			if(!$perms['read']) {
				logger('Wiki read permission denied.' . EOL);
				json_return_and_die(array('pages' => null, 'message' => 'Permission denied.', 'success' => false));
			}

			// @FIXME - we shouldn't invoke this if it isn't in the PDL or has been over-ridden

			$x = new \Zotlabs\Widget\Wiki_pages();

			$page_list_html = $x->widget([
				'resource_id' => $resource_id,
				'channel_id' => $owner['channel_id'],
				'channel_address' => $owner['channel_address'],
				'refresh' => true
			]);
			json_return_and_die(array('pages' => $page_list_html, 'message' => '', 'success' => true));
		}

		// Save a page
		if ((argc() === 4) && (argv(2) === 'save') && (argv(3) === 'page')) {

			$resource_id = $_POST['resource_id'];
			$pageUrlName = $_POST['name'];
			$pageHtmlName = escape_tags($_POST['name']);
			$content = $_POST['content']; //Get new content
			$commitMsg = $_POST['commitMsg'];
			if ($commitMsg === '') {
				$commitMsg = 'Updated ' . $pageHtmlName;
			}

			// Determine if observer has permission to save content
			$perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
			if(! $perms['write']) {
				logger('Wiki write permission denied. ' . EOL);
				json_return_and_die(array('success' => false));
			}

			$saved = Zlib\NativeWikiPage::save_page(array('channel_id' => $owner['channel_id'], 'observer_hash' => $observer_hash, 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName, 'content' => $content));

			if($saved['success']) {
				$commit = Zlib\NativeWikiPage::commit(array(
					'commit_msg' => $commitMsg,
					'pageUrlName' => $pageUrlName,
					'resource_id' => $resource_id,
					'channel_id'    => $owner['channel_id'],
					'observer_hash' => $observer_hash,
					'revision' => (-1)
				));

				if($commit['success']) {
					Zlib\NativeWiki::sync_a_wiki_item($owner['channel_id'],$commit['item_id'],$resource_id);
					json_return_and_die(array('message' => 'Wiki git repo commit made', 'success' => true));
				}
				else {
					json_return_and_die(array('message' => 'Error making git commit','success' => false));
				}
			}
			else {
				json_return_and_die(array('message' => 'Error saving page', 'success' => false));
			}
		}

		// Update page history
		// /wiki/channel/history/page
		if ((argc() === 4) && (argv(2) === 'history') && (argv(3) === 'page')) {

			$resource_id = $_POST['resource_id'];
			$pageUrlName = $_POST['name'];

			// Determine if observer has permission to read content

			$perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
			if(! $perms['read']) {
				logger('Wiki read permission denied.' . EOL);
				json_return_and_die(array('historyHTML' => '', 'message' => 'Permission denied.', 'success' => false));
			}

			$historyHTML = \Zotlabs\Lib\NativeWikiPage::render_page_history(array(
				'resource_id' => $resource_id,
				'pageUrlName' => $pageUrlName,
				'permsWrite'  => $perms['write']
			));

			json_return_and_die(array('historyHTML' => $historyHTML, 'message' => '', 'success' => true));
		}

		// Delete a page
		if ((argc() === 4) && (argv(2) === 'delete') && (argv(3) === 'page')) {

			$resource_id = $_POST['resource_id'];
			$pageUrlName = $_POST['name'];

			if ($pageUrlName === 'Home') {
				json_return_and_die(array('message' => t('Cannot delete Home'),'success' => false));
			}
			// Determine if observer has permission to delete pages
			// currently just allow page owner

			if((! local_channel()) || (local_channel() != $owner['channel_id'])) {
				logger('Wiki write permission denied. ' . EOL);
				json_return_and_die(array('success' => false));
			}

			$perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
			if(! $perms['write']) {
				logger('Wiki write permission denied. ' . EOL);
				json_return_and_die(array('success' => false));
			}

			$deleted = Zlib\NativeWikiPage::delete_page(array('channel_id' => $owner['channel_id'], 'observer_hash' => $observer_hash, 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
			if($deleted['success']) {
				Zlib\NativeWiki::sync_a_wiki_item($owner['channel_id'],$commit['item_id'],$resource_id);
				json_return_and_die(array('message' => 'Wiki git repo commit made', 'success' => true));
			}
			else {
				json_return_and_die(array('message' => 'Error deleting page', 'success' => false));
			}
		}

		// Revert a page
		if ((argc() === 4) && (argv(2) === 'revert') && (argv(3) === 'page')) {

			$resource_id = $_POST['resource_id'];
			$pageUrlName = $_POST['name'];
			$commitHash = $_POST['commitHash'];
			// Determine if observer has permission to revert pages

			$perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
			if(! $perms['write']) {
				logger('Wiki write permission denied.' . EOL);
				json_return_and_die(array('success' => false));
			}

			$reverted = Zlib\NativeWikiPage::revert_page(array('channel_id' => $owner['channel_id'], 'observer_hash' => $observer_hash, 'commitHash' => $commitHash, 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
			if($reverted['success']) {
				json_return_and_die(array('content' => $reverted['content'], 'message' => '', 'success' => true));
			} else {
				json_return_and_die(array('content' => '', 'message' => 'Error reverting page', 'success' => false));
			}
		}

		// Compare page revisions
		if ((argc() === 4) && (argv(2) === 'compare') && (argv(3) === 'page')) {
			$resource_id = $_POST['resource_id'];
			$pageUrlName = $_POST['name'];
			$compareCommit = $_POST['compareCommit'];
			$currentCommit = $_POST['currentCommit'];
			// Determine if observer has permission to revert pages

			$perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
			if(!$perms['read']) {
				logger('Wiki read permission denied.' . EOL);
				json_return_and_die(array('success' => false));
			}

			$compare = Zlib\NativeWikiPage::compare_page(array('channel_id' => $owner['channel_id'], 'observer_hash' => $observer_hash, 'currentCommit' => $currentCommit, 'compareCommit' => $compareCommit, 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName));
			if($compare['success']) {
				$diffHTML = '<table class="text-center" width="100%"><tr><td class="lead" width="50%">' . t('Current Revision') . '</td><td class="lead" width="50%">' . t('Selected Revision') . '</td></tr></table>' . $compare['diff'];
				json_return_and_die(array('diff' => $diffHTML, 'message' => '', 'success' => true));
			} else {
				json_return_and_die(array('diff' => '', 'message' => 'Error comparing page', 'success' => false));
			}
		}

		// Rename a page
		if ((argc() === 4) && (argv(2) === 'rename') && (argv(3) === 'page')) {
			$resource_id = $_POST['resource_id'];
			$pageUrlName = $_POST['oldName'];
			$pageNewName = str_replace('\\','',$_POST['newName']);
			if ($pageUrlName === 'Home') {
				json_return_and_die(array('message' => 'Cannot rename Home','success' => false));
			}
			if(urlencode(escape_tags($pageNewName)) === '') {
				json_return_and_die(array('message' => 'Error renaming page. Invalid name.', 'success' => false));
			}
			// Determine if observer has permission to rename pages

			$perms = Zlib\NativeWiki::get_permissions($resource_id, intval($owner['channel_id']), $observer_hash);
			if(! $perms['write']) {
				logger('Wiki write permission denied. ' . EOL);
				json_return_and_die(array('success' => false));
			}

			$renamed = Zlib\NativeWikiPage::rename_page(array('channel_id' => $owner['channel_id'], 'observer_hash' => $observer_hash, 'resource_id' => $resource_id, 'pageUrlName' => $pageUrlName, 'pageNewName' => $pageNewName));

			if($renamed['success']) {
				$commit = Zlib\NativeWikiPage::commit(array(
					'channel_id' => $owner['channel_id'],
					'commit_msg' => 'Renamed ' . urldecode($pageUrlName) . ' to ' . $renamed['page']['htmlName'],
					'resource_id' => $resource_id,
					'observer_hash' => $observer_hash,
					'pageUrlName' => $pageNewName
				));
				if($commit['success']) {
					Zlib\NativeWiki::sync_a_wiki_item($owner['channel_id'],$commit['item_id'],$resource_id);
					json_return_and_die(array('name' => $renamed['page'], 'message' => 'Wiki git repo commit made', 'success' => true));
				}
				else {
					json_return_and_die(array('message' => 'Error making git commit','success' => false));
				}
			}
			else {
				json_return_and_die(array('message' => 'Error renaming page', 'success' => false));
			}
		}

		//notice( t('You must be authenticated.'));
		json_return_and_die(array('message' => t('You must be authenticated.'), 'success' => false));

	}
}

redpajama_set_name: RedPajamaGithub


Whether it is TV characters, animal movie stars or characters that feature in timeless childrens literature, you will find them here in our collection of Character soft toys. All available to ship immediately. These products are fully licensed soft toys unless otherwise specified in the detailed description.


The four finalists of the inaugural Experimental Architecture Award have been announced, recognising projects that combine real locations with virtual-reality fiction and installations that explore the guts of architecture.
Holly Hendry, Chris Hildrey, Lawrence Lek and Public Practice are the four experimental architects and artists that have been shortlisted for "pushing the boundaries of how we can explore, experience and create space in its many forms".
The Experimental Architecture Award was set up by the Arts Foundation to open discussions around the role of experimentation in contemporary architecture, and how architecture, art and design can address spatial issues.
"We really had to wrestle with the term 'experimental architecture'. What does it mean?" said Justin McGuirk, one of the award's judges and chief curator of London's Design Museum.
"We established quite quickly that it didn't mean what it might have in the 1970s – with paper architecture serving as a preamble to a future career designing buildings," he added.
"Rather, it seemed to be much more about other possibilities, from virtual spaces and bureaucratic systems to sculptural interventions."
Architect Chris Hildrey has been shortlisted for his radical methods of re-imagining cities with social issues at the forefront. He worked on his latest project, ProxyAddress, as part of his year as Designer in Residence at London's Design Museum.
He has already been recognised by RIBA for the project, a database that could match people facing homelessness with the address of an empty property to redirect official communications from. Many vital things such as banks and jobs require a permanent address, and being unable to access them can make a temporary slide into homelessness permanent.
Architect and visual artist Lawrence Lek has been recognised for his use of real-time graphics and VR to design utopian digital spaces. Lek takes real geographic places but imagines them in fictional scenarios in order to examine ideas around the experience of space.
These site-specific virtual worlds are created using a mix of gaming software, 3D animation, installation and performance, creating immersive virtual realms.
Also in the running to win the award is Sculptor Holly Hendry, who makes "materially overwhelming" pieces that use and sometimes exploit the normal rules of architecture.
Her pieces examine the cracks and rear views that reveal the inner workings of buildings, examining themes of bodily containment and expulsion. Her outsized installations often use less glamorous architectural elements such as air ducts and sewer pipes.
The shortlist is completed by Public Practice, founded by architects Pooja Agrawal and Finn Williams, a social enterprise that embeds architects and urbanists in local authorities.
These experts help teach proactive planning and empower public sector workers to think creatively to tackle issues such as affordable housing at a local level.
The award will be judged by McGuirk, along with AL_A founder Amanda Levete and director of the Architectural Association's Design Research Lab (AADRL) Theodore Spyropoulos..
Tracey Emin will announce the winner of the first Experimental Architecture Award at the Arts Foundation Futures Awards, held on 28 January at the Institute of Contemporary Art.
A fellowship of £10,000 will go to the winner, with the remaining three finalists each receiving £1,000.


text:
Q: Why does shelve module create database with .db extension? I run the code using the shelve module. I expect to get 3 files as a database: .dir, .dat and .bak. Instead, I have a file with the .db extension. I can't read the created database.
I work on the manaconda environment on a apple m1 chip,
rdkit 2022.03.5, python == 3.9.13.
If someone has encountered a similar problem, what could be the reason that shelve creates a database with the .db extension?
I ran the next simplest code:
import shelve
db = shelve.open('dbs/test', flag='c', protocol=4)
db['a'] = 'A'
db.close()

And the output file is:
dbs/test.db
The problem starts when I am working with the created db.
For example, with the simplest database (test.db) I can extract the keys by doing next:
db = shelve.open('dbs/test', flag='r', protocol=4)
names = db.keys()
print(tuple(names))

BUT but the same code run on a bigger database (with the strange for shelve .db extension) that I use for work, next error message appears:
SystemError                               Traceback (most recent call last)
Cell In [48], line 1
----> 1 tuple(names)

File ~/miniconda3/envs/rd22/lib/python3.9/_collections_abc.py:826, in KeysView.__iter__(self)
    825 def __iter__(self):
--> 826     yield from self._mapping

File ~/miniconda3/envs/rd22/lib/python3.9/shelve.py:95, in Shelf.__iter__(self)
     94 def __iter__(self):
---> 95     for k in self.dict.keys():
     96         yield k.decode(self.keyencoding)

SystemError: Negative size passed to PyBytes_FromStringAndSize

I did not have any similar problems when I worked with the usual DBM database format

redpajama_set_name: RedPajamaStackExchange


The University of Ulster's Fine and Applied Art students will host their annual Christmas sale at the Belfast campus next week.
Taking place on Thursday 9 December from 5pm until 7pm, the event presents an opportunity for students, staff and the public to purchase original pieces of work from up-and-coming young artists.
Cultural Development Officer at Ulster's Belfast campus said: "This year's Christmas event promises to be even bigger and better than before with work from a broader range of students on display.
"Textile Art, Jewellery and Ceramics students will be joined by Fashion and Printmaking students as well as the university's recently appointed Artists-in-Residence.
"The Student Christmas Sale is an excellent opportunity to buy unique pieces while at the same time supporting emerging new talent.
For further information email Tim Kerr, Cultural Development Officer, at t.kerr@ulster.ac.uk or telephone: 028 95367286.


Every song that comes on is greeted by an overly enthusiastic scream and fist pump combo on your part. Its only on your 3rd trip to bathroom that you realise you've probably had a bit too much to drink. You remember the vow you made to yourself when you were still sober "stay well away from the boss".
There are no positives that'll come from even being in the vicinity of the person that signs of on your payslips. Chances are something will happen, something bad, something that you will regret, (regret even more so than when you agreed to go on a date with the douchebag from sales).
You commend yourself on having remembered to stay well away from the boss. This is obviously something that calls for a celebration.On exiting the bathroom from trip no.3 you make a bee line for the free bar, 4 sheets of toilet paper roll in tail. You order a gin & tonic, a man standing to your right at the bar says "make it two of those please", that voice sounded very familiar. You slowly look to the right to see your boss…. well it would be rude not say hello wouldn't it?
Yeah, yeah, yeah you stole this from Bridget Jones but who cares? It's romantic to quote such a wonderful romcom as good old Bridge. Well, at least that's what you follow your declaration up with. The problem is, your boss is married, he explains to you again just as he did at your last failed attempt to woo him at last years Christmas party.
****Please also note that serenading him with a medley of Celine's greatest hits or breaking down to weep in his arms will not make you any more attractive.
Why oh why does alcohol make everyone so honest? Ok, so you'll feel empowered and a strange sense of leadership as you speak on the behalf of those around you, until you realise they are no longer around you. Your fellow colleagues with whom you have discussed the varying degrees of twatishness your boss can deliver, have shrunk back into the shadows, not quite wasted enough to support you on this one. I suppose here, the point is really to wait until late on in the night when someone else will be intoxicated enough to insult the boss with you.
Boss: Throws drink in your face.
You get the idea, this cannot go well.
So perhaps not something you shouldn't say, this is more a failed attempt at talking. The same rules still apply – do not open your mouth!
The situation that you do not want to find yourself in usually goes along these lines. You are legging it to the toilet, holding your mouth with one hand, drink in the other (throwing up is a mere blip to clear the path for more drinks, and you wouldn't want to waste a glass, get your priorities right) and on your tumultuous path stands your boss. You try to shoot past, holding up your glass as a disguise to shield your face, but alas still you are stopped for a chat. A discussion, a debate, a topic that will tie you in for a long, long time. As it's your boss you feel constrained to stay and because you are hammered you will puke. It will not be pretty.
Inevitably, when the alcohol effects wear off, you will be intimidated again and probably more so after this embarrassing episode. When your boss simply glares back in response to this ridiculous request, do not attempt to get them on the dance floor through physical force. Grabbing their arms and wiggling them around whilst doing a crazy hyped up bouncy jog yourself will not convince them.
Whatever you do, do not walk away from them announcing, "well, it's you who's missing out, I do a damn good Britney". You must avoid this at all costs, it would probably be an even better idea to take the stage by yourself and perform the full 3.37 second long routine to 'I'm slave for you', don't ask me why I know.


Bonus $10.00 london drugs gift card. With a minimum $30.00 cetaphil purchase with in-store coupon. Save 20% off our everyday low price!. Prices effective Friday, March 15 - Wednesday, March 27, 2019. Save Friday, March 15 - Wednesday, March 27, 2019.
107 g. Save Friday, March 15 - Wednesday, March 27, 2019.
Selected products. Mega volume with microfiber technology. New!. Save Friday, March 15 - Wednesday, March 27, 2019.
With in-store coupon. Free product must be of equal or lesser value than purchased products. Save Friday, March 15 - Wednesday, March 27, 2019.
Excludes magnetic lashes. Save 20% off our everyday low prices!. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
Excludes oral care products. Save 20% off our everyday low prices!. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
Excludes maqnetic lashes. For full & fluttery lashes. Includes easy applicator. 100% human hair. Lightweight. Reusable. Save 20% off our everyday low prices!. Everez lashes. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
Discover the new advanced products from dermatologist- grade neostrata. Save 20% off our everyday low price!. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
All mask. No mess. Instant on-the-go hydration. New olay. Save 20% off our everyday low price!. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
Save 20% off our everyday low price!. Free aveeno daily moisturizing lotion 354 ml. With a minimum $20 purchase of any aveeno skincare products. Value up to $10.39. With in-store coupon.
Selected products. Smell fresh all day.
Live clean hair care certified organic botanicals. Body wash 500 ml. Baby products select products. Liquid soap refill 1 L.
Live clean liquid soap 500 ml. Hand wash 400 ml.
Save 20% off our everyday low price!. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
Softsoap bodywash 443 ml/532 ml. Softsoap refill 828 ml. Irish spring body wash 532 ml. Softsoap liquid hand soap 384 ml. New.
Bayer aspirin low dose 180s. Aleve liquid gels 220 mg-80 s. Claritin select products, 24s/30s.
Benadryll allergy 40s/60s. Reactine allergy 24s-36s.
Permanent filtration for low operational maintenance. Get rid of up to 99% of airborne allergens, such as dust, pollen, and pet dander with this unit's high-efficiency HEPA type filtration. Choose from 3 speeds depending on room conditions Available in black or white.
Emergen-c 18 s-45 s. Centrum multivitamins selected products 50 s -100 s.
Captures certain airborne germs. Quiet operation. Circulates room air 5 times every hour. Honeywell compact airgenius 4 air cleaner. Air cleaner/odour reducer. Captures up to 99.9% of microscopic particles as small as 0.3 microns. Ideal for rooms up to 150 sq. ft.
Excludes essentials protein plus. Save up to 40% off our everyday low prices!.
Brookside chocolates 167 g - 235 g. Hershey dark chocolate thins assorted, 150 g. Newman-0's cookies assorted, 226 g.
Cadbury or neilson chocolates 85 g - 100 g. Maynards gummy candies 170 g - 185 g.
Excel, wrigley's juicy fruit or hubba bubba gum 4 pack/7 pack. Trident or dentyne 4 pack. Skittles or starburst 151 g - 191 g. M&m's milk chocolate bars 107-113 g.
Haagen-dazs multi-packs 3 pack/4 pack. Ice cream 475 ml/500 ml. Hot price.
Late july tortilla chips 156 g. Twizzlers licorice 300 g - 454 g. Peas please organic snacks 94 g.
85 g - 97 g.
Nestle snackin chocolates 20 piece. Nestle after eight, quality street or turtles 180 g - 300 g.
135 g - 246 g.
900 ml/5 x 200 ml.
Save 20% off our everyday low prices!. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
946 ml/1 L. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
Select products. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
Great looking hair made easy. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
London drugs ASA coated daily low-dose 81 mg - 180 s. London drugs diarrhea relief 42's. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
Select products 75 ml/100 ml. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
40's. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
Tylenol regular or extra strength select products, 100s/120s. Motrin ibuprofen select products 30s - 72 s. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
Fully automatic with 24-hour programmability. Direct flow vertical burr grinder design dispenses coffee straight into the brew basket. Auto rinse technology automatically self-cleans coffee ground outlet.
Extra-large convection oven with rotisserie. 120-minute audible tone timer. Limited quantities. Sorry, no rainchecks. Clearance.
Stainless steel blades for superior ice crushing. 950W peak-power motor. 55% quieter than a traditional blender.
30 pack/40 pack. Select varieties. Celebrate like masters with van houtte.
17-piece high-speed mixing system chops, whips, blends and more.
255 g - 340 g.
Starbucks coffee 793 g. Keurig brand k-cups starbucks coffee 24 packs.
Excludes 62/70 count. Prices effective Friday, March 15 - Wednesday, March 27, 2019.
Selected products. Work it. Prices effective Friday, March 15 - Wednesday, March 27, 2019.


text:
Q: Laravel 7 change name of login credentials I have a fresh installation of Laravel 7 without composer require laravel / ui. My goal is to change the default login as username/email and password.
Controller AuthController.php :
<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Validator,Redirect,Response;
Use App\User;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Session;

class AuthController extends Controller
{

    public function index()
    {
        return view('login');
    }

    public function registration()
    {
        return view('registration');
    }

    public function getAuthPassword()
    {
        return 'sms_code';
    }

    public function postLogin(Request $request)
    {
        request()->validate([
            'id_message' => 'required',
            'sms_code' => 'required',
        ]);

        $credentials = $request->only('id_message', 'sms_code');
           if (Auth::attempt($credentials)) {

        return redirect()->intended('dashboard');
        }
        return Redirect::to("login");
    }

    public function postRegistration(Request $request)
    {
      request()->validate([
        'id_message' => 'required',
        'sms_code' => 'required|min:6',
        'url_attribute' => 'required|min:6',
        'mail_from' => 'required',
        'mail_to' => 'required',
    ]);

    $data = $request->all();

    $check = $this->create($data);

    return Redirect::to("dashboard");
    }

    public function dashboard()
    {
      if(Auth::check())
      {
         return view('dashboard');
      }
         return Redirect::to("login");
      }

    public function create(array $data)
    {
      return User::create([
         'id_message' => $data['id_message'],
         'sms_code' => Hash::make($data['sms_code']),
         'url_attribute' => $data['url_attribute'],
         'mail_from' => $data['mail_from'],
         'mail_to' => $data['mail_to'],
      ]);
    }

    public function logout()
    {
         Session::flush();
         Auth::logout();
         return Redirect('login');
    }

}

Metod App\Http\User.php
<?php

namespace App;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use Notifiable;

protected $fillable = [
    'mail_from',
    'mail_to',
    'url_attribute',
    'sms_code',
    'id_message',
];

protected $hidden = [
    'sms_code', 'remember_token',
];

protected $casts = [

];
}

When i try fill login form with datas from database -> username as id_message and password as sms_code
Return this error:
ErrorException
Undefined index: password
Illuminate\Foundation\Bootstrap\HandleExceptions::handleError
vendor/laravel/framework/src/Illuminate/Auth/EloquentUserProvider.php:156

line 156 of EloquentUserProvider.php->
public function validateCredentials(UserContract $user, array $credentials)
{
    $plain = $credentials['password'];
    return $this->hasher->check($plain, $user->getAuthPassword());
}

Did i missing something ?

A: you can use simple login by this way :
public function postLogin(Request $request)
{
    request()->validate([
        'id_message' => 'required',
        'sms_code' => 'required',
    ]);

    $credentials = $request->only('id_message', 'sms_code');
       if ($user=User::where($credentials)->first()) {
         auth()->login($user)
    return redirect()->intended('dashboard');
    }
    return Redirect::to("login");
}


Clippard Instrument Laboratory Incorporated was founded by W.L. Clippard, Jr. in 1941 as a manufacturer of electronic test equipment. The company slowly transitioned to producing a line of smaller component products. Because of growth in demand, the company finally focused on manufacturing miniature pneumatic products in the late 1960's.
The company has since grown to become one of the most innovative and well-known manufacturers in the industry. They have also included other products in their portfolios such as the Modular series and the Mouse Valve series; the Electronic Proportional Valves, and Electronic Manifold Cards.
Stationed in Cincinnati and Fairfield, Ohio, Clippard has tapped distributors worldwide to deliver reliable and unbeatable products and services. The company is now in its seventh decade of delivering to various industries such as hospitals, pharmaceuticals, research, and analytical markets with fluid power, motion and process control devices.
When Clippard Jr. built the company, he made sure that everyone involved would follow the same principles that he upholds. For that reason, he created the Clippard Creed. The Clippard creed lays out the direction and manner the company should treat its customer, products, and constituents.
The first part of the creed talks about how everyone in Clippard should be dedicated to "providing the world with useful, productive, affordable products." Everyone in the company believes that the quality and value of their products is their defining characteristic. For this reason, everyone works towards a common goal of upholding the company's reputation for Quality, Service, Performance, and Value.
Clippard values their customers. That is why their commitment to their clients does not end at the point of sale. They provide assistance and instructions to anyone who may need help in using their products. The company has a toll free hotline that can be reached by anyone in need.
They also offer training and installation to first timers to make sure that their experience is nothing but excellent. Free resources can also be downloaded from their website to provide people with step by step instruction on how to use their products.
What Products Does Clippard Offer?
Clippard Instrument Laboratory is primarily a pneumatic manufacturer. They offer a wide variety of pneumatic products such as cylinders, valves, fittings, hose & tubing, and air preparation equipment. The company is most famous for their miniature pneumatic devices. Being one of the pioneers in such products, they have the most experience and knowledge when it comes to such devices.
AOP Technologies shares Clippard's value, especially on quality and excellence for the customer. Because of this, we are committed to providing only the best products and services the market can offer. That is why we have partnered with them to provide you with their products. Check out our online store to see which Clippard products we have in stock! Contact us if you need something that we don't have in stock or have questions.


Absolute Roof Windows provide roof window installers and skylight fitters in Cobham and surrounding areas.
If you live in Cobham and you need a new Velux roof window installation, Velux roof window replacement or a new skylight fitted, we provide a prompt, efficient and professional service. We aim to please, impress and exceed your expectations.
All of our employees have many years of on site experience in the Cobham area, ranging from replacement installation of a straightforward Velux roof lights to the more complex installation of light shafts. All jobs are guaranteed to be carried out smoothly, on time and on budget.
If you live in Cobham or anywhere nearby and might need our services, please contact us and we will arrange a convenient time to visit you.


text:
← Bishoo fulfils dad's dying wish
Incursions … around Sri Lankan Cricket →
Sweet farewell for Zimbabwe
Courtesy of Jeffrey Murimbechi, Media Manager
Zimbabwe concluded their World Cup campaign in rousing fashion with a heartening and much-needed victory by 161 runs against Kenya at what many people believe to be the modern 'home of cricket,' Eden Gardens in Kolkata, on Sunday. It wasn't enough to earn a place in the knockout stages of the tournament but it was just the tonic needed by a disappointed squad of players and their equally disappointed fans who had hoped for so much before the tournament began. Half centuries from Vusi Sibanda (61), Tatenda Taibu (53) and Craig Ervine (66) launched the Zimbabwe innings above 300 and the game was effectively ended before the run chase had really started when the Kenyans collapsed to 44-5 in reply.All five bowlers used were amongst the wickets with spinners Ray Price, Greg Lamb and Graeme Cremer each claiming a brace while Sibanda and skipper Elton Chigumbura highlighted a sparkling fielding performance with brilliant run outs.
"It doesn't matter that it was against Kenya who are ranked below us, the fact remains that the team got everything together and proved to themselves what they are capable of when the batting and the bowling click together on the same day," said selection convenor Alistair Campbel. Sibanda was a revelation with the bat having only joined the squad as a replacement two weeks ago while Taibu's calm head and maturity was just what was required after the early loss of openers Brendan Taylor (26) and Reggie Chakabva.
But it was Ervine's flowing start and blistering finish which took the game away from Kenya and ensured him of the man-of-the-match award for an innings of 66 from just 54 deliveries with nine fours and a towering six which landed 20 rows deep in the famous stadium. "I've learned a lot – it has been a great experience," Ervine said after scoring his third half century in six matches. "Most of all I've learned how much more work there is to be done before I can hope to be consistent against the best teams in the world. But I'm prepared to do that work – we all are," Ervine said.
Chigumbura, too, swatted a six over long off in his cameo innings of 38 from 41 balls while both Utseya and Lamb showed a hitherto unseen ability to clear the boundary with a six apiece at the death of the innings which saw them finish unbeaten on 19 and 17 from just six and 10 balls respectively. Chris Mpofu struck with the fifth ball of the first over when Kenya began their unlikely pursuit of 309 for victory and new ball partner Price followed up with further wickets in the eighth and 12 overs to leave the innings in ruins.
"It was a good way to finish the tournament," said Chigumbura. "The next three months will be very important to us as we prepare for a couple of tours at home and our return to Test cricket. "We need to remember the way we went about things, especially the bat, and try to work on those things and make them even better."
Filed under performance, player selections

redpajama_set_name: RedPajamaCommonCrawl


The government has all but conceded it will lose control of parliament this week and MPs will hold a series of votes on different Brexit options, with ministers believing it would be ultimately pointless for Theresa May to offer the government's own plan.
It comes as May's hopes that she still can force through her withdrawal deal faded after a phone call with Arlene Foster, in which the Democratic Unionist party leader rejected a personal plea for support.
In a meeting with Jeremy Corbyn later on Monday, the Labour leader also rejected suggestions that the prime minister's exit deal could be separated from the future relationship.
A Labour spokesman said the pair had a "frank and comprehensive exchange of views" and Corbyn suggested there was no basis to bring back her deal to parliament.
"The Labour leader did not accept the prime minister's suggestion that the withdrawal agreement could be separated from the political declaration," the spokesman said.
It is understood that May suggested in her hour-long meeting with Corbyn that the government would not be bound by the decision of parliament in any indicative votes.
The government will whip Conservative MPs against an amendment to a motion on Monday that would give MPs control over the parliamentary order paper on Wednesday, to pave the way for votes on Brexit options in parliament.
May's de facto deputy, David Lidington, who will open the debate, had been in intense discussions with the leaders of the group of MPs who are pushing the motion, including the Tory MP Oliver Letwin and Labour's Hilary Benn and Stephen Kinnock.
However, government sources suggested they had now conceded that May could not offer her own version of indicative votes and MPs were determined to press ahead with their plan regardless.
Downing Street said May told a cabinet meeting on Monday morning she would table a new meaningful vote only if the government felt certain of the numbers. In a telephone call straight after the meeting, Foster said she would not change her party's position. "The position remains unchanged," a source said.
May's spokesman said there was a sense of "determination" at the meeting and the prime minister's future was not raised by any cabinet minister.
One cabinet source said Jeremy Hunt had wanted to delay the meaningful vote until close to 12 April in order to pressure Labour MPs into supporting the deal for fear of leaving without an agreement, but that was not backed by those cabinet ministers who want to take no deal off the table.
Several cabinet members also raised concerns about indicative votes being held by the government over concerns that they would cause chaos and lead to a general election.
Stephen Barclay, the Brexit secretary, is understood to have been the main voice warning of the risk of a general election if parliament seizes control of Brexit from the government, saying there was a need to honour the 2017 election manifesto.
Monday's key amendment has been tabled by Letwin and Benn, the Labour chair of the Brexit select committee, which would set aside Wednesday for MPs to take control of House of Commons business in order to hold the series of votes on different Brexit outcomes.
May's spokesman said there were concerns about the constitutional implications of the amendment.
"The prime minister has previously said that tying the government's hands in this way by seeking to commandeer the order paper would have far-reaching implications for the way in which the UK is governed and the balance of powers and responsibilities in our democratic institutions," the spokesman said.
Depending on the outcome of talks and votes on Monday, the prime minister still could table a meaningful vote for Tuesday via a late-night emergency business motion, shortly after MPs have voted on Monday night.


What if you could change the world – not just for today but for generations to come? At Moms in Prayer we believe that a mom can be the single greatest force for good in the lives of her children and the children around her. We believe that lives and whole communities are changed forever when moms gather together to pray to the only One who can change a human heart. Moms can make the difference as they reach out to God in prayer- moms just like you.


text:
Carson Cooman: The Acts of the Apostles (2009), an oratorio for baritone, chorus, congregation/audience, and chamber orchestra, full score
By Carson Cooman
Choir sheet music
Musik Fabrik
https://www.sheetmusicplus.com/title/carson-cooman-the-acts-of-the-apostles-2009-an-oratorio-for-baritone-chorus-congregation-audience-and-chamber-orchestra-full-score-digital-sheet-music/20420819?id=51635
Chamber Orchestra - Advanced - Digital Download
Composed by Carson Cooman (1982-). 21st Century, Contemporary Classical, Christian, Spiritual. Score. 189 pages. Published by Musik Fabrik (S0.201101).
Item Number: S0.201101
The Acts of the Apostles (2009), an oratorio for baritone, chorus, congregation/audience, and chamber orchestra (piano, organ, strings-suggested minimum of 3.3.3.2.1),
was commissioned by The Memorial Church at Harvard University. It is dedicated to Edward Elwyn Jones and the
Harvard University Choir.
The biblical books of Luke and Acts form a pair of documents from a single author and with a single audience (the
likely-metaphorical "Theophilus"), yet they are unusual for being composed in such contrasting genres. Luke's
gospel, using Mark as a primary source throughout, features a comparable literary style to that of the other
evangelists. Acts, by contrast, is a historical monograph that charts the birth of the Church with dramatic stories
about—and speeches from—the apostles, painting a vivid, if not necessarily chronological, picture of their victories
and struggles. As such, it is a book that provides excellent source material for a dramatic choral libretto of this scale.
Although much of Acts is focused on the ministry of Saul/Paul, this oratorio draws most of its material from the
first third of the book, prior to and including the conversion of Saul. In the Prologue, Christ's ascension is narrated
and—following an orchestral Sinfonia—the chorus sings words of Jesus from the Sermon on the Plain in Luke's
gospel that foreshadow many of the trials the apostles go on to face. The astounding account of Pentecost follows:
here, words from the book of Ruth, customarily read on the feast of Shavuot (Pentecost), are included, telling the
story of a Moabite woman who converted to the Israelite faith—a parallel to the expansion of the Christian message
to all nations by the gift of the Holy Spirit. The Prayer for Boldness, quoting Psalm 2, asks God for protection from
the threats of persecution that the apostles will now face.
Stephen, regarded as the proto-martyr of the Christian Church, offers one of the most developed speeches in Acts,
only a small portion of which is presented here. Full of scriptural references, including the quotation from Isaiah
"Heaven is my throne…", the end of the narrative is remarkable for two reasons: firstly, Stephen's final words
mirror those of Christ on the cross in Luke's gospel—where Jesus forgives his executioners and prays "Father, into
your hands I commend my spirit" (Luke 23:46); secondly, Saul is specifically mentioned as one who approved of
Stephen's stoning, indicative of the redemptive possibilities of the Christian message.
The account of the baptism of the Ethiopian eunuch here in the oratorio ends with the First Song of Isaiah—while
not quoted in Acts, it seems a fitting conclusion to the scene as Philip and the eunuch were reading Isaiah together,
and the canticle has often been associated by Christians with the rite of baptism. Similarly, the story of Saul's
Conversion is followed here by a Christological poem found in Paul's letter to the Philippians, though it is likely a
quotation from an earlier source. It is often regarded as the earliest extant Christian hymn.
The Acts of the Apostles concludes with Luke's realistic assessment that in spite of Paul's energetic evangelism many
remained unconvinced by the Christian message. At the heart of both Luke's gospel and Acts is the tension between
the uniquely important role of the Jewish traditions that Jesus himself practiced and the expansion of the gospel to
gentiles, of whom Luke himself is one. It is appropriate, therefore, to follow Paul's message of salvation to the
gentiles with the Magnificat: a canticle that emphasizes the promises of God to the people of Israel throughout
Three traditional hymn texts are found in the oratorio, each set congregationally to a pre-existing tune. The first,
"Spirit of mercy, truth, and love" is an eighteenth century poem that extols the evangelistic implications of the
Pentecost event. "O Jesus, I have promised" was written by the author for the Confirmation service of his children;
its themes of Christian commitment are reflected in the ultimate sacrifice of Stephen's martyrdom. The final hymn
of the oratorio, "My soul, awake and render"—a translation of a German chorale—offers another perspective on
discipleship: one of prayer, thanksgiving, and divine compassion.
This is the full score.
Digital Print Deluxe Binder
Preview: Carson Cooman: The Acts of the Apostles (2009), an oratorio for baritone, chorus...
Top Selling Choral Titles
Peace Upon You, Jerusalem
Vocal Warm-ups
Requiem KV 626
German Requiem
I Got Rhythm - SSAA a cappella unac...
Symphony, No. 9 d minor, Op. 125
O Love
Sacred Concert - Korpartitur
Hymn of Praise, MWV A 18
Like A River In My Soul
Choral Collection Beethoven
The Greatest Showman (Choral Highli...
Bring Us Hope
This endris night
Faith to Carry On
More by this Composer:
Carson Cooman Sheet Music Carson Cooman Choir Sheet Music Carson Cooman Chamber Orchestra Sheet Music Carson Cooman Choir Sheet Music
Chamber Orchestra Music Choir Music
21st Century Sheet Music Spirituals Sheet Music


text:
BELLEVILLE (November 27, 2019) – A pair of quick goals early in the third period wasn't enough to propel the Laval Rocket past the Belleville Senators, who scored three unanswered goals en route to a 5-3 victory Wednesday night at the CAA Arena in Belleville. Jake Evans earned two assists in the loss.
The Senators dominated the opening frame with a 12-7 shot advantage and a handful of high-danger chances. Drake Batherson notched his eighth goal of the season, defeating netminder Cayden Primeau in the slot on the powerplay. With less than 30 seconds left in the first period, Alex Formenton doubled the Senators' lead. The Rocket were down 2-0 after 20 minutes of play.
Earning a trio of powerplays, the visitors narrowed the gap by one goal when Joe Cox unleashed a wrist shot outside the right faceoff circle for his third tally of the season. Josh Brook and Jake Evans earned assists on the goal. The series of consecutive man advantages and the goal changed the momentum in favour of the Rocket, who edged the Senators in shots (16-15) after two periods.
The Rocket were off to a spectacular start to the final frame, scoring two goals in 58 seconds. Jake Evans fed a nifty backhand pass to Antoine Waked, who was parked in the slot and made no mistake to earn his second tally of the season. Shortly after, Matthew Peca carried the puck from zone-to-zone and defeated Gustavsson with a sharp-angled shot to earn his fifth point in four games. Michael McCarron and Karl Alzner were credited with helpers. The Rocket conceded a second powerplay goal to their opponent when Norris sent a laser past Primeau. Formenton restored Belleville's lead on a two-on-one, notching his second goal of the night. The Rocket upped the ante in the final minutes of the game to score the equalizer, but Cole Cassels netted the Senators' fifth goal of the night to give Belleville a 5-3 win — their third over Laval this season.
"I thought we had a couple of five-minute spans where we lost our focus, weren't playing the way we know how to play, and gave up some chances because of that. Credit to them for executing the chances that we gave them. […] When we play a complete 60-minute game, it's really hard to beat us," said Cox after the game.
LAV: Cox (Brook, Evans) | Waked (Evans) | Peca (McCarron, Alzner)
BEL: Batherson (Norris, Corrado) | Formenton (Balcers, Szwarz) | Norris (Szwarz, Corrado) | Formenton | Cassels (Balcers, Jaros)
LAV | AN/PP: (1/4) | IN/PK: (2/4)
BEL | AN/PP: (2/4) | IN/PK: (3/4)
LAV: Primeau (15/20) | BEL: Gustavsson (21/24)
1. Formenton – BEL 2. Norris — BEL 3. Szwarz – BEL


text:
Голубенко Кім Никифорович (9 вересня 1925, Одеса — 5 травня 1998, там же) — капітан турбохода «Юрій Гагарін» Чорноморського пароплавства Міністерства морського флоту СРСР, Герой Соціалістичної праці, перший президент Асоціації морських капітанів Одеси.

Біографія
Народився 1925 року в Одесі. У 1940 році закінчив середню школу, після якої вступив на навчання до Одеського морського технікуму. До початку Другої світової війни працював у колгоспі імені Фрунзе. Під час окупації Одеси брав участь у партизанському загоні імені Сталіна в Усатовських каменоломнях.

Після війни працював матросом на Чорноморському пароплавстві. Навчався у мореплавному училищі та на курсах командного складу Чорноморського пароплавства. З 1946 по 1955 — помічник капітана на різних судах і з 1957 — командир пароплава «Курськ». В 1961 призначений командиром турбохода «Юрій Гагарін», на якому здійснював перевезення в Південно-Східну Азію та на Кубу. У 1958 та 1962 роках отримав почесне звання «Найкращий командир Міністерства морського флоту СРСР».

Указом Президії Верховної Ради СРСР від 9 серпня 1963 року за видатні успіхи, досягнуті у розвитку морського транспорту, удостоєний звання Героя Соціалістичної Праці з врученням ордена Леніна та золотої медалі «Серп і Молот».

1968 року закінчив Одеське вище інженерне морське училище. У 1969 році був призначений командиром судна «Валентина Терешкова» і пізніше — балкера «Ялта».

1989 року вийшов на пенсію.

Примітки

redpajama_set_name: RedPajamaWikipedia


The Prevention of Cruelty to Animals Regulations 2008 set out when and how electronic collars can be used, sold, hired or supplied for use on animals in Victoria.
Electronic collars are defined in the regulations as an animal collar that is designed to be capable of imparting an electric shock to an animal. This does not include citronella type collars.
cattle, sheep, goats, pigs, camels, alpacas and llamas but solely for research purposes.
They cannot be used on any other species.
Only authorised collars can be used on cats and dogs.
containment systems - can be used on dogs and cats.
The regulations also set out a number of conditions for the use of electronic collars on dogs, cats and specified livestock species as well as the requirements for suppliers, sellers and hirers of electronic collars.
These legislative requirements are explained in three information sheets which can be viewed via the links below.
These information sheets have been developed for use by sellers, hirers, and suppliers of authorised electronic collars to provide to those purchasing, hiring, or receiving these collars to enable them to meet their requirements for notification under regulation 24(2) and 24 (3).
Regulation 24(2) requires that purchasers are informed in writing of the legal requirements of use of authorised collars for dogs and cats in Victoria.
Failure to comply with the requirements of the Regulations can result in either an infringement notice or prosecution in a court of law with a maximum penalty of 10 penalty units (approximately $1612*).


When love happens we simply ignore the caste and color of our lover and ignore many of the conditions. Becoming in love with someone gives utmost pleasure and is also enjoyable that we tend to remove all the hurdles in our life. Love develops a heavenly feeling in a couple. If you love someone his/ her cast and status simply do not matter to you. Living without love is almost impossible. A person who loves someone is simply ready to give up everything for his/her lover/ it is a type of close relationship between two people. It is good to understand that it is often experienced in the daily activity with that person. Sometime the love connections ignore the imperfections that create the flawless relationship. An outstanding and pleasing lifestyle is desired by a couple without even realizing the complications of real life. In the present time, there is definitely no way to get the simple life to live when the complications do not occur. In fact a life without hurdles is not considered a real life. So it is important to prepare yourself for handling the troubles as these also occur in love connections. Consult with Muslim Astrologer In Delhi to get the right way to lead your love life correctly. Maa Sunita Devi Ji provides the complete love suggestions to enable you take the right decisions that are best for your life. Muslim astrologer gives the perfect solution for any kind of love problem such as if the family of your lover or your family is not ready for marriage, your lover started falling for someone else your enemy or you are feeling something wrong in your relationship.
Consult with Maa Sunita Devi Ji, an expert Muslim Astrologer in Delhi can help you in getting your love back. You can do legal marriage with your lover and can live a smooth life. Love Muslim astrology offers the adequate solution in the way of every type of problem in life. When you understand what you need, you eagerly search for expert assistance, so Maa Sunita Devi Ji makes every possible effect in resolving your troubles. Astrology must not be taken as an illusion in fact it is a special type of religious science that is based on the study of astronomical object positions and their influence on the various sorts of human life. There is tantra astrology and Lal Kitab. Muslim astrology belongs to tantra education and practices to expertise that offers several protective ways. If you realize that someone is disturbing your life and creating troubles, this astrology suitably suggests you the solution for it. but it is extremely important to contact a true and experienced astrologer who knows the various mantras and tantra's to remove hurdles in your life and find better way for you to overcome the wrong happenings. When the troubles are too much complicated that you leave the hope to live, come in the shelter of Maa Sunita Devi Ji who is a famous and specialized Muslim astrologer in Delhi, she will suggest you the ways to control the conditions and live in the way you want.


1. GUANGZHOU YITONG NC CO LTD. is a well recognized manufacturer, wholesale supplier and exporter of a splendid range of brush making machine for paint brush manufacturing machine.
1. GUANGZHOU YITONG NC CO LTD. has a large production base and professional team to producing high quality brush making machine. - GUANGZHOU YITONG NC CO LTD. boasts its solid technical foundation.
2. GUANGZHOU YITONG NC CO LTD. has introduced advanced household brush machine manufacturing process, technology and key equipment.
3. When Greek Meets Greek, Then Comes The Tug Of War. Yitong Is A Leading tufting machine, paint brush manufacturing machine, brush machine manufacturers Manufacturer In China. Ask! - hair brush machine can be fitted in any model at extra cost. Contact!


A unique alpha-numeric designation to facilitate reference to the sets of numbers that actually locate a particular computer connected to the global information network; any name representing any record that exists within the Domain Name System (DNS). A name that identifies a computer or computers on the internet. These names appear as a component of a website's URL, e.g. peektoday.com. This type of domain name is also called a hostname.
The product that domain name registrars provide to their customers. These names are often called registered domain names.
When your host server is down, it's not good for business. That's why you want a web host with a proven track record of unparalleled tech support and reliable, good value web hosting. We use servers custom built to our own standards of quality and hosting reliability. We employ multiple, high-speed fiber connections to reduce downtime.
The web terrain is rugged. So, how do you protect your domain name and your website? How do you minimise your e-commerce website's downtime? We deliver multi-levels of security. Our web hosting servers are protected from DDoS attacks. Our web hosting data centre is above the industry's standard for security and intrusion protection.
Your business grows. Your business model changes. Things happen quickly in the world of business e-commerce and you want to be ready to adapt in this fast-paced business environment. You can start with a small simple hosting package and as you grow, we can add features such as e-commerce hosting to accommodate your needs.
Want to change hosting company?
Moving your domain from one web host to another can lead to website downtime but we'll develop a website migration strategy to reduce website downtime caused by domain hosting compatibility issues.
We measure our success by your success, and we receive testimonials from our clients everyday thanking us for the best level of support. We guarantee we will meet or exceed every one of your expectations of a web host. We offer feature-rich hosting packages to fit any need or budget. We provide support for e-commerce hosting, VPS web hosting, reseller & domain name registration. We offer high-quality, but good value web hosting for personal websites, all the way to reseller web, VPS hosting and dedicated servers.


text:
/* From private/ppb_tcp_server_socket_private.idl,
 *   modified Tue Feb 14 12:24:48 2012.
 */

#ifndef PPAPI_C_PRIVATE_PPB_TCP_SERVER_SOCKET_PRIVATE_H_
#define PPAPI_C_PRIVATE_PPB_TCP_SERVER_SOCKET_PRIVATE_H_

#include "ppapi/c/pp_bool.h"
#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_macros.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_stdint.h"
#include "ppapi/c/private/ppb_net_address_private.h"

#define PPB_TCPSERVERSOCKET_PRIVATE_INTERFACE_0_1 \
    "PPB_TCPServerSocket_Private;0.1"
#define PPB_TCPSERVERSOCKET_PRIVATE_INTERFACE \
    PPB_TCPSERVERSOCKET_PRIVATE_INTERFACE_0_1

/**
 * @file
 * This file defines the PPB_TCPServerSocket_Private interface.
 */

/**
 * @addtogroup Interfaces
 * @{
 */
/**
 * The PPB_TCPServerSocket_Private interface provides TCP
 * server socket operations.
 */
struct PPB_TCPServerSocket_Private_0_1 {
  /**
   * Allocates a TCP server socket resource.
   */
  PP_Resource (*Create)(PP_Instance instance);
  /**
   * Determines if a given resource is TCP server socket.
   */
  PP_Bool (*IsTCPServerSocket)(PP_Resource resource);
  /**
   * Binds |tcp_server_socket| to the address given by |addr| and
   * starts listening.  The |backlog| argument defines the maximum
   * length to which the queue of pending connections may
   * grow. |callback| is invoked when |tcp_server_socket| is ready to
   * accept incoming connections or in the case of failure. Returns
   * PP_ERROR_NOSPACE if socket can't be initialized, or
   * PP_ERROR_FAILED in the case of Listen failure. Otherwise, returns
   * PP_OK.
   */
  int32_t (*Listen)(PP_Resource tcp_server_socket,
                    const struct PP_NetAddress_Private* addr,
                    int32_t backlog,
                    struct PP_CompletionCallback callback);
  /**
   * Accepts single connection, creates instance of
   * PPB_TCPSocket_Private and stores reference to it in
   * |tcp_socket|. |callback| is invoked when connection is accepted
   * or in the case of failure. This method can be called only after
   * succesfull Listen call on |tcp_server_socket|.
   */
  int32_t (*Accept)(PP_Resource tcp_server_socket,
                    PP_Resource* tcp_socket,
                    struct PP_CompletionCallback callback);
  /**
   * Cancels all pending callbacks reporting PP_ERROR_ABORTED and
   * closes the socket. Note: this method is implicitly called when
   * server socket is destroyed.
   */
  void (*StopListening)(PP_Resource tcp_server_socket);
};

typedef struct PPB_TCPServerSocket_Private_0_1 PPB_TCPServerSocket_Private;
/**
 * @}
 */

#endif  /* PPAPI_C_PRIVATE_PPB_TCP_SERVER_SOCKET_PRIVATE_H_ */


North Carolina sweet potato growers say they'll be in the fields early this year and the harvest should bring the best yields in years.
Faison, N.C.-based Southern Produce Distributors Inc. expects to begin digging somewhere between Aug. 20 and Aug. 25, said Stewart Precythe, the company's president and CEO.
"We're a little earlier this year. We normally don't like to dig until Labor Day."
An early start was the only blemish on the season as of Aug. 8, Precythe said.
"We had an excellent planting season, it's not been real hot, we've had good rains. The survival rates are some of the best I've seen in 47 years."
North Carolina sweet potatoes saw their share of very hot temperatures this season, but timely rains helped prevent any negative heat-related effects, said George Wooten, owner of Wayne E. Bailey Produce Co. Chadbourn, N.C.
Wayne E. Bailey expects to begin digging the week of Aug. 15, about three weeks earlier than usual, Wooten said. Last year's storage potatoes would likely clean up in September, with new-crop cured kicking off in the second half of the month.
marketing and business development director.
"Everything looks good. We've had good weather, ample rain. The crop looks healthy."
North Carolina's official acreage estimate isn't out yet, but Precythe is predicting a slight increase in the state, up to 5%. It likely would have been up even more, he said - low prices for other crops caused growers to look at pulling them and adding sweet potatoes - but plants were hard to come by.
Some early plants were hit by cold and some late by heat, which will affect yields, but potatoes planted between about May 10 and June 20 should yield well and have "superior" quality, Precythe said.
Southern Produce will ship cured-to-cured this year, but other shippers will likely have to ship some uncured because of dwindling 2015-16 supplies as of early August, Precythe said.
"The market's firm now, and the new-crop market should be firm. It should hold through August, September and October."
Markets were stable in early August, slightly lower than both the year before at the same time and three months earlier, Wooten said. He said they should stay were they were or slightly increase after the new crop begins shipping.
On Aug. 9, the U.S. Department of Agriculture reported prices of $16-18 for 40-pound cartons of U.S. No. 1 sweet potatoes from North Carolina, down from $16-19 last year at the same time.
Nash Produce also will ship cured-to-cured, Hearn said.
Nash Produce is increasing production of its purple-skinned/white flesh and white-skinned/white flesh sweet potatoes this year, after growing the varieties on a trial basis in the past.
The company also is test-marketing a couple of new products this year, Hearn said.


text:
Friday Senate Fix
The Church Ladies of the New Woke Religion
We Need a New Covid Strategy
By Andrew Stiles
About Andrew Stiles
Follow Andrew Stiles on Twitter
• Third-party interest groups favoring the GOP are outspending their Democratic counterparts by more seven to one, according to a "Democratic operative." But what of the $250 million coming from labor unions and other liberal groups?
Kentucky:
• Watch Rachel Maddow lay into Jack Conway for his flip-flopping strategy of "stop, squirm and run."
• The latest Rasmussen poll has Dino Rossi leading Patty Murray — 49 percent to 46 percent — among likely voters. The comes on the heels of a GOP-sponsored poll released yesterday that showed Rossi with an even bigger lead — 48 percent to 42 percent — over Murray.
"Given the increasing strength and momentum of the Rossi campaign, Senator Murray's record on key issues, and the continued deterioration of the political environment, Dino is well positioned for victory in November," a spokesman for Rossi's campaign told BATTLE '10.
• Rossi's campaign says it raised $4.4 million during the third quarter. His campaign has raised almost $6 million in a period of four months. Murray has not released her third quarter fundraising results, which are due later this month.
• The Seattle Times reports that Murray ranks second in political contributions from lobbyists. Since 2009, lobbyists have contributed the ominous amount of $666,000 to Murray's reelection effort. Only Senate Majority Leader Harry Reid took more money from lobbyists during the current cycle. More here.
Wisconsin:
• A new WTP poll shows Ron Johnson continuing to lead Sen. Russ Feingold by a healthy margin — 49 percent to 41 percent, with 8 percent undecided.
• The DSCC put out a poll that shows Johnson leading by just 2 points — 44 percent to 42 percent.
• Feingold and Johnson will face off tonight in Milwaukee for the first of three debates. The others will be held in Wausau on Oct. 11 and again in Milwaukee on Oct. 22.
• Politico reports that Feingold, trying to recapture the spirit of 2008, is gunning hard for the college vote. But as BATTLE '10 wrote here, he has his work cut out for him.
• NBC Nightly News tackled the Wisconsin Senate race last night:
The most telling bit is from 02:08 – 02:20, which pretty much sums up why Democrats are doing so poorly in places like Wisconsin (as Rich Lowry discusses here), and why candidates like Johnson, a local business owner and political rookie, are surging.
• In a related note, Vice President Joe Biden, in classic form speaking at a fundraising event last night in Madison, told the crowd: "You're the dullest audience I've ever spoken to. Do you realize how many jobs Wisconsin has lost? It's staggering!"
Oh, they realize.
Andrew Stiles — Andrew Stiles is a political reporter for National Review Online. He previously worked at the Washington Free Beacon, and was an intern at The Hill newspaper. Stiles is a 2009 ... @AndrewStilesNRO
More in Politics & Policy
We Need a New Covid Strategy	We Need a New Covid Strategy
Schumer Proposes Talking Filibuster in Attempt to Introduce Voting Bills
A rules change would require the support of all 50 Senate Democrats, and Manchin told reporters on Tuesday that he does not support the change.
Despite progressive complaints to the contrary, the Virginia governor's first few days in office have been exactly what he promised during the campaign.
The fight for life is the most recent effort to ensure that our country abides by the solemn words of the Declaration of Independence.
Alexandra DeSanctis, Tim Busch
U-Haul Literally Ran Out of Trucks Leaving California
Dan McLaughlin
California bled outbound citizens so badly that U-Haul ran out of trucks to rent.


This time of year can be exciting and stressful; happy and sad; exhilarating and disappointing all wrapped up into one. Wednesday was a mix of emotions for me and many of you. I was so happy to welcome Samantha Denman to our 2nd grade team and Fred Neuhausal as our Spanish teacher. Then, I had to tell Amy and Cheri that they were moving to other buildings.
As I reflect on this day, I realize that often times endings and beginnings happen at the exact same time. For Samantha it's the end of stressing out about getting a full time position and the beginning of her dream of having her own classroom. For Fred, it's the end of being a high school Spanish teacher in a place where he certainly feels comfortable and knows what to do and the beginning of a new program at an elementary school where his son attends! These are exciting endings and beginnings. For Cheri and Amy it seems a little different. They're ending many years at a school they love, in a place where their friends are and where they feel comfortable to embark on new adventures in new buildings.
Endings and beginnings-they can be bitter sweet; they can be so many different things to different people. One thing that is the same about the endings and beginnings that I experienced today is that each person graciously accepted their ending and greeted their beginning with a positive mindset and a desire to serve children.
What a team we have here. I could not be more excited to see what the future holds for us. I leave you with one of my favorite quotes and I encourage you to consider how you look at endings and beginnings. What if this is not the end. What if it is not even the beginning of the end. What if, perhaps it is simply the end of the beginning.
We're on a journey this is not the destination.
Here is your staff update for April 18th.
After 7 years at JW Reason, I truly feel like I've seen the increase in poverty right before my eyes. We see more and more students struggling with food insecurity, housing insecurity, lacking basic health care needs and more.
Did you know that the fight against poverty began in 1964 but today more than 51 percent of students in United States public schools are eligible for free and reduced lunches?
The question I've been asking myself this year is, are we doing enough? What are we missing? What else is out there to help our kids? Can we make a difference?
Then, I stumbled across the book Disrupting Poverty! This book is giving me hope. This book is affirming. If you are looking for a read that connects directly to our lives, I think this book is it.
Here is your staff update for April 12th.
I love it when things are organized and in rows! And if you add labels then I love it even more. But, to me, what's even better than those organized, labeled rows is the mess that has to first be created in order to achieve such a level of pristine neatness. That's right, I love tearing everything out of closets, cupboards, drawers, basements or anywhere that "stuff" exists. I love picking through the stuff, throwing things away, donating things and then organizing the left over items so they all have a proper place. Oh and of course after everything is sorted, I get to go find new things to fill up the empty space!
My love of messes makes being a principal the perfect career choice for me. Think of all of the messes we get to encounter every day. Now, most of them are not created by our choosing, but some of them are. Right now, our kindergarten, first, second grade teachers and me are voluntarily making a mess. The "closet" we're cleaning out is our word study practices and boy are we messy! We've analyzed data, recognized deficit areas and started digging in to sort through the things that need thrown away or put back into the closet. And, we're shopping for new things to fill in the empty space.
Think about it like this: What would happen if you never cleaned out your closet? I'm sure there would lots of things that are no longer in style and things that no longer fit (too big, of course). And, eventually, your closet would be so full that you would no longer have room to add anything new and you'd have to stay satisfied with the outdated and ill-fitting things you had in it. It's the same for our educational practices. We need to continue to take inventory on the work we do. We need to look at current trend data and ensure that the things in our educational "closets" are working for our current needs. When they're not, then we need to start cleaning out.
I challenge you to think about things that are in your educational "closet". Do they still fit? Is there a need that you are unable to address because you need to clean out and make room for something new? Take inventory and make a mess! You'll be happy with the result.
Here is your staff update for April 5th.
For some reason, in the past few weeks I've noticed that many of our kids skip down the hallway. I've seen our littlest kids do this an even our 4th and 5th graders.
Children have responded with big toothless grins, hugs and giggles. I challenge you to "count the skippers" too. It's amazing how much joy it brings me each time I see a "skipper" and I think it will do the same for you!
Here is your staff update for March 22nd.
For the past 19 years I have been on a journey as an educator. I was so fortunate to have had the opportunity to be trained as a Literacy Collaborative coach. This training truly changed the trajectory of my career. I've written about this many times and I'm still forever grateful for the leaders who saw something in me and helped me on my journey. After my training it seemed as if a whole new world opened up to me. I understood the reading and writing process; I could listen to a child read or conference with a writer and quickly identify areas of strength and weakness which would lead me to future teaching points. And, for the past 19 years I have continued to learn about reading and writing practice within the context of the literacy collaborative framework. And, while I never believed that I would be finished learning, I must say that there came a point within the last few years that no matter what I read about reading and writing practice it just didn't surprise me anymore. And, I was getting bored.
Then, the greatest thing happened. The conversation began to change. There was a shift. We began looking more closely at phonemic awareness and phonics. I began digging into our DIBELS data and having conversations about what to do when our students weren't responding the way our LLI intervention system indicated that they should be. I could no longer be satisfied with the answer that these children were in need of special education services and I could no longer justify keeping children in an intervention that wasn't working without having an option of something else to try.
That's where all of you came in. I started engaging you in conversation about our data and you started asking questions and noticing that some of our kids were not responding to our teaching as well. And, YOU were hungry for more! This rejuvenated me! Just when I was getting bored a whole new world of reading instruction and a whole new set of questions opened up to me. Now, for some, this could be overwhelming and stressful; but to me (and I think to you too) this was fuel! I am fueled by the possibility of adding to our instructional practice so we can do even more for our students.
Today, I spent the afternoon speaking to the Director of Literacy Instruction from Marysville and a group of principals. The team shared the assessments they use; the data they collect; the ways they have adapted the Literacy Collaborative framework; their RTI model; and the additions they've made to the support that their reading teachers give to students. The information I gathered was so exciting because we are closer than we thought to being ready to shift our instruction to meet the needs of even more kids. What has taken them 4 or 5 years to create, we have figured out in the last few months.
Our kindergarten and first grade teachers are ready to begin using an Phonemic Awareness program called Heggerty during the word study portion of the framework. We are providing multisensory phonics instruction as an option for our Title students. With a few more tweaks we are going to be leading the way in reading growth for our kids. I guarantee it.
What I've learned the most from these recent discoveries is that I need to keep asking questions and to make sure that I do not settle by falling into the trap of "the way we've always done it". I am excited for the next phase in our learning journey together.
Here is your staff update for March 15th.
I love the video from Tim Kight! What does "buy in" mean to you?
Here is your staff update for March 1st.
If you're looking for a quick read that is relevant to the work we do each and every day and that is also relevant to our personal lives than you definitely want to read this book.
Michele explains that empathy is, "seeing with the eyes of another, listening with the ears of another and feeling with the heart of another. She shares the 9 Habits of Empathy with the goal of raising children who have moral courage and who are altruistic leaders.
As I listened to Dr. Borba speak, I frantically took notes and starred things that I want to try with my own kids at home.
1-There are three kinds of empathy-affective empathy in which you feel how others feel; cognitive empathy in which you try to understand others; and active empathy in which you take action to help others.
2-Middle School Students expressed that they're more comfortable texting than talking.
3-For the first time ever, 3 and 4 year olds are being diagnosed with depression!
4-66% of kids report that they think THEIR PARENTS are too plugged in. They say they think their parents care more about their devices than them. We must give kids our presence.
5-We must teach children to stand with their head up and to look people in the eye.
6-Every kids needs a mantra! Michele explains that kids need to rehearse who they are and what they want to do and as parents we can help them create these ideas by developing a family mantra. Form your mantra by deciding how your family want to be described by others and what matters to you.
7-How we praise matters--praise with an -er at the end. For example, "You are such a helper. Thank you for putting your laundry away!" or "You are a comforter. You really took time to make your sister feel better when she was sad!"
8-TURN OFF THE NEWS-live images of things like terrorists, murders and school shootings lower our children's empathy and raise their stress levels. Instead show children the good side of the world. Expose them to stories of people, especially children, doing good things.
9-Ages 14-16 are the key ages for moral identity formation.
10-Teaching kids to breath is so important. Below is a picture of children in a kindergarten class practicing deep breathing by taking their stuff animals for a ride. The key to breathing is to inhale slowly and exhale twice as long as you inhale.
Here is our staff update for February 22nd.
On Friday I traveled two hours west to visit the teachers and administrators in Fort Recovery School District. This small district has about 900 students and 70 teachers total. They are working with Focus3 for R Factor training and I got to be a part of their journey.
What am I seeing that I need to see?
What am I seeing but discounting?
How do other people see the situation?
We gravitate to what we know. We defer to autopilot. We prefer actions that are comfortable and familiar, rather than actions that are necessary for achieving our goals.
We give up too soon. We quit before we achieve the Outcome.
As I left the team from Fort Recovery, I asked them to choose one thing that they learned during our Press Pause PD that they would work on for the next few weeks. Their take-aways were inspiring and reminded me that no matter how long we have been using R Factor, we need to continue to review and build our skills. If we want to get better we must continue to get our reps in.
Do you fall into any of the common Below the Line traps?
Do you press pause so you can see Events with clarity and courage?
Here is our staff update for February 15th.
"Failure is a feeling long before it's an actual result." From BECOMING by Michelle Obama.
Let that quote sink in for a minute. "Failure is a feeling long before it's an actual result." How many times have you planted a suggestions of failure in your mind or in the mind of someone else long before you or they have even tried to succeed? What would happen if we listened to these feelings of failure? Can you think of a time you let the feeling become the result?
How about your students, friends or family? Do you ever plant the seed of failure? Unintentionally of course, but our words have power! Choose wisely. And, choose wisely about what you listen to.
Here is your staff update for February 8th.
I got to work on our snow days. I got to go to an AMAZING meeting in which Sharon Esswein graced us with her infinite wisdom and positivity. She shared the video below. It's about one minute and twenty seconds and it says it all.
Here is our staff update for February 1st.