text:
> RTCMultiConnection API References

You can search docs/APIs here:

* http://www.rtcmulticonnection.org/
* http://www.rtcmulticonnection.org/docs/

### `socketURL`

1. You can run nodejs on a separate domain or separate port or on a separate server
2. You can set `socketURL="ip-address"` to link nodejs server
3. Now you can run RTCMultiConnection demos on any webpage; whether it is PHP page, ASP.net page, python or ruby page or whatever framework running top over HTML.

```javascript
connection.socketURL = 'https://onlyChangingPort.com:8888/';
connection.socketURL = 'https://separateDomain.com:443/';
connection.socketURL = '/'; // same domain

// or a free signaling server:

// v3.4.7 or newer
connection.socketURL = 'https://muazkhan.com:9001/';
```

### `socketCustomParameters`

You can pass your custom socket.io parameters as well:

```javascript
// starts with "&"
// &fullName=Muaz
// &meetingId=xyz
connection.socketCustomParameters = '&fullName=Muaz&country=PK&meetingId=xyz';
```

Now you can open `server.js` and access above parameters here:

```javascript
// you can find below line on "server.js" file
require('./Signaling-Server.js')(app, function(socket) {
    var params = socket.handshake.query;

    var meetingId = params.meetingId;
    var fullName = params.fullName;
    var country = params.country;
    var userid = params.userid;
    // etc.
});
```

### Update Extra-Data before Socket connects

This feature allows you reliably update-extra data on nodejs before socket.io connection opens.

```javascript
connection.extra = {
    fullName: 'Muaz Khan',
    joinedAt: (new Date).toISOString()
};s
connection.socketCustomParameters = '&extra=' + JSON.stringify(connection.extra);

connection.openOrJoin('room-id');
```

### `applyConstraints`

This method allows you change video resolutions or audio sources without making a new getUserMedia request i.e. it modifies your existing MediaStream:

```javascript
var width = 1280;
var height = 720;

var supports = navigator.mediaDevices.getSupportedConstraints();

var constraints = {};
if (supports.width && supports.height) {
    constraints = {
        width: width,
        height: height
    };
}

connection.applyConstraints({
    video: constraints
});
```

`applyConstraints` access `mediaConstraints` object, defined here:

* [http://www.rtcmulticonnection.org/docs/mediaConstraints/](http://www.rtcmulticonnection.org/docs/mediaConstraints/)

### `replaceTrack`

This method allows you replace your front-camera video with back-camera video or replace video with screen or replace older low-quality video with new high quality video.

```javascript
// here is its simpler usage
connection.replaceTrack({
	screen: true,
	oneway: true
});
```

You can even pass `MediaStreamTrack` object:

```javascript
var videoTrack = yourVideoStream.getVideoTracks()[0];
connection.replaceTrack(videoTrack);
```

You can even pass `MediaStream` object:

```javascript
connection.replaceTrack(yourVideoStream);
```

You can even force to replace tracks only with a single user:

```javascript
var remoteUserId = 'single-remote-userid';

var videoTrack = yourVideoStream.getVideoTracks()[0];
connection.replaceTrack(videoTrack, remoteUserId);
```

### `resetTrack`

If you replaced a video or audio track, RTCMultiConnection keeps record of old track, and allows you move-back-to previous track:

```javascript
connection.resetTrack(null, true);
```

It takes following arguments:

1. `[Array of user-ids]` or `"single-user-id"` or `null`
2. Is video track (boolean): Either `true` or `false`. `null` means replace all last tracks.

```javascript
// with single user
connection.resetTrack('specific-userid', true);

// with multiple users
connection.resetTrack(['first-user', 'second-user'], true);

// NULL means all users
connection.resetTrack(null, true);

// reset only audio
connection.resetTrack(null, false);

// to reset all last-tracks (both audio and video)
connection.resetTrack();
```

> Means that you can reset all tracks that are replaced recently.

### `onUserStatusChanged`

This event allows you show online/offline statuses of the user:

```javascript
connection.onUserStatusChanged = function(status) {
	document.getElementById(event.userid).src = status === 'online' ? 'online.gif' : 'offline.gif';
};
```

You can even manually call above method from `onopen`, `onstream` and similar events to get the most accurate result possible:

```javascript
connection.onopen = connection.stream = function(event) {
    connection.onUserStatusChanged({
        userid: event.userid,
        extra: event.extra,
        status: 'online'
    });
};

connection.onleave = connection.streamended = connection.onclose = function(event) {
    connection.onUserStatusChanged({
        userid: event.userid,
        extra: event.extra,
        status: 'offline'
    });
};
```

### `onRoomFull`

```javascript
connection.maxParticipantsAllowed = 1; // one-to-one
connection.onRoomFull = function(roomid) {
  alert('Room is full.');
};
```

### `getSocket`

This method allows you get the `socket` object used for signaling (handshake/presence-detection/etc.):

```javascript
var socket = connection.getSocket();
socket.emit('custom-event', 'hi there');
socket.on('custom-event', function(message) {
	alert(message);
});
```

If socket isn't connected yet, then above method will auto-connect it. It is using `connectSocket` to connect socket. See below section.

### `connectSocket`

It is same like old RTCMultiConnection `connect` method:

* [http://www.rtcmulticonnection.org/docs/connect/](http://www.rtcmulticonnection.org/docs/connect/)

`connectSocket` method simply initializes socket.io server so that you can send custom-messages before creating/joining rooms:

```javascript
connection.connectSocket(function(socket) {
	socket.on('custom-message', function(message) {
		alert(message);

		// custom message
		if(message.joinMyRoom) {
			connection.join(message.roomid);
		}
	});

	socket.emit('custom-message', 'hi there');

	connection.open('room-id');
});
```

### `socketCustomEvent`

A `string` property, allows you set custom socket.io event listener:

```javascript
connection.socketCustomEvent = 'abcdef';
connection.openOrJoin('roomid', function() {
    connection.socket.on(connection.socketCustomEvent, function(message) {
        alert(message);
    });

    connection.socket.emit(connection.socketCustomEvent, 'My userid is: ' + connection.userid);
});
```

### `setCustomSocketEvent`

This method allows you set custom socket listeners anytime, during a live session:

```javascript
connection.setCustomSocketEvent('abcdef');
connection.socket.on('abcdef', function(message) {
    alert(message);
});

connection.socket.emit('abcdef', 'My userid is: ' + connection.userid);
```

### `getUserMediaHandler`

This object allows you capture audio/video stream yourself. RTCMultiConnection will NEVER know about your stream until you add it yourself, manually:

```javascript
var options = {
	localMediaConstraints: {
		audio: true,
		video: true
	},
	onGettingLocalMedia: function(stream) {},
	onLocalMediaError: function(error) {}
};
connection.getUserMediaHandler(options);
```

Its defined here:

* [getUserMedia.js#L20](https://github.com/muaz-khan/RTCMultiConnection/tree/master/dev/getUserMedia.js#L20)

## `setUserPreferences`

You can force `dontAttachStream` and `dontGetRemoteStream` for any or each user in any situation:

```javascript
connection.setUserPreferences = function(userPreferences) {
    if (connection.dontAttachStream) {
    	// current user's streams will NEVER be shared with any other user
        userPreferences.dontAttachLocalStream = true;
    }

    if (connection.dontGetRemoteStream) {
    	// current user will NEVER receive any stream from any other user
        userPreferences.dontGetRemoteStream = true;
    }

    return userPreferences;
};
```

Scenarios:

1. All users in the room are having cameras
2. All users in the room can see only **self video**
3. All users in the room can text-chat or share files; but can't share videos
4. As soon as teacher or moderator or presenter enters in the room; he can ask all the participants or specific participants to share their cameras with single or multiple users.

They can enable cameras as following:

```javascritp
connection.onmessage = function(event) {
	var message = event.data;
	if(message.shareYourCameraWithMe) {
		connection.dontAttachStream = false;
		connection.renegotiate(event.userid); // share only with single user
	}

	if(message.shareYourCameraWithAllUsers) {
		connection.dontAttachStream = false;
		connection.renegotiate(); // share with all users
	}
}
```

i.e. `setUserPreferences` allows you enable camera on demand.

## `checkPresence`

This method allows you check presence of the moderators/rooms:

```javascript
connection.checkPresence('roomid', function(isRoomEists, roomid) {
	if(isRoomEists) {
		connection.join(roomid);
	}
	else {
		connection.open(roomid);
	}
});
```

## `onReadyForOffer`

This event is fired as soon as callee says "I am ready for offer. I enabled camera. Please create offer and share.".

```javascript
connection.onReadyForOffer = function(remoteUserId, userPreferences) {
	// if OfferToReceiveAudio/OfferToReceiveVideo should be enabled for specific users
	userPreferences.localPeerSdpConstraints.OfferToReceiveAudio = true;
	userPreferences.localPeerSdpConstraints.OfferToReceiveVideo = true;

	userPreferences.dontAttachStream = false; // according to situation
	userPreferences.dontGetRemoteStream = false;  // according to situation

	// below line must be included. Above all lines are optional.
	connection.multiPeersHandler.createNewPeer(remoteUserId, userPreferences);
};
```

## `onNewParticipant`

This event is fired as soon as someone tries to join you. You can either reject his request or set preferences.

```javascript
connection.onNewParticipant = function(participantId, userPreferences) {
    // if OfferToReceiveAudio/OfferToReceiveVideo should be enabled for specific users
	userPreferences.localPeerSdpConstraints.OfferToReceiveAudio = true;
	userPreferences.localPeerSdpConstraints.OfferToReceiveVideo = true;

	userPreferences.dontAttachStream = false; // according to situation
	userPreferences.dontGetRemoteStream = false;  // according to situation

	// below line must be included. Above all lines are optional.
	// if below line is NOT included; "join-request" will be considered rejected.
    connection.acceptParticipationRequest(participantId, userPreferences);
};
```

Or:

```javascript
var alreadyAllowed = {};
connection.onNewParticipant = function(participantId, userPreferences) {
	if(alreadyAllowed[participantId]) {
		connection.addParticipationRequest(participantId, userPreferences);
		return;
	}

	var message = participantId + ' is trying to join your room. Confirm to accept his request.';
	if( window.confirm(messsage ) ) {
		connection.addParticipationRequest(participantId, userPreferences);
	}
};
```

## `disconnectWith`

Disconnect with single or multiple users. This method allows you keep connected to `socket` however either leave entire room or remove single or multiple users:

```javascript
connection.disconnectWith('remoteUserId');

// to leave entire room
connection.getAllParticipants().forEach(function(participantId) {
	connection.disconnectWith(participantId);
});
```

## `getAllParticipants`

Get list of all participants that are connected with current user.

```javascript
var numberOfUsersInTheRoom = connection.getAllParticipants().length;

var remoteUserId = 'xyz';
var isUserConnectedWithYou = connection.getAllParticipants().indexOf(remoteUserId) !== -1;

connection.getAllParticipants().forEach(function(remoteUserId) {
	var user = connection.peers[remoteUserId];
	console.log(user.extra);

	user.peer.close();
	alert(user.peer === webkitRTCPeerConnection);
});
```

## `maxParticipantsAllowed`

Set number of users who can join your room.

```javascript
// to allow another single person to join your room
// it will become one-to-one (i.e. you+anotherUser)
connection.maxParticipantsAllowed = 1;
```

## `setCustomSocketHandler`

This method allows you skip Socket.io and force custom signaling implementations e.g. SIP-signaling, XHR-signaling, SignalR/WebSync signaling, Firebase/PubNub signaling etc.

Here is Firebase example:

```html
<script src="/dev/globals.js"></script>
<script src="/dev/FirebaseConnection.js"></script>
<script>
var connection = new RTCMultiConnection();

connection.firebase = 'your-firebase-account';

// below line replaces FirebaseConnection
connection.setCustomSocketHandler(FirebaseConnection);
</script>
```

Here is PubNub example:

```html
<script src="/dev/globals.js"></script>
<script src="/dev/PubNubConnection.js"></script>
<script>
var connection = new RTCMultiConnection();

// below line replaces PubNubConnection
connection.setCustomSocketHandler(PubNubConnection);
</script>
```

SIP/SignalR/WebSync/XHR signaling:

```javascript
// please don't forget linking /dev/globals.js

var connection = new RTCMultiConnection();

// SignalR (requires /dev/SignalRConnection.js)
connection.setCustomSocketHandler(SignalRConnection);

// WebSync (requires /dev/WebSyncConnection.js)
connection.setCustomSocketHandler(WebSyncConnection);

// XHR (requires /dev/XHRConnection.js)
connection.setCustomSocketHandler(XHRConnection);

// Sip (requires /dev/SipConnection.js)
connection.setCustomSocketHandler(SipConnection);
```

Please check [`FirebaseConnection`](https://github.com/muaz-khan/RTCMultiConnection/tree/master/dev/FirebaseConnection.js) or [`PubNubConnection.js`](https://github.com/muaz-khan/RTCMultiConnection/tree/master/dev/PubNubConnection.js) to understand how it works.

For more information:

* https://muazkhan.com:9001/demos/Audio+Video+TextChat+FileSharing.html#comment-2670178473
* https://muazkhan.com:9001/demos/Audio+Video+TextChat+FileSharing.html#comment-2670182313

## `enableLogs`

By default, logs are enabled.

```javascript
connection.enableLogs = false; // to disable logs
```

## Get Remote User Extra Data

```javascript
connection.extra = {
    joinTime: new Date()
};
connection.updateExtraData();
```

Here is how to get extra-data:

```javascript
var extra = connection.peers['remote-userid'].extra;
alert( extra.joinTime);
```

Recent commit supports this as well:

```javascript
connection.onstream = function(event) {
    if(event.type === 'remote') {
        connection.socket.emit('get-remote-user-extra-data', event.userid, function(extra) {
             alert( extra.joinTime );
        });
    }
}:
```

## `updateExtraData`

You can force all the extra-data to be synced among all connected users.

```javascript
connection.extra.fullName = 'New Full Name';
connection.updateExtraData(); // now above value will be auto synced among all connected users
```

## `onExtraDataUpdated`

This event is fired as soon as extra-data from any user is updated:

```javascript
connection.onExtraDataUpdated = function(event) {
	console.log('extra data updated', event.userid, event.extra);

	// make sure that <video> header is having latest fullName
	document.getElementById('video-header').innerHTML = event.extra.fullName;
};
```

## `streamEvents`

It is similar to this:

* http://www.rtcmulticonnection.org/docs/streams/

## `socketOptions`

Socket.io options:

```javascript
connection.socketOptions = {
	'force new connection': true, // For SocketIO version < 1.0
	'forceNew': true, // For SocketIO version >= 1.0
	'transport': 'polling' // fixing transport:unknown issues
};
```

Or:

```javascript
connection.socketOptions.resource = 'custom';
connection.socketOptions.transport = 'polling';
connection.socketOptions['try multiple transports'] = false;
connection.socketOptions.secure = true;
connection.socketOptions.port = '9001';
connection.socketOptions['max reconnection attempts'] = 100;
// etc.
```

## `connection.socket`

```javascript
connection.open('roomid', function() {
    connection.socket.emit('whatever', 'hmm');
    connection.socket.disconnect();
});
```

## `DetectRTC`

Wanna detect current browser?

```javascript
if(connection.DetectRTC.browser.isChrome) {
	// it is Chrome
}

// you can even set backward compatibility hack
connection.UA = connection.DetectRTC.browser;
if(connection.UA.isChrome) { }
```

Wanna detect if user is having microphone or webcam?

```javascript
connection.DetectRTC.detectMediaAvailability(function(media){
	if(media.hasWebcam) { }
	if(media.hasMicrophone) { }
	if(media.hasSpeakers) { }
});
```

## `invokeSelectFileDialog`

Get files problematically instead of using `input[type=file]`:

```javascript
connection.invokeSelectFileDialog(function(file) {
	var file = this.files[0];
	if(file){
		connection.shareFile(file);
	}
});
```

## `processSdp`

Force bandwidth, bitrates, etc.

```javascript
var BandwidthHandler = connection.BandwidthHandler;
connection.bandwidth = {
	audio: 128,
	video: 256,
	screen: 300
};
connection.processSdp = function(sdp) {
    sdp = BandwidthHandler.setApplicationSpecificBandwidth(sdp, connection.bandwidth, !!connection.session.screen);
    sdp = BandwidthHandler.setVideoBitrates(sdp, {
        min: connection.bandwidth.video,
        max: connection.bandwidth.video
    });

    sdp = BandwidthHandler.setOpusAttributes(sdp);

    sdp = BandwidthHandler.setOpusAttributes(sdp, {
        'stereo': 1,
        //'sprop-stereo': 1,
        'maxaveragebitrate': connection.bandwidth.audio * 1000 * 8,
        'maxplaybackrate': connection.bandwidth.audio * 1000 * 8,
        //'cbr': 1,
        //'useinbandfec': 1,
        // 'usedtx': 1,
        'maxptime': 3
    });

    return sdp;
};
```

* http://www.rtcmulticonnection.org/docs/processSdp/

## `autoCloseEntireSession`

* http://www.rtcmulticonnection.org/docs/autoCloseEntireSession/

## `filesContainer`

A DOM-element to show progress-bars and preview files.

```javascript
connection.filesContainer = document.getElementById('files-container');
```

## `videosContainer`

A DOM-element to append videos or audios or screens:

```javascript
connection.videosContainer = document.getElementById('videos-container');
```

## `onMediaError`

If screen or video capturing fails:

```javascript
connection.onMediaError = function(error) {
	alert( 'onMediaError:\n' + JSON.stringify(error) );
};
```

## `renegotiate`

> Note on 10-02-2018: `replaceTrack` is preferred over `renegotiate`.

Recreate peers. Capture new video using `connection.captureUserMedia` and call `connection.renegotiate()` and that new video will be shared with all connected users.

```javascript
connection.renegotiate('with-single-userid');

connection.renegotiate(); // with all users
```

## `addStream`

* http://www.rtcmulticonnection.org/docs/addStream/

You can even pass `streamCallback` and check if user declined prompt to share
screen:

```javascript
connection.addStream({
	screen: true,
	oneway: true,
	streamCallback: function(screenStream) {
		// this will be fired as soon as stream is captured
		if (!screenStream) {
			alert('User did NOT select to share any stream. He clicked "Cancel" button instead.');
			return;
		}
		screenStream.onended = function() {
			document.getElementById('share-screen').disabled = false;

			// or show button
			$('#share-screen').show();
		};
	};
});
```

## `removeStream`

* http://www.rtcmulticonnection.org/docs/removeStream/

You can even pass `streamCallback`:

```javascript
connection.removeStream('streamid');
connection.renegotiate();
```

## `mediaConstraints`

* http://www.rtcmulticonnection.org/docs/mediaConstraints/

## `sdpConstraints`

* http://www.rtcmulticonnection.org/docs/sdpConstraints/

## `extra`

* http://www.rtcmulticonnection.org/docs/extra/

## `userid`

* http://www.rtcmulticonnection.org/docs/userid/

You must set userid before opening or joining a room:

```javascript
connection.userid = 'abcdef';
connection.openOrJoin('roomid');
```

## `session`

* http://www.rtcmulticonnection.org/docs/session/

To enable two-way audio however one-way screen or video:

```javascript
// video is oneway, however audio is two-way
connection.session = {
    audio: 'two-way',
    video: true,
    oneway: true
};

// screen is oneway, however audio is two-way
connection.session = {
    audio: 'two-way',
    screen: true,
    oneway: true
};
```

## `enableFileSharing`

To enable file sharing. By default, it is `false`:

```javascript
connection.enableFileSharing = true;
```

## `changeUserId`

Change userid and update userid among all connected peers:

```javascript
connection.changeUserId('new-userid');

// or callback to check if userid is successfully changed
connection.changeUserId('new-userid', function() {
    alert('Your userid is successfully changed to: ' + connection.userid);
});
```

## `closeBeforeUnload`

It is `true` by default. If you are handling `window.onbeforeunload` yourself, then you can set it to `false`:

```javascript
connection.closeBeforeUnload = false;
window.onbeforeunlaod = function() {
	connection.close();
};
```

## `closeEntireSession`

You can skip using `autoCloseEntireSession`. You can keep session/room opened whenever/wherever required and dynamically close the entire room using this method.

```javascript
connection.closeEntireSession();

// or callback
connection.closeEntireSession(function() {
    alert('Entire session has been closed.');
});

// or before leaving a page
connection.closeBeforeUnload = false;
window.onbeforeunlaod = function() {
    connection.closeEntireSession();
};
```

## `closeSocket`

```javascript
connection.closeSocket(); // close socket.io connections
```

## `close`

* http://www.rtcmulticonnection.org/docs/close/

## `onUserIdAlreadyTaken`

This event is fired if two users tries to open same room.

```javascript
connection.onUserIdAlreadyTaken = function(useridAlreadyTaken, yourNewUserId) {
    if (connection.enableLogs) {
        console.warn('Userid already taken.', useridAlreadyTaken, 'Your new userid:', yourNewUserId);
    }

    connection.join(useridAlreadyTaken);
};
```

Above event gets fired out of this code:

```javascript
moderator1.open('same-roomid');
moderator2.open('same-roomid');
```

## `onEntireSessionClosed`

You can tell users that room-moderator closed entire session:

```javascript
connection.onEntireSessionClosed = function(event) {
    console.info('Entire session is closed: ', event.sessionid, event.extra);
};
```

## `captureUserMedia`

* http://www.rtcmulticonnection.org/docs/captureUserMedia/

## `open`

Open room:

```javascript
connection.open('roomid', function(isRoomCreated, roomid, error) {
	if(error) {
        alert(error);

        // if error says that room is already created
        connection.join('room-id');
        return;
    }
});
```

## `join`

Join room:

```javascript
connection.join('roomid', function(isRoomJoined, roomid, error) {
    if(error) {
        // maybe room does not exist
        // maybe room is full
        // maybe password is invalid
        alert(error);
        return;
    }
});

// or pass "options"
connection.join('roomid', {
	localPeerSdpConstraints: {
		OfferToReceiveAudio: true,
		OfferToReceiveVideo: true
	},
	remotePeerSdpConstraints: {
		OfferToReceiveAudio: true,
		OfferToReceiveVideo: true
	},
	isOneWay: false,
	isDataOnly: false
});
```

## `openOrJoin`

```javascript
connection.openOrJoin('roomid');

// or
connection.openOrJoin('roomid', function(isRoomOpened, roomid) {
	if(isRoomOpened === true) {
        alert('opened the room');
    }
	else {
        alert('joined the room');
    }
});
```

## `dontCaptureUserMedia`

By default, it is `false`. Which means that RTCMultiConnection will always capture video if `connection.session.video===true`.

If you are attaching external streams, you can ask RTCMultiConnection to DO NOT capture video:

```javascript
connection.dontCaptureUserMedia = true;
```

## `dontAttachStream`

By default, it is `false`. Which means that RTCMultiConnection will always attach local streams.

```javascript
connection.dontAttachStream = true;
```

## `dontGetRemoteStream`

By default, it is `false`. Which means that RTCMultiConnection will always get remote streams.

```javascript
connection.dontGetRemoteStream = true;
```

## `onSettingLocalDescription`

This event is fired as soon as RTCMultiConnection calls the `nativePeer.setLocalDescription` method.

This event helps you say: "incoming call" or debug peers if connection didn't establish till next 3 seconds.

This method is helpful if you switch between cameras or you add screen or add other camera or change anything:

```javascript
connection.onSettingLocalDescription = fucntion(event) {
	console.log('Trying to connect with', event.userid);

	var nativePeer = event.peer;
	var localStreams = nativePeer.getLocalStreams();
	var remoteStreams = nativePeer.getRemoteStreams();

	// make sure that you are correctly displaying all remote videos
	var tries = 0;
	(function looper() {
		if(tries > 10) return; // throw error here

		tries++;

		// make sure that each user's video.id == hisUserID
		var video = document.getElementById(event.userid);

		// skip: if user left or if user video is playing
		if(!video || video.currentTIme > 0) return;

		video.src = URL.createObjectURL ( nativePeer.getRemoteStreams()[0] );
		video.play();

		setTimeout(looper, 1000); // repeat till 10-seconds
	})();
};
```

## `beforeAddingStream`

You can skip any stream or allow RTCMultiConnection to share a stream with remote users.

`nativePeer.addStream` method will be called only if below event permits the `MediaStream` object:

```javascript
connection.beforeAddingStream = function(stream, peer) {
	if(stream.id == 'any-streamid') return; // skip
	if(stream.isScreen) return; // skip
	if(stream.inactive) return; // skip

	// var remoteUserId = peer.userid;
	// var remoteUserExtra = connection.peers[remoteUserId].extra;

	return stream; // otherwise allow RTCMultiConnection to share this stream with remote users
};
```

## `getScreenConstraints`

This method allows you get full control over screen-parameters:

```javascript
connection.__getScreenConstraints = connection.getScreenConstraints;
connection.getScreenConstraints = function(callback) {
    connection.__getScreenConstraints(function(error, screen_constraints) {
        if (connection.DetectRTC.browser.name === 'Chrome') {
            delete screen_constraints.mandatory.minAspectRatio;
            delete screen_constraints.mandatory.googLeakyBucket;
            delete screen_constraints.mandatory.googTemporalLayeredScreencast;
            delete screen_constraints.mandatory.maxWidth;
            delete screen_constraints.mandatory.maxHeight;
            delete screen_constraints.mandatory.minFrameRate;
            delete screen_constraints.mandatory.maxFrameRate;
        }
        callback(error, screen_constraints);
    });
};
```

Or to more simplify it:

```javascript
connection.__getScreenConstraints = connection.getScreenConstraints;
connection.getScreenConstraints = function(callback) {
    connection.__getScreenConstraints(function(error, screen_constraints) {
        if (connection.DetectRTC.browser.name === 'Chrome') {
            screen_constraints.mandatory = {
                chromeMediaSource: screen_constraints.mandatory.chromeMediaSource,
                chromeMediaSourceId: screen_constraints.mandatory.chromeMediaSourceId
            };
        }
        callback(error, screen_constraints);
    });
};
```

You can even delete width/height for Firefox:

```javascript
connection.__getScreenConstraints = connection.getScreenConstraints;
connection.getScreenConstraints = function(callback) {
    connection.__getScreenConstraints(function(error, screen_constraints) {
        if (connection.DetectRTC.browser.name === 'Chrome') {
            delete screen_constraints.mandatory.minAspectRatio;
        }
        if (connection.DetectRTC.browser.name === 'Firefox') {
            delete screen_constraints.width;
            delete screen_constraints.height;
        }
        callback(error, screen_constraints);
    });
};
```

## Cross-Domain Screen Capturing

First step, install this chrome extension:

* https://chrome.google.com/webstore/detail/screen-capturing/ajhifddimkapgcifgcodmmfdlknahffk

Now use below code in any RTCMultiConnection (screen) demo:

```html
<script src="/dev/globals.js"></script>

<!-- capture screen from any HTTPs domain! -->
<script src="https://cdn.webrtc-experiment.com:443/getScreenId.js"></script>

<script>
// Using getScreenId.js to capture screen from any domain
// You do NOT need to deploy Chrome Extension YOUR-Self!!
connection.getScreenConstraints = function(callback, audioPlusTab) {
    if (isAudioPlusTab(connection, audioPlusTab)) {
        audioPlusTab = true;
    }

    getScreenConstraints(function(error, screen_constraints) {
        if (!error) {
            screen_constraints = connection.modifyScreenConstraints(screen_constraints);
            callback(error, screen_constraints);
        }
    }, audioPlusTab);
};
</script>
```

Don't want to link `/dev/globals.js` or want to simplify codes???

```html
<!-- capture screen from any HTTPs domain! -->
<script src="https://cdn.webrtc-experiment.com:443/getScreenId.js"></script>

<script>
// Using getScreenId.js to capture screen from any domain
// You do NOT need to deploy Chrome Extension YOUR-Self!!
connection.getScreenConstraints = function(callback) {
    getScreenConstraints(function(error, screen_constraints) {
        if (!error) {
            screen_constraints = connection.modifyScreenConstraints(screen_constraints);
            callback(error, screen_constraints);
        }
    });
};
</script>
```

## Scalable Broadcasting

RTCMultiConnection now supports WebRTC scalable broadcasting. Two new API are introduced: `enableScalableBroadcast` and `singleBroadcastAttendees`.

```javascript
connection.enableScalableBroadcast = true; // by default, it is false.
connection.singleBroadcastAttendees = 3;   // how many users are handled by each broadcaster
```

Live Demos:

| DemoTitle        | TestLive           | ViewSource |
| ------------- |-------------|-------------|
| Scalable Audio/Video Broadcast | [Demo](https://muazkhan.com:9001/demos/Scalable-Broadcast.html) | [Source](https://github.com/muaz-khan/RTCMultiConnection/tree/master/demos/Scalable-Broadcast.html) |
| Scalable Screen Broadcast | [Demo](https://muazkhan.com:9001/demos/Scalable-Screen-Broadcast.html) | [Source](https://github.com/muaz-khan/RTCMultiConnection/tree/master/demos/Scalable-Screen-Broadcast.html) |
| Scalable Video Broadcast | [Demo](https://muazkhan.com:9001/demos/Video-Scalable-Broadcast.html) | [Source](https://github.com/muaz-khan/RTCMultiConnection/tree/master/demos/Video-Scalable-Broadcast.html) |
| Scalable File Sharing | [Demo](https://muazkhan.com:9001/demos/Files-Scalable-Broadcast.html) | [Source](https://github.com/muaz-khan/RTCMultiConnection/tree/master/demos/Files-Scalable-Broadcast.html) |

## `onNumberOfBroadcastViewersUpdated`

This event is fired for scalable-broadcast-initiator.

```javascript
connection.onNumberOfBroadcastViewersUpdated = function(event) {
    // event.broadcastId
    // event.numberOfBroadcastViewers
    console.info('Number of broadcast (', event.broadcastId, ') viewers', event.numberOfBroadcastViewers);
};
```

## `getNumberOfBroadcastViewers`

You can manually get number-of-broadcast viewers as well:

```javascript
connection.getNumberOfBroadcastViewers('broadcast-unique-id', function(numberOfBroadcastViewers) {
    alert(numberOfBroadcastViewers);
});
```

## Fix Echo

```javascript
connection.onstream = function(event) {
	if(event.mediaElement) {
		event.mediaElement.muted = true;
		delete event.mediaElement;
	}

	var video = document.createElement('video');
	if(event.type === 'local') {
		video.muted = true;
	}
	video.src = URL.createObjectURL(event.stream);
	connection.videosContainer.appendChild(video);
}
```

## How to use getStats?

* https://github.com/muaz-khan/getStats

```javascript
connection.multiPeersHandler.onPeerStateChanged = function(state) {
    if (state.iceConnectionState.search(/disconnected|closed|failed/gi) === -1 && !connection.isConnected) {
        connection.isConnected = true;

        var peer = connection.peers[state.userid].peer;
        getStats(peer, function(result) {
            if (!result || !result.connectionType) return;

            // "relay" means TURN server
            // "srflx" or "prflx" means STUN server
            // "host" means neither STUN, nor TURN
            console.debug('Incoming stream is using:', result.connectionType.remote.candidateType);
            console.debug('Outgoing stream is using:', result.connectionType.local.candidateType);

            // user external ip-addresses
            console.debug('Remote user ip-address:', result.connectionType.remote.ipAddress);
            console.debug('Local user ip-address:', result.connectionType.local.ipAddress);

            // UDP is a real media port; TCP is a fallback.
            console.debug('Peers are connected on port:', result.connectionType.transport);
        }, 5000);
        return;
    }
};
```

## How to mute/unmute?

You can compare `muteType` for `onmute` event; and `unmuteType` for `onunmute` event.

```javascript
connection.onmute = function(e) {
    if (!e.mediaElement) {
        return;
    }

    if (e.muteType === 'both' || e.muteType === 'video') {
        e.mediaElement.src = null;
        e.mediaElement.pause();
        e.mediaElement.poster = e.snapshot || 'https://cdn.webrtc-experiment.com/images/muted.png';
    } else if (e.muteType === 'audio') {
        e.mediaElement.muted = true;
    }
};

connection.onunmute = function(e) {
    if (!e.mediaElement) {
        return;
    }

    if (e.unmuteType === 'both' || e.unmuteType === 'video') {
        e.mediaElement.poster = null;
        e.mediaElement.src = URL.createObjectURL(e.stream);
        e.mediaElement.play();
    } else if (e.unmuteType === 'audio') {
        e.mediaElement.muted = false;
    }
};
```

## HD Streaming

```javascript
connection.bandwidth = {
    audio: 128,
    video: 1024,
    screen: 1024
};

var videoConstraints = {
    mandatory: {
        maxWidth: 1920,
        maxHeight: 1080,
        minAspectRatio: 1.77,
        minFrameRate: 3,
        maxFrameRate: 64
    },
    optional: []
};

connection.mediaConstraints.video = videoConstraints;
```

For low-latency audio:

* https://twitter.com/WebRTCWeb/status/499102787733450753

## Default devices?

By default, RTCMultiConnection tries to use last available microphone and camera. However you can disable this behavior and ask to use default devices instead:

```javascript
// pass second parameter to force options
var connection = new RTCMultiConnection(roomId, {
    useDefaultDevices: true
});
```

## Auto open or join?

By default, you always have to call `open` or `join` or `openOrJoin` methods manually. However you can force RTCMultiConnection to auto open/join room as soon as constructor is initialized.

```javascript
// pass second parameter to force options
var connection = new RTCMultiConnection(roomId, {
    autoOpenOrJoin: true
});
```

## Wanna use H264 for video?

```javascript
connection.codecs.video = 'H264';
```

## Disable Video NACK

```html
<script src="/dev/CodecsHandler.js"></script>
<script>
// in your HTML file
connection.processSdp = function(sdp) {
    // Disable NACK to test IDR recovery
    sdp = CodecsHandler.disableNACK(sdp);
    return sdp;
};
</script>
```

## Wanna use VP8 for video?

```javascript
connection.codecs.video = 'VP8';
```

## Wanna use G722 for audio?

```javascript
connection.codecs.audio = 'G722';
```

## Prioritize Codecs

```html
<script src="/dev/CodecsHandler.js"></script>
<script>
// in your HTML file
if(connection.DetectRTC.browser.name === 'Firefox') {
    connection.getAllParticipants().forEach(function(p) {
        var peer = connection.peers[p].peer;

        CodecsHandler.prioritize('audio/opus', peer);
    });
}
</script>
```

## `StreamHasData`

[`StreamHasData.js`](https://github.com/muaz-khan/RTCMultiConnection/tree/master/dev/StreamHasData.js) allows you check if remote stream started flowing or if remote stream is successfully received or if remote stream has data or not.

```html
<script src="/dev/StreamHasData.js"></script>
<script>
connection.videosContainer = document.getElementById('videos-container');
connection.onstream = function(event) {
    StreamHasData.check(event.mediaElement, function(hasData) {
        if (!hasData) {
            alert('Seems stream does NOT has any data.');
        }

        // append video here
        connection.videosContainer.appendChild(event.mediaElement);
        event.mediaElement.play();
        setTimeout(function() {
            event.mediaElement.play();
        }, 5000);
    });
};
</script>
```

Demo: https://muazkhan.com:9001/demos/StreamHasData.html

## File Sharing

You can share files using `connection.send(file)`. E.g.

```javascript
fileInput.onchange = function() {
    var file = this.files[0];

    if(!file) return;
    connection.send(file);
};
```

If you mistakenly shared wrong file, you can stop further sharing:

```javascript
var file;
fileInput.onchange = function() {
    file = this.files[0];

    if(!file) return;

    // First step: Set UUID for your file object
    file.uuid = connection.token();

    connection.send(file);
};

if(connection.fbr) {
    // Second Last step: remove/delete file chunks based on file UUID
    delete connection.fbr.chunks[file.uuid];
}
```

You can even set `connection.fbr=null`. **It is VERY EASY & reliable**:

```javascript
connection.fbr = null;
```

You can even try any of these (you don't need to care about file UUID):

```javascript
if(connection.fbr) {
    // clearing all file chunks
    // removing all file receivers
    connection.fbr.chunks = {};
    connection.fbr.users = {};
}
```

## `config.json`

You can set ports, logs, socket-URLs and other configuration using [`config.json`](https://github.com/muaz-khan/RTCMultiConnection/blob/master/config.json).

```json
{
  "socketURL": "/",
  "socketMessageEvent": "RTCMultiConnection-Message",
  "socketCustomEvent": "RTCMultiConnection-Custom-Message",
  "port": "9001",
  "enableLogs": "true"
}
```

Note: `config.json` is completely optional. You can set each property directly in your HTML files using `connection.property` e.g.

```javascript
connection.socketURL = '/';
connection.socketMessageEvent = 'RTCMultiConnection-Message';

// etc.
```

## Server Logs

[`config.json`](https://github.com/muaz-khan/RTCMultiConnection/blob/master/config.json) provides `enableLogs` attribute.

If `enableLogs:true` then all unexpected-server-errors are logged into [`logs.json`](https://github.com/muaz-khan/RTCMultiConnection/blob/master/logs.json) file.

So, if you're facing unexpected-server-disconnection, or if your application is NOT working properly; for example, if `userid` is NOT getting updated or if `extra-data` is NOT getting-synced; then you can look into `logs.json` to see unexpected errors.

You can either remove `enableLogs` from the `config.json` to **disable logs**; or you can use `false`:

```json
{
  "enableLogs": "false"
}
```

# Tips & Tricks

* https://github.com/muaz-khan/RTCMultiConnection/blob/master/docs/tips-tricks.md

# Other Documents

1. [Getting Started guide for RTCMultiConnection](https://github.com/muaz-khan/RTCMultiConnection/tree/master/docs/getting-started.md)
2. [Installation Guide](https://github.com/muaz-khan/RTCMultiConnection/tree/master/docs/installation-guide.md)
3. [How to Use?](https://github.com/muaz-khan/RTCMultiConnection/tree/master/docs/how-to-use.md)
4. [API Reference](https://github.com/muaz-khan/RTCMultiConnection/tree/master/docs/api.md)
5. [Upgrade from v2 to v3](https://github.com/muaz-khan/RTCMultiConnection/tree/master/docs/upgrade.md)
6. [How to write iOS/Android applications?](https://github.com/muaz-khan/RTCMultiConnection/tree/master/docs/ios-android.md)
7. [Tips & Tricks](https://github.com/muaz-khan/RTCMultiConnection/blob/master/docs/tips-tricks.md)

## Twitter

* https://twitter.com/WebRTCWeb i.e. @WebRTCWeb

## License

[RTCMultiConnection](https://github.com/muaz-khan/RTCMultiConnection) is released under [MIT licence](https://github.com/muaz-khan/RTCMultiConnection/blob/master/LICENSE.md) . Copyright (c) [Muaz Khan](http://www.MuazKhan.com/).


text:
HEIDER FAMILY STABLES ROUND TOWER STAKES (GROUP 3)
The Round Tower Stakes was promoted to its current distance of six furlongs in 1991 and since 2004 it has held Group 3 status. Over the last decade the race has emerged as a notable pointer for several of the major end of season Group 1s. Lightening Pearl won this race before going to capture the Group 1 Cheveley Park Stakes at Newmarket in 2011 while the 2018 winner Ten Sovereigns won the Group 1 Middle Park Stakes on his next start. The 2017 winner US Navy Flag is probably the most notable winner in the race's history as he went on to land that year's Middle Park and Dewhurst Stakes before adding the July Cup to his haul as a three-year-old.
LEADING RIDER (since 2000)
KEVIN MANNING with 5 wins: Abigail Pett (2005), Maoineach
(2008), Leitir Mor (2012), Smash Williams (2015) & New Treasure
LEADING TRAINER (since 2000)
AIDAN O'BRIEN with 6 wins: Cherokee (2004), Great White
Eagle (2013), Intelligence Cross (2016), US Navy Flag (2017) & Ten Sovereigns (2018), Lope Y Fernandez (2019).
FLAME OF TARA STAKES (GROUP 3)
This race is named after Jim Bolger and Pat O'Kelly's 1983 Coronation Stakes heroine Flame Of Tara who went on to become a broodmare of major renown having bred the Irish Derby winner Salsabil and the Group 1 winner Marju. The race was first run in 2003 and it has been staged over a mile since 2008. In 2016 it was upgraded to Group 3 status.
FRAN BERRY with 4 wins: Dreamtheimpossible (2008), Corcovada
(2009), Chrysanthemum (2010) & Jack Naylor (2014).
LEADING TRAINERS (since 2008)
DAVID WACHMAN with 2 wins: Dreamtheimpossible (2008) & Chrysanthemum (2010).
AIDAN O'BRIEN with 3 wins: Kind Of Magic (2015), Just Wonderful (2018) & Divinely (2020).
MRS. J. HARRINGTON with 2 wins: Jack Naylor (2014) & Cayenne Pepper (2019).
PADDY POWER IRISH CAMBRIDGESHIRE (GROUP 3)
SNOW FAIRY STAKES (GROUP 3)
This race was established in 2005 and was promoted to Group 3 status in 2009. Initially it was run as the Dance Design Stakes in honour of Moyglare Stud's 1996 Irish Oaks winner but for the last three years it has been run in honour of the brilliant international racemare Snow Fairy who won the Irish Oaks in 2010 and the Irish Champion Stakes in 2012.
LEADING RIDERS (since 2005)
JOSEPH O'BRIEN with 2 wins: Up (2012) & Say (2013).
PAT SMULLEN with 2 wins: Chinese White (2009) & Carla Bianca (2014).
FRAN BERRY with 2 wins: Bible Belt (2011) & Bocca Bociata (2015).
RYAN MOORE with 2 wins: Rain Goddess (2017) & Goddess (2019).
AIDAN O'BRIEN with 4 wins: Up (2012), Say (2013), Somehow
(2016), Rain Goddess (2017) and Goddess (2019).
RACING TV show every race live which you can watch on your TV, tablet or mobile. For more information and to create an account, visit the Racing TV website.
RACING REPLAYS If you missed any of the action, you can watch all the replays here and on The Curragh Twitter and Facebook.

redpajama_set_name: RedPajamaCommonCrawl


text:
I only know my father's face from a picture
Luwi Velleman was born in 1949 and lives in Semarang, in the Jangli district. His father, Louis Velleman, had the small Luwi in his arms and cherished him. Then in 1949 all Dutch soldiers had to return to the Netherlands. Father Louis left his girlfriend and child in Indonesia with the intention to return as quickly as possible, with a job and a future. But it never came to be. Luwi has never seen his father. He lived in the assumption that his father had abandoned him deliberately. Until he received a letter from Australia in 1990...
A reunion after death
Written by Henk Schulte Nordholt
Jecky was born and raised in Bali. His daddy soldier left the island even before the birth of his child to Java and then to the Netherlands. Only 34 years later, after a long search, Jecky traced his father Jack. His father did not want to travel to Indonesia to meet because of his advanced age. And Jecky, who had never been outside Bali, did not dare to travel to the Netherlands. Son and father would never meet. Yet father Jack eventually returned in Jecky's life.


text:
November 7, 2009 The Badger 0
As I was leaving the venue after the show, I overheard several people saying "that was excellent," and, as I paused outside, I couldn't help feeling uneasy about those words. I don't know how I felt (and still don't), but excellent?
There was an intimacy between David and much of the audience; however, like entering a clique, one either left initiated, or not. David is brutally open about himself: like a character from a Wes Anderson film, he was able to articulate himself with an exactitude that was frightening. Because of this, one cannot help but have a moral reaction to David and the show – he gives and we take, with an alarming immediacy. Excellent?! I wandered the streets and felt bad for disagreeing.
The outspoken David Hoyle in perplexing form
I pondered David's continuous allusions to the avant garde: he describes the première of Stravinsky's Rite of Spring, with Nijinsky's choreography, Picasso's backdrops and the riot that then followed, in order to highlight the contrasting passivity of today's youth. – making the point that it should be some 20 year-old up there, and not some old guy pushing the boundaries. I couldn't help feeling that, like the emasculation of surrealism and the dilution of DaDa into the mainstream, something had been lost; both in this performance, and also more generally in art and its reception by modern audiences.
Was it excellent? David farted on stage, people laughed, David sang a song from Cabaret badly (I liked this moment), and people applauded and whooped, all at the right moments, too. Where, however, were the riots?
It wasn't good, but was it meant to be? I watched a girl's face as David thrashed around on the stage to music – she looked on uncomfortably, seemingly disbelieving that she'd paid for this. "Giving you your money's worth!": these words would ring intermittently throughout the act, and as I thought of that girl, I realised that she hadn't understood. Getting your money's worth? Of course not, but is that not the point? Excellent? No, please, anything but that…
Tags: Brighton David Hoyel Performance The Basement
School for Gifted Children
Our Man in Havana
Save Madeira Terrace crowdfunding campaign nearing its end
UPDATED An open letter: Remove slave trade plaques now
Micro-Adventuring! Sorry…What?
Altermodern: post-post-modern?


text:
The Instructus family of companies advances education for the public benefit through the promotion of qualifications, training and skills.
Formed in 1996 as Skills CFA, our focus on skills development has led us to become the largest apprenticeship issuing authority in the UK (by number of certificates issued). Our work on apprenticeship standards impacts 11 million people every year, with our expertise in the field earning global recognition.
Since 2013 the Instructus family has grown to include CQM Training & Consultancy and the Springboard Consultancy. These two unique training companies have enabled us to complete a wider part of the learner journey, giving us the opportunity to do more with our charitable remit.
Instructus was born in 2016. By incorporating our services into a single end-to-end package, we work with organisations, charities and community groups to further the potential of those who have been underserved and left behind by society.
Talk to us about how we can support your goals ⇢
The Instructus family is made up of three unique businesses, each serving a distinct training need. Find out more about our brands and how they play their part in our work.
View Our Brands ⇢
It takes dedication to uphold our values. The Instructus team combines talent, expertise and experience to provide a worthwhile service to everyone we work with.
Meet the Team ⇢
Formed of volunteers from a range of backgrounds and specialisms, the Board of Trustees guide our work and ensure that we always act in accordance with our values.
Board of Trustees ⇢
Would you like to join our team? We are always on the look out for the brightest talent. View the latest vacancies across the group and find details on how to apply.
Work With Us ⇢
"It's about offering the same service and opportunities to all"
Yvonne Coolbear, Suffolk Constabulary
Who We Are ⇢ Current Projects ⇢ Case Studies ⇢


Email headshot and resume to info@acclaimtalent.com. We are no longer accepting mailed submission.
Daily we receive numerous requests by actors seeking representation so it sometimes takes us up to two weeks to respond. We understand that it is your life and career so we like to review submissions rapidly, but because of the rapid development of the Central Texas market we are sometimes inundated with work. After review of your submission, if interested, we will telephone you for an appointment. If you do not hear from us feel free to resubmit when you have gained more experience.
The criteria we use for signing talent is simple: Do we think we can get you work without undercutting the talent we already represent? We are a working agency and we need to feel confident that you have what's required to successfully audition and compete in this market.
We generally represent talent based in the State of Texas but cover surrounding regions as well. We want to be the best agency for people in this area, without hindering that focus by trying to be everywhere at once. There are great agencies in New York, LA, and Elsewhere, that are committed to those regions, and we support their ability to give actors great opportunities and services. Our sights, however, are set on building for this area and its talent, and this drive to improve the Texas film industy is at the core of who we choose to be and how we choose new clients. If talent are solely in it for themselves, they are probably not a good fit for Acclaim.
We seek people of all ethnicities and backgrounds. Because many commercials use "characters" we represent many excellent actors who have unusual looks. We are not just interested in romantic leading man and leading woman types.


Kitchen Cupboard / Under Cabinet Lighting is a set of lights installed underneath the cupboards in your kitchen, illuminating the counter and the wall splash area. Some of the systems could be installed inside of the cupboards as well. It lights up your kitchen working area with a local task light using less electrical power than the general kitchen light, and adds value and style to your kitchen. The Green Electrician can install the Cupboard / Under Cabinet LED Lighting system of your choice, or design and install a custom LED system for your special kitchen. LED kitchen lights come with different white light colour. The most popular white colour is a slightly yellowish Warm White with colour temperature of 2,700 - 3,000 deg Kelvin. Bright White or Daylight White with colour temperature of around 4,000 deg Kelvin is popular too.
Most of the systems available in Toronto, Mississauga, Etobicoke, Oakville, Brampton and the GTA are supplied from 12V DC transformers included, or optional, when you buy the system. Advantage of the 12V DC system is fact that it is allowed to be installed inside the cupboard for the purpose of illumination of the shelves. The big drawback of every system with transformer is the transformer being hard to hide in the kitchen environment. 12V DC LED fixtures represent a wide game of interesting design choices, but luminosity of used LEDs is often poor and installation will require more lighting units than expected. Manufacturers do not disclose the kind of LED pearls used in the fixture and rarely disclose honestly its luminosity. Before the actual installation, check if the luminosity of the 12V DC system is up to your expectations.
Some of the systems available are supplied from the house 120V AC circuit. 120V AC systems can't be installed inside cupboards. Installation on the bottom surface of the cupboard makes them hard to notice. Arguably, your best choice would be LED 120V AC, but they are rare and few in between. The big advantage of 120V AC installation is the possibility of easy switching it with a regular in-the-wall switch. It will require access into the kitchen wall and may be limited by existing ceramic tiles and other in-the-wall installations.


text:
Q: Loading a different google map everytime, after clicking different address In my website I have two panel, left side is for adrress and right side is for google map.
I want to load a google map once I click a particular address without page refresh.
Please help me.

A: You should implement this via Javascript, the algorithm will be something like this:

*

*Show a map based on a default location (e.g. your city and adequate zoom level to this)

*a form with a textbox to search and address

*An event on click on a "search button" to geocode and get a lat,lon for that address

*Re-set via Javascript the center of the map based on the geocode service response

*add a marker on location returned from geocoding service.

hope this helps
PD How are you querying the map with the panels right now ?

A: Geocode the address here is the link on how to go about it
https://developers.google.com/maps/documentation/javascript/geocoding#GeocodingRequests
then do this
map.setMap(latLng)
where map is your global map object
and latLng is co-ordinates obtained from geocode library

A: <script src="https://maps.googleapis.com/maps/api/js?v=3.exp&sensor=false"></script>
    <script>

var geocoder;

var map;

function initialize() {

  geocoder = new google.maps.Geocoder();

  var latlng = new google.maps.LatLng(-34.397, 150.644);

  var mapOptions = {zoom: 8,center: latlng

  }

  map = new google.maps.Map(document.getElementById('map-canvas'), mapOptions);
}

function codeAddress() {

  var address = document.getElementById('address').value;

  geocoder.geocode( { 'address': address}, function(results, status) {

    if (status == google.maps.GeocoderStatus.OK) {

      map.setCenter(results[0].geometry.location);

      var marker = new google.maps.Marker({

          map: map,

          position: results[0].geometry.location

      });

    }
else
 {

      alert('Geocode was not successful for the following reason: ' + status);

   }

  });

}

google.maps.event.addDomListener(window, 'load', initialize);

    </script>

 <input id="address" type="textbox" value="New Delhi, India">

      <input type="button" value="Geocode" onclick="codeAddress()">

redpajama_set_name: RedPajamaStackExchange


Medals can be earned by reaching new Levels or you can purchase them from the Store by going to the Resources Tab, opening the Misc. subtab, and visiting the Medals Section.
Note: Upgrading Units to higher Ranks is a permanent action that applies not to individual Units, but the entire class - if you upgrade your Grenadiers to Rank 3, all future Grenadiers you hire will automatically have Rank 3.


Salon booth rental has become a very popular route for hair stylists. There are salon suites for rent, salon booth rental (chair rental), and the traditional commission salons.
Booth Renting vs Commission Salon, which is Right for Me?
How Much do Hair Stylists Make?
Read on to have these questions answered from a real life experience.
This guide is taken from my professional experience of 15 years as a hairdresser in Illinois working in commission salons and a booth rental salon.
At the age of 17 I started beauty school with a hope and a prayer that I could make a career out of my life long passion.
It took dedication, devotion, and sacrifice at a young age but I committed myself and finished school in a little over 9 months. I could not wait to get behind the chair and start taking real clients. The last month or so of school was spent finishing up my services and applying for jobs.
After what seemed like a thousand applications and a hundred interviews, I accepted a position with a corporately owned salon in a mall – my first commission salon.
For an inexperienced stylist, the starting salary was 40% commission with a minimum wage base pay (we were paid whichever was higher for the pay period), which at the time was about $7.00 an hour plus tips. I worked hard and made my way to 45% within my first month. Four months later I decided that corporately owned salons were not for me.
Now, I know what you are thinking. I'm a quitter.
One thing I should probably add to this is that I am very cautious and I make very calculated decisions when it comes to my career. The goal has always been to open my own salon so the way I see it, the early part of my career is going to be research and development.
I didn't want to commit myself to one salon, build a clientele, and then leave.
Here is my opinion on jobs – in order to be happy you have to check three things on a list.
But, there is always that lingering question, how much do hair stylists make? I will address this later on in this article.
After submitting my application and a phone call with "Luke", I was asked to come in for a meet and greet.
Luke met me and proceeded to tell me his story. He was in real estate and invested in this business with his sister who suddenly had to move due to her husband's job being transferred. Now he is stuck with a beauty salon with no knowledge or experience in the business. There was no remaining staff, and the business had been closed for a couple months.
His goal was to find someone to manage it for him. In comes me at 19 years old, one real job under my belt, but I had drive. I left the salon that night with a key and a mission. Enter the importance of contracts, paperwork, and employment forms.
This salon was in bad shape: hair everywhere, used wax sticks, chipping paint, and might I add, bugs.
Luke told me I could do what I needed to get the place functioning, and to save my receipts and I would be reimbursed.
I spent 2 weeks at about 13 hours a day cleaning, painting and prepping. A few of my friends were in the industry so I hired them as my staff (let's not even get into what a bad idea that was).
I was at the salon 6 days a week for more than 10 hours a day. We had walk-ins occasionally and I had some regulars but business was slow plus I was getting sick of doing perms. Luke did not want to put any money into advertising or marketing.
My "time off" was spent printing coupons and spreading the word about the salon. Let me tell you how this one ended. Around 5 or 6 months in, I was getting paid $300 every week, plus small tips.
All profits were picked up daily by Luke. Essentially, I was getting taken advantage of and the straw that broke the camel's back was when Luke sold half of his end of the business to Betty.
Betty wasn't in the industry, and she came up with an idea to charge $5 per haircut. That was my last day. On the plus side I did retain some of my clients from there and still see them 13 years later.
The big, beautiful, breathtaking salon on Chicago's Gold Coast. A large privately owned 8,000 + square foot, modern dream salon!
My prices? $75 and up for a haircut at 50% commission, plus $4 haircut fee and a $7 color fee.
Now, I have made it. We were treated like rockstars. Sweeping your own hair or cutting foils was not allowed, we had staff for that. All I had to do was cut and style hair and collect my money. Sounds like a fantasy, except when the majority of the staff "walked out" on the owner and took all of the clients with.
The staff from this salon was promised 60% commission at a local competing salon.
So they got together and left. The new salon owner went back on his word. Now they were stuck either working there or all finding different jobs because my owner didn't want to bring them back. Again I stress, the importance of paperwork.
I gave it a good go at the modern dream salon but ultimately the client flow wasn't there. And I just wasn't that fancy, I don't mind sweeping my own hair.
My home for the next 7 years about a mile and a half from my house.
It was a small privately (family owned) salon. The clientele was loyal, plenty of walk-ins, humble staff, and nice atmosphere.
50% commission no fee, and graduated retail commission. I was content and I was wondering how much does a hair stylist make in a commission salon?
I made really decent money. My clients were loyal and about 93% of them were referrals from people in my life who were also from the neighborhood.
After 6 years, I started to think about moving on from here to the next step in my career.
It took me about a year to finally commit to leaving. There were a few things that I was unhappy about, but those are irrelevant now.
Bottom line is that I made a really good living working here. Owning my own salon one day was still part of the plan, and seeing as how this was a family owned place, I was never going to be in the "circle of trust" or be given more responsibility, or an option to buy into the business.
This moment was pivotal. I decided to try *drumroll please* salon booth rental.
Non-Payroll, Self Employed. This means you are responsible for additional taxes that would normally be paid by an employer. Tax form 1099 issued by merchant services (credit card processor).
Booth rental means you own your own business. You are your own boss, determine your hours, book your schedule. This means there is no one looking over your shoulder, telling you how to run your business or treat your clients.
Renting a chair and booth rental are virtually the same thing. You are paying for the access during specific hours to a chair in which you can conduct your business.
This was it. This was the one that was sink or swim. Will my clients find me? Will they follow if they do? Can I afford this? The questions were endless.
I found a small salon 1 block from my house renting out chairs.
$25 a day for the first 3 months, then $50 a day thereafter. I get to keep everything I make, and the rental was the cost of 1 haircut a day. I am going to make more money than I know what to do with! I'm going to buy my dream car! I am going to retire in like… 4 months!
Hold it! Calm down, that is not the case. How am I going to keep track of my schedule? What if someone wants to pay with a credit card? Where do I buy hair color, and barbicide, and capes?
A visit to CosmoProf and thousands of dollars later, I had a very small supply of color, 2 capes, foils, styling products, cotton, color remover, ten different types of bleach for highlights, balayage etc.
Hours, maybe even days later, I had booking software, a very lame website, 100 business cards from vistaprint (with their logo on the back, because those were the cheapest), a list of fees from the credit card processors, and a lack of sleep.
It took a lot of work to set up my salon booth business.
Now, I was ready to go.
I worked long days double booking myself, working until 10pm, skipping lunch etc; I did this all to save money on rent.
As the months went by I found myself spending all of my free time playing what I call "schedule tetris", as my clients texted and called me at all hours of the night and day.
Quickly I learned there was no longer such a thing as a day off and now I had so much to worry about. Want to know what's fun? Getting a letter from the state of Illinois saying your sales taxes are late. It isn't even April 15th.
The learning curve associated with this decision was massive. No longer was I just little Maggie standing behind a chair making people feel pretty, I was a small business owner.
When tax time rolled around after my first year I thought I was going to have a heart attack. No one told me I had to save 30% for taxes.
Why? I get to keep 100% of my profits now. No one told me to file quarterly or I would pay a penalty. No one told me I was going to pay some credit card company thousands of my hard earned dollars every year.
Or spend over $30,000 a year on color and supplies, rent and insurance. Needless to say, at this point I did not retire. I do not drive my dream car. It was wild waking up in the morning and checking my bank account and seeing my money being deposited from the credit card company.
$600 a day, $1000 a day, it sounded like a lot of money. Until every trip to CosmoProf costs over $300.
I got to the point where I told them I didn't even want to hear my total, I just closed my eyes and signed. There were times I spent over $700 in one visit. From what I learned through my own experience, and watching my co-workers who were also booth renters, you have to be prepared.
What that means is that even if you do not think you are going to use a level 9 Red Copper color, you need to stock it.
Clients can surprise you and request something different that they decided on over lunch with their co-workers. How does this impact your bottom line?
You have stagnant money sitting on a shelf, for those "just in case" scenarios. I probably had about $3,000 worth of inventory sitting on a shelf at any given time.
Booth rental takes commitment, strategy, impeccable planning and scheduling, and most of all time.
As I would reflect on my job I began to realize that I was spending way more than three or four days a week working. So much of my "free" time was being spent working.
Now, I am not a mathematician, but it was pretty simple to figure out that my income was certainly not covering all of the extra hassle I endured working for myself in such a small capacity.
There was no one to help me take appointments, or greet clients if I was running behind, or make runs to the supply stores. There are no such things as "business hours" when your clients can reach you through a simple text on your cell phone at any time.
If I would have divided my income among the countless hours I spent working on things other than servicing my clients, I bet I would not have even come close to minimum wage.
I am thankful for all of the experiences I have had throughout my career thus far, and thanks to all of them, I made a very informed decision when opening my own salon.
I am now the proud co-owner of a 12-chair salon called Pilorum Salon and Spa. My salon is a commission based salon. My team is united and receives regularly scheduled free education.
Even as the owner I am happy to help assist anyone who needs the help. We are able to take on large wedding parties, and give a mother and a daughter a haircut at the same time.
Something that would have never been possible working on my own. Structuring my salon with the booth rental model would have been easy. I would have sat back and collected rent money and not had a worry in the world, I would not have to contribute taxes or stock supplies.
But, I would have been a landlord and not a salon owner. The staff would not have been a team working in unity, learning and growing together. We would not be able to co-schedule appointments, or help each other shampoo and consult each other.
Everyone would be working for themselves, be on their own schedule, and have their own agenda.
Hairdresser Salary – How is it Calculated?
Before I address some quantitative data with you let me express my concluding thoughts. If opening my own salon was not in the cards, my next transition would have been to return to a commission based salon.
Having an established clientele would have allowed me some negotiating power concerning my commission. My only responsibility would be to show up, take care of my clients, and return home with nothing but free time.
I would no longer have to worry about restocking my inventory or playing "schedule tetris" in my free time. My taxes would be as simple as a W-2 at half the rate.
Maintaining a website, booking software, marketing & advertising, making a rent payment and paying for business insurance would no longer be a worry of mine.
Everyone has their own reason for trying booth rental; an expectation of higher income, a more flexible schedule, or simply a desire for additional responsibility or decision making ability.
For me it was a test, it was research, curiosity, and due diligence prior to making decisions for my own salon. But, if there is anything you can take from my experiences, inform yourself, crunch numbers and talk to a professional accountant. Otherwise, you may be in for some unexpected surprises along the way that make the reality of booth rental a little less glamorous than it seems.
Now, why don't we crunch some numbers. I am going to round up to $100,000 and not include Federal income tax to keep this simple.
40% commission leaves me with $40,000 in taxable revenue.
50% straight commission leaves me with $50,000 in taxable revenue.
In this scenario the tax rate increases to 15% based on the fact that employers contribute 7.5% to W-2 employees whereas self-employed individuals must match the contribution to account for Social Security and Unemployment taxes.
These numbers are all a guesstimate, because I definitely did not make $100,000 the first year I was out of school.
This is meant to show you that you have to "crunch the numbers" for each scenario.
It may seem like you are making a lot of extra money being a booth renter, but when you dig a little deeper and look at the numbers, you may find that you are investing a lot more time and resources to make a lot less money.
Look at your salon booth rental agreement very closely there can be some interesting and unfavorable terms.
Bad salon reputation (Google reviews, Yelp reviews, Facebook reviews etc) based on the performance of co-workers, ultimately giving the salon as a whole a bad name.
Here is our secret and super handy infographic to salon booth rental vs profit.


text:
Мели́сса Фа́рман (; 20 августа 1990, Нью-Йорк, Нью-Йорк, США) — американская ,  и .

Биография и карьера
Мелисса Фарман родилась 20 августа 1990 года в Нью-Йорке (штат Нью-Йорк, США), а выросла в Париже (Франция). Мать Мелиссы, Джеки Фарман, была крёстной дочерью Жаклин Кеннеди. У Фарман французские, британские и итальянские корни. У неё есть младший брат. В возрасте десяти лет, Фарман была принята в двуязычную актёрскую мастерскую для профессиональных актёров в Париже. Она также училась в Университете Южной Калифорнии, где специализировалась на английском и политологии.

В 2008 году Мелисса дебютировала в кино с ролью Эмили в короткометражном фильме «Любовь, ложь и Интернет». С тех пор Фарман сыграла около 20-ти ролей в кино  на телевидении, наиболее известна по ролям молодой Даниэль Руссо в телесериале «Остаться в живых» (взрослую играла Мира Фурлан) и  в фильме HBO «Игра изменилась».

В 2017 году Фарман дебютировала в качестве режиссёра и сценариста с короткометражным фильмом «Готова».

Избранная фильмография

Примечания

Ссылки

Выпускники Университета Южной Калифорнии
Киноактрисы США

redpajama_set_name: RedPajamaWikipedia


text:
Arcis-sur-Aube is een kanton van het Franse departement Aube. Het kanton maakt deel uit van het arrondissement Troyes. Het heeft een oppervlakte van 748.39 km² en telt 14.875 inwoners in 2018, dat is een dichtheid van 20 inwoners/km².

Gemeenten
Het kanton Arcis-sur-Aube omvatte tot 2014 de volgende 22 gemeenten:
 Allibaudières
 Arcis-sur-Aube (hoofdplaats)
 Aubeterre
 Champigny-sur-Aube
 Charmont-sous-Barbuise
 Le Chêne
 Feuges
 Herbisse
 Mailly-le-Camp
 Montsuzain
 Nozay
 Ormes
 Poivres
 Pouan-les-Vallées
 Saint-Étienne-sous-Barbuise
 Saint-Remy-sous-Barbuise
 Semoine
 Torcy-le-Grand
 Torcy-le-Petit
 Villette-sur-Aube
 Villiers-Herbisse
 Voué
Door de herindeling van de kantons bij decreet van 21 februari 2014 met uitwerking op 22 maart 2015, omvat het kanton sindsdien volgende 47 gemeenten:
 Allibaudières
 Arcis-sur-Aube
 Aubeterre
 Avant-lès-Ramerupt
 Brillecourt
 Champigny-sur-Aube
 Charmont-sous-Barbuise
 Chaudrey
 Le Chêne
 Coclois
 Dampierre
 Dommartin-le-Coq
 Dosnon
 Feuges
 Grandville
 Herbisse
 Isle-Aubigny
 Lhuître
 Longsols
 Luyères
 Mailly-le-Camp
 Mesnil-la-Comtesse
 Mesnil-Lettre
 Montsuzain
 Morembert
 Nogent-sur-Aube
 Nozay
 Ormes
 Ortillon
 Poivres
 Pouan-les-Vallées
 Pougy
 Ramerupt
 Saint-Étienne-sous-Barbuise
 Saint-Nabord-sur-Aube
 Saint-Remy-sous-Barbuise
 Semoine
 Torcy-le-Grand
 Torcy-le-Petit
 Trouans
 Vaucogne
 Vaupoisson
 Verricourt
 Villette-sur-Aube
 Villiers-Herbisse
 Vinets
 Voué

Arcis-sur-Aube


Describe an invention that has changed people's life.
The use of the Global Positioning System, also known as GPS, has become a usual matter for everyone particularly people with smartphones. This is the modern technology that helps to pinpoint any specific location with the use of satellites. Now, this has become a great tool for people who want to explore the world. This nice cue card task allows me to discuss the issue. I am pleased to have it in my luck and thank you for this topic.
The masterminds of this invention are – Roger Easton, Ivan Getting, and Bradford Parkinson. Now, this is used by almost everyone for commercial, military and individual purposes. They invented this technology mostly to assist in various types of military operations. Navigation in remote places was really difficult before this invention and the explorers had suffered a lot as they lost the ways. But after the invention of the GPS, exploration, and travelling has become easier than before.
In 1973, the GPS was introduced in the USA to solve the navigation problems, though the development began in the 1960s by the US Department of Defense. About 24 satellites were used in the initial stage with the aim to support the US Military. But the maximum development of the system was done in 1995. Interestingly, the use of GPS is cheaper now and the cell phone manufacturers use this technology on their device to the real-time location of the phone users.
The use of GPS has brought a revolution in people's life. When someone uses GPS, there are fewer chances to get lost in a foreign location. Besides, some other people use this technology with their vehicles so that they can track them. It also helps to plan a travelling or exploration route too. Further, a GPS device also helps to monitor resources and ensure their proper optimization.
"Describe an invention that has changed people's life."
1. The invention of the laptop computer has reduced the stress that people took on their daily life to complete the needs. In fact, a laptop is a computer that you can carry anywhere you want. And this proved beneficial for those who have to deal with modern technology. Laptops are also essential to make communications for various purposes. I think this is a blessing for everyone.
2. The wireless charging system is the modern invention. With this process, a mobile phone user does not need connecting the charged cable to the phone. By placing the mobile phone in a particular device, it will be charged. I am happy with this invention and planning to have the phone with wireless charging feature. Besides, charging is made faster with such technology. So, it would be a great advantage for me to have the phone set.
3. Application of solar panel is often seen in places. It helps to preserve powers from the sun and then converts the power into electricity. Actually, the sun is the source of renewable energy. And it would be of great use to people across the world because the quantity of non-renewable energy is almost finished. An alternative energy source can improve the situation.
4. The invention of the credit card has changed the way of living. At present, we use credit cards for a number of reasons. But it was invented to pay the fuel bills for the growing number of automobile owners. Almost all the banks have their own credit cards with different features. They allow the consumers or bank clients to use the card and pay the bills in credit. This is an easier mode of the transaction as you do not need to carry cash always.
5. I think accounting would have been more difficult if there were no calculators. With the help of a calculator, an individual can complete calculation of a large volume of accounts. This is really a helpful device for people. And now varieties of calculators are available and the users get them based on their needs.


1) Inspects buildings, desks, cabinets, tables, and other wooden structures and equipment in establishments to ensure specified standards of maintenance.
2) Reports nature and extent of repairs needed or directs CARPENTERS, MAINTENANCE to make repairs.
3) Keeps records of conditions before and after repairs.
4) May make repairs within limits of preventive maintenance.
Is being a "CARPENTER INSPECTOR" your very best career choice?
See the Future Outlook and Educational Requirements for "CARPENTER INSPECTOR"
End Of Job Description for: "CARPENTER INSPECTOR"


text:
Q: resolve subdomains on a LAN test server I have a development machine "A" and a test server "B". A runs Windows, "B" runs ubuntu. I've set up correctly machine "B" (apache, /etc/hosts) so that e.g. curl site.B and curl site.localhost both give correct result. From windows (machine "A") when I curl site.B I get "curl: (6) Couldn't resolve host 'site.B'". Do you have any clues on how to resolve this issue? (HINT: it might be Windows or router hostname caching issue)

A: Windows also has a hosts file that you need to configure.  The problem is that Microsoft spells /etc as %WINDIR%\System32\drivers\etc.  :-)
See http://en.wikipedia.org/wiki/Hosts_(file) for details.


The Backstory: When Ben and Brodi first came to me for the wiring and electrical fitting of their new dream home, I knew I was in for an exciting and challenging task. With her flair for design and eye for detail, I could see that Brodi would settle for no less than her vision: functional yet inviting, chic but without too much fuss. One thing was for certain: the pressure was on. Luckily, I always enjoy a good challenge.
The Approach: The electrical wiring and fitting in Ben and Brodi's new dream home was going to be a critical piece of the puzzle. Proper fitting and wiring affects the functionality of some of their key living spaces, including the kitchen and the living room.
We approached the fitting by focusing not only on how they envisioned the house looking, but also on how they plan to use it on a day-to-day basis. After all, that is the beauty of a new build – getting to make those important decisions on your own terms.
Considering Ben and Brodi planned to use their home in multiple ways—as their main living space and as a home-office—we mapped out their big picture needs like underground mains wiring and then narrowed down to the finer details like accessibility to internet, Foxtel and audio-visual capabilities.
We started with new underground mains wiring of over 70 meters. When our job was complete, Ben and Brodi's new farmhouse had fully functional kitchen appliances, hot water, beautiful custom lighting, slimline power points, wall hung televisions, and ultramodern customized elements like a USB wall charger, telephone, and data points for the home office.


Botham´s of Whitby have been supplied with Rare Breed Pork by Charles & Joyce Ashbridge of Taste Tradition for the past 2 years. The quality and service is of such a high standard we have decided to increase our orders to include their Yorkshire Pork for our very popular small and large standing pies.
Having a supplier one can trust is immensely important, and we here at Botham´s know that Charles´s attention to detail and unstinting eye for quality gives us the security we need to ensure that we offer the very best to our customers.


text:
People gather to worship the world's tallest filing cabinet: 'Praise to the cabinet!'
It was just another Friday night in Burlington as the Very Cool collective paid tribute to a 40-foot-high monument to bureaucracy on Flynn Avenue.
People gather to worship the world's tallest filing cabinet: 'Praise to the cabinet!' It was just another Friday night in Burlington as the Very Cool collective paid tribute to a 40-foot-high monument to bureaucracy on Flynn Avenue. Check out this story on burlingtonfreepress.com: https://www.burlingtonfreepress.com/story/entertainment/2019/04/23/worlds-tallest-filing-cabinet-burlington-worship-local-art-very-cool/3537148002/
Brent Hallenbeck, Burlington Free Press Published 10:00 p.m. ET April 22, 2019 | Updated 9:30 a.m. ET April 24, 2019
Griffin Jones led the ceremony as about two dozen people gathered to worship the world's tallest filing cabinet in Burlington on April 19, 2019. (Photo: BRENT HALLENBECK/FREE PRESS)
A man stood in a light drizzle Friday evening in a parking lot on Flynn Avenue, delivering what he called a sermon in the shadow of a 50-foot-high filing-cabinet sculpture.
"None of us is the pinnacle of organization," said the makeshift minister, Griffin Jones, wearing a sleeveless, reflective top as his vestments. "I myself wake up late sometimes and fail to write in my journal." The crowd of about a dozen people booed and hissed.
"Yes, I feel the shame within, stronger than you could ever tell me," Jones continued.
"Confess, brother!" a crowd member yelled.
"I confess my disorganization unto you," Jones said. "And who do I look upon for relief?"
"Who?" the crowd asked in unison. "Tell us!"
"The filing cabinet. Yeah, the filing cabinet," Jones responded. "The world's tallest filing cabinet, I want you to know, brothers and sisters, will not give you more than you can handle. If you ever feel there is too much to handle and your life is disorganized because you have too much stuff, you may look to false prophets like Marie Kondo asking you to throw it away."
"Nay!" the crowd yelled.
"But no, don't throw it away!" Jones exclaimed. "File it!" The crowd yelled in approval. "Put your excess into the cabinet!" With that, Jones raced through a minor swamp to stand on the tower's concrete platform. He stuck a crumpled file folder into one of the cabinet's accepting drawers.
The origins of the cabinet
The Facebook notification for the event indicated it would be hosted by Very Cool, an organization I had never heard of. My research into the event raised questions as to whether the corroding tower in the South End of Burlington can safely lay claim to the title of "The World's Tallest Filing Cabinet."
What is said to be the world's tallest filing cabinet rises over Flynn Avenue in Burlington. (Photo: BRENT HALLENBECK/FREE PRESS)
"Built in 2002 by local artist Bren Alvarez, the filing cabinet … is made up of 38 drawers, each one representing the number of years of paperwork that Alvarez accumulated while working on the project," according to Atlas Obscura, a website calling itself the "definitive guidebook and friendly tour-guide to the world's most wondrous places." "While Alvarez's piece proudly claims to be the tallest filing cabinet on Earth, it's unclear if that is actually the case, since other works of art also claim the same title."
Atlas Obscura goes on to say that "Alvarez built the tower – titled 'File Under File Under So. Co., Waiting for …' — as a comment on bureaucratic delays building the 'Southern Connector,' a roadway intended to connect Interstate 89 to downtown Burlington. Officials originally proposed the road spur in 1965, but it was never built." The project, in fact, remains on the table in Burlington's city government.
Easter, Passover and a filing cabinet
Hints of decaf and blasphemy filled the air on Good Friday and the eve of Passover. (Jones and fellow organizer Mariel DiMidio of Very Cool said they didn't realize the religious significance of the weekend when they chose the date for "Worshipping the World's Tallest Filing Cabinet.") A dozen or so people warmed themselves with coffee and noshed on pizza and doughnuts as Jones commenced the ceremony.
I recognized several members of the Burlington arts community when I arrived for the 6:40 p.m. event, including musicians Jeremy Mendicino, Addie Herbert and Kevin Bloom. Congregants sometimes interjected their own testifying into the ceremony. Bloom produced a file folder for the crowd, with his dramatic reveal leading to the discovery of the folder's contents: nothing.
A file folder drawn in chalk rests on the parking lot near the world's tallest filing cabinet in Burlington on April 19, 2019. (Photo: BRENT HALLENBECK/FREE PRESS)
"The point is that it's empty. Just like life," Bloom told the congregation. "We are all the file, and the filing cabinet. Praise the file cabinet!"
"For the cabinet is infinite," Mendicino added.
"Praise to the cabinet!" Bloom said.
Cash (or Venmo) for the filing cabinet
Jones was ready to wrap up the ceremony around 7:15 when others started showing up in the parking lot. Some brought offerings, ranging from a pencil to root vegetables and bagels.
The crowd more than doubled, encouraging Jones to resume his sermons.
"We all need a little 'me' time. If you follow these words, then I am happy to tell you the world's tallest filing cabinet will make you incredibly rich!" Jones told the crowd, which responded with big cheers. "That's what we're all here for today – money, money, money! So who's got some money? I will happily take your money and put in the cabinet as an offering! Cash only. I will take Venmo. I will have to cash it out later and put it in the cabinet."
Journalism at its core is made up of people who are passionate and dedicated to bringing you the insights that help you make sense of what's happening with Vermont art and artists. Sign up today to get unlimited access to more subscriber-only content.
No parishioners came forward. "That's fine," Jones told them, "you don't have to give today."
Later, Bloom led the congregation in a song, the gist of which was "We are all cabinets/Inside." By 8:15 p.m., the soggy congregants started to break up and resume their lives out of sight of the looming tower.
What's next for the worshipers
What, you may have asked long before now, was the point of all this? Alvarez's sculpture protests bureaucracy and development; "Worshipping the World's Tallest Filing Cabinet" was performance art in celebration of a work of art protesting bureaucracy and development. In the process, the group skewered unbridled capitalism and the fattening of religious organization's coffers in God's name.
It was also just a fun, weird way to begin a weekend where many of us went on to celebrate traditions of a much more longstanding nature.
Very Cool — an acronym for "Volunteer Events Reterritorializing Your Community's Oft Overlooked Locales" — isn't done. Jones noted at the end of Friday's ceremony that Very Cool's next activity will be an "open up the pit" event May 1 at the big downtown lot that used to be the Burlington Town Center mall and is now the oft-delayed CityPlace Burlington project.
He doesn't expect that event to be as successful as Friday's filing-cabinet ceremony.
"Truly, I don't know how this event became so popular," Jones told the crowd as the service concluded. The congregation knew exactly why so many people came out for the event. It was, they told him, all because of organization.
Contact Brent Hallenbeck at 660-1844 or bhallenbeck@freepressmedia.com. Follow Brent on Twitter at www.twitter.com/BrentHallenbeck.
Read or Share this story: https://www.burlingtonfreepress.com/story/entertainment/2019/04/23/worlds-tallest-filing-cabinet-burlington-worship-local-art-very-cool/3537148002/
Books for summer reading, Vermont style
Arts scene: Things to do in July in Vermont
Lil Nas X songs produced by South Burlington grad
Vermont native, Elton John working on musical
Stage is set for summer theater in Vermont
June 17, 2019, 10 p.m.
Grace Potter's Grand Point North announces acts


text:
Expert Blog › Eric A. Goldstein
NYC Takes a Step Toward Environmental Justice
July 18, 2018 Eric A. Goldstein
The New York City Council has enacted legislation limiting the amount of trash that can be sent to overburdened neighborhoods that are home to a majority of privately-owned, environmentally troublesome waste transfer stations in the nation's largest city.
Today, 26 of these privately-owned waste transfer stations (out of 38 citywide) are located in just three neighborhoods – north Brooklyn, the South Bronx and southeast Queens.
These facilities are trash freight stations, where waste coming in from all around the city is transferred, mostly onto long-haul trucks, for shipment to out-of-city landfills and incinerators, as well as recycling and composting facilities.
The waste stations are significant localized sources of truck traffic and air and noise pollution, which daily disrupt the quality of life for tens of thousands of nearby residents.
Specifically, the new legislation would cut the permitted capacity of waste transfer stations by 50 per cent for north Brooklyn and 33 per cent in both the South Bronx and southeast Queens.
Community and environmental groups, join with environmental justice organizations and Teamsters Joint Council 16 to support waste equity legislation enacted in the NYC Council on July 18, 2018.
Alex Moore
However, since the permitted capacity of these 26 waste stations is much greater than the actual tonnage of waste they are receiving on a daily basis, the legislation will likely result in actual waste reductions at only a handful of facilities in these three neighborhoods.
The legislation – Intro 157 – will, nevertheless, have the effect of preventing significant increases in waste-handling in these already overburdened districts. And since the bill would allow for some growth for recycling or composting and for waste transferred by rail (instead of long-haul trucks), it incentivizes improved, more environmentally friendly operations at these facilities.
The idea behind this bill goes back as far as 1989, when the New York City Charter was revised to include a "fair share" provision. The idea was that environmentally burdensome facilities should be more equally distributed across the city, rather than concentrated in politically less powerful neighborhoods, which were often communities of color.
And the city's official 2006 Solid Waste Management Plan directly targeted the concentration of privately operated waste transfer stations in these neighborhoods for remedial action.
The new legislation, while not as strong as previous versions, ends years of legislative gridlock on this issue in the City Council.
Bringing environmental justice to NYC: Councilmember Antonio Reynoso, Councilmember Stephen Levin, Council Speaker Corey Johnson, Sanitation Commissioner Kathryn Garcia.
Councilmembers Antonio Reynoso and Stephen Levin took the lead in advancing this legislation, with critical support from Council Speaker Corey Johnson. All three, as well as the bill's other co-sponsors, deserve public thanks!
New York City Sanitation Commissioner Kathryn Garcia also supported the legislation, and Mayor Bill De Blasio is expected to sign the bill.
A broad coalition of environmental justice organizations, community groups and labor activists provided much of the firepower to help the legislation cross the finish line. Among the leading advocates, in addition to NRDC, were New York Lawyers for the Public Interest (especially Melissa Iachan and Justin Wood), the New York City Environmental Justice Alliance (Eddie Bautista and Priya Mulgaonkar), and the Teamsters Local 813 (Bernadette Kelly, Alex Moore and a cast of hundreds). Also, kudos to the many community groups that have been battling for years for more equitable waste policies, including The Point, OUTRAGE, Clean Up North Brooklyn, El Puente, Nos Quedamos, Waste Equity for Southeast Queens.
The passage of Intro 157 is the beginning of what NRDC hopes will be a broad overhaul of the entire commercial waste handling operation in New York. The De Blasio Administration, with strong support from a coalition of environmental, solid waste, community and environmental justice organizations, is pushing for the creation of a zoned system to replace the current illogical and environmentally problematic collection process for handling thousands of tons-a-day of commercial waste. Stay tuned.
Eric A. Goldstein
Senior Attorney and New York City Environment Director
Want to join the fight? We're hiring.


text:
Q: broadcast action when cellular network is lost I need to detect when the Android lost the cellular network connection (i.e user active Airplane mode or user moves to a place where there aren't any cell tower).
Does Android (API 21 or higher) broadcast an intent when cellular network is lost?


text:
Azerbaijan Baku
Baku 2015 European Games Logo Unveiled
Nov 26, 2013 baku 2015, european games azerbaijan
The official logo for the Baku 2015 European Games was launched on November 23rd, as excitement for the events begins to ramp up. It was unveiled in Rome at the 42nd European Olympic Committees General Assembly, and its finalization is the latest in a series of momentous preparations undertaken by Baku.
The logo was presented to the world by Azad Rahimov, Azerbaijan's Minister of Youth and Sports. Mr. Rahimov said in his presentation: "We are honoured to host the first-ever European Games and to welcome athletes and visitors from throughout Europe for this historic event in 2015. Our logo reflects the pride of our nation in its sporting heritage, our commitment to hospitality and welcoming our guests, and our position as an emerging center for sport, business and tourism in Europe and beyond."
The logo was created by Azeri designer Adam Yusinov, who said that he "wanted to reflect the passion and aspirations that the people in Azerbaijanhave and share for these first ever European Games, to be innovative and inspirational in spirit and in sport. This is a celebratory logo which embodies that vision."
The 2015 European Games will take place in June of 2015 in Baku.
source: #AzerbaijanNow
Azerbaijani court convicts 29 on terror charges
Azerbaijani Wine Tasting


If your child has a medically diagnosed hearing impairment, they may need additional support to help them achieve their potential at school. The Hearing Support Service is a team of specialist teachers and support workers who can work with you and your child as soon as they are identified as being deaf.
We can provide advice and support for you and your child through from the early years until they leave school. We work with children in schools and at home and provide practical advice on all aspects of language and communication. We will talk to you about the level of support your child will need and the range of specialist equipment available.
Augmentative and alternative communication (AAC) includes all forms of communication (other than oral speech) that are used to express thoughts, needs, wants, and ideas. Within the Sensory Support Team we support using whichever communication methods will best meet the needs of the child. This can include British Sign Language, Sign Support English, Visual Phonics and Communicate in Print. We also can support using an Auditory Verbal Approach.
Within Disabled Children's Social Care, there is also a specialist social worker for D/deaf children.
When your child starts school, the team can offer you advice and information to help you make your choice. They work closely with schools to advise on how they can best work with your child and ensure that they are supported to achieve their potential. Children are supported at all times of transition to help them prepare for the next stage of their education.
There are two specialist units in local schools which provide more intensive support for pupils with the highest needs. These are at Mayfield Primary School and Cottenham Village College.
Your views and opinions are always important to us. We are in the process of evolving our Parents Forum meetings to support co-production between the Sensory Support Team, parents/carers and children/young people. We advertise these events via email, letters and in our termly newsletters.
Support services for children and young people with hearing impairment are listed in the Family Information Directory.


If you are new to scarves, you will want to start here!
Listed below are some of the different types of fabrics scarves are made out of and some of their respective attributes. Use this as a reference for your shopping experience to get the most out of your time here. It will be a useful tool to help you find the scarf that best suits you and your needs.
Acrylic is an ultra-fine fabric (finer than the most delicate silk) that is luxurious and very soft to the touch. It is wearer-friendly because it is washable and dry-cleanable. Acrylic fabrics are strong and shrink resistant in nature. They are also well-known for their comfort, because they are insulated and breathable.
Cotton is one of the most well known natural fabrics. It is notorious for its breathe-ability, durability, and its cooling effect. Cotton is known to be a wash and wear fabric. It is also iron-able and soft to the touch.
Linen is infamous in the fabric world for its sheer strength. It is two to three times stronger than cotton. This fabric is virtually lint free which also gives it a very smooth texture. The color in linen fabrics doesn't fade when washed. This garment will press easily.
Mohair is a natural silk-like fabric that comes from the Angora goat. It is super soft to the touch, long-lasting, and durable. Since mohair is a natural fiber it has a luxurious feel to it. It is also warm, easily absorbs moisture, comfortable in hot or cold weather, shrink resistant, and wrinkle resistant.
Polyester is a popular man-made fabric that is notorious for its strength. It is machine washable and dries quickly. Polyester is also dry-cleanable, wrinkle resistant, stretch resistant, and shrink resistant.
Silk is the oldest textile fiber known to man. It is extremely elegant and refined. Silk retains its shape extremely well in addition to hanging well. Silk can be worn in all seasons and it shimmers with a luster all of its own. Silk must be hand-washed, but it will not shrink. It dries quickly, but do not ring out into a towel to dry or put in drier. Silk is a very light fabric and was at one time, reserved for kings.
Wool is a textile fabric that is known for its unique combination of good insulation and lightweight in nature. It is dirt, flame, and wrinkle resistant. It is washable, but it will shrink if washed improperly. Wool is a very breathable fabric.