////Y/od/7t/v/{z//&/s/}//Y/S//'/0700000c0" 00 0k  0E# 0* 02 070<!0A>"0#0$0Y%0&0V'0:(0w)0X*0")+0!2,0b;-0G.0TU/0]00>0 ?0!:w":=$:':**:+:g,:t/:2:4:P7%:9&:d;(:<*:=+:x?2:@3:qI4:Q?S?3e? r?rhB)siBJtjB vkBxlB{BBǀBXBBBBBBB>*I+I,IN-IK.I/I0I 3I4I5I*6I7Iz8I89I;I=I?I @I*FI4/GI0HI9IIzBJIbCKIDLIFMIIPIJQILRIdNSIFPTIRUI\SVITXInVZIW\I}Y]I\bI~^dISoeIofIrgIthItiIujI;vkIvlIAwmIxnIxoIypIzqI{rI}sIktIuIvIwIvxIKyI zI{Iʏ|I}I~I]I<IIIIQI% I] I I! I I Iv I I Ih I2 I I Ie I- I I Ie I I 1I[2I[:IeIgAIfBIgCIfDIeEI[NInOInWIxYIy[Iz^Iy_Iz`IyaIxcInIIIPNG  IHDRa%IDATxb:)(LL<'UTCQdF`Zl|n7}p{/&Go~qr)AqN?eE5[zvv֏q>; rZ$J_r7I%h; _j_\!^t^V:o]o&  ˛OtP3qɮ*{9 1`i.C W.8jQ54އ#1F 4l

$i18n{message}

$i18n{message}

$i18n{fileName}

$i18n{message}

// Copyright 2019 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the action API. var setIcon = require('setIcon').setIcon; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, $Function.bind(function(args) { bindingUtil.sendRequest('action.setIcon', [args, callback], /*options=*/undefined); }, this)); }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the browserAction API. var setIcon = require('setIcon').setIcon; var getExtensionViews = requireNative('runtime').GetExtensionViews; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, function(args) { bindingUtil.sendRequest( 'browserAction.setIcon', [args, callback], undefined); }.bind(this)); }); apiFunctions.setCustomCallback('openPopup', function(name, request, callback, response) { if (!callback) return; if (bindingUtil.hasLastError()) { callback(); } else { var views = getExtensionViews(-1, -1, 'POPUP'); callback(views.length > 0 ? views[0] : null); } }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming RtpStream API. var natives = requireNative('cast_streaming_natives'); apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('destroy', function(transportId) { natives.DestroyCastRtpStream(transportId); }); apiFunctions.setHandleRequest('getSupportedParams', function(transportId) { return natives.GetSupportedParamsCastRtpStream(transportId); }); apiFunctions.setHandleRequest('start', function(transportId, params) { natives.StartCastRtpStream(transportId, params); }); apiFunctions.setHandleRequest('stop', function(transportId) { natives.StopCastRtpStream(transportId); }); apiFunctions.setHandleRequest('toggleLogging', function(transportId, enable) { natives.ToggleLogging(transportId, enable); }); apiFunctions.setHandleRequest('getRawEvents', function(transportId, extraData, callback) { natives.GetRawEvents(transportId, extraData, callback); }); apiFunctions.setHandleRequest('getStats', function(transportId, callback) { natives.GetStats(transportId, callback); }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming Session API. var natives = requireNative('cast_streaming_natives'); apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('create', function(audioTrack, videoTrack, callback) { natives.CreateSession(audioTrack, videoTrack, callback); }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming UdpTransport API. var natives = requireNative('cast_streaming_natives'); apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('destroy', function(transportId) { natives.DestroyCastUdpTransport(transportId); }); apiFunctions.setHandleRequest('setDestination', function(transportId, destination) { natives.SetDestinationCastUdpTransport(transportId, destination); }); apiFunctions.setHandleRequest('setOptions', function(transportId, options) { natives.SetOptionsCastUdpTransport(transportId, options); }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Cast Streaming Session API. var natives = requireNative('cast_streaming_natives'); apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest( 'createAndBind', function(ap, vp, local, weidgth, height, fr, url, cb, op) { }); }); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. var contextMenusHandlers = require('contextMenusHandlers'); apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var handlers = contextMenusHandlers.create(true /* isWebview */); apiFunctions.setHandleRequest( 'contextMenusCreate', handlers.requestHandlers.create); apiFunctions.setHandleRequest( 'contextMenusUpdate', handlers.requestHandlers.update); apiFunctions.setHandleRequest( 'contextMenusRemove', handlers.requestHandlers.remove); apiFunctions.setHandleRequest( 'contextMenusRemoveAll', handlers.requestHandlers.removeAll); }); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // This module implements chrome-specific API. // See web_view_api_methods.js for details. var ChromeWebView = getInternalApi('chromeWebViewInternal'); var ChromeWebViewSchema = requireNative('schema_registry').GetSchema('chromeWebViewInternal'); var CreateEvent = require('guestViewEvents').CreateEvent; var GuestViewInternalNatives = requireNative('guest_view_internal'); var idGeneratorNatives = requireNative('id_generator'); var registerElement = require('guestViewContainerElement').registerElement; var utils = require('utils'); var WebViewElement = require('webViewElement').WebViewElement; var WebViewImpl = require('webView').WebViewImpl; var WebViewAttributeNames = require('webViewConstants').WebViewAttributeNames; // This is the only "webViewInternal.onClicked" named event for this renderer. // // Since we need an event per , we define events with suffix // (subEventName) in each of the . Behind the scenes, this event is // registered as a ContextMenusEvent, with filter set to the webview's // |viewInstanceId|. Any time a ContextMenusEvent is dispatched, we re-dispatch // it to the subEvent's listeners. This way // .contextMenus.onClicked behave as a regular chrome Event type. var ContextMenusEvent = CreateEvent('chromeWebViewInternal.onClicked'); // See comment above. var ContextMenusHandlerEvent = CreateEvent('chromeWebViewInternal.onContextMenuShow'); function GetUniqueSubEventName(eventName) { return eventName + '/' + idGeneratorNatives.GetNextId(); } // This event is exposed as .contextMenus.onClicked. function createContextMenusOnClickedEvent(webViewInstanceId, opt_eventName, opt_argSchemas, opt_eventOptions) { var subEventName = GetUniqueSubEventName(opt_eventName); var newEvent = bindingUtil.createCustomEvent(subEventName, false, false); var view = GuestViewInternalNatives.GetViewFromID(webViewInstanceId); if (view) { view.events.addScopedListener( ContextMenusEvent, $Function.bind(function() { // Re-dispatch to subEvent's listeners. $Function.apply(newEvent.dispatch, newEvent, $Array.slice(arguments)); }, newEvent), {instanceId: webViewInstanceId}); } return newEvent; } // This event is exposed as .contextMenus.onShow. function createContextMenusOnContextMenuEvent(webViewInstanceId, opt_eventName, opt_argSchemas, opt_eventOptions) { var subEventName = GetUniqueSubEventName(opt_eventName); var newEvent = bindingUtil.createCustomEvent(subEventName, false, false); var view = GuestViewInternalNatives.GetViewFromID(webViewInstanceId); if (view) { view.events.addScopedListener( ContextMenusHandlerEvent, $Function.bind(function(e) { var defaultPrevented = false; var event = { preventDefault: function() { defaultPrevented = true; } }; // Re-dispatch to subEvent's listeners. $Function.apply(newEvent.dispatch, newEvent, [event]); if (!defaultPrevented) { // TODO(lazyboy): Remove |items| parameter completely from // ChromeWebView.showContextMenu as we don't do anything useful with // it currently. var items = []; var guestInstanceId = GuestViewInternalNatives. GetViewFromID(webViewInstanceId).guest.getId(); ChromeWebView.showContextMenu(guestInstanceId, e.requestId, items); } }, newEvent), {instanceId: webViewInstanceId}); } return newEvent; } // ----------------------------------------------------------------------------- // WebViewContextMenusImpl object. // An instance of this class is exposed as .contextMenus. function WebViewContextMenusImpl(viewInstanceId) { this.viewInstanceId_ = viewInstanceId; } $Object.setPrototypeOf(WebViewContextMenusImpl.prototype, null); WebViewContextMenusImpl.prototype.create = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusCreate, null, args); }; WebViewContextMenusImpl.prototype.remove = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusRemove, null, args); }; WebViewContextMenusImpl.prototype.removeAll = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusRemoveAll, null, args); }; WebViewContextMenusImpl.prototype.update = function() { var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); return $Function.apply(ChromeWebView.contextMenusUpdate, null, args); }; function WebViewContextMenus() { privates(WebViewContextMenus).constructPrivate(this, arguments); } utils.expose(WebViewContextMenus, WebViewContextMenusImpl, { functions: [ 'create', 'remove', 'removeAll', 'update', ], }); // ----------------------------------------------------------------------------- class ChromeWebViewImpl extends WebViewImpl { constructor(webviewElement) { super(webviewElement); this.setupContextMenus(); } } ChromeWebViewImpl.prototype.setupContextMenus = function() { if (!this.contextMenusOnContextMenuEvent_) { var eventName = 'chromeWebViewInternal.onContextMenuShow'; var eventSchema = utils.lookup(ChromeWebViewSchema.events, 'name', 'onShow'); var eventOptions = {supportsListeners: true, supportsLazyListeners: false}; this.contextMenusOnContextMenuEvent_ = createContextMenusOnContextMenuEvent( this.viewInstanceId, eventName, eventSchema, eventOptions); } var createContextMenus = $Function.bind(function() { return this.weakWrapper(function() { if (this.contextMenus_) { return this.contextMenus_; } this.contextMenus_ = new WebViewContextMenus(this.viewInstanceId); // Define 'onClicked' event property on |this.contextMenus_|. var getOnClickedEvent = $Function.bind(function() { return this.weakWrapper(function() { if (!this.contextMenusOnClickedEvent_) { var eventName = 'chromeWebViewInternal.onClicked'; var eventSchema = utils.lookup(ChromeWebViewSchema.events, 'name', 'onClicked'); var eventOptions = {supportsListeners: true, supportsLazyListeners: false}; var onClickedEvent = createContextMenusOnClickedEvent( this.viewInstanceId, eventName, eventSchema, eventOptions); this.contextMenusOnClickedEvent_ = onClickedEvent; return onClickedEvent; } return this.contextMenusOnClickedEvent_; }); }, this); $Object.defineProperty( this.contextMenus_, 'onClicked', {get: getOnClickedEvent(), enumerable: true}); $Object.defineProperty( this.contextMenus_, 'onShow', { get: this.weakWrapper(function() { return this.contextMenusOnContextMenuEvent_; }), enumerable: true }); return this.contextMenus_; }); }, this); // Expose .contextMenus object. $Object.defineProperty( this.element, 'contextMenus', { get: createContextMenus(), enumerable: true }); }; class ChromeWebViewElement extends WebViewElement { static get observedAttributes() { return WebViewAttributeNames; } constructor() { super(); privates(this).internal = new ChromeWebViewImpl(this); } } registerElement('WebView', ChromeWebViewElement); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the declarativeContent API. var setIcon = require('setIcon').setIcon; apiBridge.registerCustomHook(function(api) { var declarativeContent = api.compiledApi; // Validation for most types is done in the native C++ with native bindings, // but setIcon is funny (and sadly broken). Ideally, we can move this // validation entirely into the native code, and this whole file can go // away. var nativeSetIcon = declarativeContent.SetIcon; declarativeContent.SetIcon = function(parameters) { // TODO(devlin): This is very, very wrong. setIcon() is potentially // asynchronous (in the case of a path being specified), which means this // becomes an "asynchronous constructor". Errors can be thrown *after* the // `new declarativeContent.SetIcon(...)` call, and in the async cases, // this wouldn't work when we immediately add the action via an API call // (e.g., // chrome.declarativeContent.onPageChange.addRules( // [{conditions: ..., actions: [ new SetIcon(...) ]}]); // ). Some of this is tracked in http://crbug.com/415315. setIcon(parameters, $Function.bind(function(data) { // Fake calling the original function as a constructor. $Object.setPrototypeOf(this, nativeSetIcon.prototype); $Function.apply(nativeSetIcon, this, [data]); }, this)); }; }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the desktopCapture API. var idGenerator = requireNative('id_generator'); apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var pendingRequests = {}; function onRequestResult(id, result, options) { if (id in pendingRequests) { var callback = pendingRequests[id]; delete pendingRequests[id]; callback(result, options); } } apiFunctions.setHandleRequest('chooseDesktopMedia', function(sources, target_tab, callback) { // |target_tab| is an optional parameter. if (callback === undefined) { callback = target_tab; target_tab = undefined; } var id = idGenerator.GetNextId(); pendingRequests[id] = callback; bindingUtil.sendRequest('desktopCapture.chooseDesktopMedia', [id, sources, target_tab, $Function.bind(onRequestResult, null, id)], undefined); return id; }); apiFunctions.setHandleRequest('cancelChooseDesktopMedia', function(id) { if (id in pendingRequests) { delete pendingRequests[id]; bindingUtil.sendRequest( 'desktopCapture.cancelChooseDesktopMedia', [id], undefined, undefined); } }); }); // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the developerPrivate API. apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; // Converts the argument of |functionName| from DirectoryEntry to URL. function bindFileSystemFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(directoryEntry, callback) { var fileSystemName = directoryEntry.filesystem.name; var relativePath = $String.slice(directoryEntry.fullPath, 1); var url = directoryEntry.toURL(); return [fileSystemName, relativePath, url, callback]; }); } bindFileSystemFunction('loadDirectory'); // developerPrivate.enable is the same as chrome.management.setEnabled. // TODO(devlin): Migrate callers off developerPrivate.enable. bindingsAPI.compiledApi.enable = chrome.management.setEnabled; apiFunctions.setHandleRequest('allowFileAccess', function(id, allow, callback) { chrome.developerPrivate.updateExtensionConfiguration( {extensionId: id, fileAccess: allow}, callback); }); apiFunctions.setHandleRequest('allowIncognito', function(id, allow, callback) { chrome.developerPrivate.updateExtensionConfiguration( {extensionId: id, incognitoAccess: allow}, callback); }); apiFunctions.setHandleRequest('inspect', function(options, callback) { var renderViewId = options.render_view_id; if (typeof renderViewId == 'string') { renderViewId = parseInt(renderViewId); if (isNaN(renderViewId)) throw new Error('Invalid value for render_view_id'); } var renderProcessId = options.render_process_id; if (typeof renderProcessId == 'string') { renderProcessId = parseInt(renderProcessId); if (isNaN(renderProcessId)) throw new Error('Invalid value for render_process_id'); } chrome.developerPrivate.openDevTools({ extensionId: options.extension_id, renderProcessId: renderProcessId, renderViewId: renderViewId, incognito: options.incognito }, callback); }); }); // Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the downloads API. var downloadsInternal = getInternalApi('downloadsInternal'); bindingUtil.registerEventArgumentMassager('downloads.onDeterminingFilename', function(args, dispatch) { var downloadItem = args[0]; // Copy the id so that extensions can't change it. var downloadId = downloadItem.id; var suggestable = true; function isValidResult(result) { if (result === undefined) return false; if (typeof(result) != 'object') { console.error('Error: Invocation of form suggest(' + typeof(result) + ') doesn\'t match definition suggest({filename: string, ' + 'conflictAction: string})'); return false; } else if ((typeof(result.filename) != 'string') || (result.filename.length == 0)) { console.error('Error: "filename" parameter to suggest() must be a ' + 'non-empty string'); return false; } else if ([undefined, 'uniquify', 'overwrite', 'prompt'].indexOf( result.conflictAction) < 0) { console.error('Error: "conflictAction" parameter to suggest() must be ' + 'one of undefined, "uniquify", "overwrite", "prompt"'); return false; } return true; } function suggestCallback(result) { if (!suggestable) { console.error('suggestCallback may not be called more than once.'); return; } suggestable = false; if (isValidResult(result)) { downloadsInternal.determineFilename( downloadId, result.filename, result.conflictAction || ""); } else { downloadsInternal.determineFilename(downloadId, "", ""); } } try { var results = dispatch([downloadItem, suggestCallback]); var async = (results && results.results && (results.results.length != 0) && (results.results[0] === true)); if (suggestable && !async) suggestCallback(); } catch (e) { suggestCallback(); throw e; } }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the GCM API. var forEach = require('utils').forEach; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var gcm = bindingsAPI.compiledApi; apiFunctions.setUpdateArgumentsPostValidate( 'send', function(message, callback) { // Validate message.data. var payloadSize = 0; forEach(message.data, function(property, value) { if (property.length == 0) throw new Error("One of data keys is empty."); var lowerCasedProperty = property.toLowerCase(); // Issue an error for forbidden prefixes of property names. if (lowerCasedProperty.startsWith("goog.") || lowerCasedProperty.startsWith("google") || property.startsWith("collapse_key")) { throw new Error("Invalid data key: " + property); } payloadSize += property.length + value.length; }); if (payloadSize > gcm.MAX_MESSAGE_SIZE) throw new Error("Payload exceeded allowed size limit. Payload size is: " + payloadSize); if (payloadSize == 0) throw new Error("No data to send."); return arguments; }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Identity API. apiBridge.registerCustomHook(function(binding, id, contextType) { var apiFunctions = binding.apiFunctions; apiFunctions.setHandleRequest('getRedirectURL', function(path) { if (path === null || path === undefined) path = '/'; else path = String(path); if (path[0] != '/') path = '/' + path; return 'https://' + id + '.chromiumapp.org' + path; }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the image writer private API. apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPostValidate( 'writeFromFile', function(device, fileEntry, options, callback) { var fileSystemName = fileEntry.filesystem.name; var relativePath = $String.slice(fileEntry.fullPath, 1); return [device, fileSystemName, relativePath, callback]; }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the input ime API. Only injected into the // v8 contexts for extensions which have permission for the API. var appWindowNatives = requireNative('app_window_natives'); var keyEventHandled; bindingUtil.registerEventArgumentMassager('input.ime.onKeyEvent', function(args, dispatch) { var keyData = args[1]; var result = undefined; try { // dispatch() is weird - it returns an object {results: array} iff // there is at least one result value that !== undefined. Since onKeyEvent // has a maximum of one listener, we know that any result we find is the one // we're interested in. var dispatchResult = dispatch(args); if (dispatchResult && dispatchResult.results) result = dispatchResult.results[0]; } catch (e) { result = false; console.error('Error in event handler for onKeyEvent: ' + e.stack); } if (result !== undefined) { keyEventHandled(keyData.requestId, !!result); } }); apiBridge.registerCustomHook(function(api) { keyEventHandled = api.compiledApi.keyEventHandled; // TODO(shuchen): override onKeyEvent.addListener only for compatibility. // This should be removed after the IME extension doesn't rely on the // additional "async" parameter. var originalAddListener = api.compiledApi.onKeyEvent.addListener; api.compiledApi.onKeyEvent.addListener = function(cb, opt_extraInfo) { $Function.call(originalAddListener, this, cb); }; api.apiFunctions.setCustomCallback('createWindow', function(name, request, callback, windowParams) { if (!callback) { return; } var view; if (windowParams && windowParams.frameId) { view = appWindowNatives.GetFrame( windowParams.frameId, false /* notifyBrowser */); view.id = windowParams.frameId; } callback(view); }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Media Gallery API. var blobNatives = requireNative('blob_natives'); var mediaGalleriesNatives = requireNative('mediaGalleries'); var blobsAwaitingMetadata = {}; var mediaGalleriesMetadata = {}; function createFileSystemObjectsAndUpdateMetadata(response) { var result = []; mediaGalleriesMetadata = {}; // Clear any previous metadata. if (response) { for (var i = 0; i < response.length; i++) { var filesystem = mediaGalleriesNatives.GetMediaFileSystemObject( response[i].fsid); $Array.push(result, filesystem); var metadata = response[i]; delete metadata.fsid; mediaGalleriesMetadata[filesystem.name] = metadata; } } return result; } apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; // getMediaFileSystems and addUserSelectedFolder use a custom callback so that // they can instantiate and return an array of file system objects. apiFunctions.setCustomCallback('getMediaFileSystems', function(name, request, callback, response) { var result = createFileSystemObjectsAndUpdateMetadata(response); if (callback) callback(result); }); apiFunctions.setCustomCallback('addUserSelectedFolder', function(name, request, callback, response) { var fileSystems = []; var selectedFileSystemName = ""; if (response && 'mediaFileSystems' in response && 'selectedFileSystemIndex' in response) { fileSystems = createFileSystemObjectsAndUpdateMetadata( response['mediaFileSystems']); var selectedFileSystemIndex = response['selectedFileSystemIndex']; if (selectedFileSystemIndex >= 0) { selectedFileSystemName = fileSystems[selectedFileSystemIndex].name; } } if (callback) callback(fileSystems, selectedFileSystemName); }); apiFunctions.setHandleRequest('getMediaFileSystemMetadata', function(filesystem) { if (filesystem && filesystem.name && filesystem.name in mediaGalleriesMetadata) { return mediaGalleriesMetadata[filesystem.name]; } return { 'name': '', 'galleryId': '', 'isRemovable': false, 'isMediaDevice': false, 'isAvailable': false, }; }); function getMetadataCallback(uuid, name, request, callback, response) { if (response && response.attachedImagesBlobInfo) { for (var i = 0; i < response.attachedImagesBlobInfo.length; i++) { var blobInfo = response.attachedImagesBlobInfo[i]; var blob = blobNatives.TakeBrowserProcessBlob( blobInfo.blobUUID, blobInfo.type, blobInfo.size); response.metadata.attachedImages.push(blob); } } if (callback) callback(response ? response.metadata : null); delete blobsAwaitingMetadata[uuid]; } apiFunctions.setHandleRequest('getMetadata', function(mediaFile, options, callback) { var blobUuid = blobNatives.GetBlobUuid(mediaFile) // Store the blob in a global object to keep its refcount nonzero -- this // prevents the object from being garbage collected before any metadata // parsing gets to occur (see crbug.com/415792). blobsAwaitingMetadata[blobUuid] = mediaFile; var optArgs = { __proto__: null, customCallback: $Function.bind(getMetadataCallback, null, blobUuid), }; bindingUtil.sendRequest( 'mediaGalleries.getMetadata', [blobUuid, options, callback], optArgs); }); }); // Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom bindings for the notifications API. // var exceptionHandler = require('uncaught_exception_handler'); var imageUtil = require('imageUtil'); var notificationsPrivate = requireNative('notifications_private'); function imageDataSetter(context, key) { var f = function(val) { this[key] = val; }; return $Function.bind(f, context); } // A URL Spec is an object with the following keys: // path: The resource to be downloaded. // width: (optional) The maximum width of the image to be downloaded in device // pixels. // height: (optional) The maximum height of the image to be downloaded in // device pixels. // callback: A function to be called when the URL is complete. It // should accept an ImageData object and set the appropriate // field in |notificationDetails|. function getUrlSpecs(imageSizes, notificationDetails) { var urlSpecs = []; // |iconUrl| might be optional for notification updates. if (notificationDetails.iconUrl) { $Array.push(urlSpecs, { path: notificationDetails.iconUrl, width: imageSizes.icon.width * imageSizes.scaleFactor, height: imageSizes.icon.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'iconBitmap') }); } // |appIconMaskUrl| is optional. if (notificationDetails.appIconMaskUrl) { $Array.push(urlSpecs, { path: notificationDetails.appIconMaskUrl, width: imageSizes.appIconMask.width * imageSizes.scaleFactor, height: imageSizes.appIconMask.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'appIconMaskBitmap') }); } // |imageUrl| is optional. if (notificationDetails.imageUrl) { $Array.push(urlSpecs, { path: notificationDetails.imageUrl, width: imageSizes.image.width * imageSizes.scaleFactor, height: imageSizes.image.height * imageSizes.scaleFactor, callback: imageDataSetter(notificationDetails, 'imageBitmap') }); } // Each button has an optional icon. var buttonList = notificationDetails.buttons; if (buttonList && typeof buttonList.length === 'number') { var numButtons = buttonList.length; for (var i = 0; i < numButtons; i++) { if (buttonList[i].iconUrl) { $Array.push(urlSpecs, { path: buttonList[i].iconUrl, width: imageSizes.buttonIcon.width * imageSizes.scaleFactor, height: imageSizes.buttonIcon.height * imageSizes.scaleFactor, callback: imageDataSetter(buttonList[i], 'iconBitmap') }); } } } return urlSpecs; } function replaceNotificationOptionURLs(notification_details, callback) { var imageSizes = notificationsPrivate.GetNotificationImageSizes(); var url_specs = getUrlSpecs(imageSizes, notification_details); if (!url_specs.length) { callback(true); return; } var errors = 0; imageUtil.loadAllImages(url_specs, { onerror: function(index) { errors++; }, oncomplete: function(imageData) { if (errors > 0) { callback(false); return; } for (var index = 0; index < url_specs.length; index++) { var url_spec = url_specs[index]; url_spec.callback(imageData[index]); } callback(true); } }); } function genHandle(name, failure_function) { return function(id, input_notification_details, callback) { // TODO(dewittj): Remove this hack. This is used as a way to deep // copy a complex JSON object. var notification_details = $JSON.parse( $JSON.stringify(input_notification_details)); var that = this; var stack = exceptionHandler.getExtensionStackTrace(); replaceNotificationOptionURLs(notification_details, function(success) { if (success) { bindingUtil.sendRequest( name, [id, notification_details, callback], undefined); return; } bindingUtil.runCallbackWithLastError( 'Unable to download all specified images.', $Function.bind(failure_function, null, callback || function() {}, id)); }); }; } var handleCreate = genHandle('notifications.create', function(callback, id) { callback(id); }); var handleUpdate = genHandle('notifications.update', function(callback, id) { callback(false); }); var notificationsCustomHook = function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('create', handleCreate); apiFunctions.setHandleRequest('update', handleUpdate); }; apiBridge.registerCustomHook(notificationsCustomHook); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the omnibox API. Only injected into the v8 contexts // for extensions which have permission for the omnibox API. // Remove invalid characters from |text| so that it is suitable to use // for |AutocompleteMatch::contents|. function sanitizeString(text, shouldTrim) { // NOTE: This logic mirrors |AutocompleteMatch::SanitizeString()|. // 0x2028 = line separator; 0x2029 = paragraph separator. var kRemoveChars = /(\r|\n|\t|\u2028|\u2029)/gm; if (shouldTrim) text = text.trimLeft(); return text.replace(kRemoveChars, ''); } // Parses the xml syntax supported by omnibox suggestion results. Returns an // object with two properties: 'description', which is just the text content, // and 'descriptionStyles', which is an array of style objects in a format // understood by the C++ backend. function parseOmniboxDescription(input) { var domParser = new DOMParser(); // The XML parser requires a single top-level element, but we want to // support things like 'hello, world!'. So we wrap the // provided text in generated root level element. var root = domParser.parseFromString( '' + input + '', 'text/xml'); // DOMParser has a terrible error reporting facility. Errors come out nested // inside the returned document. var error = root.querySelector('parsererror div'); if (error) { throw new Error(error.textContent); } // Otherwise, it's valid, so build up the result. var result = { description: '', descriptionStyles: [] }; // Recursively walk the tree. function walk(node) { for (var i = 0, child; child = node.childNodes[i]; i++) { // Append text nodes to our description. if (child.nodeType == Node.TEXT_NODE) { var shouldTrim = result.description.length == 0; result.description += sanitizeString(child.nodeValue, shouldTrim); continue; } // Process and descend into a subset of recognized tags. if (child.nodeType == Node.ELEMENT_NODE && (child.nodeName == 'dim' || child.nodeName == 'match' || child.nodeName == 'url')) { var style = { 'type': child.nodeName, 'offset': result.description.length }; $Array.push(result.descriptionStyles, style); walk(child); style.length = result.description.length - style.offset; continue; } // Descend into all other nodes, even if they are unrecognized, for // forward compat. walk(child); } }; walk(root); return result; } apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setUpdateArgumentsPreValidate('setDefaultSuggestion', function(suggestResult) { if (suggestResult.content != undefined) { // null, etc. throw new Error( 'setDefaultSuggestion cannot contain the "content" field'); } return [suggestResult]; }); apiFunctions.setHandleRequest('setDefaultSuggestion', function(details) { var parseResult = parseOmniboxDescription(details.description); bindingUtil.sendRequest('omnibox.setDefaultSuggestion', [parseResult], undefined); }); apiFunctions.setUpdateArgumentsPostValidate( 'sendSuggestions', function(requestId, userSuggestions) { var suggestions = []; for (var i = 0; i < userSuggestions.length; i++) { var parseResult = parseOmniboxDescription( userSuggestions[i].description); parseResult.content = userSuggestions[i].content; parseResult.deletable = userSuggestions[i].deletable; $Array.push(suggestions, parseResult); } return [requestId, suggestions]; }); }); bindingUtil.registerEventArgumentMassager('omnibox.onInputChanged', function(args, dispatch) { var text = args[0]; var requestId = args[1]; var suggestCallback = function(suggestions) { chrome.omnibox.sendSuggestions(requestId, suggestions); }; dispatch([text, suggestCallback]); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the pageAction API. var setIcon = require('setIcon').setIcon; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, $Function.bind(function(args) { bindingUtil.sendRequest('pageAction.setIcon', [args, callback], undefined); }, this)); }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the pageCapture API. var handleUncaughtException = require('uncaught_exception_handler').handle; var pageCaptureNatives = requireNative('page_capture'); var CreateBlob = pageCaptureNatives.CreateBlob; var SendResponseAck = pageCaptureNatives.SendResponseAck; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setCustomCallback('saveAsMHTML', function(name, request, callback, response) { if (response) response = CreateBlob(response.mhtmlFilePath, response.mhtmlFileLength); try { callback(response); } catch (e) { handleUncaughtException( 'Error in chrome.pageCapture.saveAsMHTML callback', e, request.stack); } finally { // Notify the browser. Now that the blob is referenced from JavaScript, // the browser can drop its reference to it. SendResponseAck(request.id); } }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the syncFileSystem API. var fileSystemNatives = requireNative('file_system_natives'); var syncFileSystemNatives = requireNative('sync_file_system'); apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; // Functions which take in an [instanceOf=FileEntry]. function bindFileEntryFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(entry, callback) { var fileSystemUrl = entry.toURL(); return [fileSystemUrl, callback]; }); } $Array.forEach(['getFileStatus'], bindFileEntryFunction); // Functions which take in a FileEntry array. function bindFileEntryArrayFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(entries, callback) { var fileSystemUrlArray = []; for (var i=0; i < entries.length; i++) { $Array.push(fileSystemUrlArray, entries[i].toURL()); } return [fileSystemUrlArray, callback]; }); } $Array.forEach(['getFileStatuses'], bindFileEntryArrayFunction); // Functions which take in an [instanceOf=DOMFileSystem]. function bindFileSystemFunction(functionName) { apiFunctions.setUpdateArgumentsPostValidate( functionName, function(filesystem, callback) { var fileSystemUrl = filesystem.root.toURL(); return [fileSystemUrl, callback]; }); } $Array.forEach(['getUsageAndQuota'], bindFileSystemFunction); // Functions which return an [instanceOf=DOMFileSystem]. apiFunctions.setCustomCallback('requestFileSystem', function(name, request, callback, response) { var result = null; if (response) { result = syncFileSystemNatives.GetSyncFileSystemObject( response.name, response.root); } if (callback) callback(result); }); // Functions which return an array of FileStatusInfo object // which has [instanceOf=FileEntry]. apiFunctions.setCustomCallback('getFileStatuses', function(name, request, callback, response) { var results = []; if (response) { for (var i = 0; i < response.length; i++) { var result = {}; var entry = response[i].entry; result.fileEntry = fileSystemNatives.GetFileEntry( entry.fileSystemType, entry.fileSystemName, entry.rootUrl, entry.filePath, entry.isDirectory); result.status = response[i].status; result.error = response[i].error; $Array.push(results, result); } } if (callback) callback(results); }); }); bindingUtil.registerEventArgumentMassager('syncFileSystem.onFileStatusChanged', function(args, dispatch) { // Make FileEntry object using all the base string fields. var fileEntry = fileSystemNatives.GetFileEntry( args[0].fileSystemType, args[0].fileSystemName, args[0].rootUrl, args[0].filePath, args[0].isDirectory); // Combine into a single dictionary. var fileInfo = new Object(); fileInfo.fileEntry = fileEntry; fileInfo.status = args[1]; if (fileInfo.status == "synced") { fileInfo.action = args[2]; fileInfo.direction = args[3]; } dispatch([fileInfo]); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the systemIndicator API. // TODO(dewittj) Refactor custom binding to reduce redundancy between the // extension action APIs. var setIcon = require('setIcon').setIcon; apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; apiFunctions.setHandleRequest('setIcon', function(details, callback) { setIcon(details, $Function.bind(function(args) { bindingUtil.sendRequest('systemIndicator.setIcon', [args, callback], undefined); }, this)); }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the Tab Capture API. apiBridge.registerCustomHook(function(bindingsAPI, extensionId) { var apiFunctions = bindingsAPI.apiFunctions; function proxyToGetUserMedia(name, request, callback, response) { if (!callback) return; if (!response) { // When the response is missing, runtime.lastError has already been set. // See chrome/browser/extensions/api/tab_capture/tab_capture_api.cc. callback(null); return; } // Convenience function for processing webkitGetUserMedia() error objects to // provide runtime.lastError messages for the tab capture API. function getErrorMessage(error, fallbackMessage) { if (!error || (typeof error.message != 'string')) return fallbackMessage; return error.message.replace(/(navigator\.)?(webkit)?GetUserMedia/gi, name); } var options = {}; if (response.audioConstraints) options.audio = response.audioConstraints; if (response.videoConstraints) options.video = response.videoConstraints; try { navigator.webkitGetUserMedia( options, function onSuccess(media_stream) { callback(media_stream); }, function onError(error) { bindingUtil.runCallbackWithLastError( getErrorMessage(error, "Failed to start MediaStream."), $Function.bind(callback, null, null)); }); } catch (error) { bindingUtil.runCallbackWithLastError( getErrorMessage(error, "Invalid argument(s)."), $Function.bind(callback, null, null)); } } apiFunctions.setCustomCallback('capture', proxyToGetUserMedia); apiFunctions.setCustomCallback('captureOffscreenTab', proxyToGetUserMedia); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the tts API. var idGenerator = requireNative('id_generator'); var lazyBG = requireNative('lazy_background_page'); apiBridge.registerCustomHook(function(api) { var apiFunctions = api.apiFunctions; var tts = api.compiledApi; var handlers = {}; function ttsEventListener(event) { var eventHandler = handlers[event.srcId]; if (eventHandler) { eventHandler({ type: event.type, charIndex: event.charIndex, length: event.length, errorMessage: event.errorMessage }); if (event.isFinalEvent) { delete handlers[event.srcId]; // Balanced in 'speak' handler. lazyBG.DecrementKeepaliveCount(); } } } // This file will get run if an extension needs the ttsEngine permission, but // it doesn't necessarily have the tts permission. If it doesn't, trying to // add a listener to chrome.tts.onEvent will fail. // See http://crbug.com/122474. try { tts.onEvent.addListener(ttsEventListener); } catch (e) {} apiFunctions.setHandleRequest('speak', function() { var args = $Array.from(arguments); if (args.length > 1 && args[1]) { if (args[1].onEvent) { var id = idGenerator.GetNextId(); args[1].srcId = id; handlers[id] = args[1].onEvent; // Keep the page alive until the event finishes. // Balanced in eventHandler. lazyBG.IncrementKeepaliveCount(); } if (args[1].gender) { console.warn( 'chrome.tts.speak: ' + 'Voice gender is deprecated and values will be ignored starting ' + 'in Chrome 71.'); } } bindingUtil.sendRequest('tts.speak', args, undefined); return id; }); }); // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the ttsEngine API. bindingUtil.registerEventArgumentMassager('ttsEngine.onSpeak', function(args, dispatch) { var text = args[0]; var options = args[1]; var requestId = args[2]; var sendTtsEvent = function(event) { chrome.ttsEngine.sendTtsEvent(requestId, event); }; dispatch([text, options, sendTtsEvent]); }); apiBridge.registerCustomHook(function(api) { // Provide a warning if deprecated parameters are used. api.apiFunctions.setHandleRequest('updateVoices', function(voices) { for (var i = 0; i < voices.length; i++) { if (voices[i].gender) { console.warn( 'chrome.ttsEngine.updateVoices: ' + 'Voice gender is deprecated and values will be ignored ' + 'starting in Chrome 71.'); break; } } bindingUtil.sendRequest( 'ttsEngine.updateVoices', [voices], undefined); }); }.bind(this)); // Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the webrtcDesktopCapturePrivate API. var idGenerator = requireNative('id_generator'); apiBridge.registerCustomHook(function(bindingsAPI) { var apiFunctions = bindingsAPI.apiFunctions; var pendingRequests = {}; function onRequestResult(id, result) { if (id in pendingRequests) { var callback = pendingRequests[id]; delete pendingRequests[id]; callback(result); } } apiFunctions.setHandleRequest('chooseDesktopMedia', function(sources, request, callback) { var id = idGenerator.GetNextId(); pendingRequests[id] = callback; bindingUtil.sendRequest( 'webrtcDesktopCapturePrivate.chooseDesktopMedia', [id, sources, request, $Function.bind(onRequestResult, null, id)], undefined); return id; }); apiFunctions.setHandleRequest('cancelChooseDesktopMedia', function(id) { if (id in pendingRequests) { delete pendingRequests[id]; bindingUtil.sendRequest( 'webrtcDesktopCapturePrivate.cancelChooseDesktopMedia', [id], undefined); } }); }); // Copyright 2017 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // Custom binding for the webrtcLoggingPrivate API. var getBindDirectoryEntryCallback = require('fileEntryBindingUtil').getBindDirectoryEntryCallback; apiBridge.registerCustomHook(function(binding, id, contextType) { var apiFunctions = binding.apiFunctions; apiFunctions.setCustomCallback('getLogsDirectory', getBindDirectoryEntryCallback()); }); // chrome/common/media_router/mojom/media_controller.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'chrome/common/media_router/mojom/media_controller.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mediaRouter.mojom'); var media_status$ = mojo.internal.exposeNamespace('mediaRouter.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'chrome/common/media_router/mojom/media_status.mojom', 'media_status.mojom.js'); } var time$ = mojo.internal.exposeNamespace('mojoBase.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'mojo/public/mojom/base/time.mojom', '../../../../mojo/public/mojom/base/time.mojom.js'); } function MediaController_Play_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_Play_Params.prototype.initDefaults_ = function() { }; MediaController_Play_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_Play_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_Play_Params.encodedSize = codec.kStructHeaderSize + 0; MediaController_Play_Params.decode = function(decoder) { var packed; var val = new MediaController_Play_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaController_Play_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_Play_Params.encodedSize); encoder.writeUint32(0); }; function MediaController_Pause_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_Pause_Params.prototype.initDefaults_ = function() { }; MediaController_Pause_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_Pause_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_Pause_Params.encodedSize = codec.kStructHeaderSize + 0; MediaController_Pause_Params.decode = function(decoder) { var packed; var val = new MediaController_Pause_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaController_Pause_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_Pause_Params.encodedSize); encoder.writeUint32(0); }; function MediaController_SetMute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_SetMute_Params.prototype.initDefaults_ = function() { this.mute = false; }; MediaController_SetMute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_SetMute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_SetMute_Params.encodedSize = codec.kStructHeaderSize + 8; MediaController_SetMute_Params.decode = function(decoder) { var packed; var val = new MediaController_SetMute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.mute = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaController_SetMute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_SetMute_Params.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.mute & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaController_SetVolume_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_SetVolume_Params.prototype.initDefaults_ = function() { this.volume = 0; }; MediaController_SetVolume_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_SetVolume_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_SetVolume_Params.encodedSize = codec.kStructHeaderSize + 8; MediaController_SetVolume_Params.decode = function(decoder) { var packed; var val = new MediaController_SetVolume_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.volume = decoder.decodeStruct(codec.Float); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaController_SetVolume_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_SetVolume_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Float, val.volume); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaController_Seek_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_Seek_Params.prototype.initDefaults_ = function() { this.time = null; }; MediaController_Seek_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_Seek_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaController_Seek_Params.time err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_Seek_Params.encodedSize = codec.kStructHeaderSize + 8; MediaController_Seek_Params.decode = function(decoder) { var packed; var val = new MediaController_Seek_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.time = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaController_Seek_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_Seek_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(time$.TimeDelta, val.time); }; function MediaController_NextTrack_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_NextTrack_Params.prototype.initDefaults_ = function() { }; MediaController_NextTrack_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_NextTrack_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_NextTrack_Params.encodedSize = codec.kStructHeaderSize + 0; MediaController_NextTrack_Params.decode = function(decoder) { var packed; var val = new MediaController_NextTrack_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaController_NextTrack_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_NextTrack_Params.encodedSize); encoder.writeUint32(0); }; function MediaController_PreviousTrack_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaController_PreviousTrack_Params.prototype.initDefaults_ = function() { }; MediaController_PreviousTrack_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaController_PreviousTrack_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaController_PreviousTrack_Params.encodedSize = codec.kStructHeaderSize + 0; MediaController_PreviousTrack_Params.decode = function(decoder) { var packed; var val = new MediaController_PreviousTrack_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaController_PreviousTrack_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaController_PreviousTrack_Params.encodedSize); encoder.writeUint32(0); }; var kMediaController_Play_Name = 1549515263; var kMediaController_Pause_Name = 1198343308; var kMediaController_SetMute_Name = 586590081; var kMediaController_SetVolume_Name = 928562510; var kMediaController_Seek_Name = 1119781559; var kMediaController_NextTrack_Name = 485431279; var kMediaController_PreviousTrack_Name = 229233413; function MediaControllerPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaController, handleOrPtrInfo); } function MediaControllerAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaController, associatedInterfacePtrInfo); } MediaControllerAssociatedPtr.prototype = Object.create(MediaControllerPtr.prototype); MediaControllerAssociatedPtr.prototype.constructor = MediaControllerAssociatedPtr; function MediaControllerProxy(receiver) { this.receiver_ = receiver; } MediaControllerPtr.prototype.play = function() { return MediaControllerProxy.prototype.play .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.play = function() { var params_ = new MediaController_Play_Params(); var builder = new codec.MessageV0Builder( kMediaController_Play_Name, codec.align(MediaController_Play_Params.encodedSize)); builder.encodeStruct(MediaController_Play_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.pause = function() { return MediaControllerProxy.prototype.pause .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.pause = function() { var params_ = new MediaController_Pause_Params(); var builder = new codec.MessageV0Builder( kMediaController_Pause_Name, codec.align(MediaController_Pause_Params.encodedSize)); builder.encodeStruct(MediaController_Pause_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.setMute = function() { return MediaControllerProxy.prototype.setMute .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.setMute = function(mute) { var params_ = new MediaController_SetMute_Params(); params_.mute = mute; var builder = new codec.MessageV0Builder( kMediaController_SetMute_Name, codec.align(MediaController_SetMute_Params.encodedSize)); builder.encodeStruct(MediaController_SetMute_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.setVolume = function() { return MediaControllerProxy.prototype.setVolume .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.setVolume = function(volume) { var params_ = new MediaController_SetVolume_Params(); params_.volume = volume; var builder = new codec.MessageV0Builder( kMediaController_SetVolume_Name, codec.align(MediaController_SetVolume_Params.encodedSize)); builder.encodeStruct(MediaController_SetVolume_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.seek = function() { return MediaControllerProxy.prototype.seek .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.seek = function(time) { var params_ = new MediaController_Seek_Params(); params_.time = time; var builder = new codec.MessageV0Builder( kMediaController_Seek_Name, codec.align(MediaController_Seek_Params.encodedSize)); builder.encodeStruct(MediaController_Seek_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.nextTrack = function() { return MediaControllerProxy.prototype.nextTrack .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.nextTrack = function() { var params_ = new MediaController_NextTrack_Params(); var builder = new codec.MessageV0Builder( kMediaController_NextTrack_Name, codec.align(MediaController_NextTrack_Params.encodedSize)); builder.encodeStruct(MediaController_NextTrack_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaControllerPtr.prototype.previousTrack = function() { return MediaControllerProxy.prototype.previousTrack .apply(this.ptr.getProxy(), arguments); }; MediaControllerProxy.prototype.previousTrack = function() { var params_ = new MediaController_PreviousTrack_Params(); var builder = new codec.MessageV0Builder( kMediaController_PreviousTrack_Name, codec.align(MediaController_PreviousTrack_Params.encodedSize)); builder.encodeStruct(MediaController_PreviousTrack_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function MediaControllerStub(delegate) { this.delegate_ = delegate; } MediaControllerStub.prototype.play = function() { return this.delegate_ && this.delegate_.play && this.delegate_.play(); } MediaControllerStub.prototype.pause = function() { return this.delegate_ && this.delegate_.pause && this.delegate_.pause(); } MediaControllerStub.prototype.setMute = function(mute) { return this.delegate_ && this.delegate_.setMute && this.delegate_.setMute(mute); } MediaControllerStub.prototype.setVolume = function(volume) { return this.delegate_ && this.delegate_.setVolume && this.delegate_.setVolume(volume); } MediaControllerStub.prototype.seek = function(time) { return this.delegate_ && this.delegate_.seek && this.delegate_.seek(time); } MediaControllerStub.prototype.nextTrack = function() { return this.delegate_ && this.delegate_.nextTrack && this.delegate_.nextTrack(); } MediaControllerStub.prototype.previousTrack = function() { return this.delegate_ && this.delegate_.previousTrack && this.delegate_.previousTrack(); } MediaControllerStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaController_Play_Name: var params = reader.decodeStruct(MediaController_Play_Params); this.play(); return true; case kMediaController_Pause_Name: var params = reader.decodeStruct(MediaController_Pause_Params); this.pause(); return true; case kMediaController_SetMute_Name: var params = reader.decodeStruct(MediaController_SetMute_Params); this.setMute(params.mute); return true; case kMediaController_SetVolume_Name: var params = reader.decodeStruct(MediaController_SetVolume_Params); this.setVolume(params.volume); return true; case kMediaController_Seek_Name: var params = reader.decodeStruct(MediaController_Seek_Params); this.seek(params.time); return true; case kMediaController_NextTrack_Name: var params = reader.decodeStruct(MediaController_NextTrack_Params); this.nextTrack(); return true; case kMediaController_PreviousTrack_Name: var params = reader.decodeStruct(MediaController_PreviousTrack_Params); this.previousTrack(); return true; default: return false; } }; MediaControllerStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateMediaControllerRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaController_Play_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_Play_Params; break; case kMediaController_Pause_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_Pause_Params; break; case kMediaController_SetMute_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_SetMute_Params; break; case kMediaController_SetVolume_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_SetVolume_Params; break; case kMediaController_Seek_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_Seek_Params; break; case kMediaController_NextTrack_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_NextTrack_Params; break; case kMediaController_PreviousTrack_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaController_PreviousTrack_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaControllerResponse(messageValidator) { return validator.validationError.NONE; } var MediaController = { name: 'media_router.mojom.MediaController', kVersion: 0, ptrClass: MediaControllerPtr, proxyClass: MediaControllerProxy, stubClass: MediaControllerStub, validateRequest: validateMediaControllerRequest, validateResponse: null, }; MediaControllerStub.prototype.validator = validateMediaControllerRequest; MediaControllerProxy.prototype.validator = null; exports.MediaController = MediaController; exports.MediaControllerPtr = MediaControllerPtr; exports.MediaControllerAssociatedPtr = MediaControllerAssociatedPtr; })();// chrome/common/media_router/mojom/media_router.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'chrome/common/media_router/mojom/media_router.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mediaRouter.mojom'); var media_controller$ = mojo.internal.exposeNamespace('mediaRouter.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'chrome/common/media_router/mojom/media_controller.mojom', 'media_controller.mojom.js'); } var media_status$ = mojo.internal.exposeNamespace('mediaRouter.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'chrome/common/media_router/mojom/media_status.mojom', 'media_status.mojom.js'); } var mirroring_service_host$ = mojo.internal.exposeNamespace('mirroring.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'components/mirroring/mojom/mirroring_service_host.mojom', '../../../../components/mirroring/mojom/mirroring_service_host.mojom.js'); } var mirror_service_remoting$ = mojo.internal.exposeNamespace('media.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'media/mojo/mojom/mirror_service_remoting.mojom', '../../../../media/mojo/mojom/mirror_service_remoting.mojom.js'); } var time$ = mojo.internal.exposeNamespace('mojoBase.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'mojo/public/mojom/base/time.mojom', '../../../../mojo/public/mojom/base/time.mojom.js'); } var ip_address$ = mojo.internal.exposeNamespace('network.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'services/network/public/mojom/ip_address.mojom', '../../../../services/network/public/mojom/ip_address.mojom.js'); } var ip_endpoint$ = mojo.internal.exposeNamespace('network.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'services/network/public/mojom/ip_endpoint.mojom', '../../../../services/network/public/mojom/ip_endpoint.mojom.js'); } var presentation$ = mojo.internal.exposeNamespace('blink.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'third_party/blink/public/mojom/presentation/presentation.mojom', '../../../../third_party/blink/public/mojom/presentation/presentation.mojom.js'); } var origin$ = mojo.internal.exposeNamespace('url.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'url/mojom/origin.mojom', '../../../../url/mojom/origin.mojom.js'); } var url$ = mojo.internal.exposeNamespace('url.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'url/mojom/url.mojom', '../../../../url/mojom/url.mojom.js'); } var SinkIconType = {}; SinkIconType.CAST = 0; SinkIconType.CAST_AUDIO_GROUP = SinkIconType.CAST + 1; SinkIconType.CAST_AUDIO = SinkIconType.CAST_AUDIO_GROUP + 1; SinkIconType.MEETING = SinkIconType.CAST_AUDIO + 1; SinkIconType.HANGOUT = SinkIconType.MEETING + 1; SinkIconType.EDUCATION = SinkIconType.HANGOUT + 1; SinkIconType.WIRED_DISPLAY = SinkIconType.EDUCATION + 1; SinkIconType.GENERIC = SinkIconType.WIRED_DISPLAY + 1; SinkIconType.MIN_VALUE = 0, SinkIconType.MAX_VALUE = 7, SinkIconType.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: return true; } return false; }; SinkIconType.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RouteControllerType = {}; RouteControllerType.kNone = 0; RouteControllerType.kGeneric = RouteControllerType.kNone + 1; RouteControllerType.kMirroring = RouteControllerType.kGeneric + 1; RouteControllerType.MIN_VALUE = 0, RouteControllerType.MAX_VALUE = 2, RouteControllerType.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; RouteControllerType.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RouteRequestResultCode = {}; RouteRequestResultCode.UNKNOWN_ERROR = 0; RouteRequestResultCode.OK = RouteRequestResultCode.UNKNOWN_ERROR + 1; RouteRequestResultCode.TIMED_OUT = RouteRequestResultCode.OK + 1; RouteRequestResultCode.ROUTE_NOT_FOUND = RouteRequestResultCode.TIMED_OUT + 1; RouteRequestResultCode.SINK_NOT_FOUND = RouteRequestResultCode.ROUTE_NOT_FOUND + 1; RouteRequestResultCode.INVALID_ORIGIN = RouteRequestResultCode.SINK_NOT_FOUND + 1; RouteRequestResultCode.INCOGNITO_MISMATCH = RouteRequestResultCode.INVALID_ORIGIN + 1; RouteRequestResultCode.NO_SUPPORTED_PROVIDER = RouteRequestResultCode.INCOGNITO_MISMATCH + 1; RouteRequestResultCode.CANCELLED = RouteRequestResultCode.NO_SUPPORTED_PROVIDER + 1; RouteRequestResultCode.ROUTE_ALREADY_EXISTS = RouteRequestResultCode.CANCELLED + 1; RouteRequestResultCode.DESKTOP_PICKER_FAILED = RouteRequestResultCode.ROUTE_ALREADY_EXISTS + 1; RouteRequestResultCode.MIN_VALUE = 0, RouteRequestResultCode.MAX_VALUE = 10, RouteRequestResultCode.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: return true; } return false; }; RouteRequestResultCode.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; function MediaSink(values) { this.initDefaults_(); this.initFields_(values); } MediaSink.prototype.initDefaults_ = function() { this.sinkId = null; this.name = null; this.description = null; this.domain = null; this.iconType = 0; this.providerId = 0; this.extraData = null; }; MediaSink.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaSink.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 64} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaSink.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaSink.name err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaSink.description err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaSink.domain err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, true) if (err !== validator.validationError.NONE) return err; // validate MediaSink.iconType err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 32, SinkIconType); if (err !== validator.validationError.NONE) return err; // validate MediaSink.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 36, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaSink.extraData err = messageValidator.validateUnion(offset + codec.kStructHeaderSize + 40, MediaSinkExtraData, true); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaSink.encodedSize = codec.kStructHeaderSize + 56; MediaSink.decode = function(decoder) { var packed; var val = new MediaSink(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.sinkId = decoder.decodeStruct(codec.String); val.name = decoder.decodeStruct(codec.String); val.description = decoder.decodeStruct(codec.NullableString); val.domain = decoder.decodeStruct(codec.NullableString); val.iconType = decoder.decodeStruct(codec.Int32); val.providerId = decoder.decodeStruct(codec.Int32); val.extraData = decoder.decodeStruct(MediaSinkExtraData); return val; }; MediaSink.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaSink.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.sinkId); encoder.encodeStruct(codec.String, val.name); encoder.encodeStruct(codec.NullableString, val.description); encoder.encodeStruct(codec.NullableString, val.domain); encoder.encodeStruct(codec.Int32, val.iconType); encoder.encodeStruct(codec.Int32, val.providerId); encoder.encodeStruct(MediaSinkExtraData, val.extraData); }; function DialMediaSink(values) { this.initDefaults_(); this.initFields_(values); } DialMediaSink.prototype.initDefaults_ = function() { this.ipAddress = null; this.modelName = null; this.appUrl = null; }; DialMediaSink.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; DialMediaSink.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate DialMediaSink.ipAddress err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_address$.IPAddress, false); if (err !== validator.validationError.NONE) return err; // validate DialMediaSink.modelName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate DialMediaSink.appUrl err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, url$.Url, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; DialMediaSink.encodedSize = codec.kStructHeaderSize + 24; DialMediaSink.decode = function(decoder) { var packed; var val = new DialMediaSink(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.ipAddress = decoder.decodeStructPointer(ip_address$.IPAddress); val.modelName = decoder.decodeStruct(codec.String); val.appUrl = decoder.decodeStructPointer(url$.Url); return val; }; DialMediaSink.encode = function(encoder, val) { var packed; encoder.writeUint32(DialMediaSink.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(ip_address$.IPAddress, val.ipAddress); encoder.encodeStruct(codec.String, val.modelName); encoder.encodeStructPointer(url$.Url, val.appUrl); }; function CastMediaSink(values) { this.initDefaults_(); this.initFields_(values); } CastMediaSink.prototype.initDefaults_ = function() { this.ipEndpoint = null; this.modelName = null; this.capabilities = 0; this.castChannelId = 0; }; CastMediaSink.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; CastMediaSink.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate CastMediaSink.ipEndpoint err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_endpoint$.IPEndPoint, false); if (err !== validator.validationError.NONE) return err; // validate CastMediaSink.modelName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; CastMediaSink.encodedSize = codec.kStructHeaderSize + 24; CastMediaSink.decode = function(decoder) { var packed; var val = new CastMediaSink(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.ipEndpoint = decoder.decodeStructPointer(ip_endpoint$.IPEndPoint); val.modelName = decoder.decodeStruct(codec.String); val.capabilities = decoder.decodeStruct(codec.Uint8); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.castChannelId = decoder.decodeStruct(codec.Int32); return val; }; CastMediaSink.encode = function(encoder, val) { var packed; encoder.writeUint32(CastMediaSink.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(ip_endpoint$.IPEndPoint, val.ipEndpoint); encoder.encodeStruct(codec.String, val.modelName); encoder.encodeStruct(codec.Uint8, val.capabilities); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.Int32, val.castChannelId); }; function MediaRoute(values) { this.initDefaults_(); this.initFields_(values); } MediaRoute.prototype.initDefaults_ = function() { this.mediaRouteId = null; this.presentationId = null; this.mediaSource = null; this.mediaSinkId = null; this.description = null; this.isLocal = false; this.forDisplay = false; this.isIncognito = false; this.isLocalPresentation = false; this.controllerType = 0; }; MediaRoute.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRoute.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRoute.mediaRouteId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.presentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.mediaSinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.description err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 32, false) if (err !== validator.validationError.NONE) return err; // validate MediaRoute.controllerType err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 44, RouteControllerType); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRoute.encodedSize = codec.kStructHeaderSize + 48; MediaRoute.decode = function(decoder) { var packed; var val = new MediaRoute(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaRouteId = decoder.decodeStruct(codec.String); val.presentationId = decoder.decodeStruct(codec.String); val.mediaSource = decoder.decodeStruct(codec.NullableString); val.mediaSinkId = decoder.decodeStruct(codec.String); val.description = decoder.decodeStruct(codec.String); packed = decoder.readUint8(); val.isLocal = (packed >> 0) & 1 ? true : false; val.forDisplay = (packed >> 1) & 1 ? true : false; val.isIncognito = (packed >> 2) & 1 ? true : false; val.isLocalPresentation = (packed >> 3) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.controllerType = decoder.decodeStruct(codec.Int32); return val; }; MediaRoute.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRoute.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaRouteId); encoder.encodeStruct(codec.String, val.presentationId); encoder.encodeStruct(codec.NullableString, val.mediaSource); encoder.encodeStruct(codec.String, val.mediaSinkId); encoder.encodeStruct(codec.String, val.description); packed = 0; packed |= (val.isLocal & 1) << 0 packed |= (val.forDisplay & 1) << 1 packed |= (val.isIncognito & 1) << 2 packed |= (val.isLocalPresentation & 1) << 3 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.Int32, val.controllerType); }; function Issue(values) { this.initDefaults_(); this.initFields_(values); } Issue.Severity = {}; Issue.Severity.FATAL = 0; Issue.Severity.WARNING = Issue.Severity.FATAL + 1; Issue.Severity.NOTIFICATION = Issue.Severity.WARNING + 1; Issue.Severity.MIN_VALUE = 0, Issue.Severity.MAX_VALUE = 2, Issue.Severity.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; Issue.Severity.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; Issue.ActionType = {}; Issue.ActionType.DISMISS = 0; Issue.ActionType.LEARN_MORE = Issue.ActionType.DISMISS + 1; Issue.ActionType.MIN_VALUE = 0, Issue.ActionType.MAX_VALUE = 1, Issue.ActionType.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: return true; } return false; }; Issue.ActionType.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; Issue.prototype.initDefaults_ = function() { this.routeId = null; this.sinkId = null; this.severity = 0; this.isBlocking = false; this.title = null; this.message = null; this.defaultAction = 0; this.helpPageId = 0; this.secondaryActions = null; }; Issue.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Issue.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 64} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate Issue.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate Issue.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate Issue.severity err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 16, Issue.Severity); if (err !== validator.validationError.NONE) return err; // validate Issue.title err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, false) if (err !== validator.validationError.NONE) return err; // validate Issue.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 32, true) if (err !== validator.validationError.NONE) return err; // validate Issue.defaultAction err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 40, Issue.ActionType); if (err !== validator.validationError.NONE) return err; // validate Issue.secondaryActions err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 48, 4, new codec.Enum(Issue.ActionType), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Issue.encodedSize = codec.kStructHeaderSize + 56; Issue.decode = function(decoder) { var packed; var val = new Issue(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.sinkId = decoder.decodeStruct(codec.String); val.severity = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.isBlocking = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.title = decoder.decodeStruct(codec.String); val.message = decoder.decodeStruct(codec.NullableString); val.defaultAction = decoder.decodeStruct(codec.Int32); val.helpPageId = decoder.decodeStruct(codec.Int32); val.secondaryActions = decoder.decodeArrayPointer(new codec.Enum(Issue.ActionType)); return val; }; Issue.encode = function(encoder, val) { var packed; encoder.writeUint32(Issue.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.String, val.sinkId); encoder.encodeStruct(codec.Int32, val.severity); packed = 0; packed |= (val.isBlocking & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.String, val.title); encoder.encodeStruct(codec.NullableString, val.message); encoder.encodeStruct(codec.Int32, val.defaultAction); encoder.encodeStruct(codec.Int32, val.helpPageId); encoder.encodeArrayPointer(new codec.Enum(Issue.ActionType), val.secondaryActions); }; function RouteMessage(values) { this.initDefaults_(); this.initFields_(values); } RouteMessage.Type = {}; RouteMessage.Type.TEXT = 0; RouteMessage.Type.BINARY = RouteMessage.Type.TEXT + 1; RouteMessage.Type.MIN_VALUE = 0, RouteMessage.Type.MAX_VALUE = 1, RouteMessage.Type.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: return true; } return false; }; RouteMessage.Type.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; RouteMessage.prototype.initDefaults_ = function() { this.type = 0; this.message = null; this.data = null; }; RouteMessage.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; RouteMessage.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate RouteMessage.type err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, RouteMessage.Type); if (err !== validator.validationError.NONE) return err; // validate RouteMessage.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, true) if (err !== validator.validationError.NONE) return err; // validate RouteMessage.data err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 1, codec.Uint8, true, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; RouteMessage.encodedSize = codec.kStructHeaderSize + 24; RouteMessage.decode = function(decoder) { var packed; var val = new RouteMessage(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.type = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.message = decoder.decodeStruct(codec.NullableString); val.data = decoder.decodeArrayPointer(codec.Uint8); return val; }; RouteMessage.encode = function(encoder, val) { var packed; encoder.writeUint32(RouteMessage.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.type); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.NullableString, val.message); encoder.encodeArrayPointer(codec.Uint8, val.data); }; function SinkSearchCriteria(values) { this.initDefaults_(); this.initFields_(values); } SinkSearchCriteria.prototype.initDefaults_ = function() { this.input = null; this.domain = null; }; SinkSearchCriteria.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; SinkSearchCriteria.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate SinkSearchCriteria.input err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate SinkSearchCriteria.domain err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; SinkSearchCriteria.encodedSize = codec.kStructHeaderSize + 16; SinkSearchCriteria.decode = function(decoder) { var packed; var val = new SinkSearchCriteria(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.input = decoder.decodeStruct(codec.String); val.domain = decoder.decodeStruct(codec.String); return val; }; SinkSearchCriteria.encode = function(encoder, val) { var packed; encoder.writeUint32(SinkSearchCriteria.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.input); encoder.encodeStruct(codec.String, val.domain); }; function MediaRouteProviderConfig(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProviderConfig.prototype.initDefaults_ = function() { this.enableDialDiscovery = false; this.enableCastDiscovery = false; this.enableDialSinkQuery = false; this.enableCastSinkQuery = false; this.useMirroringService = false; }; MediaRouteProviderConfig.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProviderConfig.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProviderConfig.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProviderConfig.decode = function(decoder) { var packed; var val = new MediaRouteProviderConfig(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.enableDialDiscovery = (packed >> 0) & 1 ? true : false; val.enableCastDiscovery = (packed >> 1) & 1 ? true : false; val.enableDialSinkQuery = (packed >> 2) & 1 ? true : false; val.enableCastSinkQuery = (packed >> 3) & 1 ? true : false; val.useMirroringService = (packed >> 4) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProviderConfig.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProviderConfig.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.enableDialDiscovery & 1) << 0 packed |= (val.enableCastDiscovery & 1) << 1 packed |= (val.enableDialSinkQuery & 1) << 2 packed |= (val.enableCastSinkQuery & 1) << 3 packed |= (val.useMirroringService & 1) << 4 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function RoutePresentationConnection(values) { this.initDefaults_(); this.initFields_(values); } RoutePresentationConnection.prototype.initDefaults_ = function() { this.connectionRemote = new presentation$.PresentationConnectionPtr(); this.connectionReceiver = new bindings.InterfaceRequest(); }; RoutePresentationConnection.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; RoutePresentationConnection.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate RoutePresentationConnection.connectionRemote err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 0, false); if (err !== validator.validationError.NONE) return err; // validate RoutePresentationConnection.connectionReceiver err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; RoutePresentationConnection.encodedSize = codec.kStructHeaderSize + 16; RoutePresentationConnection.decode = function(decoder) { var packed; var val = new RoutePresentationConnection(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.connectionRemote = decoder.decodeStruct(new codec.Interface(presentation$.PresentationConnectionPtr)); val.connectionReceiver = decoder.decodeStruct(codec.InterfaceRequest); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; RoutePresentationConnection.encode = function(encoder, val) { var packed; encoder.writeUint32(RoutePresentationConnection.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(new codec.Interface(presentation$.PresentationConnectionPtr), val.connectionRemote); encoder.encodeStruct(codec.InterfaceRequest, val.connectionReceiver); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_CreateRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateRoute_Params.prototype.initDefaults_ = function() { this.mediaSource = null; this.sinkId = null; this.originalPresentationId = null; this.origin = null; this.tabId = 0; this.incognito = false; this.timeout = null; }; MediaRouteProvider_CreateRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.originalPresentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.origin err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, origin$.Origin, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_Params.timeout err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 40, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateRoute_Params.encodedSize = codec.kStructHeaderSize + 48; MediaRouteProvider_CreateRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); val.sinkId = decoder.decodeStruct(codec.String); val.originalPresentationId = decoder.decodeStruct(codec.String); val.origin = decoder.decodeStructPointer(origin$.Origin); val.tabId = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.incognito = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.timeout = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaRouteProvider_CreateRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStruct(codec.String, val.sinkId); encoder.encodeStruct(codec.String, val.originalPresentationId); encoder.encodeStructPointer(origin$.Origin, val.origin); encoder.encodeStruct(codec.Int32, val.tabId); packed = 0; packed |= (val.incognito & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.timeout); }; function MediaRouteProvider_CreateRoute_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateRoute_ResponseParams.prototype.initDefaults_ = function() { this.route = null; this.connection = null; this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_CreateRoute_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateRoute_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_ResponseParams.route err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_ResponseParams.connection err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, RoutePresentationConnection, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateRoute_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 24, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 32; MediaRouteProvider_CreateRoute_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateRoute_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.route = decoder.decodeStructPointer(MediaRoute); val.connection = decoder.decodeStructPointer(RoutePresentationConnection); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_CreateRoute_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateRoute_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaRoute, val.route); encoder.encodeStructPointer(RoutePresentationConnection, val.connection); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_JoinRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_JoinRoute_Params.prototype.initDefaults_ = function() { this.mediaSource = null; this.presentationId = null; this.origin = null; this.tabId = 0; this.incognito = false; this.timeout = null; }; MediaRouteProvider_JoinRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_JoinRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 48} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.presentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.origin err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, origin$.Origin, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_Params.timeout err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 32, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_JoinRoute_Params.encodedSize = codec.kStructHeaderSize + 40; MediaRouteProvider_JoinRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_JoinRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); val.presentationId = decoder.decodeStruct(codec.String); val.origin = decoder.decodeStructPointer(origin$.Origin); val.tabId = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.incognito = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.timeout = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaRouteProvider_JoinRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_JoinRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStruct(codec.String, val.presentationId); encoder.encodeStructPointer(origin$.Origin, val.origin); encoder.encodeStruct(codec.Int32, val.tabId); packed = 0; packed |= (val.incognito & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.timeout); }; function MediaRouteProvider_JoinRoute_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_JoinRoute_ResponseParams.prototype.initDefaults_ = function() { this.route = null; this.connection = null; this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_JoinRoute_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_JoinRoute_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_ResponseParams.route err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_ResponseParams.connection err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, RoutePresentationConnection, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_JoinRoute_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 24, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_JoinRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 32; MediaRouteProvider_JoinRoute_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_JoinRoute_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.route = decoder.decodeStructPointer(MediaRoute); val.connection = decoder.decodeStructPointer(RoutePresentationConnection); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_JoinRoute_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_JoinRoute_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaRoute, val.route); encoder.encodeStructPointer(RoutePresentationConnection, val.connection); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_ConnectRouteByRouteId_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_ConnectRouteByRouteId_Params.prototype.initDefaults_ = function() { this.mediaSource = null; this.routeId = null; this.presentationId = null; this.origin = null; this.tabId = 0; this.incognito = false; this.timeout = null; }; MediaRouteProvider_ConnectRouteByRouteId_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_ConnectRouteByRouteId_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.presentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.origin err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, origin$.Origin, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_Params.timeout err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 40, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize = codec.kStructHeaderSize + 48; MediaRouteProvider_ConnectRouteByRouteId_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_ConnectRouteByRouteId_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); val.routeId = decoder.decodeStruct(codec.String); val.presentationId = decoder.decodeStruct(codec.String); val.origin = decoder.decodeStructPointer(origin$.Origin); val.tabId = decoder.decodeStruct(codec.Int32); packed = decoder.readUint8(); val.incognito = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.timeout = decoder.decodeStructPointer(time$.TimeDelta); return val; }; MediaRouteProvider_ConnectRouteByRouteId_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.String, val.presentationId); encoder.encodeStructPointer(origin$.Origin, val.origin); encoder.encodeStruct(codec.Int32, val.tabId); packed = 0; packed |= (val.incognito & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.timeout); }; function MediaRouteProvider_ConnectRouteByRouteId_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.prototype.initDefaults_ = function() { this.route = null; this.connection = null; this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.route err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaRoute, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.connection err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, RoutePresentationConnection, true); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 24, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize = codec.kStructHeaderSize + 32; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_ConnectRouteByRouteId_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.route = decoder.decodeStructPointer(MediaRoute); val.connection = decoder.decodeStructPointer(RoutePresentationConnection); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaRoute, val.route); encoder.encodeStructPointer(RoutePresentationConnection, val.connection); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_TerminateRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_TerminateRoute_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_TerminateRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_TerminateRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_TerminateRoute_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_TerminateRoute_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_TerminateRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_TerminateRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_TerminateRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_TerminateRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_TerminateRoute_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_TerminateRoute_ResponseParams.prototype.initDefaults_ = function() { this.errorText = null; this.resultCode = 0; }; MediaRouteProvider_TerminateRoute_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_TerminateRoute_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_TerminateRoute_ResponseParams.errorText err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, true) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_TerminateRoute_ResponseParams.resultCode err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, RouteRequestResultCode); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_TerminateRoute_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_TerminateRoute_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.errorText = decoder.decodeStruct(codec.NullableString); val.resultCode = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_TerminateRoute_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.NullableString, val.errorText); encoder.encodeStruct(codec.Int32, val.resultCode); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_SendRouteMessage_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SendRouteMessage_Params.prototype.initDefaults_ = function() { this.mediaRouteId = null; this.message = null; }; MediaRouteProvider_SendRouteMessage_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SendRouteMessage_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteMessage_Params.mediaRouteId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteMessage_Params.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SendRouteMessage_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_SendRouteMessage_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SendRouteMessage_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaRouteId = decoder.decodeStruct(codec.String); val.message = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_SendRouteMessage_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SendRouteMessage_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaRouteId); encoder.encodeStruct(codec.String, val.message); }; function MediaRouteProvider_SendRouteBinaryMessage_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SendRouteBinaryMessage_Params.prototype.initDefaults_ = function() { this.mediaRouteId = null; this.data = null; }; MediaRouteProvider_SendRouteBinaryMessage_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SendRouteBinaryMessage_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteBinaryMessage_Params.mediaRouteId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SendRouteBinaryMessage_Params.data err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_SendRouteBinaryMessage_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SendRouteBinaryMessage_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaRouteId = decoder.decodeStruct(codec.String); val.data = decoder.decodeArrayPointer(codec.Uint8); return val; }; MediaRouteProvider_SendRouteBinaryMessage_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaRouteId); encoder.encodeArrayPointer(codec.Uint8, val.data); }; function MediaRouteProvider_StartObservingMediaSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StartObservingMediaSinks_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StartObservingMediaSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StartObservingMediaSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StartObservingMediaSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StartObservingMediaSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StartObservingMediaSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StartObservingMediaSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StopObservingMediaSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StopObservingMediaSinks_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StopObservingMediaSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StopObservingMediaSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StopObservingMediaSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StopObservingMediaSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StopObservingMediaSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StopObservingMediaSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StartObservingMediaRoutes_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StartObservingMediaRoutes_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StartObservingMediaRoutes_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StartObservingMediaRoutes_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StartObservingMediaRoutes_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StartObservingMediaRoutes_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StartObservingMediaRoutes_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StartObservingMediaRoutes_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StopObservingMediaRoutes_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StopObservingMediaRoutes_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_StopObservingMediaRoutes_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StopObservingMediaRoutes_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StopObservingMediaRoutes_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StopObservingMediaRoutes_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StopObservingMediaRoutes_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StopObservingMediaRoutes_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_StartListeningForRouteMessages_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StartListeningForRouteMessages_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_StartListeningForRouteMessages_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StartListeningForRouteMessages_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StartListeningForRouteMessages_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StartListeningForRouteMessages_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StartListeningForRouteMessages_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StartListeningForRouteMessages_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_StopListeningForRouteMessages_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_StopListeningForRouteMessages_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_StopListeningForRouteMessages_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_StopListeningForRouteMessages_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_StopListeningForRouteMessages_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_StopListeningForRouteMessages_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_StopListeningForRouteMessages_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_StopListeningForRouteMessages_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_DetachRoute_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_DetachRoute_Params.prototype.initDefaults_ = function() { this.routeId = null; }; MediaRouteProvider_DetachRoute_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_DetachRoute_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_DetachRoute_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_DetachRoute_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_DetachRoute_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_DetachRoute_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_DetachRoute_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_DetachRoute_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); }; function MediaRouteProvider_EnableMdnsDiscovery_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_EnableMdnsDiscovery_Params.prototype.initDefaults_ = function() { }; MediaRouteProvider_EnableMdnsDiscovery_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_EnableMdnsDiscovery_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize = codec.kStructHeaderSize + 0; MediaRouteProvider_EnableMdnsDiscovery_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_EnableMdnsDiscovery_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaRouteProvider_EnableMdnsDiscovery_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize); encoder.writeUint32(0); }; function MediaRouteProvider_UpdateMediaSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_UpdateMediaSinks_Params.prototype.initDefaults_ = function() { this.mediaSource = null; }; MediaRouteProvider_UpdateMediaSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_UpdateMediaSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_UpdateMediaSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_UpdateMediaSinks_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_UpdateMediaSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_UpdateMediaSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.mediaSource = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_UpdateMediaSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_UpdateMediaSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.mediaSource); }; function MediaRouteProvider_SearchSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SearchSinks_Params.prototype.initDefaults_ = function() { this.sinkId = null; this.mediaSource = null; this.searchCriteria = null; }; MediaRouteProvider_SearchSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SearchSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_Params.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_Params.searchCriteria err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 16, SinkSearchCriteria, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SearchSinks_Params.encodedSize = codec.kStructHeaderSize + 24; MediaRouteProvider_SearchSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SearchSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.sinkId = decoder.decodeStruct(codec.String); val.mediaSource = decoder.decodeStruct(codec.String); val.searchCriteria = decoder.decodeStructPointer(SinkSearchCriteria); return val; }; MediaRouteProvider_SearchSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SearchSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.sinkId); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeStructPointer(SinkSearchCriteria, val.searchCriteria); }; function MediaRouteProvider_SearchSinks_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_SearchSinks_ResponseParams.prototype.initDefaults_ = function() { this.sinkId = null; }; MediaRouteProvider_SearchSinks_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_SearchSinks_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_SearchSinks_ResponseParams.sinkId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_SearchSinks_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_SearchSinks_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_SearchSinks_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.sinkId = decoder.decodeStruct(codec.String); return val; }; MediaRouteProvider_SearchSinks_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_SearchSinks_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.sinkId); }; function MediaRouteProvider_ProvideSinks_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_ProvideSinks_Params.prototype.initDefaults_ = function() { this.providerName = null; this.sinks = null; }; MediaRouteProvider_ProvideSinks_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_ProvideSinks_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ProvideSinks_Params.providerName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_ProvideSinks_Params.sinks err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(MediaSink), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_ProvideSinks_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouteProvider_ProvideSinks_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_ProvideSinks_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerName = decoder.decodeStruct(codec.String); val.sinks = decoder.decodeArrayPointer(new codec.PointerTo(MediaSink)); return val; }; MediaRouteProvider_ProvideSinks_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_ProvideSinks_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.providerName); encoder.encodeArrayPointer(new codec.PointerTo(MediaSink), val.sinks); }; function MediaRouteProvider_CreateMediaRouteController_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateMediaRouteController_Params.prototype.initDefaults_ = function() { this.routeId = null; this.mediaController = new bindings.InterfaceRequest(); this.observer = new media_status$.MediaStatusObserverPtr(); }; MediaRouteProvider_CreateMediaRouteController_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateMediaRouteController_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateMediaRouteController_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateMediaRouteController_Params.mediaController err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouteProvider_CreateMediaRouteController_Params.observer err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 12, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateMediaRouteController_Params.encodedSize = codec.kStructHeaderSize + 24; MediaRouteProvider_CreateMediaRouteController_Params.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateMediaRouteController_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.mediaController = decoder.decodeStruct(codec.InterfaceRequest); val.observer = decoder.decodeStruct(new codec.Interface(media_status$.MediaStatusObserverPtr)); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_CreateMediaRouteController_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateMediaRouteController_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.InterfaceRequest, val.mediaController); encoder.encodeStruct(new codec.Interface(media_status$.MediaStatusObserverPtr), val.observer); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouteProvider_CreateMediaRouteController_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouteProvider_CreateMediaRouteController_ResponseParams.prototype.initDefaults_ = function() { this.success = false; }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MediaRouteProvider_CreateMediaRouteController_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouteProvider_CreateMediaRouteController_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.success = (packed >> 0) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouteProvider_CreateMediaRouteController_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.success & 1) << 0 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouter_RegisterMediaRouteProvider_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_RegisterMediaRouteProvider_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.mediaRouterProvider = new MediaRouteProviderPtr(); }; MediaRouter_RegisterMediaRouteProvider_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_RegisterMediaRouteProvider_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_Params.mediaRouterProvider err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 4, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_RegisterMediaRouteProvider_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_RegisterMediaRouteProvider_Params.decode = function(decoder) { var packed; var val = new MediaRouter_RegisterMediaRouteProvider_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); val.mediaRouterProvider = decoder.decodeStruct(new codec.Interface(MediaRouteProviderPtr)); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouter_RegisterMediaRouteProvider_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_RegisterMediaRouteProvider_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.encodeStruct(new codec.Interface(MediaRouteProviderPtr), val.mediaRouterProvider); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouter_RegisterMediaRouteProvider_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_RegisterMediaRouteProvider_ResponseParams.prototype.initDefaults_ = function() { this.instanceId = null; this.config = null; }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_ResponseParams.instanceId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_RegisterMediaRouteProvider_ResponseParams.config err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, MediaRouteProviderConfig, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_RegisterMediaRouteProvider_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouter_RegisterMediaRouteProvider_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.instanceId = decoder.decodeStruct(codec.String); val.config = decoder.decodeStructPointer(MediaRouteProviderConfig); return val; }; MediaRouter_RegisterMediaRouteProvider_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.instanceId); encoder.encodeStructPointer(MediaRouteProviderConfig, val.config); }; function MediaRouter_OnSinksReceived_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnSinksReceived_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.mediaSource = null; this.sinks = null; this.origins = null; }; MediaRouter_OnSinksReceived_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnSinksReceived_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.sinks err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 8, new codec.PointerTo(MediaSink), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinksReceived_Params.origins err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 24, 8, new codec.PointerTo(origin$.Origin), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnSinksReceived_Params.encodedSize = codec.kStructHeaderSize + 32; MediaRouter_OnSinksReceived_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnSinksReceived_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.mediaSource = decoder.decodeStruct(codec.String); val.sinks = decoder.decodeArrayPointer(new codec.PointerTo(MediaSink)); val.origins = decoder.decodeArrayPointer(new codec.PointerTo(origin$.Origin)); return val; }; MediaRouter_OnSinksReceived_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnSinksReceived_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeArrayPointer(new codec.PointerTo(MediaSink), val.sinks); encoder.encodeArrayPointer(new codec.PointerTo(origin$.Origin), val.origins); }; function MediaRouter_OnIssue_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnIssue_Params.prototype.initDefaults_ = function() { this.issue = null; }; MediaRouter_OnIssue_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnIssue_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnIssue_Params.issue err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, Issue, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnIssue_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouter_OnIssue_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnIssue_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.issue = decoder.decodeStructPointer(Issue); return val; }; MediaRouter_OnIssue_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnIssue_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(Issue, val.issue); }; function MediaRouter_OnRoutesUpdated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnRoutesUpdated_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.routes = null; this.mediaSource = null; this.joinableRouteIds = null; }; MediaRouter_OnRoutesUpdated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnRoutesUpdated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.routes err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(MediaRoute), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.mediaSource err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRoutesUpdated_Params.joinableRouteIds err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 24, 8, codec.String, false, [0, 0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnRoutesUpdated_Params.encodedSize = codec.kStructHeaderSize + 32; MediaRouter_OnRoutesUpdated_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnRoutesUpdated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.routes = decoder.decodeArrayPointer(new codec.PointerTo(MediaRoute)); val.mediaSource = decoder.decodeStruct(codec.String); val.joinableRouteIds = decoder.decodeArrayPointer(codec.String); return val; }; MediaRouter_OnRoutesUpdated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnRoutesUpdated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeArrayPointer(new codec.PointerTo(MediaRoute), val.routes); encoder.encodeStruct(codec.String, val.mediaSource); encoder.encodeArrayPointer(codec.String, val.joinableRouteIds); }; function MediaRouter_OnSinkAvailabilityUpdated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnSinkAvailabilityUpdated_Params.prototype.initDefaults_ = function() { this.providerId = 0; this.availability = 0; }; MediaRouter_OnSinkAvailabilityUpdated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnSinkAvailabilityUpdated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinkAvailabilityUpdated_Params.providerId err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, MediaRouteProvider.Id); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnSinkAvailabilityUpdated_Params.availability err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 4, MediaRouter.SinkAvailability); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouter_OnSinkAvailabilityUpdated_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnSinkAvailabilityUpdated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.providerId = decoder.decodeStruct(codec.Int32); val.availability = decoder.decodeStruct(codec.Int32); return val; }; MediaRouter_OnSinkAvailabilityUpdated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.providerId); encoder.encodeStruct(codec.Int32, val.availability); }; function MediaRouter_OnPresentationConnectionStateChanged_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnPresentationConnectionStateChanged_Params.prototype.initDefaults_ = function() { this.routeId = null; this.state = 0; }; MediaRouter_OnPresentationConnectionStateChanged_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnPresentationConnectionStateChanged_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionStateChanged_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionStateChanged_Params.state err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, MediaRouter.PresentationConnectionState); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_OnPresentationConnectionStateChanged_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnPresentationConnectionStateChanged_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.state = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouter_OnPresentationConnectionStateChanged_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.Int32, val.state); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaRouter_OnPresentationConnectionClosed_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnPresentationConnectionClosed_Params.prototype.initDefaults_ = function() { this.routeId = null; this.reason = 0; this.message = null; }; MediaRouter_OnPresentationConnectionClosed_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnPresentationConnectionClosed_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionClosed_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionClosed_Params.reason err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 8, MediaRouter.PresentationConnectionCloseReason); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnPresentationConnectionClosed_Params.message err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnPresentationConnectionClosed_Params.encodedSize = codec.kStructHeaderSize + 24; MediaRouter_OnPresentationConnectionClosed_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnPresentationConnectionClosed_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.reason = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.message = decoder.decodeStruct(codec.String); return val; }; MediaRouter_OnPresentationConnectionClosed_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnPresentationConnectionClosed_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeStruct(codec.Int32, val.reason); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.String, val.message); }; function MediaRouter_OnRouteMessagesReceived_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnRouteMessagesReceived_Params.prototype.initDefaults_ = function() { this.routeId = null; this.messages = null; }; MediaRouter_OnRouteMessagesReceived_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnRouteMessagesReceived_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRouteMessagesReceived_Params.routeId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnRouteMessagesReceived_Params.messages err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 8, new codec.PointerTo(RouteMessage), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnRouteMessagesReceived_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_OnRouteMessagesReceived_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnRouteMessagesReceived_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.routeId = decoder.decodeStruct(codec.String); val.messages = decoder.decodeArrayPointer(new codec.PointerTo(RouteMessage)); return val; }; MediaRouter_OnRouteMessagesReceived_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnRouteMessagesReceived_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.routeId); encoder.encodeArrayPointer(new codec.PointerTo(RouteMessage), val.messages); }; function MediaRouter_OnMediaRemoterCreated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_OnMediaRemoterCreated_Params.prototype.initDefaults_ = function() { this.tabId = 0; this.remoter = new mirror_service_remoting$.MirrorServiceRemoterPtr(); this.remotingSource = new bindings.InterfaceRequest(); }; MediaRouter_OnMediaRemoterCreated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_OnMediaRemoterCreated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnMediaRemoterCreated_Params.remoter err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 4, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_OnMediaRemoterCreated_Params.remotingSource err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 12, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_OnMediaRemoterCreated_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_OnMediaRemoterCreated_Params.decode = function(decoder) { var packed; var val = new MediaRouter_OnMediaRemoterCreated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.tabId = decoder.decodeStruct(codec.Int32); val.remoter = decoder.decodeStruct(new codec.Interface(mirror_service_remoting$.MirrorServiceRemoterPtr)); val.remotingSource = decoder.decodeStruct(codec.InterfaceRequest); return val; }; MediaRouter_OnMediaRemoterCreated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_OnMediaRemoterCreated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.tabId); encoder.encodeStruct(new codec.Interface(mirror_service_remoting$.MirrorServiceRemoterPtr), val.remoter); encoder.encodeStruct(codec.InterfaceRequest, val.remotingSource); }; function MediaRouter_GetMediaSinkServiceStatus_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_GetMediaSinkServiceStatus_Params.prototype.initDefaults_ = function() { }; MediaRouter_GetMediaSinkServiceStatus_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_GetMediaSinkServiceStatus_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_GetMediaSinkServiceStatus_Params.encodedSize = codec.kStructHeaderSize + 0; MediaRouter_GetMediaSinkServiceStatus_Params.decode = function(decoder) { var packed; var val = new MediaRouter_GetMediaSinkServiceStatus_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MediaRouter_GetMediaSinkServiceStatus_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_GetMediaSinkServiceStatus_Params.encodedSize); encoder.writeUint32(0); }; function MediaRouter_GetMediaSinkServiceStatus_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_GetMediaSinkServiceStatus_ResponseParams.prototype.initDefaults_ = function() { this.status = null; }; MediaRouter_GetMediaSinkServiceStatus_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_GetMediaSinkServiceStatus_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMediaSinkServiceStatus_ResponseParams.status err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MediaRouter_GetMediaSinkServiceStatus_ResponseParams.decode = function(decoder) { var packed; var val = new MediaRouter_GetMediaSinkServiceStatus_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.status = decoder.decodeStruct(codec.String); return val; }; MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.status); }; function MediaRouter_GetMirroringServiceHostForTab_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_GetMirroringServiceHostForTab_Params.prototype.initDefaults_ = function() { this.targetTabId = 0; this.receiver = new bindings.InterfaceRequest(); }; MediaRouter_GetMirroringServiceHostForTab_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_GetMirroringServiceHostForTab_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForTab_Params.receiver err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 4, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_GetMirroringServiceHostForTab_Params.encodedSize = codec.kStructHeaderSize + 8; MediaRouter_GetMirroringServiceHostForTab_Params.decode = function(decoder) { var packed; var val = new MediaRouter_GetMirroringServiceHostForTab_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.targetTabId = decoder.decodeStruct(codec.Int32); val.receiver = decoder.decodeStruct(codec.InterfaceRequest); return val; }; MediaRouter_GetMirroringServiceHostForTab_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_GetMirroringServiceHostForTab_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.targetTabId); encoder.encodeStruct(codec.InterfaceRequest, val.receiver); }; function MediaRouter_GetMirroringServiceHostForDesktop_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_GetMirroringServiceHostForDesktop_Params.prototype.initDefaults_ = function() { this.initiatorTabId = 0; this.receiver = new bindings.InterfaceRequest(); this.desktopStreamId = null; }; MediaRouter_GetMirroringServiceHostForDesktop_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_GetMirroringServiceHostForDesktop_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForDesktop_Params.desktopStreamId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForDesktop_Params.receiver err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 4, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_GetMirroringServiceHostForDesktop_Params.encodedSize = codec.kStructHeaderSize + 16; MediaRouter_GetMirroringServiceHostForDesktop_Params.decode = function(decoder) { var packed; var val = new MediaRouter_GetMirroringServiceHostForDesktop_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.initiatorTabId = decoder.decodeStruct(codec.Int32); val.receiver = decoder.decodeStruct(codec.InterfaceRequest); val.desktopStreamId = decoder.decodeStruct(codec.String); return val; }; MediaRouter_GetMirroringServiceHostForDesktop_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_GetMirroringServiceHostForDesktop_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.initiatorTabId); encoder.encodeStruct(codec.InterfaceRequest, val.receiver); encoder.encodeStruct(codec.String, val.desktopStreamId); }; function MediaRouter_GetMirroringServiceHostForOffscreenTab_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.prototype.initDefaults_ = function() { this.presentationUrl = null; this.presentationId = null; this.receiver = new bindings.InterfaceRequest(); }; MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.presentationUrl err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, url$.Url, false); if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.presentationId err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.receiver err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.encodedSize = codec.kStructHeaderSize + 24; MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.decode = function(decoder) { var packed; var val = new MediaRouter_GetMirroringServiceHostForOffscreenTab_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.presentationUrl = decoder.decodeStructPointer(url$.Url); val.presentationId = decoder.decodeStruct(codec.String); val.receiver = decoder.decodeStruct(codec.InterfaceRequest); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(url$.Url, val.presentationUrl); encoder.encodeStruct(codec.String, val.presentationId); encoder.encodeStruct(codec.InterfaceRequest, val.receiver); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MediaSinkExtraData(value) { this.initDefault_(); this.initValue_(value); } MediaSinkExtraData.Tags = { dialMediaSink: 0, castMediaSink: 1, }; MediaSinkExtraData.prototype.initDefault_ = function() { this.$data = null; this.$tag = undefined; } MediaSinkExtraData.prototype.initValue_ = function(value) { if (value == undefined) { return; } var keys = Object.keys(value); if (keys.length == 0) { return; } if (keys.length > 1) { throw new TypeError("You may set only one member on a union."); } var fields = [ "dialMediaSink", "castMediaSink", ]; if (fields.indexOf(keys[0]) < 0) { throw new ReferenceError(keys[0] + " is not a MediaSinkExtraData member."); } this[keys[0]] = value[keys[0]]; } Object.defineProperty(MediaSinkExtraData.prototype, "dialMediaSink", { get: function() { if (this.$tag != MediaSinkExtraData.Tags.dialMediaSink) { throw new ReferenceError( "MediaSinkExtraData.dialMediaSink is not currently set."); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraData.Tags.dialMediaSink; this.$data = value; } }); Object.defineProperty(MediaSinkExtraData.prototype, "castMediaSink", { get: function() { if (this.$tag != MediaSinkExtraData.Tags.castMediaSink) { throw new ReferenceError( "MediaSinkExtraData.castMediaSink is not currently set."); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraData.Tags.castMediaSink; this.$data = value; } }); MediaSinkExtraData.encode = function(encoder, val) { if (val == null) { encoder.writeUint64(0); encoder.writeUint64(0); return; } if (val.$tag == undefined) { throw new TypeError("Cannot encode unions with an unknown member set."); } encoder.writeUint32(16); encoder.writeUint32(val.$tag); switch (val.$tag) { case MediaSinkExtraData.Tags.dialMediaSink: encoder.encodeStructPointer(DialMediaSink, val.dialMediaSink); break; case MediaSinkExtraData.Tags.castMediaSink: encoder.encodeStructPointer(CastMediaSink, val.castMediaSink); break; } encoder.align(); }; MediaSinkExtraData.decode = function(decoder) { var size = decoder.readUint32(); if (size == 0) { decoder.readUint32(); decoder.readUint64(); return null; } var result = new MediaSinkExtraData(); var tag = decoder.readUint32(); switch (tag) { case MediaSinkExtraData.Tags.dialMediaSink: result.dialMediaSink = decoder.decodeStructPointer(DialMediaSink); break; case MediaSinkExtraData.Tags.castMediaSink: result.castMediaSink = decoder.decodeStructPointer(CastMediaSink); break; } decoder.align(); return result; }; MediaSinkExtraData.validate = function(messageValidator, offset) { var size = messageValidator.decodeUnionSize(offset); if (size != 16) { return validator.validationError.INVALID_UNION_SIZE; } var tag = messageValidator.decodeUnionTag(offset); var data_offset = offset + 8; var err; switch (tag) { case MediaSinkExtraData.Tags.dialMediaSink: // validate MediaSinkExtraData.dialMediaSink err = messageValidator.validateStructPointer(data_offset, DialMediaSink, false); if (err !== validator.validationError.NONE) return err; break; case MediaSinkExtraData.Tags.castMediaSink: // validate MediaSinkExtraData.castMediaSink err = messageValidator.validateStructPointer(data_offset, CastMediaSink, false); if (err !== validator.validationError.NONE) return err; break; } return validator.validationError.NONE; }; MediaSinkExtraData.encodedSize = 16; var kMediaRouteProvider_CreateRoute_Name = 1076787515; var kMediaRouteProvider_JoinRoute_Name = 2098056945; var kMediaRouteProvider_ConnectRouteByRouteId_Name = 568394884; var kMediaRouteProvider_TerminateRoute_Name = 1179810998; var kMediaRouteProvider_SendRouteMessage_Name = 1085208061; var kMediaRouteProvider_SendRouteBinaryMessage_Name = 513418127; var kMediaRouteProvider_StartObservingMediaSinks_Name = 1487629603; var kMediaRouteProvider_StopObservingMediaSinks_Name = 1406641220; var kMediaRouteProvider_StartObservingMediaRoutes_Name = 1759385908; var kMediaRouteProvider_StopObservingMediaRoutes_Name = 551403914; var kMediaRouteProvider_StartListeningForRouteMessages_Name = 1389699310; var kMediaRouteProvider_StopListeningForRouteMessages_Name = 721262489; var kMediaRouteProvider_DetachRoute_Name = 692740655; var kMediaRouteProvider_EnableMdnsDiscovery_Name = 1405576643; var kMediaRouteProvider_UpdateMediaSinks_Name = 437955509; var kMediaRouteProvider_SearchSinks_Name = 430886131; var kMediaRouteProvider_ProvideSinks_Name = 1494284795; var kMediaRouteProvider_CreateMediaRouteController_Name = 1790096448; function MediaRouteProviderPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaRouteProvider, handleOrPtrInfo); } function MediaRouteProviderAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaRouteProvider, associatedInterfacePtrInfo); } MediaRouteProviderAssociatedPtr.prototype = Object.create(MediaRouteProviderPtr.prototype); MediaRouteProviderAssociatedPtr.prototype.constructor = MediaRouteProviderAssociatedPtr; function MediaRouteProviderProxy(receiver) { this.receiver_ = receiver; } MediaRouteProviderPtr.prototype.createRoute = function() { return MediaRouteProviderProxy.prototype.createRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.createRoute = function(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito) { var params_ = new MediaRouteProvider_CreateRoute_Params(); params_.mediaSource = mediaSource; params_.sinkId = sinkId; params_.originalPresentationId = originalPresentationId; params_.origin = origin; params_.tabId = tabId; params_.timeout = timeout; params_.incognito = incognito; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateRoute_Name, codec.align(MediaRouteProvider_CreateRoute_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_CreateRoute_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_CreateRoute_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.joinRoute = function() { return MediaRouteProviderProxy.prototype.joinRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.joinRoute = function(mediaSource, presentationId, origin, tabId, timeout, incognito) { var params_ = new MediaRouteProvider_JoinRoute_Params(); params_.mediaSource = mediaSource; params_.presentationId = presentationId; params_.origin = origin; params_.tabId = tabId; params_.timeout = timeout; params_.incognito = incognito; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_JoinRoute_Name, codec.align(MediaRouteProvider_JoinRoute_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_JoinRoute_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_JoinRoute_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.connectRouteByRouteId = function() { return MediaRouteProviderProxy.prototype.connectRouteByRouteId .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.connectRouteByRouteId = function(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito) { var params_ = new MediaRouteProvider_ConnectRouteByRouteId_Params(); params_.mediaSource = mediaSource; params_.routeId = routeId; params_.presentationId = presentationId; params_.origin = origin; params_.tabId = tabId; params_.timeout = timeout; params_.incognito = incognito; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_ConnectRouteByRouteId_Name, codec.align(MediaRouteProvider_ConnectRouteByRouteId_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_ConnectRouteByRouteId_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.terminateRoute = function() { return MediaRouteProviderProxy.prototype.terminateRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.terminateRoute = function(routeId) { var params_ = new MediaRouteProvider_TerminateRoute_Params(); params_.routeId = routeId; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_TerminateRoute_Name, codec.align(MediaRouteProvider_TerminateRoute_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_TerminateRoute_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_TerminateRoute_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.sendRouteMessage = function() { return MediaRouteProviderProxy.prototype.sendRouteMessage .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.sendRouteMessage = function(mediaRouteId, message) { var params_ = new MediaRouteProvider_SendRouteMessage_Params(); params_.mediaRouteId = mediaRouteId; params_.message = message; var builder = new codec.MessageV0Builder( kMediaRouteProvider_SendRouteMessage_Name, codec.align(MediaRouteProvider_SendRouteMessage_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_SendRouteMessage_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.sendRouteBinaryMessage = function() { return MediaRouteProviderProxy.prototype.sendRouteBinaryMessage .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.sendRouteBinaryMessage = function(mediaRouteId, data) { var params_ = new MediaRouteProvider_SendRouteBinaryMessage_Params(); params_.mediaRouteId = mediaRouteId; params_.data = data; var builder = new codec.MessageV0Builder( kMediaRouteProvider_SendRouteBinaryMessage_Name, codec.align(MediaRouteProvider_SendRouteBinaryMessage_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_SendRouteBinaryMessage_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.startObservingMediaSinks = function() { return MediaRouteProviderProxy.prototype.startObservingMediaSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.startObservingMediaSinks = function(mediaSource) { var params_ = new MediaRouteProvider_StartObservingMediaSinks_Params(); params_.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StartObservingMediaSinks_Name, codec.align(MediaRouteProvider_StartObservingMediaSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StartObservingMediaSinks_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.stopObservingMediaSinks = function() { return MediaRouteProviderProxy.prototype.stopObservingMediaSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.stopObservingMediaSinks = function(mediaSource) { var params_ = new MediaRouteProvider_StopObservingMediaSinks_Params(); params_.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StopObservingMediaSinks_Name, codec.align(MediaRouteProvider_StopObservingMediaSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StopObservingMediaSinks_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.startObservingMediaRoutes = function() { return MediaRouteProviderProxy.prototype.startObservingMediaRoutes .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.startObservingMediaRoutes = function(mediaSource) { var params_ = new MediaRouteProvider_StartObservingMediaRoutes_Params(); params_.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StartObservingMediaRoutes_Name, codec.align(MediaRouteProvider_StartObservingMediaRoutes_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StartObservingMediaRoutes_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.stopObservingMediaRoutes = function() { return MediaRouteProviderProxy.prototype.stopObservingMediaRoutes .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.stopObservingMediaRoutes = function(mediaSource) { var params_ = new MediaRouteProvider_StopObservingMediaRoutes_Params(); params_.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StopObservingMediaRoutes_Name, codec.align(MediaRouteProvider_StopObservingMediaRoutes_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StopObservingMediaRoutes_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.startListeningForRouteMessages = function() { return MediaRouteProviderProxy.prototype.startListeningForRouteMessages .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.startListeningForRouteMessages = function(routeId) { var params_ = new MediaRouteProvider_StartListeningForRouteMessages_Params(); params_.routeId = routeId; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StartListeningForRouteMessages_Name, codec.align(MediaRouteProvider_StartListeningForRouteMessages_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StartListeningForRouteMessages_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.stopListeningForRouteMessages = function() { return MediaRouteProviderProxy.prototype.stopListeningForRouteMessages .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.stopListeningForRouteMessages = function(routeId) { var params_ = new MediaRouteProvider_StopListeningForRouteMessages_Params(); params_.routeId = routeId; var builder = new codec.MessageV0Builder( kMediaRouteProvider_StopListeningForRouteMessages_Name, codec.align(MediaRouteProvider_StopListeningForRouteMessages_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_StopListeningForRouteMessages_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.detachRoute = function() { return MediaRouteProviderProxy.prototype.detachRoute .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.detachRoute = function(routeId) { var params_ = new MediaRouteProvider_DetachRoute_Params(); params_.routeId = routeId; var builder = new codec.MessageV0Builder( kMediaRouteProvider_DetachRoute_Name, codec.align(MediaRouteProvider_DetachRoute_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_DetachRoute_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.enableMdnsDiscovery = function() { return MediaRouteProviderProxy.prototype.enableMdnsDiscovery .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.enableMdnsDiscovery = function() { var params_ = new MediaRouteProvider_EnableMdnsDiscovery_Params(); var builder = new codec.MessageV0Builder( kMediaRouteProvider_EnableMdnsDiscovery_Name, codec.align(MediaRouteProvider_EnableMdnsDiscovery_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_EnableMdnsDiscovery_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.updateMediaSinks = function() { return MediaRouteProviderProxy.prototype.updateMediaSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.updateMediaSinks = function(mediaSource) { var params_ = new MediaRouteProvider_UpdateMediaSinks_Params(); params_.mediaSource = mediaSource; var builder = new codec.MessageV0Builder( kMediaRouteProvider_UpdateMediaSinks_Name, codec.align(MediaRouteProvider_UpdateMediaSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_UpdateMediaSinks_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.searchSinks = function() { return MediaRouteProviderProxy.prototype.searchSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.searchSinks = function(sinkId, mediaSource, searchCriteria) { var params_ = new MediaRouteProvider_SearchSinks_Params(); params_.sinkId = sinkId; params_.mediaSource = mediaSource; params_.searchCriteria = searchCriteria; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_SearchSinks_Name, codec.align(MediaRouteProvider_SearchSinks_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_SearchSinks_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_SearchSinks_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouteProviderPtr.prototype.provideSinks = function() { return MediaRouteProviderProxy.prototype.provideSinks .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.provideSinks = function(providerName, sinks) { var params_ = new MediaRouteProvider_ProvideSinks_Params(); params_.providerName = providerName; params_.sinks = sinks; var builder = new codec.MessageV0Builder( kMediaRouteProvider_ProvideSinks_Name, codec.align(MediaRouteProvider_ProvideSinks_Params.encodedSize)); builder.encodeStruct(MediaRouteProvider_ProvideSinks_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouteProviderPtr.prototype.createMediaRouteController = function() { return MediaRouteProviderProxy.prototype.createMediaRouteController .apply(this.ptr.getProxy(), arguments); }; MediaRouteProviderProxy.prototype.createMediaRouteController = function(routeId, mediaController, observer) { var params_ = new MediaRouteProvider_CreateMediaRouteController_Params(); params_.routeId = routeId; params_.mediaController = mediaController; params_.observer = observer; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateMediaRouteController_Name, codec.align(MediaRouteProvider_CreateMediaRouteController_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouteProvider_CreateMediaRouteController_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouteProvider_CreateMediaRouteController_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; function MediaRouteProviderStub(delegate) { this.delegate_ = delegate; } MediaRouteProviderStub.prototype.createRoute = function(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito) { return this.delegate_ && this.delegate_.createRoute && this.delegate_.createRoute(mediaSource, sinkId, originalPresentationId, origin, tabId, timeout, incognito); } MediaRouteProviderStub.prototype.joinRoute = function(mediaSource, presentationId, origin, tabId, timeout, incognito) { return this.delegate_ && this.delegate_.joinRoute && this.delegate_.joinRoute(mediaSource, presentationId, origin, tabId, timeout, incognito); } MediaRouteProviderStub.prototype.connectRouteByRouteId = function(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito) { return this.delegate_ && this.delegate_.connectRouteByRouteId && this.delegate_.connectRouteByRouteId(mediaSource, routeId, presentationId, origin, tabId, timeout, incognito); } MediaRouteProviderStub.prototype.terminateRoute = function(routeId) { return this.delegate_ && this.delegate_.terminateRoute && this.delegate_.terminateRoute(routeId); } MediaRouteProviderStub.prototype.sendRouteMessage = function(mediaRouteId, message) { return this.delegate_ && this.delegate_.sendRouteMessage && this.delegate_.sendRouteMessage(mediaRouteId, message); } MediaRouteProviderStub.prototype.sendRouteBinaryMessage = function(mediaRouteId, data) { return this.delegate_ && this.delegate_.sendRouteBinaryMessage && this.delegate_.sendRouteBinaryMessage(mediaRouteId, data); } MediaRouteProviderStub.prototype.startObservingMediaSinks = function(mediaSource) { return this.delegate_ && this.delegate_.startObservingMediaSinks && this.delegate_.startObservingMediaSinks(mediaSource); } MediaRouteProviderStub.prototype.stopObservingMediaSinks = function(mediaSource) { return this.delegate_ && this.delegate_.stopObservingMediaSinks && this.delegate_.stopObservingMediaSinks(mediaSource); } MediaRouteProviderStub.prototype.startObservingMediaRoutes = function(mediaSource) { return this.delegate_ && this.delegate_.startObservingMediaRoutes && this.delegate_.startObservingMediaRoutes(mediaSource); } MediaRouteProviderStub.prototype.stopObservingMediaRoutes = function(mediaSource) { return this.delegate_ && this.delegate_.stopObservingMediaRoutes && this.delegate_.stopObservingMediaRoutes(mediaSource); } MediaRouteProviderStub.prototype.startListeningForRouteMessages = function(routeId) { return this.delegate_ && this.delegate_.startListeningForRouteMessages && this.delegate_.startListeningForRouteMessages(routeId); } MediaRouteProviderStub.prototype.stopListeningForRouteMessages = function(routeId) { return this.delegate_ && this.delegate_.stopListeningForRouteMessages && this.delegate_.stopListeningForRouteMessages(routeId); } MediaRouteProviderStub.prototype.detachRoute = function(routeId) { return this.delegate_ && this.delegate_.detachRoute && this.delegate_.detachRoute(routeId); } MediaRouteProviderStub.prototype.enableMdnsDiscovery = function() { return this.delegate_ && this.delegate_.enableMdnsDiscovery && this.delegate_.enableMdnsDiscovery(); } MediaRouteProviderStub.prototype.updateMediaSinks = function(mediaSource) { return this.delegate_ && this.delegate_.updateMediaSinks && this.delegate_.updateMediaSinks(mediaSource); } MediaRouteProviderStub.prototype.searchSinks = function(sinkId, mediaSource, searchCriteria) { return this.delegate_ && this.delegate_.searchSinks && this.delegate_.searchSinks(sinkId, mediaSource, searchCriteria); } MediaRouteProviderStub.prototype.provideSinks = function(providerName, sinks) { return this.delegate_ && this.delegate_.provideSinks && this.delegate_.provideSinks(providerName, sinks); } MediaRouteProviderStub.prototype.createMediaRouteController = function(routeId, mediaController, observer) { return this.delegate_ && this.delegate_.createMediaRouteController && this.delegate_.createMediaRouteController(routeId, mediaController, observer); } MediaRouteProviderStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouteProvider_SendRouteMessage_Name: var params = reader.decodeStruct(MediaRouteProvider_SendRouteMessage_Params); this.sendRouteMessage(params.mediaRouteId, params.message); return true; case kMediaRouteProvider_SendRouteBinaryMessage_Name: var params = reader.decodeStruct(MediaRouteProvider_SendRouteBinaryMessage_Params); this.sendRouteBinaryMessage(params.mediaRouteId, params.data); return true; case kMediaRouteProvider_StartObservingMediaSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_StartObservingMediaSinks_Params); this.startObservingMediaSinks(params.mediaSource); return true; case kMediaRouteProvider_StopObservingMediaSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_StopObservingMediaSinks_Params); this.stopObservingMediaSinks(params.mediaSource); return true; case kMediaRouteProvider_StartObservingMediaRoutes_Name: var params = reader.decodeStruct(MediaRouteProvider_StartObservingMediaRoutes_Params); this.startObservingMediaRoutes(params.mediaSource); return true; case kMediaRouteProvider_StopObservingMediaRoutes_Name: var params = reader.decodeStruct(MediaRouteProvider_StopObservingMediaRoutes_Params); this.stopObservingMediaRoutes(params.mediaSource); return true; case kMediaRouteProvider_StartListeningForRouteMessages_Name: var params = reader.decodeStruct(MediaRouteProvider_StartListeningForRouteMessages_Params); this.startListeningForRouteMessages(params.routeId); return true; case kMediaRouteProvider_StopListeningForRouteMessages_Name: var params = reader.decodeStruct(MediaRouteProvider_StopListeningForRouteMessages_Params); this.stopListeningForRouteMessages(params.routeId); return true; case kMediaRouteProvider_DetachRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_DetachRoute_Params); this.detachRoute(params.routeId); return true; case kMediaRouteProvider_EnableMdnsDiscovery_Name: var params = reader.decodeStruct(MediaRouteProvider_EnableMdnsDiscovery_Params); this.enableMdnsDiscovery(); return true; case kMediaRouteProvider_UpdateMediaSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_UpdateMediaSinks_Params); this.updateMediaSinks(params.mediaSource); return true; case kMediaRouteProvider_ProvideSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_ProvideSinks_Params); this.provideSinks(params.providerName, params.sinks); return true; default: return false; } }; MediaRouteProviderStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouteProvider_CreateRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_CreateRoute_Params); this.createRoute(params.mediaSource, params.sinkId, params.originalPresentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) { var responseParams = new MediaRouteProvider_CreateRoute_ResponseParams(); responseParams.route = response.route; responseParams.connection = response.connection; responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateRoute_Name, codec.align(MediaRouteProvider_CreateRoute_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_CreateRoute_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_JoinRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_JoinRoute_Params); this.joinRoute(params.mediaSource, params.presentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) { var responseParams = new MediaRouteProvider_JoinRoute_ResponseParams(); responseParams.route = response.route; responseParams.connection = response.connection; responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_JoinRoute_Name, codec.align(MediaRouteProvider_JoinRoute_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_JoinRoute_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_ConnectRouteByRouteId_Name: var params = reader.decodeStruct(MediaRouteProvider_ConnectRouteByRouteId_Params); this.connectRouteByRouteId(params.mediaSource, params.routeId, params.presentationId, params.origin, params.tabId, params.timeout, params.incognito).then(function(response) { var responseParams = new MediaRouteProvider_ConnectRouteByRouteId_ResponseParams(); responseParams.route = response.route; responseParams.connection = response.connection; responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_ConnectRouteByRouteId_Name, codec.align(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_ConnectRouteByRouteId_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_TerminateRoute_Name: var params = reader.decodeStruct(MediaRouteProvider_TerminateRoute_Params); this.terminateRoute(params.routeId).then(function(response) { var responseParams = new MediaRouteProvider_TerminateRoute_ResponseParams(); responseParams.errorText = response.errorText; responseParams.resultCode = response.resultCode; var builder = new codec.MessageV1Builder( kMediaRouteProvider_TerminateRoute_Name, codec.align(MediaRouteProvider_TerminateRoute_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_TerminateRoute_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_SearchSinks_Name: var params = reader.decodeStruct(MediaRouteProvider_SearchSinks_Params); this.searchSinks(params.sinkId, params.mediaSource, params.searchCriteria).then(function(response) { var responseParams = new MediaRouteProvider_SearchSinks_ResponseParams(); responseParams.sinkId = response.sinkId; var builder = new codec.MessageV1Builder( kMediaRouteProvider_SearchSinks_Name, codec.align(MediaRouteProvider_SearchSinks_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_SearchSinks_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouteProvider_CreateMediaRouteController_Name: var params = reader.decodeStruct(MediaRouteProvider_CreateMediaRouteController_Params); this.createMediaRouteController(params.routeId, params.mediaController, params.observer).then(function(response) { var responseParams = new MediaRouteProvider_CreateMediaRouteController_ResponseParams(); responseParams.success = response.success; var builder = new codec.MessageV1Builder( kMediaRouteProvider_CreateMediaRouteController_Name, codec.align(MediaRouteProvider_CreateMediaRouteController_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouteProvider_CreateMediaRouteController_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; default: return false; } }; function validateMediaRouteProviderRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouteProvider_CreateRoute_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_CreateRoute_Params; break; case kMediaRouteProvider_JoinRoute_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_JoinRoute_Params; break; case kMediaRouteProvider_ConnectRouteByRouteId_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_ConnectRouteByRouteId_Params; break; case kMediaRouteProvider_TerminateRoute_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_TerminateRoute_Params; break; case kMediaRouteProvider_SendRouteMessage_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_SendRouteMessage_Params; break; case kMediaRouteProvider_SendRouteBinaryMessage_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_SendRouteBinaryMessage_Params; break; case kMediaRouteProvider_StartObservingMediaSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StartObservingMediaSinks_Params; break; case kMediaRouteProvider_StopObservingMediaSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StopObservingMediaSinks_Params; break; case kMediaRouteProvider_StartObservingMediaRoutes_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StartObservingMediaRoutes_Params; break; case kMediaRouteProvider_StopObservingMediaRoutes_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StopObservingMediaRoutes_Params; break; case kMediaRouteProvider_StartListeningForRouteMessages_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StartListeningForRouteMessages_Params; break; case kMediaRouteProvider_StopListeningForRouteMessages_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_StopListeningForRouteMessages_Params; break; case kMediaRouteProvider_DetachRoute_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_DetachRoute_Params; break; case kMediaRouteProvider_EnableMdnsDiscovery_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_EnableMdnsDiscovery_Params; break; case kMediaRouteProvider_UpdateMediaSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_UpdateMediaSinks_Params; break; case kMediaRouteProvider_SearchSinks_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_SearchSinks_Params; break; case kMediaRouteProvider_ProvideSinks_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouteProvider_ProvideSinks_Params; break; case kMediaRouteProvider_CreateMediaRouteController_Name: if (message.expectsResponse()) paramsClass = MediaRouteProvider_CreateMediaRouteController_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaRouteProviderResponse(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouteProvider_CreateRoute_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_CreateRoute_ResponseParams; break; case kMediaRouteProvider_JoinRoute_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_JoinRoute_ResponseParams; break; case kMediaRouteProvider_ConnectRouteByRouteId_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_ConnectRouteByRouteId_ResponseParams; break; case kMediaRouteProvider_TerminateRoute_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_TerminateRoute_ResponseParams; break; case kMediaRouteProvider_SearchSinks_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_SearchSinks_ResponseParams; break; case kMediaRouteProvider_CreateMediaRouteController_Name: if (message.isResponse()) paramsClass = MediaRouteProvider_CreateMediaRouteController_ResponseParams; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } var MediaRouteProvider = { name: 'media_router.mojom.MediaRouteProvider', kVersion: 0, ptrClass: MediaRouteProviderPtr, proxyClass: MediaRouteProviderProxy, stubClass: MediaRouteProviderStub, validateRequest: validateMediaRouteProviderRequest, validateResponse: validateMediaRouteProviderResponse, }; MediaRouteProvider.Id = {}; MediaRouteProvider.Id.EXTENSION = 0; MediaRouteProvider.Id.WIRED_DISPLAY = MediaRouteProvider.Id.EXTENSION + 1; MediaRouteProvider.Id.CAST = MediaRouteProvider.Id.WIRED_DISPLAY + 1; MediaRouteProvider.Id.DIAL = MediaRouteProvider.Id.CAST + 1; MediaRouteProvider.Id.MIN_VALUE = 0, MediaRouteProvider.Id.MAX_VALUE = 3, MediaRouteProvider.Id.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: return true; } return false; }; MediaRouteProvider.Id.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouteProviderStub.prototype.validator = validateMediaRouteProviderRequest; MediaRouteProviderProxy.prototype.validator = validateMediaRouteProviderResponse; var kMediaRouter_RegisterMediaRouteProvider_Name = 1488862852; var kMediaRouter_OnSinksReceived_Name = 1926251281; var kMediaRouter_OnIssue_Name = 1552938974; var kMediaRouter_OnRoutesUpdated_Name = 2131043604; var kMediaRouter_OnSinkAvailabilityUpdated_Name = 1978357086; var kMediaRouter_OnPresentationConnectionStateChanged_Name = 1938877931; var kMediaRouter_OnPresentationConnectionClosed_Name = 1623948733; var kMediaRouter_OnRouteMessagesReceived_Name = 2027964811; var kMediaRouter_OnMediaRemoterCreated_Name = 937188391; var kMediaRouter_GetMediaSinkServiceStatus_Name = 693890836; var kMediaRouter_GetMirroringServiceHostForTab_Name = 675925530; var kMediaRouter_GetMirroringServiceHostForDesktop_Name = 971745838; var kMediaRouter_GetMirroringServiceHostForOffscreenTab_Name = 595791292; function MediaRouterPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaRouter, handleOrPtrInfo); } function MediaRouterAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaRouter, associatedInterfacePtrInfo); } MediaRouterAssociatedPtr.prototype = Object.create(MediaRouterPtr.prototype); MediaRouterAssociatedPtr.prototype.constructor = MediaRouterAssociatedPtr; function MediaRouterProxy(receiver) { this.receiver_ = receiver; } MediaRouterPtr.prototype.registerMediaRouteProvider = function() { return MediaRouterProxy.prototype.registerMediaRouteProvider .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.registerMediaRouteProvider = function(providerId, mediaRouterProvider) { var params_ = new MediaRouter_RegisterMediaRouteProvider_Params(); params_.providerId = providerId; params_.mediaRouterProvider = mediaRouterProvider; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouter_RegisterMediaRouteProvider_Name, codec.align(MediaRouter_RegisterMediaRouteProvider_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouter_RegisterMediaRouteProvider_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouter_RegisterMediaRouteProvider_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouterPtr.prototype.onSinksReceived = function() { return MediaRouterProxy.prototype.onSinksReceived .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onSinksReceived = function(providerId, mediaSource, sinks, origins) { var params_ = new MediaRouter_OnSinksReceived_Params(); params_.providerId = providerId; params_.mediaSource = mediaSource; params_.sinks = sinks; params_.origins = origins; var builder = new codec.MessageV0Builder( kMediaRouter_OnSinksReceived_Name, codec.align(MediaRouter_OnSinksReceived_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnSinksReceived_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onIssue = function() { return MediaRouterProxy.prototype.onIssue .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onIssue = function(issue) { var params_ = new MediaRouter_OnIssue_Params(); params_.issue = issue; var builder = new codec.MessageV0Builder( kMediaRouter_OnIssue_Name, codec.align(MediaRouter_OnIssue_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnIssue_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onRoutesUpdated = function() { return MediaRouterProxy.prototype.onRoutesUpdated .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onRoutesUpdated = function(providerId, routes, mediaSource, joinableRouteIds) { var params_ = new MediaRouter_OnRoutesUpdated_Params(); params_.providerId = providerId; params_.routes = routes; params_.mediaSource = mediaSource; params_.joinableRouteIds = joinableRouteIds; var builder = new codec.MessageV0Builder( kMediaRouter_OnRoutesUpdated_Name, codec.align(MediaRouter_OnRoutesUpdated_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnRoutesUpdated_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onSinkAvailabilityUpdated = function() { return MediaRouterProxy.prototype.onSinkAvailabilityUpdated .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onSinkAvailabilityUpdated = function(providerId, availability) { var params_ = new MediaRouter_OnSinkAvailabilityUpdated_Params(); params_.providerId = providerId; params_.availability = availability; var builder = new codec.MessageV0Builder( kMediaRouter_OnSinkAvailabilityUpdated_Name, codec.align(MediaRouter_OnSinkAvailabilityUpdated_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnSinkAvailabilityUpdated_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onPresentationConnectionStateChanged = function() { return MediaRouterProxy.prototype.onPresentationConnectionStateChanged .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onPresentationConnectionStateChanged = function(routeId, state) { var params_ = new MediaRouter_OnPresentationConnectionStateChanged_Params(); params_.routeId = routeId; params_.state = state; var builder = new codec.MessageV0Builder( kMediaRouter_OnPresentationConnectionStateChanged_Name, codec.align(MediaRouter_OnPresentationConnectionStateChanged_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnPresentationConnectionStateChanged_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onPresentationConnectionClosed = function() { return MediaRouterProxy.prototype.onPresentationConnectionClosed .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onPresentationConnectionClosed = function(routeId, reason, message) { var params_ = new MediaRouter_OnPresentationConnectionClosed_Params(); params_.routeId = routeId; params_.reason = reason; params_.message = message; var builder = new codec.MessageV0Builder( kMediaRouter_OnPresentationConnectionClosed_Name, codec.align(MediaRouter_OnPresentationConnectionClosed_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnPresentationConnectionClosed_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onRouteMessagesReceived = function() { return MediaRouterProxy.prototype.onRouteMessagesReceived .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onRouteMessagesReceived = function(routeId, messages) { var params_ = new MediaRouter_OnRouteMessagesReceived_Params(); params_.routeId = routeId; params_.messages = messages; var builder = new codec.MessageV0Builder( kMediaRouter_OnRouteMessagesReceived_Name, codec.align(MediaRouter_OnRouteMessagesReceived_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnRouteMessagesReceived_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.onMediaRemoterCreated = function() { return MediaRouterProxy.prototype.onMediaRemoterCreated .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.onMediaRemoterCreated = function(tabId, remoter, remotingSource) { var params_ = new MediaRouter_OnMediaRemoterCreated_Params(); params_.tabId = tabId; params_.remoter = remoter; params_.remotingSource = remotingSource; var builder = new codec.MessageV0Builder( kMediaRouter_OnMediaRemoterCreated_Name, codec.align(MediaRouter_OnMediaRemoterCreated_Params.encodedSize)); builder.encodeStruct(MediaRouter_OnMediaRemoterCreated_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.getMediaSinkServiceStatus = function() { return MediaRouterProxy.prototype.getMediaSinkServiceStatus .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.getMediaSinkServiceStatus = function() { var params_ = new MediaRouter_GetMediaSinkServiceStatus_Params(); return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMediaRouter_GetMediaSinkServiceStatus_Name, codec.align(MediaRouter_GetMediaSinkServiceStatus_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MediaRouter_GetMediaSinkServiceStatus_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MediaRouter_GetMediaSinkServiceStatus_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MediaRouterPtr.prototype.getMirroringServiceHostForTab = function() { return MediaRouterProxy.prototype.getMirroringServiceHostForTab .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.getMirroringServiceHostForTab = function(targetTabId, receiver) { var params_ = new MediaRouter_GetMirroringServiceHostForTab_Params(); params_.targetTabId = targetTabId; params_.receiver = receiver; var builder = new codec.MessageV0Builder( kMediaRouter_GetMirroringServiceHostForTab_Name, codec.align(MediaRouter_GetMirroringServiceHostForTab_Params.encodedSize)); builder.encodeStruct(MediaRouter_GetMirroringServiceHostForTab_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.getMirroringServiceHostForDesktop = function() { return MediaRouterProxy.prototype.getMirroringServiceHostForDesktop .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.getMirroringServiceHostForDesktop = function(initiatorTabId, desktopStreamId, receiver) { var params_ = new MediaRouter_GetMirroringServiceHostForDesktop_Params(); params_.initiatorTabId = initiatorTabId; params_.desktopStreamId = desktopStreamId; params_.receiver = receiver; var builder = new codec.MessageV0Builder( kMediaRouter_GetMirroringServiceHostForDesktop_Name, codec.align(MediaRouter_GetMirroringServiceHostForDesktop_Params.encodedSize)); builder.encodeStruct(MediaRouter_GetMirroringServiceHostForDesktop_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MediaRouterPtr.prototype.getMirroringServiceHostForOffscreenTab = function() { return MediaRouterProxy.prototype.getMirroringServiceHostForOffscreenTab .apply(this.ptr.getProxy(), arguments); }; MediaRouterProxy.prototype.getMirroringServiceHostForOffscreenTab = function(presentationUrl, presentationId, receiver) { var params_ = new MediaRouter_GetMirroringServiceHostForOffscreenTab_Params(); params_.presentationUrl = presentationUrl; params_.presentationId = presentationId; params_.receiver = receiver; var builder = new codec.MessageV0Builder( kMediaRouter_GetMirroringServiceHostForOffscreenTab_Name, codec.align(MediaRouter_GetMirroringServiceHostForOffscreenTab_Params.encodedSize)); builder.encodeStruct(MediaRouter_GetMirroringServiceHostForOffscreenTab_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function MediaRouterStub(delegate) { this.delegate_ = delegate; } MediaRouterStub.prototype.registerMediaRouteProvider = function(providerId, mediaRouterProvider) { return this.delegate_ && this.delegate_.registerMediaRouteProvider && this.delegate_.registerMediaRouteProvider(providerId, mediaRouterProvider); } MediaRouterStub.prototype.onSinksReceived = function(providerId, mediaSource, sinks, origins) { return this.delegate_ && this.delegate_.onSinksReceived && this.delegate_.onSinksReceived(providerId, mediaSource, sinks, origins); } MediaRouterStub.prototype.onIssue = function(issue) { return this.delegate_ && this.delegate_.onIssue && this.delegate_.onIssue(issue); } MediaRouterStub.prototype.onRoutesUpdated = function(providerId, routes, mediaSource, joinableRouteIds) { return this.delegate_ && this.delegate_.onRoutesUpdated && this.delegate_.onRoutesUpdated(providerId, routes, mediaSource, joinableRouteIds); } MediaRouterStub.prototype.onSinkAvailabilityUpdated = function(providerId, availability) { return this.delegate_ && this.delegate_.onSinkAvailabilityUpdated && this.delegate_.onSinkAvailabilityUpdated(providerId, availability); } MediaRouterStub.prototype.onPresentationConnectionStateChanged = function(routeId, state) { return this.delegate_ && this.delegate_.onPresentationConnectionStateChanged && this.delegate_.onPresentationConnectionStateChanged(routeId, state); } MediaRouterStub.prototype.onPresentationConnectionClosed = function(routeId, reason, message) { return this.delegate_ && this.delegate_.onPresentationConnectionClosed && this.delegate_.onPresentationConnectionClosed(routeId, reason, message); } MediaRouterStub.prototype.onRouteMessagesReceived = function(routeId, messages) { return this.delegate_ && this.delegate_.onRouteMessagesReceived && this.delegate_.onRouteMessagesReceived(routeId, messages); } MediaRouterStub.prototype.onMediaRemoterCreated = function(tabId, remoter, remotingSource) { return this.delegate_ && this.delegate_.onMediaRemoterCreated && this.delegate_.onMediaRemoterCreated(tabId, remoter, remotingSource); } MediaRouterStub.prototype.getMediaSinkServiceStatus = function() { return this.delegate_ && this.delegate_.getMediaSinkServiceStatus && this.delegate_.getMediaSinkServiceStatus(); } MediaRouterStub.prototype.getMirroringServiceHostForTab = function(targetTabId, receiver) { return this.delegate_ && this.delegate_.getMirroringServiceHostForTab && this.delegate_.getMirroringServiceHostForTab(targetTabId, receiver); } MediaRouterStub.prototype.getMirroringServiceHostForDesktop = function(initiatorTabId, desktopStreamId, receiver) { return this.delegate_ && this.delegate_.getMirroringServiceHostForDesktop && this.delegate_.getMirroringServiceHostForDesktop(initiatorTabId, desktopStreamId, receiver); } MediaRouterStub.prototype.getMirroringServiceHostForOffscreenTab = function(presentationUrl, presentationId, receiver) { return this.delegate_ && this.delegate_.getMirroringServiceHostForOffscreenTab && this.delegate_.getMirroringServiceHostForOffscreenTab(presentationUrl, presentationId, receiver); } MediaRouterStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouter_OnSinksReceived_Name: var params = reader.decodeStruct(MediaRouter_OnSinksReceived_Params); this.onSinksReceived(params.providerId, params.mediaSource, params.sinks, params.origins); return true; case kMediaRouter_OnIssue_Name: var params = reader.decodeStruct(MediaRouter_OnIssue_Params); this.onIssue(params.issue); return true; case kMediaRouter_OnRoutesUpdated_Name: var params = reader.decodeStruct(MediaRouter_OnRoutesUpdated_Params); this.onRoutesUpdated(params.providerId, params.routes, params.mediaSource, params.joinableRouteIds); return true; case kMediaRouter_OnSinkAvailabilityUpdated_Name: var params = reader.decodeStruct(MediaRouter_OnSinkAvailabilityUpdated_Params); this.onSinkAvailabilityUpdated(params.providerId, params.availability); return true; case kMediaRouter_OnPresentationConnectionStateChanged_Name: var params = reader.decodeStruct(MediaRouter_OnPresentationConnectionStateChanged_Params); this.onPresentationConnectionStateChanged(params.routeId, params.state); return true; case kMediaRouter_OnPresentationConnectionClosed_Name: var params = reader.decodeStruct(MediaRouter_OnPresentationConnectionClosed_Params); this.onPresentationConnectionClosed(params.routeId, params.reason, params.message); return true; case kMediaRouter_OnRouteMessagesReceived_Name: var params = reader.decodeStruct(MediaRouter_OnRouteMessagesReceived_Params); this.onRouteMessagesReceived(params.routeId, params.messages); return true; case kMediaRouter_OnMediaRemoterCreated_Name: var params = reader.decodeStruct(MediaRouter_OnMediaRemoterCreated_Params); this.onMediaRemoterCreated(params.tabId, params.remoter, params.remotingSource); return true; case kMediaRouter_GetMirroringServiceHostForTab_Name: var params = reader.decodeStruct(MediaRouter_GetMirroringServiceHostForTab_Params); this.getMirroringServiceHostForTab(params.targetTabId, params.receiver); return true; case kMediaRouter_GetMirroringServiceHostForDesktop_Name: var params = reader.decodeStruct(MediaRouter_GetMirroringServiceHostForDesktop_Params); this.getMirroringServiceHostForDesktop(params.initiatorTabId, params.desktopStreamId, params.receiver); return true; case kMediaRouter_GetMirroringServiceHostForOffscreenTab_Name: var params = reader.decodeStruct(MediaRouter_GetMirroringServiceHostForOffscreenTab_Params); this.getMirroringServiceHostForOffscreenTab(params.presentationUrl, params.presentationId, params.receiver); return true; default: return false; } }; MediaRouterStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaRouter_RegisterMediaRouteProvider_Name: var params = reader.decodeStruct(MediaRouter_RegisterMediaRouteProvider_Params); this.registerMediaRouteProvider(params.providerId, params.mediaRouterProvider).then(function(response) { var responseParams = new MediaRouter_RegisterMediaRouteProvider_ResponseParams(); responseParams.instanceId = response.instanceId; responseParams.config = response.config; var builder = new codec.MessageV1Builder( kMediaRouter_RegisterMediaRouteProvider_Name, codec.align(MediaRouter_RegisterMediaRouteProvider_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouter_RegisterMediaRouteProvider_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMediaRouter_GetMediaSinkServiceStatus_Name: var params = reader.decodeStruct(MediaRouter_GetMediaSinkServiceStatus_Params); this.getMediaSinkServiceStatus().then(function(response) { var responseParams = new MediaRouter_GetMediaSinkServiceStatus_ResponseParams(); responseParams.status = response.status; var builder = new codec.MessageV1Builder( kMediaRouter_GetMediaSinkServiceStatus_Name, codec.align(MediaRouter_GetMediaSinkServiceStatus_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MediaRouter_GetMediaSinkServiceStatus_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; default: return false; } }; function validateMediaRouterRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouter_RegisterMediaRouteProvider_Name: if (message.expectsResponse()) paramsClass = MediaRouter_RegisterMediaRouteProvider_Params; break; case kMediaRouter_OnSinksReceived_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnSinksReceived_Params; break; case kMediaRouter_OnIssue_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnIssue_Params; break; case kMediaRouter_OnRoutesUpdated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnRoutesUpdated_Params; break; case kMediaRouter_OnSinkAvailabilityUpdated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnSinkAvailabilityUpdated_Params; break; case kMediaRouter_OnPresentationConnectionStateChanged_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnPresentationConnectionStateChanged_Params; break; case kMediaRouter_OnPresentationConnectionClosed_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnPresentationConnectionClosed_Params; break; case kMediaRouter_OnRouteMessagesReceived_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnRouteMessagesReceived_Params; break; case kMediaRouter_OnMediaRemoterCreated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_OnMediaRemoterCreated_Params; break; case kMediaRouter_GetMediaSinkServiceStatus_Name: if (message.expectsResponse()) paramsClass = MediaRouter_GetMediaSinkServiceStatus_Params; break; case kMediaRouter_GetMirroringServiceHostForTab_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_GetMirroringServiceHostForTab_Params; break; case kMediaRouter_GetMirroringServiceHostForDesktop_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_GetMirroringServiceHostForDesktop_Params; break; case kMediaRouter_GetMirroringServiceHostForOffscreenTab_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaRouter_GetMirroringServiceHostForOffscreenTab_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaRouterResponse(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaRouter_RegisterMediaRouteProvider_Name: if (message.isResponse()) paramsClass = MediaRouter_RegisterMediaRouteProvider_ResponseParams; break; case kMediaRouter_GetMediaSinkServiceStatus_Name: if (message.isResponse()) paramsClass = MediaRouter_GetMediaSinkServiceStatus_ResponseParams; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } var MediaRouter = { name: 'media_router.mojom.MediaRouter', kVersion: 0, ptrClass: MediaRouterPtr, proxyClass: MediaRouterProxy, stubClass: MediaRouterStub, validateRequest: validateMediaRouterRequest, validateResponse: validateMediaRouterResponse, }; MediaRouter.SinkAvailability = {}; MediaRouter.SinkAvailability.UNAVAILABLE = 0; MediaRouter.SinkAvailability.PER_SOURCE = MediaRouter.SinkAvailability.UNAVAILABLE + 1; MediaRouter.SinkAvailability.AVAILABLE = MediaRouter.SinkAvailability.PER_SOURCE + 1; MediaRouter.SinkAvailability.MIN_VALUE = 0, MediaRouter.SinkAvailability.MAX_VALUE = 2, MediaRouter.SinkAvailability.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; MediaRouter.SinkAvailability.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouter.PresentationConnectionState = {}; MediaRouter.PresentationConnectionState.CONNECTING = 0; MediaRouter.PresentationConnectionState.CONNECTED = MediaRouter.PresentationConnectionState.CONNECTING + 1; MediaRouter.PresentationConnectionState.CLOSED = MediaRouter.PresentationConnectionState.CONNECTED + 1; MediaRouter.PresentationConnectionState.TERMINATED = MediaRouter.PresentationConnectionState.CLOSED + 1; MediaRouter.PresentationConnectionState.MIN_VALUE = 0, MediaRouter.PresentationConnectionState.MAX_VALUE = 3, MediaRouter.PresentationConnectionState.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: return true; } return false; }; MediaRouter.PresentationConnectionState.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouter.PresentationConnectionCloseReason = {}; MediaRouter.PresentationConnectionCloseReason.CONNECTION_ERROR = 0; MediaRouter.PresentationConnectionCloseReason.CLOSED = MediaRouter.PresentationConnectionCloseReason.CONNECTION_ERROR + 1; MediaRouter.PresentationConnectionCloseReason.WENT_AWAY = MediaRouter.PresentationConnectionCloseReason.CLOSED + 1; MediaRouter.PresentationConnectionCloseReason.MIN_VALUE = 0, MediaRouter.PresentationConnectionCloseReason.MAX_VALUE = 2, MediaRouter.PresentationConnectionCloseReason.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; MediaRouter.PresentationConnectionCloseReason.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaRouterStub.prototype.validator = validateMediaRouterRequest; MediaRouterProxy.prototype.validator = validateMediaRouterResponse; exports.SinkIconType = SinkIconType; exports.RouteControllerType = RouteControllerType; exports.RouteRequestResultCode = RouteRequestResultCode; exports.MediaSink = MediaSink; exports.DialMediaSink = DialMediaSink; exports.CastMediaSink = CastMediaSink; exports.MediaRoute = MediaRoute; exports.Issue = Issue; exports.RouteMessage = RouteMessage; exports.SinkSearchCriteria = SinkSearchCriteria; exports.MediaRouteProviderConfig = MediaRouteProviderConfig; exports.RoutePresentationConnection = RoutePresentationConnection; exports.MediaSinkExtraData = MediaSinkExtraData; exports.MediaRouteProvider = MediaRouteProvider; exports.MediaRouteProviderPtr = MediaRouteProviderPtr; exports.MediaRouteProviderAssociatedPtr = MediaRouteProviderAssociatedPtr; exports.MediaRouter = MediaRouter; exports.MediaRouterPtr = MediaRouterPtr; exports.MediaRouterAssociatedPtr = MediaRouterAssociatedPtr; })();// Copyright 2015 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; if ((typeof mojo === 'undefined') || !mojo.bindingsLibraryInitialized) { loadScript('mojo_bindings'); } mojo.config.autoLoadMojomDeps = false; loadScript('chrome/common/media_router/mojom/media_controller.mojom'); loadScript('chrome/common/media_router/mojom/media_router.mojom'); loadScript('chrome/common/media_router/mojom/media_status.mojom'); loadScript('components/mirroring/mojom/cast_message_channel.mojom'); loadScript('components/mirroring/mojom/mirroring_service_host.mojom'); loadScript('components/mirroring/mojom/session_observer.mojom'); loadScript('components/mirroring/mojom/session_parameters.mojom'); loadScript('extensions/common/mojom/keep_alive.mojom'); loadScript('media/mojo/mojom/mirror_service_remoting.mojom'); loadScript('media/mojo/mojom/remoting_common.mojom'); loadScript('mojo/public/mojom/base/time.mojom'); loadScript('mojo/public/mojom/base/unguessable_token.mojom'); loadScript('net/interfaces/ip_address.mojom'); loadScript('net/interfaces/ip_endpoint.mojom'); loadScript('url/mojom/origin.mojom'); loadScript('url/mojom/url.mojom'); // The following adapter classes preserve backward compatibility for the media // router component extension. // TODO(crbug.com/787128): Remove these adapters. function assignFields(object, fields) { for(var field in fields) { if (object.hasOwnProperty(field)) object[field] = fields[field]; } } /** * Adapter for mediaRouter.mojom.DialMediaSink. * @constructor */ function DialMediaSinkAdapter(fields) { this.ip_address = null; this.model_name = null; this.app_url = null; assignFields(this, fields); } DialMediaSinkAdapter.fromNewVersion = function(other) { return new DialMediaSinkAdapter({ 'ip_address': IPAddressAdapter.fromNewVersion(other.ipAddress), 'model_name': other.modelName, 'app_url': other.appUrl, }); }; DialMediaSinkAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.DialMediaSink({ 'ipAddress' : this.ip_address.toNewVersion(), 'modelName' : this.model_name, 'appUrl' : this.app_url, }); }; /** * Adapter for mediaRouter.mojom.CastMediaSink. * @constructor */ function CastMediaSinkAdapter(fields) { this.ip_endpoint = null; this.model_name = null; this.capabilities = 0; this.cast_channel_id = 0; assignFields(this, fields); } CastMediaSinkAdapter.fromNewVersion = function(other) { return new CastMediaSinkAdapter({ 'ip_endpoint': IPEndpointAdapter.fromNewVersion(other.ipEndpoint), 'model_name': other.modelName, 'capabilities': other.capabilities, 'cast_channel_id': other.castChannelId, }); }; CastMediaSinkAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.CastMediaSink({ 'ipEndpoint': this.ip_endpoint.toNewVersion(), 'modelName': this.model_name, 'capabilities': this.capabilities, 'castChannelId': this.cast_channel_id, }); }; /** * Adapter for net.interfaces.IPAddress. * @constructor */ function IPAddressAdapter(fields) { this.address_bytes = null; assignFields(this, fields); } IPAddressAdapter.fromNewVersion = function(other) { return new IPAddressAdapter({ 'address_bytes': other.addressBytes, }); }; IPAddressAdapter.prototype.toNewVersion = function() { return new net.interfaces.IPAddress({ 'addressBytes': this.address_bytes, }); }; /** * Adapter for net.interfaces.IPEndpoint. * @constructor */ function IPEndpointAdapter(fields) { this.address = null; this.port = 0; assignFields(this, fields); } IPEndpointAdapter.fromNewVersion = function(other) { return new IPEndpointAdapter({ 'address': IPAddressAdapter.fromNewVersion(other.address), 'port': other.port, }); }; IPEndpointAdapter.prototype.toNewVersion = function() { return new net.interfaces.IPEndpoint({ 'address': this.address.toNewVersion(), 'port': this.port, }); }; /** * Adapter for mediaRouter.mojom.MediaStatus. * @constructor */ function MediaStatusAdapter(fields) { this.title = null; this.can_play_pause = false; this.can_mute = false; this.can_set_volume = false; this.can_seek = false; this.can_skip_to_next_track = false; this.can_skip_to_previous_track = false; this.is_muted = false; this.play_state = 0; this.volume = 0; this.duration = null; this.current_time = null; this.images = null; assignFields(this, fields); } MediaStatusAdapter.PlayState = mediaRouter.mojom.MediaStatus.PlayState; MediaStatusAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.MediaStatus({ 'title': this.title, 'canPlayPause': this.can_play_pause, 'canMute': this.can_mute, 'canSetVolume': this.can_set_volume, 'canSeek': this.can_seek, 'canSkipToNextTrack': this.can_skip_to_next_track, 'canSkipToPreviousTrack': this.can_skip_to_previous_track, 'isMuted': this.is_muted, 'playState': this.play_state, 'volume': this.volume, 'duration': this.duration, 'currentTime': this.current_time, 'images': this.images || [], }); }; /** * Adapter for media.mojom.RemotingSinkMetadata. * @constructor */ function RemotingSinkMetadataAdapter(fields) { this.features = null; this.audio_capabilities = null; this.video_capabilities = null; this.friendly_name = null; assignFields(this, fields); } RemotingSinkMetadataAdapter.fromNewVersion = function(other) { return new RemotingSinkMetadataAdapter({ 'features': other.features, 'audio_capabilities': other.audioCapabilities, 'video_capabilities': other.videoCapabilities, 'friendly_name': other.friendlyName, }); }; RemotingSinkMetadataAdapter.prototype.toNewVersion = function() { return new media.mojom.RemotingSinkMetadata({ 'features': this.features, 'audioCapabilities': this.audio_capabilities, 'videoCapabilities': this.video_capabilities, 'friendlyName': this.friendly_name, }); }; /** * Adapter for mediaRouter.mojom.MediaSink. * @constructor */ function MediaSinkAdapter(fields) { this.sink_id = null; this.name = null; this.description = null; this.domain = null; this.icon_type = 0; this.extra_data = null; assignFields(this, fields); } MediaSinkAdapter.fromNewVersion = function(other) { return new MediaSinkAdapter({ 'sink_id': other.sinkId, 'name': other.name, 'description': other.description, 'domain': other.domain, 'icon_type': other.iconType, 'extra_data': other.extraData && MediaSinkExtraDataAdapter.fromNewVersion(other.extraData), }); }; MediaSinkAdapter.prototype.toNewVersion = function() { return new mediaRouter.mojom.MediaSink({ 'sinkId': this.sink_id, 'name': this.name, 'description': this.description, 'domain': this.domain, 'iconType': this.icon_type, 'extraData': this.extra_data && this.extra_data.toNewVersion(), }); }; /** * Adapter for mediaRouter.mojom.MediaSinkExtraData. * @constructor */ function MediaSinkExtraDataAdapter(value) { this.$data = null; this.$tag = undefined; if (value == undefined) { return; } var keys = Object.keys(value); if (keys.length == 0) { return; } if (keys.length > 1) { throw new TypeError('You may set only one member on a union.'); } var fields = [ 'dial_media_sink', 'cast_media_sink', ]; if (fields.indexOf(keys[0]) < 0) { throw new ReferenceError(keys[0] + ' is not a MediaSinkExtraDataAdapter member.'); } this[keys[0]] = value[keys[0]]; } MediaSinkExtraDataAdapter.Tags = { dial_media_sink: 0, cast_media_sink: 1, }; Object.defineProperty(MediaSinkExtraDataAdapter.prototype, 'dial_media_sink', { get: function() { if (this.$tag != MediaSinkExtraDataAdapter.Tags.dial_media_sink) { throw new ReferenceError( 'MediaSinkExtraDataAdapter.dial_media_sink is not currently set.'); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraDataAdapter.Tags.dial_media_sink; this.$data = value; } }); Object.defineProperty(MediaSinkExtraDataAdapter.prototype, 'cast_media_sink', { get: function() { if (this.$tag != MediaSinkExtraDataAdapter.Tags.cast_media_sink) { throw new ReferenceError( 'MediaSinkExtraDataAdapter.cast_media_sink is not currently set.'); } return this.$data; }, set: function(value) { this.$tag = MediaSinkExtraDataAdapter.Tags.cast_media_sink; this.$data = value; } }); MediaSinkExtraDataAdapter.fromNewVersion = function(other) { if (other.$tag == mediaRouter.mojom.MediaSinkExtraData.Tags.dialMediaSink) { return new MediaSinkExtraDataAdapter({ 'dial_media_sink': DialMediaSinkAdapter.fromNewVersion(other.dialMediaSink), }); } else { return new MediaSinkExtraDataAdapter({ 'cast_media_sink': CastMediaSinkAdapter.fromNewVersion(other.castMediaSink), }); } }; MediaSinkExtraDataAdapter.prototype.toNewVersion = function() { if (this.$tag == MediaSinkExtraDataAdapter.Tags.dial_media_sink) { return new mediaRouter.mojom.MediaSinkExtraData({ 'dialMediaSink': this.dial_media_sink.toNewVersion(), }); } else { return new mediaRouter.mojom.MediaSinkExtraData({ 'castMediaSink': this.cast_media_sink.toNewVersion(), }); } }; /** * Adapter for media.mojom.MirrorServiceRemoterPtr. * @constructor */ function MirrorServiceRemoterPtrAdapter(handleOrPtrInfo) { this.ptr = new mojo.InterfacePtrController(MirrorServiceRemoterAdapter, handleOrPtrInfo); } MirrorServiceRemoterPtrAdapter.prototype = Object.create(media.mojom.MirrorServiceRemoterPtr.prototype); MirrorServiceRemoterPtrAdapter.prototype.constructor = MirrorServiceRemoterPtrAdapter; MirrorServiceRemoterPtrAdapter.prototype.startDataStreams = function() { return MirrorServiceRemoterProxy.prototype.startDataStreams .apply(this.ptr.getProxy(), arguments).then(function(response) { return Promise.resolve({ 'audio_stream_id': response.audioStreamId, 'video_stream_id': response.videoStreamId, }); }); }; /** * Adapter for media.mojom.MirrorServiceRemoter.stubclass. * @constructor */ function MirrorServiceRemoterStubAdapter(delegate) { this.delegate_ = delegate; } MirrorServiceRemoterStubAdapter.prototype = Object.create( media.mojom.MirrorServiceRemoter.stubClass.prototype); MirrorServiceRemoterStubAdapter.prototype.constructor = MirrorServiceRemoterStubAdapter; MirrorServiceRemoterStubAdapter.prototype.startDataStreams = function(hasAudio, hasVideo) { return this.delegate_ && this.delegate_.startDataStreams && this.delegate_.startDataStreams(hasAudio, hasVideo).then( function(response) { return { 'audioStreamId': response.audio_stream_id, 'videoStreamId': response.video_stream_id, }; }); }; /** * Adapter for media.mojom.MirrorServiceRemoter. */ var MirrorServiceRemoterAdapter = { name: 'media.mojom.MirrorServiceRemoter', kVersion: 0, ptrClass: MirrorServiceRemoterPtrAdapter, proxyClass: media.mojom.MirrorServiceRemoter.proxyClass, stubClass: MirrorServiceRemoterStubAdapter, validateRequest: media.mojom.MirrorServiceRemoter.validateRequest, validateResponse: media.mojom.MirrorServiceRemoter.validateResponse, }; /** * Adapter for media.mojom.MirrorServiceRemotingSourcePtr. * @constructor */ function MirrorServiceRemotingSourcePtrAdapter(handleOrPtrInfo) { this.ptr = new mojo.InterfacePtrController(MirrorServiceRemotingSourceAdapter, handleOrPtrInfo); } MirrorServiceRemotingSourcePtrAdapter.prototype = Object.create(media.mojom.MirrorServiceRemotingSourcePtr.prototype); MirrorServiceRemotingSourcePtrAdapter.prototype.constructor = MirrorServiceRemotingSourcePtrAdapter; MirrorServiceRemotingSourcePtrAdapter.prototype.onSinkAvailable = function(metadata) { return this.ptr.getProxy().onSinkAvailable(metadata.toNewVersion()); }; /** * Adapter for media.mojom.MirrorServiceRemotingSource. */ var MirrorServiceRemotingSourceAdapter = { name: 'media.mojom.MirrorServiceRemotingSource', kVersion: 0, ptrClass: MirrorServiceRemotingSourcePtrAdapter, proxyClass: media.mojom.MirrorServiceRemotingSource.proxyClass, stubClass: null, validateRequest: media.mojom.MirrorServiceRemotingSource.validateRequest, validateResponse: null, }; /** * Adapter for mediaRouter.mojom.MediaStatusObserver. * @constructor */ function MediaStatusObserverPtrAdapter(handleOrPtrInfo) { this.ptr = new mojo.InterfacePtrController(MediaStatusObserverAdapter, handleOrPtrInfo); } MediaStatusObserverPtrAdapter.prototype = Object.create(mediaRouter.mojom.MediaStatusObserverPtr.prototype); MediaStatusObserverPtrAdapter.prototype.constructor = MediaStatusObserverPtrAdapter; MediaStatusObserverPtrAdapter.prototype.onMediaStatusUpdated = function(status) { return this.ptr.getProxy().onMediaStatusUpdated(status.toNewVersion()); }; /** * Adapter for mediaRouter.mojom.MediaStatusObserver. */ var MediaStatusObserverAdapter = { name: 'mediaRouter.mojom.MediaStatusObserver', kVersion: 0, ptrClass: MediaStatusObserverPtrAdapter, proxyClass: mediaRouter.mojom.MediaStatusObserver.proxyClass, stubClass: null, validateRequest: mediaRouter.mojom.MediaStatusObserver.validateRequest, validateResponse: null, }; /** * Converts a media sink to a MediaSink Mojo object. * @param {!MediaSink} sink A media sink. * @return {!mediaRouter.mojom.MediaSink} A Mojo MediaSink object. */ function sinkToMojo_(sink) { return new mediaRouter.mojom.MediaSink({ 'name': sink.friendlyName, 'description': sink.description, 'domain': sink.domain, 'sinkId': sink.id, 'iconType': sinkIconTypeToMojo(sink.iconType), 'providerId': mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, }); } /** * Converts a media sink's icon type to a MediaSink.IconType Mojo object. * @param {!MediaSink.IconType} type A media sink's icon type. * @return {!mediaRouter.mojom.MediaSink.IconType} A Mojo MediaSink.IconType * object. */ function sinkIconTypeToMojo(type) { switch (type) { case 'cast': return mediaRouter.mojom.SinkIconType.CAST; case 'cast_audio_group': return mediaRouter.mojom.SinkIconType.CAST_AUDIO_GROUP; case 'cast_audio': return mediaRouter.mojom.SinkIconType.CAST_AUDIO; case 'meeting': return mediaRouter.mojom.SinkIconType.MEETING; case 'hangout': return mediaRouter.mojom.SinkIconType.HANGOUT; case 'education': return mediaRouter.mojom.SinkIconType.EDUCATION; case 'generic': return mediaRouter.mojom.SinkIconType.GENERIC; default: console.error('Unknown sink icon type : ' + type); return mediaRouter.mojom.SinkIconType.GENERIC; } } /** * Returns a Mojo MediaRoute object given a MediaRoute and a * media sink name. * @param {!MediaRoute} route * @return {!mediaRouter.mojom.MediaRoute} */ function routeToMojo_(route) { return new mediaRouter.mojom.MediaRoute({ 'mediaRouteId': route.id, 'mediaSource': route.mediaSource, 'mediaSinkId': route.sinkId, 'description': route.description, 'iconUrl': route.iconUrl, 'isLocal': route.isLocal, 'forDisplay': route.forDisplay, 'isIncognito': route.offTheRecord, 'isLocalPresentation': route.isOffscreenPresentation, 'controllerType': route.controllerType, // Begin newly added properties, followed by the milestone they were // added. The guard should be safe to remove N+2 milestones later. 'presentationId': route.presentationId || '' // M64 }); } /** * Converts a route message to a RouteMessage Mojo object. * @param {!RouteMessage} message * @return {!mediaRouter.mojom.RouteMessage} A Mojo RouteMessage object. */ function messageToMojo_(message) { if ("string" == typeof message.message) { return new mediaRouter.mojom.RouteMessage({ 'type': mediaRouter.mojom.RouteMessage.Type.TEXT, 'message': message.message, }); } else { return new mediaRouter.mojom.RouteMessage({ 'type': mediaRouter.mojom.RouteMessage.Type.BINARY, 'data': message.message, }); } } /** * Converts presentation connection state to Mojo enum value. * @param {!string} state * @return {!mediaRouter.mojom.MediaRouter.PresentationConnectionState} */ function presentationConnectionStateToMojo_(state) { var PresentationConnectionState = mediaRouter.mojom.MediaRouter.PresentationConnectionState; switch (state) { case 'connecting': return PresentationConnectionState.CONNECTING; case 'connected': return PresentationConnectionState.CONNECTED; case 'closed': return PresentationConnectionState.CLOSED; case 'terminated': return PresentationConnectionState.TERMINATED; default: console.error('Unknown presentation connection state: ' + state); return PresentationConnectionState.TERMINATED; } } /** * Converts presentation connection close reason to Mojo enum value. * @param {!string} reason * @return {!mediaRouter.mojom.MediaRouter.PresentationConnectionCloseReason} */ function presentationConnectionCloseReasonToMojo_(reason) { var PresentationConnectionCloseReason = mediaRouter.mojom.MediaRouter.PresentationConnectionCloseReason; switch (reason) { case 'error': return PresentationConnectionCloseReason.CONNECTION_ERROR; case 'closed': return PresentationConnectionCloseReason.CLOSED; case 'went_away': return PresentationConnectionCloseReason.WENT_AWAY; default: console.error('Unknown presentation connection close reason : ' + reason); return PresentationConnectionCloseReason.CONNECTION_ERROR; } } /** * Converts string to Mojo origin. * @param {string|!url.mojom.Origin} origin * @return {!url.mojom.Origin} */ function stringToMojoOrigin_(origin) { if (origin instanceof url.mojom.Origin) { return origin; } var originUrl = new URL(origin); var mojoOrigin = {}; mojoOrigin.scheme = originUrl.protocol.replace(':', ''); mojoOrigin.host = originUrl.hostname; var port = originUrl.port ? Number.parseInt(originUrl.port) : 0; switch (mojoOrigin.scheme) { case 'http': mojoOrigin.port = port || 80; break; case 'https': mojoOrigin.port = port || 443; break; default: throw new Error('Scheme must be http or https'); } mojoOrigin.suborigin = ''; return new url.mojom.Origin(mojoOrigin); } /** * Parses the given route request Error object and converts it to the * corresponding result code. * @param {!Error} error * @return {!mediaRouter.mojom.RouteRequestResultCode} */ function getRouteRequestResultCode_(error) { return error.errorCode ? error.errorCode : mediaRouter.mojom.RouteRequestResultCode.UNKNOWN_ERROR; } /** * Creates and returns a successful route response from given route. * @param {!MediaRoute} route * @return {!Object} */ function toSuccessRouteResponse_(route) { return { route: routeToMojo_(route), resultCode: mediaRouter.mojom.RouteRequestResultCode.OK }; } /** * Creates and returns a error route response from given Error object. * @param {!Error} error * @return {!Object} */ function toErrorRouteResponse_(error) { return { errorText: error.message, resultCode: getRouteRequestResultCode_(error) }; } /** * Creates a new MediaRouter. * Converts a route struct to its Mojo form. * @param {!mediaRouter.mojom.MediaRouterPtr} service * @constructor */ function MediaRouter(service) { /** * The Mojo service proxy. Allows extension code to call methods that reside * in the browser. * @type {!mediaRouter.mojom.MediaRouterPtr} */ this.service_ = service; /** * The provider manager service delegate. Its methods are called by the * browser-resident Mojo service. * @type {!MediaRouter} */ this.mrpm_ = new MediaRouteProvider(this); /** * Handle to a KeepAlive service object, which prevents the extension from * being suspended as long as it remains in scope. * @type {boolean} */ this.keepAlive_ = null; /** * The bindings to bind the service delegate to the Mojo interface. * Object must remain in scope for the lifetime of the connection to * prevent the connection from closing automatically. * @type {!mojo.Binding} */ this.mediaRouteProviderBinding_ = new mojo.Binding( mediaRouter.mojom.MediaRouteProvider, this.mrpm_); } /** * Returns definitions of Mojo core and generated Mojom classes that can be * used directly by the component. * @return {!Object} * TODO(imcheng): We should export these along with MediaRouter. This requires * us to modify the component to handle multiple exports. When that logic is * baked in for a couple of milestones, we should be able to remove this * method. * TODO(imcheng): We should stop exporting mojo bindings classes that the * Media Router extension doesn't directly use, such as * mojo.AssociatedInterfacePtrInfo, mojo.InterfacePtrController and * mojo.interfaceControl. */ MediaRouter.prototype.getMojoExports = function() { return { AssociatedInterfacePtrInfo: mojo.AssociatedInterfacePtrInfo, Binding: mojo.Binding, DialMediaSink: DialMediaSinkAdapter, CastMediaSink: CastMediaSinkAdapter, IPAddress: IPAddressAdapter, IPEndpoint: IPEndpointAdapter, InterfacePtrController: mojo.InterfacePtrController, InterfacePtrInfo: mojo.InterfacePtrInfo, InterfaceRequest: mojo.InterfaceRequest, MediaController: mediaRouter.mojom.MediaController, MediaStatus: MediaStatusAdapter, MediaStatusObserverPtr: mediaRouter.mojom.MediaStatusObserverPtr, MirroringCastMessage: mirroring.mojom.CastMessage, MirroringCastMessageChannel: mirroring.mojom.CastMessageChannel, MirroringCastMessageChannelPtr: mirroring.mojom.CastMessageChannelPtr, MirroringServiceHostPtr: mirroring.mojom.MirroringServiceHostPtr, MirroringSessionError: mirroring.mojom.SessionError, MirroringSessionObserver: mirroring.mojom.SessionObserver, MirroringSessionObserverPtr: mirroring.mojom.SessionObserverPtr, MirroringSessionParameters: mirroring.mojom.SessionParameters, MirroringSessionType: mirroring.mojom.SessionType, MirroringRemotingNamespace: mirroring.mojom.REMOTING_NAMESPACE, MirroringWebRtcNamespace: mirroring.mojom.WEB_RTC_NAMESPACE, MirrorServiceRemoter: MirrorServiceRemoterAdapter, MirrorServiceRemoterPtr: MirrorServiceRemoterPtrAdapter, MirrorServiceRemotingSourcePtr: MirrorServiceRemotingSourcePtrAdapter, RemotingStopReason: media.mojom.RemotingStopReason, RemotingStartFailReason: media.mojom.RemotingStartFailReason, RemotingSinkFeature: media.mojom.RemotingSinkFeature, RemotingSinkAudioCapability: media.mojom.RemotingSinkAudioCapability, RemotingSinkVideoCapability: media.mojom.RemotingSinkVideoCapability, RemotingSinkMetadata: RemotingSinkMetadataAdapter, RouteControllerType: mediaRouter.mojom.RouteControllerType, Origin: url.mojom.Origin, Sink: MediaSinkAdapter, SinkExtraData: MediaSinkExtraDataAdapter, TimeDelta: mojoBase.mojom.TimeDelta, Url: url.mojom.Url, interfaceControl: mojo.interfaceControl, makeRequest: mojo.makeRequest, }; }; /** * Registers the Media Router Provider Manager with the Media Router. * @return {!Promise} Instance ID and config for the Media Router. */ MediaRouter.prototype.start = function() { return this.service_.registerMediaRouteProvider( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, this.mediaRouteProviderBinding_.createInterfacePtrAndBind()).then( function(response) { return { 'instance_id': response.instanceId, 'config': { 'enable_dial_discovery': response.config.enableDialDiscovery, 'enable_cast_discovery': response.config.enableCastDiscovery, 'enable_dial_sink_query': response.config.enableDialSinkQuery, 'enable_cast_sink_query': response.config.enableCastSinkQuery, 'use_mirroring_service': response.config.useMirroringService, } }; }); } /** * Sets the service delegate methods. * @param {Object} handlers */ MediaRouter.prototype.setHandlers = function(handlers) { this.mrpm_.setHandlers(handlers); } /** * The keep alive status. * @return {boolean} */ MediaRouter.prototype.getKeepAlive = function() { return this.keepAlive_ != null; }; /** * Called by the provider manager when a sink list for a given source is * updated. * @param {!string} sourceUrn * @param {!Array} sinks * @param {!Array} origins */ MediaRouter.prototype.onSinksReceived = function(sourceUrn, sinks, origins) { // |origins| is a string array if the Media Router component extension version // is 59 or older. Without the stringToMojoOrigin_() conversion, clients using // those extension versions would see a crash shown in // https://crbug.com/787427. this.service_.onSinksReceived( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, sourceUrn, sinks.map(sinkToMojo_), origins.map(stringToMojoOrigin_)); }; /** * Called by the provider manager when a sink is found to notify the MR of the * sink's ID. The actual sink will be returned through the normal sink list * update process, so this helps the MR identify the search result in the * list. * @param {string} pseudoSinkId ID of the pseudo sink that started the * search. * @param {string} sinkId ID of the newly-found sink. */ MediaRouter.prototype.onSearchSinkIdReceived = function( pseudoSinkId, sinkId) { this.service_.onSearchSinkIdReceived(pseudoSinkId, sinkId); }; /** * Called by the provider manager to keep the extension from suspending * if it enters a state where suspension is undesirable (e.g. there is an * active MediaRoute.) * If keepAlive is true, the extension is kept alive. * If keepAlive is false, the extension is allowed to suspend. * @param {boolean} keepAlive */ MediaRouter.prototype.setKeepAlive = function(keepAlive) { if (keepAlive === false && this.keepAlive_) { this.keepAlive_.ptr.reset(); this.keepAlive_ = null; } else if (keepAlive === true && !this.keepAlive_) { this.keepAlive_ = new extensions.KeepAlivePtr; Mojo.bindInterface( extensions.KeepAlive.name, mojo.makeRequest(this.keepAlive_).handle, 'context', true); } }; /** * Called by the provider manager to send an issue from a media route * provider to the Media Router, to show the user. * @param {!Object} issue The issue object. */ MediaRouter.prototype.onIssue = function(issue) { function issueSeverityToMojo_(severity) { switch (severity) { case 'fatal': return mediaRouter.mojom.Issue.Severity.FATAL; case 'warning': return mediaRouter.mojom.Issue.Severity.WARNING; case 'notification': return mediaRouter.mojom.Issue.Severity.NOTIFICATION; default: console.error('Unknown issue severity: ' + severity); return mediaRouter.mojom.Issue.Severity.NOTIFICATION; } } function issueActionToMojo_(action) { switch (action) { case 'dismiss': return mediaRouter.mojom.Issue.ActionType.DISMISS; case 'learn_more': return mediaRouter.mojom.Issue.ActionType.LEARN_MORE; default: console.error('Unknown issue action type : ' + action); return mediaRouter.mojom.Issue.ActionType.OK; } } var secondaryActions = (issue.secondaryActions || []).map(issueActionToMojo_); this.service_.onIssue(new mediaRouter.mojom.Issue({ 'routeId': issue.routeId || '', 'severity': issueSeverityToMojo_(issue.severity), 'title': issue.title, 'message': issue.message || '', 'defaultAction': issueActionToMojo_(issue.defaultAction), 'secondaryActions': secondaryActions, 'helpPageId': issue.helpPageId, 'isBlocking': issue.isBlocking, 'sinkId': issue.sinkId || '' })); }; /** * Called by the provider manager when the set of active routes * has been updated. * @param {!Array} routes The active set of media routes. * @param {string=} sourceUrn The sourceUrn associated with this route * query. * @param {Array=} joinableRouteIds The active set of joinable * media routes. */ MediaRouter.prototype.onRoutesUpdated = function( routes, sourceUrn = '', joinableRouteIds = []) { this.service_.onRoutesUpdated( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, routes.map(routeToMojo_), sourceUrn, joinableRouteIds); }; /** * Called by the provider manager when sink availability has been updated. * @param {!mediaRouter.mojom.MediaRouter.SinkAvailability} availability * The new sink availability. */ MediaRouter.prototype.onSinkAvailabilityUpdated = function(availability) { this.service_.onSinkAvailabilityUpdated( mediaRouter.mojom.MediaRouteProvider.Id.EXTENSION, availability); }; /** * Called by the provider manager when the state of a presentation connected * to a route has changed. * @param {string} routeId * @param {string} state */ MediaRouter.prototype.onPresentationConnectionStateChanged = function(routeId, state) { this.service_.onPresentationConnectionStateChanged( routeId, presentationConnectionStateToMojo_(state)); }; /** * Called by the provider manager when the state of a presentation connected * to a route has closed. * @param {string} routeId * @param {string} reason * @param {string} message */ MediaRouter.prototype.onPresentationConnectionClosed = function(routeId, reason, message) { this.service_.onPresentationConnectionClosed( routeId, presentationConnectionCloseReasonToMojo_(reason), message); }; /** * @param {string} routeId * @param {!Array} mesages */ MediaRouter.prototype.onRouteMessagesReceived = function(routeId, messages) { this.service_.onRouteMessagesReceived( routeId, messages.map(messageToMojo_)); }; /** * @param {number} tabId * @param {!media.mojom.MirrorServiceRemoterPtr} remoter * @param {!mojo.InterfaceRequest} remotingSource */ MediaRouter.prototype.onMediaRemoterCreated = function(tabId, remoter, remotingSource) { this.service_.onMediaRemoterCreated( tabId, new media.mojom.MirrorServiceRemoterPtr(remoter.ptr.passInterface()), remotingSource); } /** * Returns current status of media sink service in JSON format. * @return {!Promise} */ MediaRouter.prototype.getMediaSinkServiceStatus = function() { return this.service_.getMediaSinkServiceStatus(); } /** * @param {int32} target_tab_id * @param {!mojo.InterfaceRequest} request */ MediaRouter.prototype.getMirroringServiceHostForTab = function( target_tab_id, request) { this.service_.getMirroringServiceHostForTab(target_tab_id, request); } /** * @param {int32} initiator_tab_id * @param {!string} desktop_stream_id * @param {!mojo.InterfaceRequest} request */ MediaRouter.prototype.getMirroringServiceHostForDesktop = function( initiator_tab_id, desktop_stream_id, request) { this.service_.getMirroringServiceHostForDesktop(initiator_tab_id, desktop_stream_id, request); } /** * @param {!url.mojom.Url} presentation_url * @param {!string} presentation_id * @param {!mojo.InterfaceRequest} request */ MediaRouter.prototype.getMirroringServiceHostForOffscreenTab = function( presentation_url, presentation_id, request) { this.service_.getMirroringServiceHostForOffscreenTab(presentation_url, presentation_id, request); } /** * Object containing callbacks set by the provider manager. * * @constructor * @struct */ function MediaRouterHandlers() { /** * @type {function(!string, !string, !string, !string, !number)} */ this.createRoute = null; /** * @type {function(!string, !string, !string, !number)} */ this.joinRoute = null; /** * @type {function(string): Promise} */ this.terminateRoute = null; /** * @type {function(string)} */ this.startObservingMediaSinks = null; /** * @type {function(string)} */ this.stopObservingMediaSinks = null; /** * @type {function(string, string): Promise} */ this.sendRouteMessage = null; /** * @type {function(string, Uint8Array): Promise} */ this.sendRouteBinaryMessage = null; /** * @type {function(string)} */ this.startListeningForRouteMessages = null; /** * @type {function(string)} */ this.stopListeningForRouteMessages = null; /** * @type {function(string)} */ this.detachRoute = null; /** * @type {function()} */ this.startObservingMediaRoutes = null; /** * @type {function()} */ this.stopObservingMediaRoutes = null; /** * @type {function()} */ this.connectRouteByRouteId = null; /** * @type {function()} */ this.enableMdnsDiscovery = null; /** * @type {function()} */ this.updateMediaSinks = null; /** * @type {function(string, string, !SinkSearchCriteria): string} */ this.searchSinks = null; /** * @type {function()} */ this.provideSinks = null; /** * @type {function(string, !mojo.InterfaceRequest, * !mediaRouter.mojom.MediaStatusObserverPtr): !Promise} */ this.createMediaRouteController = null; }; /** * Routes calls from Media Router to the provider manager extension. * Registered with the MediaRouter stub. * @param {!MediaRouter} MediaRouter proxy to call into the * Media Router mojo interface. * @constructor */ function MediaRouteProvider(mediaRouter) { /** * Object containing JS callbacks into Provider Manager code. * @type {!MediaRouterHandlers} */ this.handlers_ = new MediaRouterHandlers(); /** * Proxy class to the browser's Media Router Mojo service. * @type {!MediaRouter} */ this.mediaRouter_ = mediaRouter; } /* * Sets the callback handler used to invoke methods in the provider manager. * * @param {!MediaRouterHandlers} handlers */ MediaRouteProvider.prototype.setHandlers = function(handlers) { this.handlers_ = handlers; var requiredHandlers = [ 'stopObservingMediaRoutes', 'startObservingMediaRoutes', 'sendRouteMessage', 'sendRouteBinaryMessage', 'startListeningForRouteMessages', 'stopListeningForRouteMessages', 'detachRoute', 'terminateRoute', 'joinRoute', 'createRoute', 'stopObservingMediaSinks', 'startObservingMediaRoutes', 'connectRouteByRouteId', 'enableMdnsDiscovery', 'updateMediaSinks', 'searchSinks', 'provideSinks', 'createMediaRouteController', 'onBeforeInvokeHandler' ]; requiredHandlers.forEach(function(nextHandler) { if (handlers[nextHandler] === undefined) { console.error(nextHandler + ' handler not registered.'); } }); } /** * Starts querying for sinks capable of displaying the media source * designated by |sourceUrn|. Results are returned by calling * OnSinksReceived. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.startObservingMediaSinks = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.startObservingMediaSinks(sourceUrn); }; /** * Stops querying for sinks capable of displaying |sourceUrn|. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.stopObservingMediaSinks = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.stopObservingMediaSinks(sourceUrn); }; /** * Requests that |sinkId| render the media referenced by |sourceUrn|. If the * request is from the Presentation API, then origin and tabId will * be populated. * @param {!string} sourceUrn Media source to render. * @param {!string} sinkId Media sink ID. * @param {!string} presentationId Presentation ID from the site * requesting presentation. TODO(mfoltz): Remove. * @param {!url.mojom.Origin} origin Origin of site requesting presentation. * @param {!number} tabId ID of tab requesting presentation. * @param {!mojo_base.mojom.TimeDelta} timeout If positive, the timeout * duration for the request. Otherwise, the default duration will be used. * @param {!boolean} incognito If true, the route is being requested by * an incognito profile. * @return {!Promise.} A Promise resolving to an object describing * the newly created media route, or rejecting with an error message on * failure. */ MediaRouteProvider.prototype.createRoute = function(sourceUrn, sinkId, presentationId, origin, tabId, timeout, incognito) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.createRoute( sourceUrn, sinkId, presentationId, origin, tabId, Math.floor(timeout.microseconds / 1000), incognito) .then(function(route) { return toSuccessRouteResponse_(route); }, function(err) { return toErrorRouteResponse_(err); }); }; /** * Handles a request via the Presentation API to join an existing route given * by |sourceUrn| and |presentationId|. |origin| and |tabId| are used for * validating same-origin/tab scope. * @param {!string} sourceUrn Media source to render. * @param {!string} presentationId Presentation ID to join. * @param {!url.mojom.Origin} origin Origin of site requesting join. * @param {!number} tabId ID of tab requesting join. * @param {!mojo_base.mojom.TimeDelta} timeout If positive, the timeout * duration for the request. Otherwise, the default duration will be used. * @param {!boolean} incognito If true, the route is being requested by * an incognito profile. * @return {!Promise.} A Promise resolving to an object describing * the newly created media route, or rejecting with an error message on * failure. */ MediaRouteProvider.prototype.joinRoute = function(sourceUrn, presentationId, origin, tabId, timeout, incognito) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.joinRoute( sourceUrn, presentationId, origin, tabId, Math.floor(timeout.microseconds / 1000), incognito) .then(function(route) { return toSuccessRouteResponse_(route); }, function(err) { return toErrorRouteResponse_(err); }); }; /** * Handles a request via the Presentation API to join an existing route given * by |sourceUrn| and |routeId|. |origin| and |tabId| are used for * validating same-origin/tab scope. * @param {!string} sourceUrn Media source to render. * @param {!string} routeId Route ID to join. * @param {!string} presentationId Presentation ID to join. * @param {!url.mojom.Origin} origin Origin of site requesting join. * @param {!number} tabId ID of tab requesting join. * @param {!mojo_base.mojom.TimeDelta} timeout If positive, the timeout * duration for the request. Otherwise, the default duration will be used. * @param {!boolean} incognito If true, the route is being requested by * an incognito profile. * @return {!Promise.} A Promise resolving to an object describing * the newly created media route, or rejecting with an error message on * failure. */ MediaRouteProvider.prototype.connectRouteByRouteId = function(sourceUrn, routeId, presentationId, origin, tabId, timeout, incognito) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.connectRouteByRouteId( sourceUrn, routeId, presentationId, origin, tabId, Math.floor(timeout.microseconds / 1000), incognito) .then(function(route) { return toSuccessRouteResponse_(route); }, function(err) { return toErrorRouteResponse_(err); }); }; /** * Terminates the route specified by |routeId|. * @param {!string} routeId * @return {!Promise} A Promise resolving to an object describing * the result of the terminate operation, or rejecting with an error * message and code if the operation failed. */ MediaRouteProvider.prototype.terminateRoute = function(routeId) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.terminateRoute(routeId).then( () => ({resultCode: mediaRouter.mojom.RouteRequestResultCode.OK}), (err) => toErrorRouteResponse_(err)); }; /** * Posts a message to the route designated by |routeId|. * @param {!string} routeId * @param {!string} message */ MediaRouteProvider.prototype.sendRouteMessage = function( routeId, message) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.sendRouteMessage(routeId, message); }; /** * Sends a binary message to the route designated by |routeId|. * @param {!string} routeId * @param {!Array} data */ MediaRouteProvider.prototype.sendRouteBinaryMessage = function( routeId, data) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.sendRouteBinaryMessage(routeId, new Uint8Array(data)); }; /** * Listen for messages from a route. * @param {!string} routeId */ MediaRouteProvider.prototype.startListeningForRouteMessages = function( routeId) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.startListeningForRouteMessages(routeId); }; /** * @param {!string} routeId */ MediaRouteProvider.prototype.stopListeningForRouteMessages = function( routeId) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.stopListeningForRouteMessages(routeId); }; /** * Indicates that the presentation connection that was connected to |routeId| * is no longer connected to it. * @param {!string} routeId */ MediaRouteProvider.prototype.detachRoute = function( routeId) { this.handlers_.detachRoute(routeId); }; /** * Requests that the provider manager start sending information about active * media routes to the Media Router. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.startObservingMediaRoutes = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.startObservingMediaRoutes(sourceUrn); }; /** * Requests that the provider manager stop sending information about active * media routes to the Media Router. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.stopObservingMediaRoutes = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.stopObservingMediaRoutes(sourceUrn); }; /** * Enables mDNS device discovery. */ MediaRouteProvider.prototype.enableMdnsDiscovery = function() { this.handlers_.onBeforeInvokeHandler(); this.handlers_.enableMdnsDiscovery(); }; /** * Requests that the provider manager update media sinks. * @param {!string} sourceUrn */ MediaRouteProvider.prototype.updateMediaSinks = function(sourceUrn) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.updateMediaSinks(sourceUrn); }; /** * Requests that the provider manager search its providers for a sink matching * |searchCriteria| that is compatible with |sourceUrn|. If a sink is found * that can be used immediately for route creation, its ID is returned. * Otherwise the empty string is returned. * * @param {string} sinkId Sink ID of the pseudo sink generating the request. * @param {string} sourceUrn Media source to be used with the sink. * @param {!SinkSearchCriteria} searchCriteria Search criteria for the route * providers. * @return {!Promise.} A Promise resolving to either the * sink ID of the sink found by the search that can be used for route * creation, or the empty string if no route can be immediately created. */ MediaRouteProvider.prototype.searchSinks = function( sinkId, sourceUrn, searchCriteria) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.searchSinks(sinkId, sourceUrn, searchCriteria).then( sinkId => { return { 'sinkId': sinkId }; }, () => { return { 'sinkId': '' }; }); }; /** * Notifies the provider manager that MediaRouter has discovered a list of * sinks. * @param {string} providerName * @param {!Array} sinks */ MediaRouteProvider.prototype.provideSinks = function(providerName, sinks) { this.handlers_.onBeforeInvokeHandler(); this.handlers_.provideSinks(providerName, sinks.map(MediaSinkAdapter.fromNewVersion)); }; /** * Creates a controller for the given route and binds the given * InterfaceRequest to it, and registers an observer for media status updates * for the route. * @param {string} routeId * @param {!mojo.InterfaceRequest} controllerRequest * @param {!mediaRouter.mojom.MediaStatusObserverPtr} observer * @return {!Promise} Resolves to true if a controller * is created. Resolves to false if a controller cannot be created, or if * the controller is already bound. */ MediaRouteProvider.prototype.createMediaRouteController = function( routeId, controllerRequest, observer) { this.handlers_.onBeforeInvokeHandler(); return this.handlers_.createMediaRouteController( routeId, controllerRequest, new MediaStatusObserverPtrAdapter(observer.ptr.passInterface())).then( () => ({success: true}), e => ({success: false})); }; var ptr = new mediaRouter.mojom.MediaRouterPtr; Mojo.bindInterface( mediaRouter.mojom.MediaRouter.name, mojo.makeRequest(ptr).handle, 'context', true); exports.$set('returnValue', new MediaRouter(ptr)); // chrome/common/media_router/mojom/media_status.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'chrome/common/media_router/mojom/media_status.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mediaRouter.mojom'); var time$ = mojo.internal.exposeNamespace('mojoBase.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'mojo/public/mojom/base/time.mojom', '../../../../mojo/public/mojom/base/time.mojom.js'); } var geometry$ = mojo.internal.exposeNamespace('gfx.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'ui/gfx/geometry/mojom/geometry.mojom', '../../../../ui/gfx/geometry/mojom/geometry.mojom.js'); } var url$ = mojo.internal.exposeNamespace('url.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'url/mojom/url.mojom', '../../../../url/mojom/url.mojom.js'); } function MediaImage(values) { this.initDefaults_(); this.initFields_(values); } MediaImage.prototype.initDefaults_ = function() { this.url = null; this.size = null; }; MediaImage.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaImage.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaImage.url err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, url$.Url, false); if (err !== validator.validationError.NONE) return err; // validate MediaImage.size err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, geometry$.Size, true); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaImage.encodedSize = codec.kStructHeaderSize + 16; MediaImage.decode = function(decoder) { var packed; var val = new MediaImage(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.url = decoder.decodeStructPointer(url$.Url); val.size = decoder.decodeStructPointer(geometry$.Size); return val; }; MediaImage.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaImage.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(url$.Url, val.url); encoder.encodeStructPointer(geometry$.Size, val.size); }; function MediaStatus(values) { this.initDefaults_(); this.initFields_(values); } MediaStatus.PlayState = {}; MediaStatus.PlayState.PLAYING = 0; MediaStatus.PlayState.PAUSED = MediaStatus.PlayState.PLAYING + 1; MediaStatus.PlayState.BUFFERING = MediaStatus.PlayState.PAUSED + 1; MediaStatus.PlayState.MIN_VALUE = 0, MediaStatus.PlayState.MAX_VALUE = 2, MediaStatus.PlayState.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; MediaStatus.PlayState.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; MediaStatus.prototype.initDefaults_ = function() { this.title = null; this.canPlayPause = false; this.canMute = false; this.canSetVolume = false; this.canSeek = false; this.canSkipToNextTrack = false; this.canSkipToPreviousTrack = false; this.isMuted = false; this.playState = 0; this.volume = 0; this.duration = null; this.currentTime = null; this.images = null; }; MediaStatus.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaStatus.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 56} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.title err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate MediaStatus.playState err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 12, MediaStatus.PlayState); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.duration err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.currentTime err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 32, time$.TimeDelta, false); if (err !== validator.validationError.NONE) return err; // validate MediaStatus.images err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 40, 8, new codec.PointerTo(MediaImage), false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaStatus.encodedSize = codec.kStructHeaderSize + 48; MediaStatus.decode = function(decoder) { var packed; var val = new MediaStatus(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.title = decoder.decodeStruct(codec.String); packed = decoder.readUint8(); val.canPlayPause = (packed >> 0) & 1 ? true : false; val.canMute = (packed >> 1) & 1 ? true : false; val.canSetVolume = (packed >> 2) & 1 ? true : false; val.canSeek = (packed >> 3) & 1 ? true : false; val.canSkipToNextTrack = (packed >> 4) & 1 ? true : false; val.canSkipToPreviousTrack = (packed >> 5) & 1 ? true : false; val.isMuted = (packed >> 6) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); val.playState = decoder.decodeStruct(codec.Int32); val.volume = decoder.decodeStruct(codec.Float); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.duration = decoder.decodeStructPointer(time$.TimeDelta); val.currentTime = decoder.decodeStructPointer(time$.TimeDelta); val.images = decoder.decodeArrayPointer(new codec.PointerTo(MediaImage)); return val; }; MediaStatus.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaStatus.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.title); packed = 0; packed |= (val.canPlayPause & 1) << 0 packed |= (val.canMute & 1) << 1 packed |= (val.canSetVolume & 1) << 2 packed |= (val.canSeek & 1) << 3 packed |= (val.canSkipToNextTrack & 1) << 4 packed |= (val.canSkipToPreviousTrack & 1) << 5 packed |= (val.isMuted & 1) << 6 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStruct(codec.Int32, val.playState); encoder.encodeStruct(codec.Float, val.volume); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(time$.TimeDelta, val.duration); encoder.encodeStructPointer(time$.TimeDelta, val.currentTime); encoder.encodeArrayPointer(new codec.PointerTo(MediaImage), val.images); }; function MediaStatusObserver_OnMediaStatusUpdated_Params(values) { this.initDefaults_(); this.initFields_(values); } MediaStatusObserver_OnMediaStatusUpdated_Params.prototype.initDefaults_ = function() { this.status = null; }; MediaStatusObserver_OnMediaStatusUpdated_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MediaStatusObserver_OnMediaStatusUpdated_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MediaStatusObserver_OnMediaStatusUpdated_Params.status err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, MediaStatus, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize = codec.kStructHeaderSize + 8; MediaStatusObserver_OnMediaStatusUpdated_Params.decode = function(decoder) { var packed; var val = new MediaStatusObserver_OnMediaStatusUpdated_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.status = decoder.decodeStructPointer(MediaStatus); return val; }; MediaStatusObserver_OnMediaStatusUpdated_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(MediaStatus, val.status); }; var kMediaStatusObserver_OnMediaStatusUpdated_Name = 1632843672; function MediaStatusObserverPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MediaStatusObserver, handleOrPtrInfo); } function MediaStatusObserverAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MediaStatusObserver, associatedInterfacePtrInfo); } MediaStatusObserverAssociatedPtr.prototype = Object.create(MediaStatusObserverPtr.prototype); MediaStatusObserverAssociatedPtr.prototype.constructor = MediaStatusObserverAssociatedPtr; function MediaStatusObserverProxy(receiver) { this.receiver_ = receiver; } MediaStatusObserverPtr.prototype.onMediaStatusUpdated = function() { return MediaStatusObserverProxy.prototype.onMediaStatusUpdated .apply(this.ptr.getProxy(), arguments); }; MediaStatusObserverProxy.prototype.onMediaStatusUpdated = function(status) { var params_ = new MediaStatusObserver_OnMediaStatusUpdated_Params(); params_.status = status; var builder = new codec.MessageV0Builder( kMediaStatusObserver_OnMediaStatusUpdated_Name, codec.align(MediaStatusObserver_OnMediaStatusUpdated_Params.encodedSize)); builder.encodeStruct(MediaStatusObserver_OnMediaStatusUpdated_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function MediaStatusObserverStub(delegate) { this.delegate_ = delegate; } MediaStatusObserverStub.prototype.onMediaStatusUpdated = function(status) { return this.delegate_ && this.delegate_.onMediaStatusUpdated && this.delegate_.onMediaStatusUpdated(status); } MediaStatusObserverStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMediaStatusObserver_OnMediaStatusUpdated_Name: var params = reader.decodeStruct(MediaStatusObserver_OnMediaStatusUpdated_Params); this.onMediaStatusUpdated(params.status); return true; default: return false; } }; MediaStatusObserverStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateMediaStatusObserverRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMediaStatusObserver_OnMediaStatusUpdated_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MediaStatusObserver_OnMediaStatusUpdated_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMediaStatusObserverResponse(messageValidator) { return validator.validationError.NONE; } var MediaStatusObserver = { name: 'media_router.mojom.MediaStatusObserver', kVersion: 0, ptrClass: MediaStatusObserverPtr, proxyClass: MediaStatusObserverProxy, stubClass: MediaStatusObserverStub, validateRequest: validateMediaStatusObserverRequest, validateResponse: null, }; MediaStatusObserverStub.prototype.validator = validateMediaStatusObserverRequest; MediaStatusObserverProxy.prototype.validator = null; exports.MediaImage = MediaImage; exports.MediaStatus = MediaStatus; exports.MediaStatusObserver = MediaStatusObserver; exports.MediaStatusObserverPtr = MediaStatusObserverPtr; exports.MediaStatusObserverAssociatedPtr = MediaStatusObserverAssociatedPtr; })();// components/mirroring/mojom/mirroring_service_host.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'components/mirroring/mojom/mirroring_service_host.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mirroring.mojom'); var cast_message_channel$ = mojo.internal.exposeNamespace('mirroring.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'components/mirroring/mojom/cast_message_channel.mojom', 'cast_message_channel.mojom.js'); } var session_observer$ = mojo.internal.exposeNamespace('mirroring.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'components/mirroring/mojom/session_observer.mojom', 'session_observer.mojom.js'); } var session_parameters$ = mojo.internal.exposeNamespace('mirroring.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'components/mirroring/mojom/session_parameters.mojom', 'session_parameters.mojom.js'); } function MirroringServiceHost_Start_Params(values) { this.initDefaults_(); this.initFields_(values); } MirroringServiceHost_Start_Params.prototype.initDefaults_ = function() { this.params = null; this.observer = new session_observer$.SessionObserverPtr(); this.outboundChannel = new cast_message_channel$.CastMessageChannelPtr(); this.inboundChannel = new bindings.InterfaceRequest(); }; MirroringServiceHost_Start_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirroringServiceHost_Start_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirroringServiceHost_Start_Params.params err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, session_parameters$.SessionParameters, false); if (err !== validator.validationError.NONE) return err; // validate MirroringServiceHost_Start_Params.observer err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 8, false); if (err !== validator.validationError.NONE) return err; // validate MirroringServiceHost_Start_Params.outboundChannel err = messageValidator.validateInterface(offset + codec.kStructHeaderSize + 16, false); if (err !== validator.validationError.NONE) return err; // validate MirroringServiceHost_Start_Params.inboundChannel err = messageValidator.validateInterfaceRequest(offset + codec.kStructHeaderSize + 24, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirroringServiceHost_Start_Params.encodedSize = codec.kStructHeaderSize + 32; MirroringServiceHost_Start_Params.decode = function(decoder) { var packed; var val = new MirroringServiceHost_Start_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.params = decoder.decodeStructPointer(session_parameters$.SessionParameters); val.observer = decoder.decodeStruct(new codec.Interface(session_observer$.SessionObserverPtr)); val.outboundChannel = decoder.decodeStruct(new codec.Interface(cast_message_channel$.CastMessageChannelPtr)); val.inboundChannel = decoder.decodeStruct(codec.InterfaceRequest); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MirroringServiceHost_Start_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirroringServiceHost_Start_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(session_parameters$.SessionParameters, val.params); encoder.encodeStruct(new codec.Interface(session_observer$.SessionObserverPtr), val.observer); encoder.encodeStruct(new codec.Interface(cast_message_channel$.CastMessageChannelPtr), val.outboundChannel); encoder.encodeStruct(codec.InterfaceRequest, val.inboundChannel); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; var kMirroringServiceHost_Start_Name = 19375681; function MirroringServiceHostPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MirroringServiceHost, handleOrPtrInfo); } function MirroringServiceHostAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MirroringServiceHost, associatedInterfacePtrInfo); } MirroringServiceHostAssociatedPtr.prototype = Object.create(MirroringServiceHostPtr.prototype); MirroringServiceHostAssociatedPtr.prototype.constructor = MirroringServiceHostAssociatedPtr; function MirroringServiceHostProxy(receiver) { this.receiver_ = receiver; } MirroringServiceHostPtr.prototype.start = function() { return MirroringServiceHostProxy.prototype.start .apply(this.ptr.getProxy(), arguments); }; MirroringServiceHostProxy.prototype.start = function(params, observer, outboundChannel, inboundChannel) { var params_ = new MirroringServiceHost_Start_Params(); params_.params = params; params_.observer = observer; params_.outboundChannel = outboundChannel; params_.inboundChannel = inboundChannel; var builder = new codec.MessageV0Builder( kMirroringServiceHost_Start_Name, codec.align(MirroringServiceHost_Start_Params.encodedSize)); builder.encodeStruct(MirroringServiceHost_Start_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function MirroringServiceHostStub(delegate) { this.delegate_ = delegate; } MirroringServiceHostStub.prototype.start = function(params, observer, outboundChannel, inboundChannel) { return this.delegate_ && this.delegate_.start && this.delegate_.start(params, observer, outboundChannel, inboundChannel); } MirroringServiceHostStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMirroringServiceHost_Start_Name: var params = reader.decodeStruct(MirroringServiceHost_Start_Params); this.start(params.params, params.observer, params.outboundChannel, params.inboundChannel); return true; default: return false; } }; MirroringServiceHostStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateMirroringServiceHostRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMirroringServiceHost_Start_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirroringServiceHost_Start_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMirroringServiceHostResponse(messageValidator) { return validator.validationError.NONE; } var MirroringServiceHost = { name: 'mirroring.mojom.MirroringServiceHost', kVersion: 0, ptrClass: MirroringServiceHostPtr, proxyClass: MirroringServiceHostProxy, stubClass: MirroringServiceHostStub, validateRequest: validateMirroringServiceHostRequest, validateResponse: null, }; MirroringServiceHostStub.prototype.validator = validateMirroringServiceHostRequest; MirroringServiceHostProxy.prototype.validator = null; exports.MirroringServiceHost = MirroringServiceHost; exports.MirroringServiceHostPtr = MirroringServiceHostPtr; exports.MirroringServiceHostAssociatedPtr = MirroringServiceHostAssociatedPtr; })();// components/mirroring/mojom/cast_message_channel.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'components/mirroring/mojom/cast_message_channel.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mirroring.mojom'); var REMOTING_NAMESPACE = "urn:x-cast:com.google.cast.remoting"; var WEB_RTC_NAMESPACE = "urn:x-cast:com.google.cast.webrtc"; function CastMessage(values) { this.initDefaults_(); this.initFields_(values); } CastMessage.prototype.initDefaults_ = function() { this.messageNamespace = null; this.jsonFormatData = null; }; CastMessage.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; CastMessage.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate CastMessage.messageNamespace err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate CastMessage.jsonFormatData err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; CastMessage.encodedSize = codec.kStructHeaderSize + 16; CastMessage.decode = function(decoder) { var packed; var val = new CastMessage(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.messageNamespace = decoder.decodeStruct(codec.String); val.jsonFormatData = decoder.decodeStruct(codec.String); return val; }; CastMessage.encode = function(encoder, val) { var packed; encoder.writeUint32(CastMessage.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.messageNamespace); encoder.encodeStruct(codec.String, val.jsonFormatData); }; function CastMessageChannel_Send_Params(values) { this.initDefaults_(); this.initFields_(values); } CastMessageChannel_Send_Params.prototype.initDefaults_ = function() { this.message = null; }; CastMessageChannel_Send_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; CastMessageChannel_Send_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate CastMessageChannel_Send_Params.message err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, CastMessage, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; CastMessageChannel_Send_Params.encodedSize = codec.kStructHeaderSize + 8; CastMessageChannel_Send_Params.decode = function(decoder) { var packed; var val = new CastMessageChannel_Send_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.message = decoder.decodeStructPointer(CastMessage); return val; }; CastMessageChannel_Send_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(CastMessageChannel_Send_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(CastMessage, val.message); }; var kCastMessageChannel_Send_Name = 1197333462; function CastMessageChannelPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(CastMessageChannel, handleOrPtrInfo); } function CastMessageChannelAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( CastMessageChannel, associatedInterfacePtrInfo); } CastMessageChannelAssociatedPtr.prototype = Object.create(CastMessageChannelPtr.prototype); CastMessageChannelAssociatedPtr.prototype.constructor = CastMessageChannelAssociatedPtr; function CastMessageChannelProxy(receiver) { this.receiver_ = receiver; } CastMessageChannelPtr.prototype.send = function() { return CastMessageChannelProxy.prototype.send .apply(this.ptr.getProxy(), arguments); }; CastMessageChannelProxy.prototype.send = function(message) { var params_ = new CastMessageChannel_Send_Params(); params_.message = message; var builder = new codec.MessageV0Builder( kCastMessageChannel_Send_Name, codec.align(CastMessageChannel_Send_Params.encodedSize)); builder.encodeStruct(CastMessageChannel_Send_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function CastMessageChannelStub(delegate) { this.delegate_ = delegate; } CastMessageChannelStub.prototype.send = function(message) { return this.delegate_ && this.delegate_.send && this.delegate_.send(message); } CastMessageChannelStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kCastMessageChannel_Send_Name: var params = reader.decodeStruct(CastMessageChannel_Send_Params); this.send(params.message); return true; default: return false; } }; CastMessageChannelStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateCastMessageChannelRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kCastMessageChannel_Send_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = CastMessageChannel_Send_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateCastMessageChannelResponse(messageValidator) { return validator.validationError.NONE; } var CastMessageChannel = { name: 'mirroring.mojom.CastMessageChannel', kVersion: 0, ptrClass: CastMessageChannelPtr, proxyClass: CastMessageChannelProxy, stubClass: CastMessageChannelStub, validateRequest: validateCastMessageChannelRequest, validateResponse: null, }; CastMessageChannelStub.prototype.validator = validateCastMessageChannelRequest; CastMessageChannelProxy.prototype.validator = null; exports.REMOTING_NAMESPACE = REMOTING_NAMESPACE; exports.WEB_RTC_NAMESPACE = WEB_RTC_NAMESPACE; exports.CastMessage = CastMessage; exports.CastMessageChannel = CastMessageChannel; exports.CastMessageChannelPtr = CastMessageChannelPtr; exports.CastMessageChannelAssociatedPtr = CastMessageChannelAssociatedPtr; })();// components/mirroring/mojom/session_observer.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'components/mirroring/mojom/session_observer.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mirroring.mojom'); var SessionError = {}; SessionError.ANSWER_TIME_OUT = 0; SessionError.ANSWER_NOT_OK = SessionError.ANSWER_TIME_OUT + 1; SessionError.ANSWER_MISMATCHED_CAST_MODE = SessionError.ANSWER_NOT_OK + 1; SessionError.ANSWER_MISMATCHED_SSRC_LENGTH = SessionError.ANSWER_MISMATCHED_CAST_MODE + 1; SessionError.ANSWER_SELECT_MULTIPLE_AUDIO = SessionError.ANSWER_MISMATCHED_SSRC_LENGTH + 1; SessionError.ANSWER_SELECT_MULTIPLE_VIDEO = SessionError.ANSWER_SELECT_MULTIPLE_AUDIO + 1; SessionError.ANSWER_SELECT_INVALID_INDEX = SessionError.ANSWER_SELECT_MULTIPLE_VIDEO + 1; SessionError.ANSWER_NO_AUDIO_OR_VIDEO = SessionError.ANSWER_SELECT_INVALID_INDEX + 1; SessionError.AUDIO_CAPTURE_ERROR = SessionError.ANSWER_NO_AUDIO_OR_VIDEO + 1; SessionError.VIDEO_CAPTURE_ERROR = SessionError.AUDIO_CAPTURE_ERROR + 1; SessionError.RTP_STREAM_ERROR = SessionError.VIDEO_CAPTURE_ERROR + 1; SessionError.ENCODING_ERROR = SessionError.RTP_STREAM_ERROR + 1; SessionError.CAST_TRANSPORT_ERROR = SessionError.ENCODING_ERROR + 1; SessionError.MIN_VALUE = 0, SessionError.MAX_VALUE = 12, SessionError.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: return true; } return false; }; SessionError.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; function SessionObserver_OnError_Params(values) { this.initDefaults_(); this.initFields_(values); } SessionObserver_OnError_Params.prototype.initDefaults_ = function() { this.error = 0; }; SessionObserver_OnError_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; SessionObserver_OnError_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate SessionObserver_OnError_Params.error err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, SessionError); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; SessionObserver_OnError_Params.encodedSize = codec.kStructHeaderSize + 8; SessionObserver_OnError_Params.decode = function(decoder) { var packed; var val = new SessionObserver_OnError_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.error = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; SessionObserver_OnError_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(SessionObserver_OnError_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.error); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function SessionObserver_DidStart_Params(values) { this.initDefaults_(); this.initFields_(values); } SessionObserver_DidStart_Params.prototype.initDefaults_ = function() { }; SessionObserver_DidStart_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; SessionObserver_DidStart_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; SessionObserver_DidStart_Params.encodedSize = codec.kStructHeaderSize + 0; SessionObserver_DidStart_Params.decode = function(decoder) { var packed; var val = new SessionObserver_DidStart_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; SessionObserver_DidStart_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(SessionObserver_DidStart_Params.encodedSize); encoder.writeUint32(0); }; function SessionObserver_DidStop_Params(values) { this.initDefaults_(); this.initFields_(values); } SessionObserver_DidStop_Params.prototype.initDefaults_ = function() { }; SessionObserver_DidStop_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; SessionObserver_DidStop_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; SessionObserver_DidStop_Params.encodedSize = codec.kStructHeaderSize + 0; SessionObserver_DidStop_Params.decode = function(decoder) { var packed; var val = new SessionObserver_DidStop_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; SessionObserver_DidStop_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(SessionObserver_DidStop_Params.encodedSize); encoder.writeUint32(0); }; var kSessionObserver_OnError_Name = 1560282092; var kSessionObserver_DidStart_Name = 427876750; var kSessionObserver_DidStop_Name = 1459290989; function SessionObserverPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(SessionObserver, handleOrPtrInfo); } function SessionObserverAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( SessionObserver, associatedInterfacePtrInfo); } SessionObserverAssociatedPtr.prototype = Object.create(SessionObserverPtr.prototype); SessionObserverAssociatedPtr.prototype.constructor = SessionObserverAssociatedPtr; function SessionObserverProxy(receiver) { this.receiver_ = receiver; } SessionObserverPtr.prototype.onError = function() { return SessionObserverProxy.prototype.onError .apply(this.ptr.getProxy(), arguments); }; SessionObserverProxy.prototype.onError = function(error) { var params_ = new SessionObserver_OnError_Params(); params_.error = error; var builder = new codec.MessageV0Builder( kSessionObserver_OnError_Name, codec.align(SessionObserver_OnError_Params.encodedSize)); builder.encodeStruct(SessionObserver_OnError_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; SessionObserverPtr.prototype.didStart = function() { return SessionObserverProxy.prototype.didStart .apply(this.ptr.getProxy(), arguments); }; SessionObserverProxy.prototype.didStart = function() { var params_ = new SessionObserver_DidStart_Params(); var builder = new codec.MessageV0Builder( kSessionObserver_DidStart_Name, codec.align(SessionObserver_DidStart_Params.encodedSize)); builder.encodeStruct(SessionObserver_DidStart_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; SessionObserverPtr.prototype.didStop = function() { return SessionObserverProxy.prototype.didStop .apply(this.ptr.getProxy(), arguments); }; SessionObserverProxy.prototype.didStop = function() { var params_ = new SessionObserver_DidStop_Params(); var builder = new codec.MessageV0Builder( kSessionObserver_DidStop_Name, codec.align(SessionObserver_DidStop_Params.encodedSize)); builder.encodeStruct(SessionObserver_DidStop_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function SessionObserverStub(delegate) { this.delegate_ = delegate; } SessionObserverStub.prototype.onError = function(error) { return this.delegate_ && this.delegate_.onError && this.delegate_.onError(error); } SessionObserverStub.prototype.didStart = function() { return this.delegate_ && this.delegate_.didStart && this.delegate_.didStart(); } SessionObserverStub.prototype.didStop = function() { return this.delegate_ && this.delegate_.didStop && this.delegate_.didStop(); } SessionObserverStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kSessionObserver_OnError_Name: var params = reader.decodeStruct(SessionObserver_OnError_Params); this.onError(params.error); return true; case kSessionObserver_DidStart_Name: var params = reader.decodeStruct(SessionObserver_DidStart_Params); this.didStart(); return true; case kSessionObserver_DidStop_Name: var params = reader.decodeStruct(SessionObserver_DidStop_Params); this.didStop(); return true; default: return false; } }; SessionObserverStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateSessionObserverRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kSessionObserver_OnError_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = SessionObserver_OnError_Params; break; case kSessionObserver_DidStart_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = SessionObserver_DidStart_Params; break; case kSessionObserver_DidStop_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = SessionObserver_DidStop_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateSessionObserverResponse(messageValidator) { return validator.validationError.NONE; } var SessionObserver = { name: 'mirroring.mojom.SessionObserver', kVersion: 0, ptrClass: SessionObserverPtr, proxyClass: SessionObserverProxy, stubClass: SessionObserverStub, validateRequest: validateSessionObserverRequest, validateResponse: null, }; SessionObserverStub.prototype.validator = validateSessionObserverRequest; SessionObserverProxy.prototype.validator = null; exports.SessionError = SessionError; exports.SessionObserver = SessionObserver; exports.SessionObserverPtr = SessionObserverPtr; exports.SessionObserverAssociatedPtr = SessionObserverAssociatedPtr; })();// components/mirroring/mojom/session_parameters.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'components/mirroring/mojom/session_parameters.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mirroring.mojom'); var ip_address$ = mojo.internal.exposeNamespace('network.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'services/network/public/mojom/ip_address.mojom', '../../../services/network/public/mojom/ip_address.mojom.js'); } var SessionType = {}; SessionType.AUDIO_ONLY = 0; SessionType.VIDEO_ONLY = SessionType.AUDIO_ONLY + 1; SessionType.AUDIO_AND_VIDEO = SessionType.VIDEO_ONLY + 1; SessionType.MIN_VALUE = 0, SessionType.MAX_VALUE = 2, SessionType.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; SessionType.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; function SessionParameters(values) { this.initDefaults_(); this.initFields_(values); } SessionParameters.prototype.initDefaults_ = function() { this.type = 0; this.receiverAddress = null; this.receiverModelName = null; }; SessionParameters.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; SessionParameters.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 32} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate SessionParameters.type err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, SessionType); if (err !== validator.validationError.NONE) return err; // validate SessionParameters.receiverAddress err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 8, ip_address$.IPAddress, false); if (err !== validator.validationError.NONE) return err; // validate SessionParameters.receiverModelName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 16, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; SessionParameters.encodedSize = codec.kStructHeaderSize + 24; SessionParameters.decode = function(decoder) { var packed; var val = new SessionParameters(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.type = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.receiverAddress = decoder.decodeStructPointer(ip_address$.IPAddress); val.receiverModelName = decoder.decodeStruct(codec.String); return val; }; SessionParameters.encode = function(encoder, val) { var packed; encoder.writeUint32(SessionParameters.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.type); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(ip_address$.IPAddress, val.receiverAddress); encoder.encodeStruct(codec.String, val.receiverModelName); }; exports.SessionType = SessionType; exports.SessionParameters = SessionParameters; })();// mojo/public/mojom/base/time.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'mojo/public/mojom/base/time.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mojoBase.mojom'); function Time(values) { this.initDefaults_(); this.initFields_(values); } Time.prototype.initDefaults_ = function() { this.internalValue = 0; }; Time.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Time.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Time.encodedSize = codec.kStructHeaderSize + 8; Time.decode = function(decoder) { var packed; var val = new Time(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.internalValue = decoder.decodeStruct(codec.Int64); return val; }; Time.encode = function(encoder, val) { var packed; encoder.writeUint32(Time.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int64, val.internalValue); }; function TimeDelta(values) { this.initDefaults_(); this.initFields_(values); } TimeDelta.prototype.initDefaults_ = function() { this.microseconds = 0; }; TimeDelta.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; TimeDelta.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; TimeDelta.encodedSize = codec.kStructHeaderSize + 8; TimeDelta.decode = function(decoder) { var packed; var val = new TimeDelta(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.microseconds = decoder.decodeStruct(codec.Int64); return val; }; TimeDelta.encode = function(encoder, val) { var packed; encoder.writeUint32(TimeDelta.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int64, val.microseconds); }; function TimeTicks(values) { this.initDefaults_(); this.initFields_(values); } TimeTicks.prototype.initDefaults_ = function() { this.internalValue = 0; }; TimeTicks.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; TimeTicks.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; TimeTicks.encodedSize = codec.kStructHeaderSize + 8; TimeTicks.decode = function(decoder) { var packed; var val = new TimeTicks(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.internalValue = decoder.decodeStruct(codec.Int64); return val; }; TimeTicks.encode = function(encoder, val) { var packed; encoder.writeUint32(TimeTicks.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int64, val.internalValue); }; exports.Time = Time; exports.TimeDelta = TimeDelta; exports.TimeTicks = TimeTicks; })();// mojo/public/mojom/base/unguessable_token.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'mojo/public/mojom/base/unguessable_token.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('mojoBase.mojom'); function UnguessableToken(values) { this.initDefaults_(); this.initFields_(values); } UnguessableToken.prototype.initDefaults_ = function() { this.high = 0; this.low = 0; }; UnguessableToken.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; UnguessableToken.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; UnguessableToken.encodedSize = codec.kStructHeaderSize + 16; UnguessableToken.decode = function(decoder) { var packed; var val = new UnguessableToken(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.high = decoder.decodeStruct(codec.Uint64); val.low = decoder.decodeStruct(codec.Uint64); return val; }; UnguessableToken.encode = function(encoder, val) { var packed; encoder.writeUint32(UnguessableToken.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Uint64, val.high); encoder.encodeStruct(codec.Uint64, val.low); }; exports.UnguessableToken = UnguessableToken; })();// services/network/public/mojom/ip_address.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'services/network/public/mojom/ip_address.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('network.mojom'); function IPAddress(values) { this.initDefaults_(); this.initFields_(values); } IPAddress.prototype.initDefaults_ = function() { this.addressBytes = null; }; IPAddress.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; IPAddress.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate IPAddress.addressBytes err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; IPAddress.encodedSize = codec.kStructHeaderSize + 8; IPAddress.decode = function(decoder) { var packed; var val = new IPAddress(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.addressBytes = decoder.decodeArrayPointer(codec.Uint8); return val; }; IPAddress.encode = function(encoder, val) { var packed; encoder.writeUint32(IPAddress.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(codec.Uint8, val.addressBytes); }; exports.IPAddress = IPAddress; })();// services/network/public/mojom/ip_endpoint.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'services/network/public/mojom/ip_endpoint.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('network.mojom'); var ip_address$ = mojo.internal.exposeNamespace('network.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'services/network/public/mojom/ip_address.mojom', 'ip_address.mojom.js'); } function IPEndPoint(values) { this.initDefaults_(); this.initFields_(values); } IPEndPoint.prototype.initDefaults_ = function() { this.address = null; this.port = 0; }; IPEndPoint.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; IPEndPoint.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 24} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate IPEndPoint.address err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, ip_address$.IPAddress, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; IPEndPoint.encodedSize = codec.kStructHeaderSize + 16; IPEndPoint.decode = function(decoder) { var packed; var val = new IPEndPoint(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.address = decoder.decodeStructPointer(ip_address$.IPAddress); val.port = decoder.decodeStruct(codec.Uint16); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; IPEndPoint.encode = function(encoder, val) { var packed; encoder.writeUint32(IPEndPoint.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(ip_address$.IPAddress, val.address); encoder.encodeStruct(codec.Uint16, val.port); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; exports.IPEndPoint = IPEndPoint; })();// url/mojom/origin.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'url/mojom/origin.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('url.mojom'); var unguessable_token$ = mojo.internal.exposeNamespace('mojoBase.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'mojo/public/mojom/base/unguessable_token.mojom', '../../mojo/public/mojom/base/unguessable_token.mojom.js'); } function Origin(values) { this.initDefaults_(); this.initFields_(values); } Origin.prototype.initDefaults_ = function() { this.scheme = null; this.host = null; this.port = 0; this.nonceIfOpaque = null; }; Origin.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Origin.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate Origin.scheme err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; // validate Origin.host err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 8, false) if (err !== validator.validationError.NONE) return err; // validate Origin.nonceIfOpaque err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 24, unguessable_token$.UnguessableToken, true); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Origin.encodedSize = codec.kStructHeaderSize + 32; Origin.decode = function(decoder) { var packed; var val = new Origin(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.scheme = decoder.decodeStruct(codec.String); val.host = decoder.decodeStruct(codec.String); val.port = decoder.decodeStruct(codec.Uint16); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); val.nonceIfOpaque = decoder.decodeStructPointer(unguessable_token$.UnguessableToken); return val; }; Origin.encode = function(encoder, val) { var packed; encoder.writeUint32(Origin.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.scheme); encoder.encodeStruct(codec.String, val.host); encoder.encodeStruct(codec.Uint16, val.port); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.encodeStructPointer(unguessable_token$.UnguessableToken, val.nonceIfOpaque); }; exports.Origin = Origin; })();// url/mojom/url.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'url/mojom/url.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('url.mojom'); function Url(values) { this.initDefaults_(); this.initFields_(values); } Url.prototype.initDefaults_ = function() { this.url = null; }; Url.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; Url.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate Url.url err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 0, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; Url.encodedSize = codec.kStructHeaderSize + 8; Url.decode = function(decoder) { var packed; var val = new Url(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.url = decoder.decodeStruct(codec.String); return val; }; Url.encode = function(encoder, val) { var packed; encoder.writeUint32(Url.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.String, val.url); }; exports.Url = Url; })();// media/mojo/mojom/mirror_service_remoting.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'media/mojo/mojom/mirror_service_remoting.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('media.mojom'); var remoting_common$ = mojo.internal.exposeNamespace('media.mojom'); if (mojo.config.autoLoadMojomDeps) { mojo.internal.loadMojomIfNecessary( 'media/mojo/mojom/remoting_common.mojom', 'remoting_common.mojom.js'); } function MirrorServiceRemoter_Start_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_Start_Params.prototype.initDefaults_ = function() { }; MirrorServiceRemoter_Start_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_Start_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_Start_Params.encodedSize = codec.kStructHeaderSize + 0; MirrorServiceRemoter_Start_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_Start_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MirrorServiceRemoter_Start_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_Start_Params.encodedSize); encoder.writeUint32(0); }; function MirrorServiceRemoter_StartDataStreams_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_StartDataStreams_Params.prototype.initDefaults_ = function() { this.hasAudio = false; this.hasVideo = false; }; MirrorServiceRemoter_StartDataStreams_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_StartDataStreams_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_StartDataStreams_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_StartDataStreams_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_StartDataStreams_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); packed = decoder.readUint8(); val.hasAudio = (packed >> 0) & 1 ? true : false; val.hasVideo = (packed >> 1) & 1 ? true : false; decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MirrorServiceRemoter_StartDataStreams_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_StartDataStreams_Params.encodedSize); encoder.writeUint32(0); packed = 0; packed |= (val.hasAudio & 1) << 0 packed |= (val.hasVideo & 1) << 1 encoder.writeUint8(packed); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MirrorServiceRemoter_StartDataStreams_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_StartDataStreams_ResponseParams.prototype.initDefaults_ = function() { this.audioStreamId = 0; this.videoStreamId = 0; }; MirrorServiceRemoter_StartDataStreams_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_StartDataStreams_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_StartDataStreams_ResponseParams.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_StartDataStreams_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.audioStreamId = decoder.decodeStruct(codec.Int32); val.videoStreamId = decoder.decodeStruct(codec.Int32); return val; }; MirrorServiceRemoter_StartDataStreams_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.audioStreamId); encoder.encodeStruct(codec.Int32, val.videoStreamId); }; function MirrorServiceRemoter_Stop_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_Stop_Params.prototype.initDefaults_ = function() { this.reason = 0; }; MirrorServiceRemoter_Stop_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_Stop_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemoter_Stop_Params.reason err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingStopReason); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_Stop_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_Stop_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_Stop_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.reason = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MirrorServiceRemoter_Stop_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_Stop_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.reason); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MirrorServiceRemoter_SendMessageToSink_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_SendMessageToSink_Params.prototype.initDefaults_ = function() { this.message = null; }; MirrorServiceRemoter_SendMessageToSink_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_SendMessageToSink_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemoter_SendMessageToSink_Params.message err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_SendMessageToSink_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_SendMessageToSink_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_SendMessageToSink_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.message = decoder.decodeArrayPointer(codec.Uint8); return val; }; MirrorServiceRemoter_SendMessageToSink_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_SendMessageToSink_Params.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(codec.Uint8, val.message); }; function MirrorServiceRemoter_EstimateTransmissionCapacity_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_EstimateTransmissionCapacity_Params.prototype.initDefaults_ = function() { }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize = codec.kStructHeaderSize + 0; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_EstimateTransmissionCapacity_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize); encoder.writeUint32(0); }; function MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.prototype.initDefaults_ = function() { this.rate = 0; }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.decode = function(decoder) { var packed; var val = new MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.rate = decoder.decodeStruct(codec.Double); return val; }; MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Double, val.rate); }; function MirrorServiceRemotingSource_OnSinkAvailable_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnSinkAvailable_Params.prototype.initDefaults_ = function() { this.metadata = null; }; MirrorServiceRemotingSource_OnSinkAvailable_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnSinkAvailable_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemotingSource_OnSinkAvailable_Params.metadata err = messageValidator.validateStructPointer(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingSinkMetadata, false); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemotingSource_OnSinkAvailable_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnSinkAvailable_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.metadata = decoder.decodeStructPointer(remoting_common$.RemotingSinkMetadata); return val; }; MirrorServiceRemotingSource_OnSinkAvailable_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStructPointer(remoting_common$.RemotingSinkMetadata, val.metadata); }; function MirrorServiceRemotingSource_OnMessageFromSink_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnMessageFromSink_Params.prototype.initDefaults_ = function() { this.message = null; }; MirrorServiceRemotingSource_OnMessageFromSink_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnMessageFromSink_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemotingSource_OnMessageFromSink_Params.message err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 1, codec.Uint8, false, [0], 0); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemotingSource_OnMessageFromSink_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnMessageFromSink_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.message = decoder.decodeArrayPointer(codec.Uint8); return val; }; MirrorServiceRemotingSource_OnMessageFromSink_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(codec.Uint8, val.message); }; function MirrorServiceRemotingSource_OnStopped_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnStopped_Params.prototype.initDefaults_ = function() { this.reason = 0; }; MirrorServiceRemotingSource_OnStopped_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnStopped_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 16} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate MirrorServiceRemotingSource_OnStopped_Params.reason err = messageValidator.validateEnum(offset + codec.kStructHeaderSize + 0, remoting_common$.RemotingStopReason); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnStopped_Params.encodedSize = codec.kStructHeaderSize + 8; MirrorServiceRemotingSource_OnStopped_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnStopped_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.reason = decoder.decodeStruct(codec.Int32); decoder.skip(1); decoder.skip(1); decoder.skip(1); decoder.skip(1); return val; }; MirrorServiceRemotingSource_OnStopped_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnStopped_Params.encodedSize); encoder.writeUint32(0); encoder.encodeStruct(codec.Int32, val.reason); encoder.skip(1); encoder.skip(1); encoder.skip(1); encoder.skip(1); }; function MirrorServiceRemotingSource_OnError_Params(values) { this.initDefaults_(); this.initFields_(values); } MirrorServiceRemotingSource_OnError_Params.prototype.initDefaults_ = function() { }; MirrorServiceRemotingSource_OnError_Params.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; MirrorServiceRemotingSource_OnError_Params.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 8} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; MirrorServiceRemotingSource_OnError_Params.encodedSize = codec.kStructHeaderSize + 0; MirrorServiceRemotingSource_OnError_Params.decode = function(decoder) { var packed; var val = new MirrorServiceRemotingSource_OnError_Params(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); return val; }; MirrorServiceRemotingSource_OnError_Params.encode = function(encoder, val) { var packed; encoder.writeUint32(MirrorServiceRemotingSource_OnError_Params.encodedSize); encoder.writeUint32(0); }; var kMirrorServiceRemoter_Start_Name = 2026428975; var kMirrorServiceRemoter_StartDataStreams_Name = 1448785961; var kMirrorServiceRemoter_Stop_Name = 1924219678; var kMirrorServiceRemoter_SendMessageToSink_Name = 1873187558; var kMirrorServiceRemoter_EstimateTransmissionCapacity_Name = 1054845002; function MirrorServiceRemoterPtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MirrorServiceRemoter, handleOrPtrInfo); } function MirrorServiceRemoterAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MirrorServiceRemoter, associatedInterfacePtrInfo); } MirrorServiceRemoterAssociatedPtr.prototype = Object.create(MirrorServiceRemoterPtr.prototype); MirrorServiceRemoterAssociatedPtr.prototype.constructor = MirrorServiceRemoterAssociatedPtr; function MirrorServiceRemoterProxy(receiver) { this.receiver_ = receiver; } MirrorServiceRemoterPtr.prototype.start = function() { return MirrorServiceRemoterProxy.prototype.start .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.start = function() { var params_ = new MirrorServiceRemoter_Start_Params(); var builder = new codec.MessageV0Builder( kMirrorServiceRemoter_Start_Name, codec.align(MirrorServiceRemoter_Start_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemoter_Start_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemoterPtr.prototype.startDataStreams = function() { return MirrorServiceRemoterProxy.prototype.startDataStreams .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.startDataStreams = function(hasAudio, hasVideo) { var params_ = new MirrorServiceRemoter_StartDataStreams_Params(); params_.hasAudio = hasAudio; params_.hasVideo = hasVideo; return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_StartDataStreams_Name, codec.align(MirrorServiceRemoter_StartDataStreams_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MirrorServiceRemoter_StartDataStreams_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MirrorServiceRemoter_StartDataStreams_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; MirrorServiceRemoterPtr.prototype.stop = function() { return MirrorServiceRemoterProxy.prototype.stop .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.stop = function(reason) { var params_ = new MirrorServiceRemoter_Stop_Params(); params_.reason = reason; var builder = new codec.MessageV0Builder( kMirrorServiceRemoter_Stop_Name, codec.align(MirrorServiceRemoter_Stop_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemoter_Stop_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemoterPtr.prototype.sendMessageToSink = function() { return MirrorServiceRemoterProxy.prototype.sendMessageToSink .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.sendMessageToSink = function(message) { var params_ = new MirrorServiceRemoter_SendMessageToSink_Params(); params_.message = message; var builder = new codec.MessageV0Builder( kMirrorServiceRemoter_SendMessageToSink_Name, codec.align(MirrorServiceRemoter_SendMessageToSink_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemoter_SendMessageToSink_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemoterPtr.prototype.estimateTransmissionCapacity = function() { return MirrorServiceRemoterProxy.prototype.estimateTransmissionCapacity .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemoterProxy.prototype.estimateTransmissionCapacity = function() { var params_ = new MirrorServiceRemoter_EstimateTransmissionCapacity_Params(); return new Promise(function(resolve, reject) { var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_EstimateTransmissionCapacity_Name, codec.align(MirrorServiceRemoter_EstimateTransmissionCapacity_Params.encodedSize), codec.kMessageExpectsResponse, 0); builder.encodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_Params, params_); var message = builder.finish(); this.receiver_.acceptAndExpectResponse(message).then(function(message) { var reader = new codec.MessageReader(message); var responseParams = reader.decodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams); resolve(responseParams); }).catch(function(result) { reject(Error("Connection error: " + result)); }); }.bind(this)); }; function MirrorServiceRemoterStub(delegate) { this.delegate_ = delegate; } MirrorServiceRemoterStub.prototype.start = function() { return this.delegate_ && this.delegate_.start && this.delegate_.start(); } MirrorServiceRemoterStub.prototype.startDataStreams = function(hasAudio, hasVideo) { return this.delegate_ && this.delegate_.startDataStreams && this.delegate_.startDataStreams(hasAudio, hasVideo); } MirrorServiceRemoterStub.prototype.stop = function(reason) { return this.delegate_ && this.delegate_.stop && this.delegate_.stop(reason); } MirrorServiceRemoterStub.prototype.sendMessageToSink = function(message) { return this.delegate_ && this.delegate_.sendMessageToSink && this.delegate_.sendMessageToSink(message); } MirrorServiceRemoterStub.prototype.estimateTransmissionCapacity = function() { return this.delegate_ && this.delegate_.estimateTransmissionCapacity && this.delegate_.estimateTransmissionCapacity(); } MirrorServiceRemoterStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMirrorServiceRemoter_Start_Name: var params = reader.decodeStruct(MirrorServiceRemoter_Start_Params); this.start(); return true; case kMirrorServiceRemoter_Stop_Name: var params = reader.decodeStruct(MirrorServiceRemoter_Stop_Params); this.stop(params.reason); return true; case kMirrorServiceRemoter_SendMessageToSink_Name: var params = reader.decodeStruct(MirrorServiceRemoter_SendMessageToSink_Params); this.sendMessageToSink(params.message); return true; default: return false; } }; MirrorServiceRemoterStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMirrorServiceRemoter_StartDataStreams_Name: var params = reader.decodeStruct(MirrorServiceRemoter_StartDataStreams_Params); this.startDataStreams(params.hasAudio, params.hasVideo).then(function(response) { var responseParams = new MirrorServiceRemoter_StartDataStreams_ResponseParams(); responseParams.audioStreamId = response.audioStreamId; responseParams.videoStreamId = response.videoStreamId; var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_StartDataStreams_Name, codec.align(MirrorServiceRemoter_StartDataStreams_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MirrorServiceRemoter_StartDataStreams_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name: var params = reader.decodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_Params); this.estimateTransmissionCapacity().then(function(response) { var responseParams = new MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams(); responseParams.rate = response.rate; var builder = new codec.MessageV1Builder( kMirrorServiceRemoter_EstimateTransmissionCapacity_Name, codec.align(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams.encodedSize), codec.kMessageIsResponse, reader.requestID); builder.encodeStruct(MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams, responseParams); var message = builder.finish(); responder.accept(message); }); return true; default: return false; } }; function validateMirrorServiceRemoterRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMirrorServiceRemoter_Start_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemoter_Start_Params; break; case kMirrorServiceRemoter_StartDataStreams_Name: if (message.expectsResponse()) paramsClass = MirrorServiceRemoter_StartDataStreams_Params; break; case kMirrorServiceRemoter_Stop_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemoter_Stop_Params; break; case kMirrorServiceRemoter_SendMessageToSink_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemoter_SendMessageToSink_Params; break; case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name: if (message.expectsResponse()) paramsClass = MirrorServiceRemoter_EstimateTransmissionCapacity_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMirrorServiceRemoterResponse(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMirrorServiceRemoter_StartDataStreams_Name: if (message.isResponse()) paramsClass = MirrorServiceRemoter_StartDataStreams_ResponseParams; break; case kMirrorServiceRemoter_EstimateTransmissionCapacity_Name: if (message.isResponse()) paramsClass = MirrorServiceRemoter_EstimateTransmissionCapacity_ResponseParams; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } var MirrorServiceRemoter = { name: 'media.mojom.MirrorServiceRemoter', kVersion: 0, ptrClass: MirrorServiceRemoterPtr, proxyClass: MirrorServiceRemoterProxy, stubClass: MirrorServiceRemoterStub, validateRequest: validateMirrorServiceRemoterRequest, validateResponse: validateMirrorServiceRemoterResponse, }; MirrorServiceRemoterStub.prototype.validator = validateMirrorServiceRemoterRequest; MirrorServiceRemoterProxy.prototype.validator = validateMirrorServiceRemoterResponse; var kMirrorServiceRemotingSource_OnSinkAvailable_Name = 704836746; var kMirrorServiceRemotingSource_OnMessageFromSink_Name = 1562903362; var kMirrorServiceRemotingSource_OnStopped_Name = 1973290239; var kMirrorServiceRemotingSource_OnError_Name = 786894234; function MirrorServiceRemotingSourcePtr(handleOrPtrInfo) { this.ptr = new bindings.InterfacePtrController(MirrorServiceRemotingSource, handleOrPtrInfo); } function MirrorServiceRemotingSourceAssociatedPtr(associatedInterfacePtrInfo) { this.ptr = new associatedBindings.AssociatedInterfacePtrController( MirrorServiceRemotingSource, associatedInterfacePtrInfo); } MirrorServiceRemotingSourceAssociatedPtr.prototype = Object.create(MirrorServiceRemotingSourcePtr.prototype); MirrorServiceRemotingSourceAssociatedPtr.prototype.constructor = MirrorServiceRemotingSourceAssociatedPtr; function MirrorServiceRemotingSourceProxy(receiver) { this.receiver_ = receiver; } MirrorServiceRemotingSourcePtr.prototype.onSinkAvailable = function() { return MirrorServiceRemotingSourceProxy.prototype.onSinkAvailable .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onSinkAvailable = function(metadata) { var params_ = new MirrorServiceRemotingSource_OnSinkAvailable_Params(); params_.metadata = metadata; var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnSinkAvailable_Name, codec.align(MirrorServiceRemotingSource_OnSinkAvailable_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnSinkAvailable_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemotingSourcePtr.prototype.onMessageFromSink = function() { return MirrorServiceRemotingSourceProxy.prototype.onMessageFromSink .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onMessageFromSink = function(message) { var params_ = new MirrorServiceRemotingSource_OnMessageFromSink_Params(); params_.message = message; var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnMessageFromSink_Name, codec.align(MirrorServiceRemotingSource_OnMessageFromSink_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnMessageFromSink_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemotingSourcePtr.prototype.onStopped = function() { return MirrorServiceRemotingSourceProxy.prototype.onStopped .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onStopped = function(reason) { var params_ = new MirrorServiceRemotingSource_OnStopped_Params(); params_.reason = reason; var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnStopped_Name, codec.align(MirrorServiceRemotingSource_OnStopped_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnStopped_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; MirrorServiceRemotingSourcePtr.prototype.onError = function() { return MirrorServiceRemotingSourceProxy.prototype.onError .apply(this.ptr.getProxy(), arguments); }; MirrorServiceRemotingSourceProxy.prototype.onError = function() { var params_ = new MirrorServiceRemotingSource_OnError_Params(); var builder = new codec.MessageV0Builder( kMirrorServiceRemotingSource_OnError_Name, codec.align(MirrorServiceRemotingSource_OnError_Params.encodedSize)); builder.encodeStruct(MirrorServiceRemotingSource_OnError_Params, params_); var message = builder.finish(); this.receiver_.accept(message); }; function MirrorServiceRemotingSourceStub(delegate) { this.delegate_ = delegate; } MirrorServiceRemotingSourceStub.prototype.onSinkAvailable = function(metadata) { return this.delegate_ && this.delegate_.onSinkAvailable && this.delegate_.onSinkAvailable(metadata); } MirrorServiceRemotingSourceStub.prototype.onMessageFromSink = function(message) { return this.delegate_ && this.delegate_.onMessageFromSink && this.delegate_.onMessageFromSink(message); } MirrorServiceRemotingSourceStub.prototype.onStopped = function(reason) { return this.delegate_ && this.delegate_.onStopped && this.delegate_.onStopped(reason); } MirrorServiceRemotingSourceStub.prototype.onError = function() { return this.delegate_ && this.delegate_.onError && this.delegate_.onError(); } MirrorServiceRemotingSourceStub.prototype.accept = function(message) { var reader = new codec.MessageReader(message); switch (reader.messageName) { case kMirrorServiceRemotingSource_OnSinkAvailable_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnSinkAvailable_Params); this.onSinkAvailable(params.metadata); return true; case kMirrorServiceRemotingSource_OnMessageFromSink_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnMessageFromSink_Params); this.onMessageFromSink(params.message); return true; case kMirrorServiceRemotingSource_OnStopped_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnStopped_Params); this.onStopped(params.reason); return true; case kMirrorServiceRemotingSource_OnError_Name: var params = reader.decodeStruct(MirrorServiceRemotingSource_OnError_Params); this.onError(); return true; default: return false; } }; MirrorServiceRemotingSourceStub.prototype.acceptWithResponder = function(message, responder) { var reader = new codec.MessageReader(message); switch (reader.messageName) { default: return false; } }; function validateMirrorServiceRemotingSourceRequest(messageValidator) { var message = messageValidator.message; var paramsClass = null; switch (message.getName()) { case kMirrorServiceRemotingSource_OnSinkAvailable_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnSinkAvailable_Params; break; case kMirrorServiceRemotingSource_OnMessageFromSink_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnMessageFromSink_Params; break; case kMirrorServiceRemotingSource_OnStopped_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnStopped_Params; break; case kMirrorServiceRemotingSource_OnError_Name: if (!message.expectsResponse() && !message.isResponse()) paramsClass = MirrorServiceRemotingSource_OnError_Params; break; } if (paramsClass === null) return validator.validationError.NONE; return paramsClass.validate(messageValidator, messageValidator.message.getHeaderNumBytes()); } function validateMirrorServiceRemotingSourceResponse(messageValidator) { return validator.validationError.NONE; } var MirrorServiceRemotingSource = { name: 'media.mojom.MirrorServiceRemotingSource', kVersion: 0, ptrClass: MirrorServiceRemotingSourcePtr, proxyClass: MirrorServiceRemotingSourceProxy, stubClass: MirrorServiceRemotingSourceStub, validateRequest: validateMirrorServiceRemotingSourceRequest, validateResponse: null, }; MirrorServiceRemotingSourceStub.prototype.validator = validateMirrorServiceRemotingSourceRequest; MirrorServiceRemotingSourceProxy.prototype.validator = null; exports.MirrorServiceRemoter = MirrorServiceRemoter; exports.MirrorServiceRemoterPtr = MirrorServiceRemoterPtr; exports.MirrorServiceRemoterAssociatedPtr = MirrorServiceRemoterAssociatedPtr; exports.MirrorServiceRemotingSource = MirrorServiceRemotingSource; exports.MirrorServiceRemotingSourcePtr = MirrorServiceRemotingSourcePtr; exports.MirrorServiceRemotingSourceAssociatedPtr = MirrorServiceRemotingSourceAssociatedPtr; })();// media/mojo/mojom/remoting_common.mojom.js is auto generated by mojom_bindings_generator.py, do not edit // Copyright 2014 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. 'use strict'; (function() { var mojomId = 'media/mojo/mojom/remoting_common.mojom'; if (mojo.internal.isMojomLoaded(mojomId)) { console.warn('The following mojom is loaded multiple times: ' + mojomId); return; } mojo.internal.markMojomLoaded(mojomId); var bindings = mojo; var associatedBindings = mojo; var codec = mojo.internal; var validator = mojo.internal; var exports = mojo.internal.exposeNamespace('media.mojom'); var RemotingStopReason = {}; RemotingStopReason.ROUTE_TERMINATED = 0; RemotingStopReason.LOCAL_PLAYBACK = RemotingStopReason.ROUTE_TERMINATED + 1; RemotingStopReason.SOURCE_GONE = RemotingStopReason.LOCAL_PLAYBACK + 1; RemotingStopReason.MESSAGE_SEND_FAILED = RemotingStopReason.SOURCE_GONE + 1; RemotingStopReason.DATA_SEND_FAILED = RemotingStopReason.MESSAGE_SEND_FAILED + 1; RemotingStopReason.UNEXPECTED_FAILURE = RemotingStopReason.DATA_SEND_FAILED + 1; RemotingStopReason.SERVICE_GONE = RemotingStopReason.UNEXPECTED_FAILURE + 1; RemotingStopReason.USER_DISABLED = RemotingStopReason.SERVICE_GONE + 1; RemotingStopReason.MIN_VALUE = 0, RemotingStopReason.MAX_VALUE = 7, RemotingStopReason.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7: return true; } return false; }; RemotingStopReason.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingStartFailReason = {}; RemotingStartFailReason.CANNOT_START_MULTIPLE = 0; RemotingStartFailReason.ROUTE_TERMINATED = RemotingStartFailReason.CANNOT_START_MULTIPLE + 1; RemotingStartFailReason.INVALID_ANSWER_MESSAGE = RemotingStartFailReason.ROUTE_TERMINATED + 1; RemotingStartFailReason.MIN_VALUE = 0, RemotingStartFailReason.MAX_VALUE = 2, RemotingStartFailReason.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; RemotingStartFailReason.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingSinkFeature = {}; RemotingSinkFeature.RENDERING = 0; RemotingSinkFeature.CONTENT_DECRYPTION = RemotingSinkFeature.RENDERING + 1; RemotingSinkFeature.MIN_VALUE = 0, RemotingSinkFeature.MAX_VALUE = 1, RemotingSinkFeature.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: return true; } return false; }; RemotingSinkFeature.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingSinkAudioCapability = {}; RemotingSinkAudioCapability.CODEC_BASELINE_SET = 0; RemotingSinkAudioCapability.CODEC_AAC = RemotingSinkAudioCapability.CODEC_BASELINE_SET + 1; RemotingSinkAudioCapability.CODEC_OPUS = RemotingSinkAudioCapability.CODEC_AAC + 1; RemotingSinkAudioCapability.MIN_VALUE = 0, RemotingSinkAudioCapability.MAX_VALUE = 2, RemotingSinkAudioCapability.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: return true; } return false; }; RemotingSinkAudioCapability.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; var RemotingSinkVideoCapability = {}; RemotingSinkVideoCapability.SUPPORT_4K = 0; RemotingSinkVideoCapability.CODEC_BASELINE_SET = RemotingSinkVideoCapability.SUPPORT_4K + 1; RemotingSinkVideoCapability.CODEC_H264 = RemotingSinkVideoCapability.CODEC_BASELINE_SET + 1; RemotingSinkVideoCapability.CODEC_VP8 = RemotingSinkVideoCapability.CODEC_H264 + 1; RemotingSinkVideoCapability.CODEC_VP9 = RemotingSinkVideoCapability.CODEC_VP8 + 1; RemotingSinkVideoCapability.CODEC_HEVC = RemotingSinkVideoCapability.CODEC_VP9 + 1; RemotingSinkVideoCapability.MIN_VALUE = 0, RemotingSinkVideoCapability.MAX_VALUE = 5, RemotingSinkVideoCapability.isKnownEnumValue = function(value) { switch (value) { case 0: case 1: case 2: case 3: case 4: case 5: return true; } return false; }; RemotingSinkVideoCapability.validate = function(enumValue) { var isExtensible = false; if (isExtensible || this.isKnownEnumValue(enumValue)) return validator.validationError.NONE; return validator.validationError.UNKNOWN_ENUM_VALUE; }; function RemotingSinkMetadata(values) { this.initDefaults_(); this.initFields_(values); } RemotingSinkMetadata.prototype.initDefaults_ = function() { this.features = null; this.audioCapabilities = null; this.videoCapabilities = null; this.friendlyName = null; }; RemotingSinkMetadata.prototype.initFields_ = function(fields) { for(var field in fields) { if (this.hasOwnProperty(field)) this[field] = fields[field]; } }; RemotingSinkMetadata.validate = function(messageValidator, offset) { var err; err = messageValidator.validateStructHeader(offset, codec.kStructHeaderSize); if (err !== validator.validationError.NONE) return err; var kVersionSizes = [ {version: 0, numBytes: 40} ]; err = messageValidator.validateStructVersion(offset, kVersionSizes); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.features err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 0, 4, new codec.Enum(RemotingSinkFeature), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.audioCapabilities err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 8, 4, new codec.Enum(RemotingSinkAudioCapability), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.videoCapabilities err = messageValidator.validateArrayPointer(offset + codec.kStructHeaderSize + 16, 4, new codec.Enum(RemotingSinkVideoCapability), false, [0], 0); if (err !== validator.validationError.NONE) return err; // validate RemotingSinkMetadata.friendlyName err = messageValidator.validateStringPointer(offset + codec.kStructHeaderSize + 24, false) if (err !== validator.validationError.NONE) return err; return validator.validationError.NONE; }; RemotingSinkMetadata.encodedSize = codec.kStructHeaderSize + 32; RemotingSinkMetadata.decode = function(decoder) { var packed; var val = new RemotingSinkMetadata(); var numberOfBytes = decoder.readUint32(); var version = decoder.readUint32(); val.features = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkFeature)); val.audioCapabilities = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkAudioCapability)); val.videoCapabilities = decoder.decodeArrayPointer(new codec.Enum(RemotingSinkVideoCapability)); val.friendlyName = decoder.decodeStruct(codec.String); return val; }; RemotingSinkMetadata.encode = function(encoder, val) { var packed; encoder.writeUint32(RemotingSinkMetadata.encodedSize); encoder.writeUint32(0); encoder.encodeArrayPointer(new codec.Enum(RemotingSinkFeature), val.features); encoder.encodeArrayPointer(new codec.Enum(RemotingSinkAudioCapability), val.audioCapabilities); encoder.encodeArrayPointer(new codec.Enum(RemotingSinkVideoCapability), val.videoCapabilities); encoder.encodeStruct(codec.String, val.friendlyName); }; exports.RemotingStopReason = RemotingStopReason; exports.RemotingStartFailReason = RemotingStartFailReason; exports.RemotingSinkFeature = RemotingSinkFeature; exports.RemotingSinkAudioCapability = RemotingSinkAudioCapability; exports.RemotingSinkVideoCapability = RemotingSinkVideoCapability; exports.RemotingSinkMetadata = RemotingSinkMetadata; })();PNG  IHDR**o`IDATx^1 C n.3(A$ހC;ߎDŽ,`N3QlyJ Ag uJ!C7'*膟.Ms *IENDB`PNG  IHDRJAuIDATx^Qj1@Q! ## K($y ,;ltYvBzO(#DQ6&}ɝE'̲ ,9VF|۲&ï&~! jY͑aRoFZ7'!fg7m>w%Za--4ȿޤI]IENDB`PNG  IHDR ?OIDATx3QƧb'Mm۶m۶ẝwoL5g| JzP(TrlI2hZHeDs]opӍzSl۩c] ӢYx-äp+iYy,<떐ح;Qr<<}<\6n5Kܾ#s@yӰ-Q,>6΀oF.@l|نثy0$ܼww޶!eGJ5fr3:pC O$~fN>ɣv 3&8Rt*.؉4 _ͷaVsb! )x;_7^ aP/q@p2Xw40Z: ۀ5HIb^b],IENDB`PNG  IHDR ?O)IDATxŖ|WƧ jĩqm۶mͱmϬ{{wTz\:rؗjDc9L6F 8,Xnzo3_}S# <+b5V{)|# RH0;Ҟ*|b;4rYxʱi#bQ7VzJDGԌʞhǰǏ88nLyZ٣&8{+k)%xM X(50N=_122Pwvؕ  ]X…KH1W, - (> ;pе Y$0 HW[\cYYDGQ*WFJ2pߧA@UmijB8[VWW1==YLNN"ɠX,"Hjp;:: >Gi˅vN47ݝ0LF6E]M VWǡP+r<$& v wߣT)0hkGsc~49>DL:VM F"p:hmn} K%S,BMrk|>ONeP1hmiVL/]]ez-5T[Uz5ƆF|d|MZ+;  ;h!% }в j^~G@)5.:Hdxo&"4'8w,cFəry0&??5VnZ:g`~Yېbcƈ+VwWW̚M]] eȵ*_ pqt"33477ӷg/֮^ qw !.۶U\.gxz1bPH^@/GN?\03O;v&L`A\t[7o y1ch4/DE(ܜ]pcu21RN  VgI>[hД$<@4ׅ>ѿI%}/Yr'ksuI Wؿw?yIENDB`PNG  IHDR O}PLTEݭ ~~~///000<<|IDATx0@у1OxhA,ᗀvrd_I/[`->,h E)W5ԂalNGt64.fhAi/TjYH ͊m7$ ?rF#?nIENDB`PNG  IHDR FrIDATxՔ1 D}ZDr)i$Z!ѵJӬHTXj & :txt& d Y V AG65ί G-kK.MEϬ-IENDB`PNG  IHDR ?OIDATxŖ+ACm۶m۶mֵm۶m۶)Fj/&c<"##і7rN551hO<"$M{Vl [At?7tA ='!>r/}eD~$y Wbrl[}([9(zQD {BHZ Kag,KsMe=9 3ρ&.v"+LJX( xہDiā)<3 e`M%lbAzR( ;ov|\AHu "q-\ҹ*0jZAQ'DYI(Ʌ>x=D5l \(R@Ā L}n=˨ q8H-JJ`mF2T#2 ;# Pː?\y$'Y [#;Y܏FKI 9E917;ޔW*>b5ujǯz}3Cx e8#`e`+ +-CW@wv2$=p:TP"jB+Ta3*;pd=D|)>eZ}Ea ,[g;&vݐmQ{mv?W,v{IENDB`PNG  IHDR ?OnIDATxbذaݻw?x?=1εk0}@Z=DPm۶u 6m{۶m۶Ƕ~3s5wˎLCbxlkv(gY֒@ <7ј+#;G-tu"@modm+\h5N™k0P*0 ԯg?@OBFB-+L.HM*@8.`YYzSJpW^[Y ҫi|CL[.*;t{3BR@W 8ӈel˒5 ^mW%ҦJLi6;tMGAW_UӋB8Ψm!?@FVTt ËAW~ ا1Ez:pǶy, XT} f   ^Z? ocAq2- ?{ "*T"HJ78w?b739˲;t:?SI,~vQ&eKD󫊲/QU/DbX>jJa/W"_)Օ(JBݎwаF_~ G>Y5WYX%H um|i#V 9֦۟MpqT˕a;ilx&l4y00L>Ca-wf h>f#ypՈ;O}9A]pm ;۶cٓE.ѐs`> nMwo>Zk? p\wnLއ66zucXP*&C4h$6WA!ђpɷoA2M23y(IENDB`PNG  IHDR ?OIDATxĕcYmݱm۶mOEl۶mum{4in';PYY-0!9]]]`4f ~@%?·Y\>ûJhYS&{LJ~ixa*`"~SDܯh(QY=\]vbz=q}FbRl~zGcՈA^mMhή%Fjw_wB_:R n;&֤^xrfij'p@Y90`qIZ&U ELށݽdᐒǔ9W\InN<<_2{@}P_eۢT*Pi4 L  $/! =~IENDB`PNG  IHDR ?OgAMA asRGB cHRMz&u0`:pQ<(IDATHcxÇ^GE0M;zs /:!0$@ኪS ` py߱+Wh{Kip|TM}w߿u LTX?1^8EC5x|9~M`hwǙU(x;39;J٧\K_Wd_Q&40*ŀbjɑ'}"m%/rԦ,ƵH`aw鷀:đ>0Cn4͐ziIǁrw\ 5e.{Ags>Zmݘa"Ϻaj>l&`@5n#qw#7k okf~\ӷ,.dF VꞾܰPb:]h oVf9>LlϯDz#4c6ʄ_ qM 7IENDB`PNG  IHDRHHo#!PLTESSSi'tRNS@fCIDATx^ͱ !Dс-kiKlt FA00G/E2rj˵~ vEPrB_RMX4uIENDB`PNG  IHDR m %IDATxklϝڻ^k&18R  0mTU]jJ[î%J6+UWI6l҄W<, =3cg^q戻;sΙ;sό!R̳$ !>ӍNtȺ(@GK-F#0`ݒ8|k=QU&M' ;4џ˳+/{z6knN^.9EGU ԂFxzY"H^Vj;YYay계 L(uU YMmV֧N~7 uD0jL: Zq|FM|O(%%%Uu}s# ԓo}:@_d=MrwxPvinKܬݦVsXYh4$zdiLyrTS%Hd":6bRPUhK__Iv9zGHcp b*f_apfQ 6k'N O@d0PKA(;?pgxx-)L@VV,%*\f5,Jmw&cbWp1u&猲ʲX.lY3'C#~Oo {!*5a?:^P'G5VG"Kk#-KrWsqishQ2: [<, ;c}w{¡.~XmYc'gK\jٛa'鲾}pv1HXl}+뮃6PB  g/T ]E)G53yj{ 1w[ ?> C܏d2@L5K1n/5#:Y}Cٲc]q:Y]ktĦ-`ŀdYIV}f}fm|@ >҃ۓ'Nw,] @ l _\M~W1B8Zu KU &Kz^i Nv1NSn)g; t5.27̩ܞx̛\nkًLbxrB4;f,e7C;7OJoƘ {N1PAP@g\ϣ8hČg}U2>\ZE-tȱFv.ɩ^%V' 8 Nm!fY&RgX/-MɁZ)]`%А; Ba1noYN@ (*,@@d,h-LF7>N̳C6 W(͔*rX!sGgXG?uF-N/]y0l:TqlO㉷Б"Hq ] 7U;yV]yXh~;pNfW\4M<Xq>45a)scBn)<"蚥(4PmR.WE]Trq?d=8u^`ҵGy\̈$̇S0㬄f<>^t;Z$1^} V<+7@g2#%\+! uq]vmܳv_$DUSTh'uHQ6<.^w{VX 'F>fa>?hӠ/ՔjrPjf|fOʗ%Y'B [TՇW˔iE~!} ˳2jٶoeIW}1I~# &/9=`lFa̳:f̳d`#?ڳIENDB`PNG  IHDR mIDATx}Pqm'vu7I'C҈C?b3 #x9m:ֱ "ƖcS@%W0pƄ rqIn79"{`e]^{ <x&eɶm0XrgG Oz,=x˶|w glEf)R0n .ֻ3.ʋ+֥{վOY`A:L#*V9듛X$gqۄ3h57XY{- h4e`%Q4^Kc lFƖaRǺp[fiU](+ȱFw B0ؙ`}"G}sVL,ƍ[:a\0nGXwLӀhOhS018U/ۑ+0n^Ea}BURzXy3ƚkPƳ׉4Ʌn܇Y؇ns=׼B[ǭO(_1ß[[O ?\ ]#y#2oȲibMJi`50'Li g_J4UKweAZމ`?D#9yO$4\`?'$gHˆ?Us E(>:Bim¾zX4L^SH:Q Q@5!q(:1yiۤ8d8^}FY6N1׵j7PVc8~4Xs-nhua?e_Bى+Htogc")k%"VQ"BEy~Pc({/!bNt&2d'eUj2"e[#Iǭb3E*9?AcNUٿ_]^{5z`rNYj v2'$ePV+QQoT0S>Q3c8|6з5J=)NKPqi$H@5"FD8aEc0MqN>Zpz0d^$ebѺ64qEJ1PSq+JPLGUBnP,% wK?U*_5p10Nqv'ScN *T;0_xm*ep)$. }jK8p4FFuaMTZ8O˄Sj$a_PǷCoWb*^B1Ď`]ŚUlϭN?c,(bSC]J,3zYzcX532Ih)i$TZ/mnAIC> Pm3V5sTFUٻ{!A¦:-nU„5:TҿS.Uc朿XKЫG O򬀐 tzq\#gջo] yU^r%4uE8tN@{.vKh@@Ùa4h@UVH%_I/ QR X yΞ'kJqPy~QYi `ӭӭǪJ9'W 5K}d~*N9 `u|c:P).M]3z!K!ܗYWy%.NT-,#s .uV5I4~:x/Dfj6 /yQq2 %,i?߃XU{VfG6QAC/4RF weㄑ Uʬ!DZKU /[g=ϗ ?G`Dz@кu>ԷFM?'* 7#ARyop %|/7bB=,s}gwL/SZS+D~ լDZx+/1rb|R[IENDB`PNG  IHDRhsRGBIDAT8SOTAywK"jr!ĆHE&&ĐXZ{w\a΃-$1"1P Xo_Gu_*;|-@g`ewa nEn@P+6!B >Z P%{Bğ)xa<_v.㻹0`(o +_[uz]'zL@=)Jn-[|i/ϑ [+n%QP2P"p-yJ :i ˻ED72x m1WTM@ EsXw0:S<>qUVцm Fɗ^q&/wYgtV~En\ul'eiSm>klNuug.zf);{o&&gV2?TĿht?91/!ڃW+s8y_RJ a1eIENDB`PNG  IHDR``w8,IDATx^il\u I&EmR4e(~1` @ $"um"8Ube6.NٲL 9 93\evp*j"2]JG>z!9G677Q %<JHH(  }w'tHC9#w%D8~ndyy駟޾u&G}/tm\>-6o޼y>YrرW^DGVO H___ .9j6M'}')rʭtxO>p8܍`mfȥhkkkk4==3H=%|rRBn^+fK~ɓ 귥Vnn䔴Y_x]U:<_ArAN/4c @ 7nؼvw}_!]bpO.\];?ŗs⦟bÑߖGҿW^^E''+(h"ܐ#r -puߑ_.--W7(q臖7~W^vR]ůwZJ~a.Rf{ِ#ϵSD, !FĊ)~䂜rDGN;__hnnn [OaU5T~tu{ Ҋ3/ K2/ C9PvH6Sh\1!6ĈX3bG9!7@_jkE1R7//ѝEU D"9ٹU5NCQ;ޣ̈́>jg73-c%@9(X1 D!VČؑrAN 9r~纳@m W?6&:hr}9ʆst^PX{t256~O calapr䊜;`@~?|h2#(Dj>U<O36*T>-4.p1G+rFTQ0”D4ߩ~2*GiuM猢˜C\3r dpJAQO!|n>U=U<9B={fS c A31K!К\3rԆF\-`bCƓፗfSM}s)J cf@!G6 ~QLex2_HVT ! oEȕ6p݌ SOύoXHn\JڭIu]^Mͯ6vO3c>#8Ďx+Bȕ`mh`ט^"?tGgSҙJWk ׊|Ʈ`Fu{@e 's;ƓZ93lݱ{<+_RccqC#ynmK]WNsٜWNzgkc*KtBj׷=LiZq@p1#v@!G䊜@=~i" oPr]G@e ^/!w9\ 9m)or R1,@NԆC7pO^1.ϵS3FDJ˥ɴJ4jW12Z)T-Vd#"6<aµz|Vէi,]}~`l9/^cw\ɨ4u[z bBlyp1ֺ & ]DeOS>B삳S7.BN0ͯj+~/ \{2@@&#@ U'x_zU~ 4 `;/g\"?f V ɠUw^':A|We pq 2B^`FL-RTxOX~ Bfd/mvOP>@@ ʷM甚"Sl b,A/Nu+ 4xJlӔF3Cs[vr[I?A 9fW&F *b_\\@M3tQVX<0'V5Z-cz;Űd y8ZaaA~ zmP75#*S&w)TBٵ.yj~}٣kRa,1tj=y6 `B<^аK@uNJ[ܺ_^HBLE`jA՗Uڌ,'-\4d>NKH3q}Efeh!Ik.\i1CM3.v l`vq7b+Ja9^e\HR~lMof 0yDBӨ`Zac"0Wa`0ATqY͑o^ם7gz&sWJLi~6uO7/Z:$~0_T333iA-x1[@Ԛ)u٧+nM)~kϦw,MB!(?F#JU fA6&g:?55%?f?I@h^h=0rrR~ `W\ 7bbB~ !p&pҀ(}drT3`0(?臿:MGP;@8!7HGOb+9\A8(VB?ѓJ8C>h[I/l g%0˜tDGJF/|d=t.4A7NM :5TA@ #XE[4V\O7' / ߗA @NIzt1qt1()1P<-RңOLM#N|મ#9<+6A  gK[*G7o>;ۇr? rzԂ* ^6V)MWJ|@8- !c_Ox46⠘hGK\ȷUx0Hn?xꩧׅ ہPb`råCdvCQ''_)Is] |,[v!!¡**5\jNCC^x{B/ /Z&;vB_@2}מ1~mkŅ\3rw ' B,STc"䊜;<O( B/c4ׅ\o#9##d  %$$P@@B.!lXIENDB`PNG  IHDR@@iq IDATx^[WW0AOqlm6k,ըQD@DxeG!(*GKjlͦ&qG{ϼ&3~x9{y~swK{ox4>xNބha}lZt7 n $ij>ÂpgpoA,8HgpЩ~gp?Hgp`AH(XLH@uhJ6E6OD#WPOLS:Dy#,đ2 22-/!a [\Jő~‹ӵɼb\>U),w)W #D},#t#pG qx|^NT+Ȅ}/@wMG^W _"ܳep o&@V5TNBSh`h0Z5Of-RԤ)6>znEX\M: Xv%o5:kG_7> )z(qJ AGLVw.Z?ô<}|>jGYWڧ!W=Yd bD/,Y+]q{vuh(X\`K,ťiQ;pDczgdbjvai6"ן=6BS"RNSc5w"O xjs]tY縧@a($HX@&ѐ=-gĶiCm^hY@(]fjPѮ!=? z )cI+Cu"_՝8'tbgSPcHBY]N47v&Y Їץ*/D]#]JڞR>ЇGq$?r*Ꜻ0Qq&n^ZyLe'q9|FqŶ{#'4jqAJX|!;#:F-4 9Z#05Qv^%EUeLBcjO\y0{GwHةDN~y6:SDv%6@uqB=JQfI2Uy '=L4{OVs5"˻> "*6ԄxPU)a%ň sx'͇4X6L EnULrRØljpx:[C"Bu2Gʬߛq^m/_\D~rfi}Li&ERErSs3 ޼ s/v_^Ez8_EM1B^\,0PY|'HĽ\W|SkiDBm}+U#8zVģݹņv4_l}2ΰ+1> Cתu|''؁LQ ҈י J}M#cpAbчT6,Χ|FK%6Au&Fl/KpTN"gn,,%jh<ސo|~i|(߮0֏]y¯ṔQ/ di/EUM7{Zaah\"Q󬊾э ѱ;Pj*\ΑC#$ D> H ehH"6>:s¿Euv2[5ɐ|uack<1Y[TGQ 2ES |@Fu|cйjOՉ*;+P+ҹ69Od_c\;Hybu ē~%%N->9n)zklm +wƨs-!q|15y֜V2 M+F: I?@^ @ B/lJ*eym«9n޶qT$55 (]V(:4%m v9zZz^#!;S"9Bu$H86bY5EЂfb:Z8g@{`3M3B!(d""FmP A#ZC 1|Zz&>k>" DD@$i5!_`@gOCR  AOk{|`/~_WfKS?v!۔&8o2^~7mQpWɄif>_[!GIENDB`PNG  IHDR&&4!%UIDATxֱ 0 A-i9+(AFH #Bsf!_ k?#e̘1cƌ3v &]*ڪ  ޮSIENDB`PNG  IHDR00 1 XIDATxر 0 A p.;BXx|EI{ܞk^ u VrG'#cH|ιIENDB`PNG  IHDRm pHYs   cHRMz%u0`:o_FIDATxڜ 0FMo3I؀!SewރDRY`;uwjR'MK5)͂$mA!KZrX>Pcp9#--cƞтV6`c]VPOLGFW 9~ׂ9 Gf>G%C-uZpȝaNIENDB`PNG  IHDR&N:IDAT(SI/CQ_ 6XX"$j5THMXAՐVU hQo,9ϳ9P DTF?e?1)CQW|~8NLI޼ːn!z89}3jؗAJvwG"lEpC.[fۊgk^K?!s K/O2OfqpEV74:D,GH}. vv!R!yDGDĊrC48H{Oh娛45b6$\n籰ےWȕȠ~  W6d;dZ FPT5ͅZXO8]gdlB4nߊ#w>Pgg;̠u[,*e;5 IENDB`PNG  IHDRr ߔIDATx^QgPw3Weo! /0|,"S~zW0a6ɾL^)3)r\B@Č_6Rz#Q8cnY{}D|zc}5 >t,5& QaLiөoHHQAT]#_T! )j2Ȱim5JW?JuO v۶BB(ETsX4Ě%D_@qoFIENDB`PNG  IHDRr ߔIDATx^Ag\Q{7!RB(a(eha4UV颺(2dJB em>5^s2ͳsN@8@ b<#( )A/0u N 7Q }5_D F|N1%bgT0TP"9piJ& XPXHgHKEY`YPհX8kG22pғmiZzAbF+<0:{Aڱ"E=ʫ8A `'cFs;segiÁ-\5=٠bCL  e[` Pq {+ +c.hJIcGu K۾<~ :{}vg_viT? M|2N}i c9:wqΎnrqg;&wp @`Wbs"<^o2Ϋ^kk."Qm__^3d H8QE씝`*1w60nQ9\r$Bљ}DjZ}PDKJF^ޥ܈Bj -5ry(Ɲ]3}SeDsu{SG/]IENDB`PNG  IHDR``w8IDATxShHo3ƞֶm۶m۶=l}e1o kM)RJ)RJK2\\,!Uޗ>Ϧyϟو>A#8N7sRW}NS%F%u3Q*}Iog, 9$ց/Q4r(Y0WOu]z.uɸu+] 4@4@4@zf&h&h&hLf-GWn@yu-ô_ tp2w|/૽&@fw$c=.@ &9it>5.9]qvq0c9!)!IIMkrGNMG8cg؇7I}ҧuN0DTm@U* c|V;q˙s+tVV_c6me녱nR#^HgZ  +#c|Jra ƆMiuOxyZ(1F$`֚}o5 &XEg?f !QCҍ2|HyIlʶYN~cMCVc4ҋXhQҽ,1^.#Gq{z^KTweQ(+>urdw}ۇOD@7 Lg:[I=Ho͒0 >E&g,,x7A찬H e^ibl"ݥ¿#7cc} RJYR -sFOMg"sT azơͧAAb?]ݹnmpw{)N⾗{`taxޙuSGz{KLvGzٞj2# H! R>D*jLJYR?|<`1WM 0>q6 .BkH`C|zk uXJNzz+Ɖ-B2}AFk 2e\,2J] UgK7%e[vi."Mnׯ ;'M 0 {ϮVAx]\ -,çV?2p~hRG!}D$vHFTqE0LŎ| F ܭs7vdxKםmP7/w?bIZPOF" /½iJ0uW*Y}EDEwDIE{=FZjiUsvB1eddDvkӘoËigڵa0wcL\Ϭu__otoLfw 榟p 4܍vt-3eLE>3T JQ'3QK37ts=V̴??Qwq^Lꪡ;Au#z-u:V\Zb7էK3x)`3A elemΏtѳZa'<M pOK=a'q nM-q]ѭC5z2%Lq(T ֮Ozu<6܏ ,׊LD),3ס zrĬuK M<1'g)GpRNY 0Slӂ0?g!$}* 1,ElP$Aw4RLy0?x<o xWw6LPֺ`ŷߟ%{ zsZ2EkEWe(tp[$/" ^\x*#z@Z<O4ׁ`S7BkM_ɴ> }59#]hL pCB.]075Tߛ7;g{1RqPBG[wb?71d6Ps?/A? *X## J$µ?4%P~rc>U|@}7JZuå?Aفinz +\ޠri=ωE=nR1k0KX&oApPs&bןևl;0{Gsl63Tsb6fmlք/׬Yf80Zh ni gg1;6]j*hI\_ݛS-um ٞazU/}j[޳I3li6ޢ?*80VǕfx=weÖ/6jը֠ySכ׫XCzc:~ofq㥬7dQnԠ,{ m3 lnf`^[c m {Q1׽e_ AtNoSi1o:!y}nݑ暨5*GҖZDjM:] 5$#,THwK:lJ 訴u讻[_;[S$2Q' [Krnb`52-q\ؕZӫS:5UqoZ~MYi Z wˊvr:@U]/&Zֵz-٬ϱrv{w*NMbkp`oӺVӼ;Z3(v_i3hjFG+ۤA؝NTki?D&16,-Fͳ+o{텙crbPLyQc.,Dɛ. RkӚ\ຣt\K˘&+ ϮM0|ѷDAhQ*bEuش3'(HeʱTk t&0,nASˌV4uahj['31\OvS+c2HAyCݫ)wV-#RY{'X~W z[&ʑO'A!e/f+RU-[rAX\ sUyV%~^V4Y5 c̺E+\.`E7Ί! ,'!lI8Wjb}FhY\Xn!7=C-Fnn\ bdMl])|q86aMylbͦ/ñ+]!hSZTf|G+b >oNEټŴگWD!pŰZmz[1iZp\5W+Y>M++Ϙۇ,7 rJJQ3{O~[ ܭL\t4iV1Ӭ-MBf5MZ׹~~k_o} ZXIm_LwB@[yfqW9 Vdddd|D<8ר IA9aiS\0).cƥbnNƏ悡 }=):ud;p3dE@zIFSKAό9C%fԁvAߏkݴ`jen<6ccH3OӃm抹2ܓ "ei;WU_Ljs4ݏIW,'jqjrɪ}* }V5ҡܹEؽ&3sgx-`x@=Ozd*1~|"٫VӢ/j~gWZUAaV_oGuNTx TKa\wWZ>0׻[Vt Ah[4wX?o ?~M囅R"QoM^ɉ,")DthiF,K,, F8:q4IԌR&Pz|e(i=)Ps+>ORn3HQ 'qi_Lf0o0"n*ɰ4T-lZzlCACBK $&ƃٿ[,G&>|2[hӪ2e_ųg`yӼ܉_2/ ;vkcF3$ ߮A-砃|) w% :av'IZ&v?9|?Q/A' $<>t_q&xOփNājU-h.kFC1S cq`:J$QBel h":83CPҟM')z2.~8HltMouڏ?HUaZ+ː}͜pv;nuxkOKϝs0T_lZ m/}"L<}~:d_3g_J٧Kd }%*;uq&B]ig2;H[ls:a?{q?+xz? ggpĞrS`M'Sxn?r?xK~q ;zmo 6*9qv<\[bW ^rG}>pM>-LA\˔fc\ orG3oaq ?MT{jm`1&UU30E¹,j/T-!_xخCmyrL4>޳P5( r;ev࠽ɂ7)#R`Pg"M@;CmW*>?ԍ#C}\U : E $@yl/ -9ǩ'g3G]{L*f$xOCHG%ZH-` WU^@}[v/mlBa!B@z mC/@(um,@΋4;zs{1Df|X@kR6ߑCH &[&#@DpL 1-TǶW!aG#'XBT,[(&#xxHE #d<|_&l# D}6"K)|< 's3uYXԩ16]5ZwV7I3% nK`-3&O.1Wj{_0TJED_%^֓٫E@25n ͖w*am DcMma3[dܯ"]$#aS`$ou .{b!E¨B]%:i>@tKuoJP@ ϬQ=j 0*cjݴ7nxi K9)㲌I,ZQQ7Dğ'>[7aduŦN:&CaB=Qz(Cц呡0GZ 0kD4a!1H9c057'p9S<ӧ9\#ebwS 3|`V ?&'Wq)Le 0-n#=/$_5v{u 1vXF Xy-AcI6 sdK)4>\跋ߡp n-ɕz$bU&k&l@mwykL*Ua( B̂,\(Cv\Wlܖ$L6ET2#? ;Znӓ7s1kO(H'ZVdYqy!s"(lT]\>w:leM1jɋ9Bg[lcv_Q|>?Q~WM7<ƫWj»O! 5oxW\~HwӨwx?g\Ok,a[CE1%׶VrcX-u`~s;Ho2xgJ%";E$ԁRNj dŽ@=8)ñ{Kc CdsP؏:D8P}{aIal9I^ؑTT7lx`˧u VRFՁ\4n /ltc4j{?HcdutPv~ l^^hHA6xG&L+:sեU0m'6e"!>H`lОHȎ"mXzwT,-XMDuJ@"0BԴg1VB/&'|,%vo>SN#Q0mЛ4fJg^?Ov8nyqiC` '` I ҀQ\l_"F 2H .$'3;R"%_TL\J@bpTO/z؃mW^ o`UB\,6 .)V!:-OG0PVk?r=.#?}b ħhLb I" $jbzXb ?\$$4םi}qzFLFͽ2, p M?Yj{%<3a~ mZ혥 "ێodW:2&rXrQAy-F| LOOv͜خ-BMI9Tp2H"#iKHEu-a :ZDXO"Vz|yXwc11aDd{cě1&Rge!'Jq⨻ŊNk 负A;fPX&'窹ABa6:ëuMBî82T{UqD `_{7z<~ <.-eZLTƑa(vhLzlޭo9 f,Qoةu jt$ cXR&q^c*b.bYW1ԫuo†jWxAq4Ha@v u~#)twW$Vu>Rgaۿο_)3ͷi[P|5n2,ՙXO (v@1! 87yߎ抆,($Ok`q#v_5CVg f'G^:tҥqȔ)~>v5H$5PiuG4/'?`Cw0JqX1-X&@h|pξԩj>IWLk[$9Ŷs33( RJ^u%B5_~!?-/7>?w%+4>p8^F@K1x:,30!$ f5lPW qWẗ6=]6n'^رNECP3O4g}k,f yxL>K WL `;ئMu< .$ӡl!i{:P[ J}Yx_>St==]y(؈ 9d&zЧ ?!qq6)'\OwlIG*/ii EM?qe /l$fS; a|Wo7tp㴋d˛J`{=Lt65;zf'{eϬSsg!=gYg#_y/;{qd쟽p{{?x~lO*}Q,DגN+CH wȻ A/@vVLfkdC'g.ϝh/V+SchVE̥8ggɷ&Wk 䜌%_*f'd?6{,0l+0ov \ck)Ѵ8 `k2ޚo`ʔ 5҃rN{`C%j$R)mٛ{, r[ծT2ٷ:X z=uw&-kF|UA3;gQBZIJ+]8ۑ6c"pTO^ajq(zw\5L(Xƾ=0aXg4FAP|JBu Ekq =9>/CE^,}J6FQim~^> j k  ][%6|GM >=JU_K*}wh^uð]<^^@$M\'{qEww$TU#@(4LJYqqCF!X =t \ ;x"lTǑPŤK(|v8=h  p)\)ӑ hGFQ `X`0KT<{}I2Ǧט?_C|“^q:; =~^rމ X~zsp9ٗ\_.g\ލW7nuz0TgY֯>^3i#Ndi'?m@KZ:ćdW` UF0_nӵo?˜./QH?1e|~pC+צ˵V5 ?I(/ PjN/=/J{(͛T[lgIO[wc3~:ˤ0'ϐ Ȥ?nqo:[M8szS {~C2w /._cD%A*>ɞ;:KoGswL5Q~u)|Xb:hP|ZY"œ'6ы/fӝP]? m_*{C0Slӂ}wC_7Bڜ$`Ɂ[pGafٖ<צKo|yoB/:^̕E?U-}I}0.m PޒrWLosǷn!9Fzt~Q&ON[Dս,\J.,'pn:=]a}49Mӹ6||"ݴm8[3?40K?80 PJ@+H≜7+Mu%"e,T^ezkr PhxE0K=􂮅╙E<~,Hd@Ov>%#~L0MIg73x4/+'M#'rĭq_=l+M/7nar_;Wpkؔ~ӽFk0~ Y;7]~8x=!VTrr̈t/񵈑RDPRd{aA(H@)3FIcSř4CS(я0~XڋXΊF72`]s#9|$KνP5hNi>~J/I^9ftS~~Z@r86㡰͍6/;vv)x9"N'9vmƤG1תbC̋@vH,}^K Q`wmj?ɧ5&Jrgڮ]bUh/P|M㔽=)dc@rI{8u@ =w/3RM]OCQu\/120(];ɉ(FP1mɁx4'#3L1ɑ`^6n|/b(YrP:>"ҿ$Gc=`<z`|gӏnP=4#럿}`gm-. gv өG˃fu5n;e5Fqh7Ct7q,{PO"kwN{[V3GTk8ϏSGy'+v=8^REng=' `-ǃp)w' @fs=[cLT#u} & c%A.Iڥ$ ?!S&C-ZrO/E6[$TqR륁wXSxO[$PR1>4bI9ܴܲ4-ơ Y~[~GmQڃ0 [Ն %㱙J̍$6t{G֩Vy#n_mq ީov[a#Y/$NɰzGB|Zxى% g@-ߓ#3k e{^niY]hzBנxѧ쮯|CA/rQ^_{]B5][|rڔ1пbxB5әk3Hvcg^Kokonjr]_t}awav*}9`ULU7qW=-~ד]O`3w:-y#I}ڝPO/1TK'JR Q既Z74-½p?f!j\ݵGxf=/ +F)lߤE3+w`m>XEw'{ûwA,$0ܨ\/Ct_N/Fkbo< D%͓m}cZB"Vv%2-mS׺Cgd"GЄϫg΂zy MzPQCMӧ7^{}soʕNK8gf1d}@O 1^Z쳵.R 5YUFNG$CFƈ1z23;+i؅ʵvnNb6ޏ`'e"oT/CuS.ؼOZ0v>9 &4GAW4M3;[6yR?q#</j%{?qb^݌r(}&zT{anqRM]0\wV =ŒYU Yv&Y}`kO|UTK86fI[ YoOս7J9 v3:简 M[TDzW +,Ζ0ƮȤ+%k;@Tըߡ5c*.?V^)Ŧ;8尨es*mw ޲:1^S}55r )6sWoxwhCfWe5wb@'l l$,[ -t]t|)pa[9)C1](h\̆hŚL^{>L/]ׯI^)nXf|DOGg]_\VvgWC 7.%UH޷9_VZ5,nD)vPmV^'害g mͬ#fb2-7+O[++XҬ+YVt6{3Jksr6qĝ ,pfd6]yOeW`*5v ڬ`fNk/gspvulk@ U?;3fuG7i|NGVd '|ьюl`ҡA\\B˝F5mZKat4ý6l⨉My:kcζNr5(WVL: ^۪.˻p-Og:"zSuԵۗPa[E JQJ`aOϗ{gȄ]F&юA+5;x*XQ14%5kz.]iPœV-̪)|iֳ>[A5+zV.+6 e}S~QS= hv{3Bm: 9ޔv}qdYSE- z5 lYE:[q=7Pp*[rG.Xm*3BxoYGR)b %Bs\a:if4km&lwm-8i60r02{k%쎦bXghFʢM+e4]N|qZbk%e|ź1J{Y4&~Νꦶs[9K%4;>Vv(qea~>˗#kZ@."V"~sm&I21r*ZtvQ3G33tR:AN#vE! VJBUjhfJ/wBJ"5(vev͗yl~=VXO< cF=&0IʎoH4<^6 4l5iu]u@7i -u=H‹0'϶!j{X{zyV}xԤ ]?Z䥺6) 4iƽn , VWNtnЪ4JJ{a䐪kaRf{/VhɲiD̳h?tL?nCfntuE ٦aFl*:2XORd\Ժ0)bh☮۹cRszwp׫F+b{S*򌾻sA]^1G7M{eTpm%abBۨzպShWmo^XPܖ;Bv9PaEBLl=iH0P概ۛ?Aoȕ&K^ jSh 4a&/aYH]^Pѣ8mb![lJ0l^] 7nnfM{^[FIܲH{Ղ(uIq;+*Ƹ^  {쾃cv* FaYnT$ӛݎea/k+J+]#zll=4YVq:Tݐ\cfV p+ʝ KRgχ~D۲A7e=hFl.j䝩F9bH ۜa0ֲf[i7 m>Rؾ*K:#PTJRiW8b\[Zk? m#׫7zubX ĨTxVVbL(=r7 2%ZS+m`DjgYnXLӹ@ &RJ-fgoh;.j9)5|{b~JܶFZa:[ٳMǫJ} e]~'t%)6Ő]JV U ]ՠRI~UTIɔac٢/HfZ0%^~)4Y0T(&l{qvU-;>>G"";Й\ۤ%wv+0L-D\`ПF2+= xL (ҼEg`ȁh*X佰pW,iɮ?oA6_4[EF=PZ.P=,f6ٜj+}ɭ%6Xip]8o̚; }Ӫ2fAWc,5;X=_jn-aWi;gee%~'{{k[ǤNȫkcJ<D "TveN۽6r݁5\z̶hsB!H sNs٨՟sa~cZbKCO,SB޹yC `9Xt%p{,9d뉲a&1T qy˾DvaA"[ p.(b|{]6eM.@+m̰CV`nlLX4\WZlPv v"U\715l` iOAܯRٔ&uLfmX-2̘㞟:NA+x lJ8׏.|/#=9)o*4>DАODĪ=IcRgCRH{sECh^#N 8h/d-5 0vb#mQ[@[ };Ft$V "]w/hMQ bQ\ghǻ<6Ҷ 38H4OepPP s4Gh|qm2 "] >-OG0PVk%I\قY-踽?ֻj1165 > cWsw\׃N]nr>&bFbĉXa@ E Dp˘P  LjN l*Pw1 e T!׺ ;/o&T :>x{Pdڶ͍YdޑM&>=fr(Noq&/ @U+XяL)"vY/E0;GY AKgP1QQĮ D192Q58&֡4{ eW״c?Lxmj=Rx`=GIш.N,J5i}GdhҞ&fY*gkeFiQqV 4:!5]*`0!~{G\Z5Bh)EUy\*t4{;䨅<*eeaﯜdeYrЄMdגai)P[CoQR;11&;KZYmӒMkڑW զ\I[mmII ib #-V8 Sg| fӰ:+Kꬰ}g,ZʹÕ:\);G/8'EX\9Yre LJ֤9\sx,.*cvXdAyIJ‡r'쪓S,QʭI{V jN~@:lXŸHs߇%-H\$Q:_RR " >o/ӄ̿]˦L|C Qn*Vew%R&GQ7/\ā=X , iueݽnnĻvx:Y(<4{Rݯ,uQA{ 'uo\;`ܘ(mHiG |y蹙C 5u>5L%("C D>'z9rR+ mj6Л儐1LhIill16B1{՘s;S@z z]z=Y\^s[١;QAnUMZ+K\Q~Anjeei@쇖6sCcie(VKtmnۊ-OFףR2֦’;ʠ]z-aaV*StΡ~K72'b}0SVvrEme]WSiZ4i7a ˭Lx{<6%C e//9y0dzA[ f`YylupǺu-5cm5+[,.AVm=m LXH&v&*6eY0lo wQ.|UUgڸfĕjՄA&rhr^Ϋ{;76Qs>vfo5ʋըY_m ֖&VE0 2dԲ9]įrL]h>uV&![5Ikt!9Ġtݤ_g NW~(!+v 瞼uc$<j7mYAJZ-rq0t91S~{o(adk`)95b%raEtXx%VB04tY UG^sQޮ} }Ōs"?r@"Es&4nxB>ϐuգ  eymP 'ͧ5Wb]$#Iuy]/˕ v7c_77xv9(OX@0-pa~{C m/(LOF-+/gj% 9q)cI )LW[\\7JWPAN w .;g8h+ s/%2u@Qv#uow.2 U|r˿2P^6?X[}ȺWd6/ދf@v}Nzי_$wqYU~͖;φ(X ΏlKc0/ })69۹*c](F{A3.z#zURJTx=|.V>T(߾ed_-RGx@YkjV58'8Y1et+C:)AٱLP k6.@-ӲMבB|-驷ϼjC\:( nJ%HX)C50O:(O9;^Mŋn4fÕ&ڙ]ӥ?92xу[Ua?&'vLj_Mc5J?k&p6V;Iy+N7-Tk sc1mfr Gk{ri [,V 2oZLLJS-nQz^;Ɓ3iEo )&?ja$iU3{kwt*6G }#vciH&PQ.1cxghE^_i.?=Rf(tGE'}=+`mhv"Rͦ[>kBNıuR 3FEԫ}K7rltSqATa4v#M h _l/x.׻"Qi9NςmG*EjI baNQ1Unl2'pyi }&taOk7 , $48X⣈xãa41wQvbʝfŹ$&Ӽ =}=rNU@$p6<e26tkΠ5;VdP ZˇC.̈́aAGK>nE+r"e? sþ[8۲3zJJJEm =F[m'r_6x>-Ccfgpkp LmzIhe6_21q9lmWTX}dц:U:xp%C5mMc<ެ󼯰ظAY̎ >2L;Iҥ6b)XEQT&]_ASM&t΅@w QåX[2a( DIC ,V$p1ݕ` 3<-ŚƦ!ʥ5 LDaਬ@BM16mԔ}cwI{hP#NXewOy-%Ns*wGB\J Q}ՓwB5 |t 5c.BpTl>gܓf&ކ8ɨ!tF񚺎A32q*kH8c(+&/i&\cm,)ɐqJʘ(jJ;caNOLBlTyM=c`FHMg`o$zX\WmU3{K0W(_Zʷ7]OjfpFQ9ps{O f  sPtiY -bTbb-Guk5Ų~`jNJ*3'et<2 {QqEeOAPNG  IHDRnMIDATx^?ha.\Z5=*IEO Rp$Hs8A$A8itA)-5Rܾ^Ky>;;TB&Y,rXd0_$Οk0{kƗ+yښL'ۋAk}{x #nޫ j-/njbc~Me15BUm \nE-:/WҌQX$033 J!8HI3{a72t`n( kP f;F/`vG)pki`/9|?n\ "Y+i <3O3D'`# tn7meMw U2ނV6 fycr3[J,e`zMoYLV&΀ rm. W|&d hbX ˕jKمRY |,K `L˫TTɑMWZ8p2 c E|XdƧ l)E6?؂,`b* #\,@@3hjTMՌ5}-e*~k%@lŪQUrUzu_/d[ʮl!Vm6W 7R%2A`pt}WBQHX,hۮ|ip !,F 2fj}pq=1pBNSh@9&9O6YyJQJG<,t-$ҰR^|y8GICNh|K H_vJt#,l! FxvJt!`&Dt8r @&[HnlywͬPi΅Dn8:/BLQ)*S*߼ L\l mM v7#Bޕ5BEIUG4yU{Y/'pⱑBr%` r6\:IО[iL_r=G^9x@![qRutQrƻL\T*USwf["Gw3JS8'e!ZUkJU~ƪ"Kצѥn40W1bH TdYHAAgѽw0Bxhg^TL_hȲٽsN|YVVR |Sr8{XJR9'4eV nB~S4%*A LpUGsN|xYV_-za]W=5I) s:;wt @g)Q 8ı[A=r|x4Te(8*yB[#܆vpr{|ق .p Xe{ҋT JA*l h4eA BoTJok)v4^>xBJ4Qտaݡ-m_v>~q_?GvB㔯,ȫX3yg%T MRj5p/NV&DSl %)MP*Q.\e*xk 4RJ<*|MLPҔɯ|_#k~0{#i..nrWJOJSҔ*_?JR¹O ;kDtͣ]+=D,âIENDB`PNG  IHDR@@`UIDATx^Q@FeIȀPMEA O-x6}.Leύy|x@oĈqgA{ 1c! /-B"b1q Y`u B%+bI0fFB2frcP(b<<\D:J=<<r=5|u%_S!W;5ϩ  NM_NuMLyIENDB`PNG  IHDR@@`UIDATx^=K#QNތ/F#ɺA [,)Y_-+a]A?ZY[m/"kgc{3NFb3ȝp<H) @gFl}7r~ !fd6] ! :" c Y\9 #$yn ;:[(AB@w H@1HE#<e" q'AtG,0V9 @5L (p $@绀9^(a4:ou_ 7 @4:o*!pHL4 y,`% bFPB""oD>1@o| "7?nw,vl ۶|doD:oEHNЄ2hB/4$?͘] KqO%7&4xy:>;XDS U̢[ n1@1 qh`:oeM(1ʉqI3^N5ӹ8t>AĸMHx;-O) m tIENDB`PNG  IHDR@@`UIDATx^͘mUgޛ!$-X-`/ R PF LmWWK`-E`A,TDQ:st8 Nw{.Os>}sv<ŃH@a53gP^W[uVq!o(d7jxW!qxy]U]L*3uǿw:NL3exT|r?uߙTP֞ ;@=NL}e xB&gJ"e|tܯx7@ i}MAJ٫GZH d tr&C@ @ @ @ @ @ @ @ @P@P %P8O h}&蔀XAӀiXAF@VsjZ4.9jv"XbԨP"8.%*Ԩ[T!GLHc+a(S'r+14SnejĮrY^DԩRɤ@a% Iy} fu@f  ^ BzK*N gGY#Ft^0 A \lLR8dSݧUwcg6E 8en?NH-vh6Z <̮VPv{\%t_kM̭SߚM hh* Z(";PsG 4x~MHjz!$9pV 7;`C1iΚĄ&)/yv~ے>JQϰF;X7"H"x XKytq &S9E(> kGgP)4x;I]NDԨP8ɣʯe9S?v=chҠ,!Qyp$p':ذb -MwxvwktǡkH*F<CdOCЁWѱϫ9(R%$w'h=ޟ)FL@EځF+N*E.spΕ/Rh+8 aK2/ 4l\5M/֊H:oZ>WIENDB`PNG  IHDR@@iq 4IDATx^[}lVW[BS*Z1AK"$$ؒjĎ!  I# ! FeP *J%Ӝ֛޼7'r99<<}y'(l?]$ ј= ALd2<~a_gsGj3Nã0nڵɛ7ov޽]?xxxx@{c^0>B!Bx}0{Lb7Ç q}< R 't\A;PF`#ZGqS@?|z3#s$͈c> q2, '$rKe X1?<1K`OI@;0}Oƣk'$d^To޼;wt8kEy0W;kJ]x衾)f=H8o.]i#GL=ʃcr]+BؓI$$IBwfyy}m@V=(xvCY!zݶt6[՝lZ'O}Wq|J隣8} )JeḸOAYt$ Hy4> GT_J: Oh{NW@@I>53Bh"e)L3Z׶P(.\l'Uz6mRju)HooP2*xIjW_f~?in93H`ذaҲw^>8 HBE,j9g_"H, ]رCV|Ne+^|ˊN,׏k׮f+++P[l[,sN'tC3 Yf#minnܾ}[qW< Y(|qcNB@]]6^IY^,F+: +Wt%@KON:FUUAN8ĊL5wh;sh!GUܹs`&WLpŊ#)f Y ,YY];w+ "{ |aƪkʕ+]gϞQC?VݻwR"H4hgo7ku(l***r%Iqü@' /xrv=gK2;++($ÒBW3N 0׵;$,@89?jH<|jnI"q]ٕf;KwLώ| 5f,5;$Q+:$DKʌ&슟h(Y!ÅS'~nJ)N1{s8T$*C@$TqlOpٕطlIkA=m "MaLEGc+la%up$Tפy%a'T)PBIIDRD^ɂJFtGմ`+{ ~fNzv#jZOk;[]XL*ѫpj聙~`n;?wL@Qv}D5 t./&Y+>T@Q1aU[G2A{1:&"{X@T(4ff"OfvwA9OvS0dS Z)zVXrPP "8@e٦٦.yH+|a]2T>sxݘHV%ɏ/)V>o:K1&pJ-`k_)QRT\]e:)JÀH{}X&mJGu [߾GxWٹgF' : ڌFDl^&Cb֘uN߷ȯdtqLI5_d-]1(A !3J nOYkp/fl|) <'44 SD-Gkڜ|Èj+O@iGn<OT#H\4 +$ROsʐv1b]8>ծwSNvl RPRE˝`xpEڜf_X#  6=hM,ZyKq!xmt.Z} \!jpY >ˠ\cqaCq7Cފ]kpvccp8 : c,,C4h(V|9^/_)[0(41 GqǺ݀)hЅbo5p $ɨU٭X݀,1,Ur8jmaO._@P6-k-RۡO#0 QaW՗?Qa ((k{JǏO@^0h J7X*?PR)IENDB`PNG  IHDR@@`U@IDATx^TWϹ3˲%PjڠZM)EDŨMcVcKBB"B@465ؔhզj",eؚA ڄ$twgg_$Lv/{{~3 %KU7%  E51F#ۂT>S5Ϸm3h GU[?cTeBH|E*T}7,S@Ck Ʈ[5Z1Ӱ#~'s+,kwb3fm8n QA4Po|0 n0պf/)DQS |643V{p=dN:唃!i6:H xcL[Mv[Nbg*)t>$sFU@nVF<NO &72;ѣ" %}6 {54EQlh)%Sz׀Zw9YkUT]>ڃWOrjGmsY̛ m{T0|嘤$[oPC6'{+NR7kJ; ST=7BzýJXda0<˕VW U fTLDoo)*^nrLTe޾gu8d V4v%*24&­@!@TLn1OsNS2@fq3Z -s@cYMNA!fjA*kxȑ-s1I>H(P}WᠳRdһMØ֎X?-3jvOU4P7fԨuNF٣Q`! U3M?<2JFmm]sڋIHUAݘ~#5u0& *@ Owa39fjQ/ ٭[Iw.(El~b Tא-Xn3𠽺AVFI/ƬVdYIrP&azf=V&ƨ8[2yC=ibls]%u6~m (GmU.8n$3PSnم}M~a,mb9ku<ԀeO,oU(W1ePq]υ6.cHs N_6K)u{lUSO׶@92RL}RF$^JZbh?D䈢LH ]u$4Td~7I!הbD4Bg!&w.( .R.w|I?ylNIENDB`PNG  IHDR@@`U/IDATx^}gu98YE؆2F7Xp4 Lة | k^d:QQsjli#8* W0.9p{E8{~/u z"Q2AQb k!r Q=>_. YzNAɽcr:/ 7|٘ӆAk5dB3*6W-s5qW1/0 dJoxAfUhf>T*O0 d gbH'D "5-FE+]k]!lwyfif\:owRGuom6i+DĺA@ĩoR 6Vp%ih:fuPJ .HgeS P(K|| '>-DQ \cf뻆> xG[:Oi2J d=g.̿_bȰ[`[,s5dB%}0}V horj2 (k.i?t@r[;o+lAY sBw駇V |Š~NKJ}2j}L ytqT"*, а>!@$6VJݠ$x6U^ 2. sz)crUgvZr7E<  t3wڣ]78 m-ϺSdD7opވ2o Q2kk'|\79!E)PM`҄ []X~uJ2(^VUZsQ&2h0=M[]8F=Ɉ DIƼ`!G\(~~mmE5 *;jݘ Ga Eﰟ R;v=`jRaGQl_k ?恨GZvqﵧHZCڒM?gaIUՕG^r_? *PUhCgFM휶_;)΄S>N۸V*@bRh^4]]eJh:cKǨxZI@,ׁ85'x\3 t3E4(v;'qi[@~\Q}Z5C@[⦡yCΓ9(-@WL>euF5YYb x7>j GO.ԩ/ݩ-qi.I) PsoBG&j& IH7!}ubpu=cP,IENDB`PNG  IHDR@@`UIDATx^kWﳷaŠ[VKTӆvA[nj( ZkS_5!ƘTIl$ o- A757ʂ\2?83q 'Dx~9y8|RtďbyOA9ʮBa"D"Dm~4y+  NDZ)|s#\"y!=\xSUmb0% D$iF @xp@.j6kRIIk#)Rd,yX]b,a4c9C JyIzp0ɟ U 訤SO$*@Z% Gic/JCB1s҃5I_);t!u V~1f,12$ai>Hoc{T;L#EԀN"A6Jxc/'m^3øfn`^;# !Ш7p'{H; _tݖ9]N3!Ec;J z*isщ'f2_="=jYUR/3; n]Κ'JGaɘBPi5MooKF3i1@3z e14ЮKLyNU; c+ڦ骤׿I+v`q?$*PZ/]pAd.^I׏'PM؂%T~N:lk%]>8|tKҰ^$<B(kckxZ@au{X&,e1, IIe.HڳXBX`3ya&djR vJ:s2L頝Vd`)_~OiGK7oMN&Kiq"5_5_ź_Kg.#Q撧DؤWYɚe%n@E&>O th% pkTL6+zSa[gO$-)#l4~d)S.覓t)Vb2^w $ !I)F,|'EPsaH:i /˔o"EF:O|\z2U,#N$it7 l$"$ VvH:]1+iک#d>\ly3,B]_DQ`|$Ϭ@M5(QkP=~7WްGۑWb4 KN܇; wtOX?^g#^o`Kt]U?98ѫIENDB`PNG  IHDR@@`UUIDATx^_OiVX ?&-AaC GoֽMz<1bVwP3=PO;s2!'y~̼s&֧~/T׀> +< w0/ۗG?#߯K~1KŃAT@8xJpCx<%xOxKxbx <pw"ll?<>fCm;0ZX)uP:(5;6k>,{\ƲԒ2VzpX {?}>9,s 䑓}|}[Xrz:6J3HaN 򑀼U_,~uj5 +਄D_BqH@J>,:*),n0q^q$#I1go/`; @j6ޜTMm:h(@*]%7+}*. ]:<pBa) g!I;=i>>E|y.? 7z0$rm%e@OBbJTC0q?[Q Q= cF BX+ƏX}#ۦclHZx `,~{( / ,EKi_WB[¶%D$Y76xAq_:\@ bގHB[%skvtP>T_^ԟ7?l5:}0aѬE {Nj6'^ ΅ $aiBiLx`1!#_ܦ;c^c].<O''! Gwx||8apw8h||'N \YrDZ*)k~_\bhp~uFm/1(a=ъ7qØIENDB`PNG  IHDR@@`UIDATx^ٻoUeY|Yvm+KDbPHHD(nґ*e7(E@J4q$ IlCj3Gc>r2srymGs9Y>N#8 QQ5TqxRL)FX~s@eÇƀA|µM(_!Sh4K[BF{e<1uζRM8OCa\/!ڄx9C !&,)@uFb@4h2O#@nƑϗ!*7wK}ޗ9wOs ouU_P8N?wa6&]%) 7lt(yL\?'` : FM~^kγ">}?&+Rc$r3!88IKt,^[]I1OJ%S&i2N3<-ܜP?Ma 2&)J_1w?SKx PG Wh-cv7'÷## 3.m+8 l Ą;^/_251K[P3 LyEL (`^/*~J 4X#T`Sr7!yc 5NZ =xizBI RŎ5@/ޢIE 2C8rѷK Ȓ#@dj {@[zR9n79V"Ujzߣ9.3F "]$ħ=2>!/3 =RcL2[@ӄQxnQZ3BH$dQ'̔54R0،RoC>_#:E{IENDB`PNG  IHDR@@`UIDATx^OKbQn?WMYX)%6Zͬi5ML+׽@ i{8nj|Co{3 >`B`SL)L{=v:s߇xD]'#*@oOT^c` ] r^&Xy` 'yp @0%@LBޔ`0!rޜ WjG}Y'K8@D=c:Y"aQR(Q:lMv{ӤN)8&,E, `-ؠ-lF K,RH 1MCG$9*B$WO7C(Ǒƀ1` ƀ1`_#>HBdO(0{kxߜ = v7,7{\}yVӇ$0GQ|C9fHY)iTY: reIi9>Eh] 1yN&s`7QK߇f*"o E9o [9o ļ}0xy&F#B:@ȐD5X<!o i|%'D?@eլIENDB`PNG  IHDR@@`UIDATx^MoU=db';-qj4IEP6HH "6l+D+|nUb^T$+M[5͛fp|S sѵ'Ds& `=9 y Q@(C1ft*n ! tRNK1= OAwncc8*q^ ԀG`2K{}2 ţHz505V3G G -\ST`R07Р*Gw_b SR@|ɼ|2aS Ą߾<53э!hB1rAyi=Z7!.(n7o'KBTG~kI ysu|;p~{ovv*i1@ _6%?tG&q^_9,++#{0OtH}3,H2M֌6SzwOdJ@<73Tc?v,Qn_,t,Sxx„p/.z?\*,LMVen`o«Cۇ>)=teW9_/&|\>1uR$ Wp>)qƖL o1+!=:dCBHs,Ӻr(nd <<*w_t1\#kR!@֎g) X8ݎIB-%@VKC,.:rTK\M*ei2g9GΈY "GKyYR?55Bk r6Ӕe27i2Y\?RCc L?Yrt>ĊIENDB`PNG  IHDR@@iq IDATx^[}LT)32"b T]-KYݏVݦJMvuUiMMhHmq7Q0.d5Y?¢Dc4l"ongrdy#Iړ}wι_j b1BLz،0R>|؁o2WQP000' 3%fӵ3>}###mpttghh mѽ˗/ϖd!”6چ?~ \k xs&]DL >FW- 5"AST[wr'220 *X4/*>'g${ZJ=:$ %_9!eu "HcANml4= r2B6ȖB)`"V?uF$h Ҳ"ōsRo~-V{P_A$ 20j/X@Wd腕', WYBmtB!ACee-s$ \ ټB@ZOoVھ@Z=8W-N{Ɇԭ ۀC|$ 2D?~z<_sH0QbzWnߞ%HCmGVnjp M HI*?O:4& >|x3/$H@4( ,]ٷo懀D~S}Tb<τ%7|ދ8Ì 56= @s=zT;VGٞ =ͣj$ۚ`nZ`ӹjժw H2HuB $Ipo VGԁ7. kw"֓!V`= `= Oʒ!'! Xd>LhlAE m6y>K #@dfflڴI<|p8**jr7E+>~>IDeNo=۶mRarh]^Ccv% U0HIN2AG-[SBhRL2P{r!$xv>RZKƍ;v(Ne}M{5OMM;vڵm/rbxv7QNt" _S~L X$9sF]C, gfNeKSyq…Bev}'O[Xdggˍʑt&`~Lx,"`մ*HT&g\}AW^$޾}[\~C^Јuʕ+744rØtvIFF! 7o$I-7+˗{v|:o_ȹsNogYqXr IIcc<!960EBB! 0o21r|0nܸ/=Kc9Hf%$F1RLĆ`ijj"_Tw3luWycijgJe<Rgܞl5}5;yt99lRe˖mDJ"*,}n{w!VؘU34b།apH!n]{ N>JZǹ$ZM@(̢xiw2b:n䙓#oN$X:ބ>O\PD/FlCxABcҥK\`F-~嶚Wƃo&0Iq3\l/g(%8D?xt4-l1f?ESO|pH_fZl[0?r/ް`'f|'x*/,^cDJxYF Wy:+[f$ {d<0Q&[.U "@j$? !<R/IENDB`PNG  IHDR@@`UIDATx^͘]h\E 4V1^ *ЪP(6*j+"*("*5B( MJJj"BբV"Es=0v؅p3sW~J_$x$  Xp biYEb\@",>D LFA6\Fp|($@@ >x*$' H\|" Ps*$y Z $ E SJ *H  *H  *H ?+Y$»%UWA_ ~$UWA_ ~$UWAs^@{%Fƒ>9Y8-Hg#xC0q[%ǬkEM*n"s4-dUӄ(RJ l =, DȲh!KHD25v>;b7 S熍.3BтjSIFЦO>!7!/߳ %,fe*jC Fp sM0tn[)QBBc 7$f{N G:N,nhg8@;&kB-˸bG4w*$ߍ#o(H2eYj# \ ( @DE4SC.#붓"@8}q|p#)S4Oc>Wrpn|FW*8 ;⊧'45s|Dq|Y)ᯙe<dߔvр7x)o3^Ə#4QY2E q:^郊* sq6A=]_xu<@pAnpq3/ntozFW5驗{n$@L: J̾掝}sa) (15^c@ag ɚxU'ЪP @&o/ޑ"DMX#P3- $b\(C[_[w/HIENDB`PNG  IHDR@@`U[IDATxױN"QV[Yz#XآbLԇ) >%X0(|$@u903Θv`p,/m XJ/¼ C0Da?!ލ B!+t 11jbL?Qh@PO[E8֛\_ìB UImj."Ig#,gZXRy.y,@7XCuDazT!Ęm;+t5? Ѹl'8 }O3)66 WJ߇mic#? {U|C-Η={5eEp:ou FD|yBTZ7ǤR$&@M@, /&9&+r)C6qx(`GI 6yR,ՉVa|HϔƜHS s㸖pGcП6nqH=ڀR 2 E`#KǚMNMѦ3nBğ-ݖI(O.39 1썻Mݣ{:A;k|T`C%)t;ΗvC{slyMxrwpZf Y:~߸'I1s:>skUZtifYdܥaÝtpթ[fowwjZ=X~e1[]@< I15N3i+7=іd/X@rj,۰@ʤ$&0'ƞ6w)⌻)^R%Ūl%xeP qOSsEN-BB!KB %. WRmf\  =vj]Zm,=-{wfI$NZCV4Ǝn$-#NёPGdHx2Dg?izbw sdbϭz*U %438Lqg@sp~ Re%yET( ^OzG2V<Ï%=с!͋,R"ղ|Ȝs"$^ڰrdX߶X^m}0gN|\"cIENDB`PNG  IHDR@@`UIDATx^{pT޻]!<" "i vCSe:V T )#vZP_V( J #nv=_3sf!܌o=|sX`R#D^>( u`S+T.nI+,Mn]#2ᔻGuN!D] VO:BQ(hl]彯BҴ A# ^Kt.`LJ<1|U yש##ڃaR&o}0wP(\7:/޹{X#p~SM &Ws?}U:Eţ}ko>Ne(}~o|顅!̊q nhl"v;{3w pPXQͅÍZ=ƬTE|\ԠxTOhw݄g"GܲV,.72X,0'џ>pOj2 /(+K_k, @ێYaOWO~bNoS1jvʂLҏ CgkvXѐDϽXaVQK zzvd\ij=9#K n^F%_VT॑AXe6l* A'/hbXVH4 h٧R}e5)DBXe }:7Lh/pu47 rߴ 6luE釛8vahS:""M&}An?JBp.Izr>B^~aPB2 Q >yR!8! ڄAX \ HB _X2S2!ς-PEӆV*Y%"'XzAч -APSH_od*Zy>Crp!iE8nIkX Q+ 4}uKyoKHy(߉`ﰜMsw0"V@Wqݓ>c`.H TMكPA[ Xm81+:˭}FdWɣ$Վ`(IF=k$MHI(hu<Y2Uzt"Pne U!a3E,ಂblz)?]! xTQY@.,a:c[F1S]&VQ@޽?jQGW&c˳fT0 ʝP vռiD[\ (Dw| Io>齡lZPjc43&zLݼ"iN" ɒ!MWΪ]WL0Hr2 D(@m+׌=$^aIṳ?ppK<9?)͌#h@:(2j+/_N-G4h3GʙYЩIDh|̲_shV5 UJ6ڼTS-j6u11t e< *Knqکe"-{3NŃ&639OFhy&TtwD*J%<d.ŅտeR#^..* A"Ѐ(ﬖAV1Á q\lj0&qM8v9Y\vO0mցCe}:B<:|6!v:Dh8HBO#hBOdOSAPym(MYWnJ mJU%5 x\c6n{sf_sЫ֞ܗIENDB`PNG  IHDRnMIDATx^=kQ\I6.;! BFJ^H/ ~-VJ A|Y=rafb`?BЊA6Wp$ G a2yiGP%Ϝ;x"ӓ0 Y$e"!# C JEIdHLjDRGFbQ*!^1(˜."=!U5~yC=Β:tjw̒BcXt\g81晡@">=,BHN9B9EE)غ]=Ug@Zl@ +k5zvPu2͡/rћB=&%i"mf7NЧKJ=ޟߏ5CwcHp$I qEl:HʉIENDB`PNG  IHDRcIDATx^KSa;grH#5Њ.AWA8m"/E n 궼A, <|e9ǣ^<;"=SJƙNňXWI¡25lV\Noh4m03ֱϨL&˺SP55b$̱>??[HL]T$&_r@9sbb"GcpގDBeSSSt. D؟yĒZ |=HFN&###a|DOPq#O YO_Ye0.CQ*0oY@? (fow=O*@IENDB`PNG  IHDRnMsIDATxcFuX  C=@8 E  "b4U3d5O(-^5?[ԁQxxAa@v~<  (1BK8IENDB`PNG  IHDRnMIDATx^=hqrIZ&& hM}B qt*)8Hq"88[!"Ep%jN? LW1MKz$iA,GKFI3QR8ǦF.B/Bٞ>բZu]CSeQ>䌸Bx^ť ^l<J Y˔qIrۅw}9q.zuy#b&|b&(B|G̏m(U#JD9|$#b"Ef_rs!n!~2xvη_I1.1)pRY<`?(/eC@2cԘ–IS!K覗~l("'񿺏F\Q/IENDB`PNG  IHDRnMIDATx^=kQ߽3hb̺DbwQ,T"Z QB,*XD/us$s1H9ýh?` Er*%q}p257{mj-bxkbH诓> fk`N`_+e94!S$ #r_j4I@"ȉ,hUMO#nC!HZ#sr#A3bANwVk*晤F$i^1Sy0,\P˭LJ-  .rIENDB`PNG  IHDRnMgIDATx; 09Zr BZlV,& y40XyK'8F+2 #f`:S:"2U*,3 "]$b_IENDB`PNG  IHDRnMEIDATx^б@.`Xm4 gW{sX-x7  \  !"B0Ϲ5֜sČicv{DI"@JzZay"& X`9,p *y2E9 vFhC袡0om%{~rD #pm' VX7XӚ]/Fu) 5UgB:3X3_ (&tוI$"P 8Dg{Ф-P'a OGy?$3BGIENDB`PNG  IHDRnM[IDATx^ԱJPrIriҒdf*ugP tWp(եJjlʱJBCn"bpЉ(lb>GYMnk2$fs ^8${ED4|01@} 3hI,J"_Ͻkġ*ҕpp3Ñ^h<fh,dH'M MV(RmQJs4 VpPXh بlrI~&F.!ZD/J$M\YS&6V`'6PD҈ZǣJ y@auP1Yb"IENDB`PNG  IHDRnMDIDATx^1n0߄HUh;0!1u* S9TU[T-C0Mp$/Gl=)R}>?h3jN69#0xMdLDm@9L}' >BD3vjCP)pb iס6N b1.փ{#Nm$%=){?є|nBūaprq0i f@Z. !;Ѕ~z`J(γq^Pe /vDr IENDB`PNG  IHDRnMYIDATx^ԱJ`$-*-ikjm} >B ]wnNwAi R{ppg IFb@hwO6$Q` ߯A:88x}Hd,N!8= 0NHp"Xik^zkB2gMM߿$Ittg|p*:xH^oϙ yPR"Q^Z# oկL"YR$1Ӧ]ϓw?ih0 f/:66 .GQ4q%~_7DP0RC'_zꂿ7gɅCq)uK=OTƿU2{:wߧ}N(xj$uQh'`?QDL(oMh:_ݣ'իƿ;WpvqOfql3Q3uOw}77;!_7E~#&̍:iߚ}>r~O]!oO>($ٿ~W b3 $lyy|DL^[/ȳޯTOľBD%Jh  ֠]J~4<"§``Ѿ³8WR F4 &4,fO@\ܢ|Oe8A&v?BJJb?iZQ2v!=jȈe}m`2?;koW0>|Z3E?wGsNNhECVƏp殺(` 2<=Xֳ݉.|"iwGMeK\tO[>h #J(]<ԫ}s>ǵDW +.|x9YϽl娂Hc6xs˳A/ n2$Aa_/* @w3ɣwg1 UR)hL;0CJ}-K2y^Р4 >y*2[Fzk@r(,0c/ا(|lG65@ʿď9nhxlVG#K꯯Oi\W9gw_5~DŽ}ǷOr K d[DG%(WK?Qfye wÙ7!\h/@r%c0:\Q̝O,^bmǯ?5[^>n_/M o? p,尟nϙuZirwFc-7ـϛ}>f]˫ w5&2|1nem'|Kɗv>|jadLT4xU1o qN*7 B/}-3~lu~\9иIMOk>:}J> `%%_3~Ek8+1ɦ-|˱&3\-? ]]Jv{j&V49k=]~P5&D~A?IaJ+f9-7c6@8"e<7:T݋R6(>~Dɟ6wI5᠖yeP Y*ky,iee?3}<,ň_ˏXj 4AhJ:ac9yOiVw1IkxGN2 l!09*VLyMPNd|^x<ƌH?qN)M) q-d#JĽRaZ ^[scn wIU' I(},>5xhA 뭅}=P*샏6ʼn(4A ~\ݛL[xRPt _~<c5Gl1݁7,Ycs<ߋ#h"Gyss ;r.H5Ok<Fg9'?ic%k 8r>8p~2%Jay2'O<o:uH0aJ3v@ VӲ^6Ϡ!"B[6_3KS%oy#_!sP>s`ѭoBx/1wG<-ns*m#}ad3$ƣS/O `Ujت[&~3Ɩ5ۗL o_=b *lH猯5cײl`#h'|3@fvz_ cXeڨ2bË_5vs~} 0]\~)#ERDw}8bm<`G_%IENDB`PNG  IHDRnMIDATx^KTa}љҌi2* *h!ZE pW:آE`IpPA/]-LT6c"!j 8b#njqa-#]˰csvyec-%7YeVfR&i*GxiyV:t^48BDۃ3}$u 2: |CO{>L_ɿH_s1"Zh'[}{l[FM&NiKɼSV^* "{@3O.>p{_{mG I!41m|b4YA?||liSIENDB`PNG  IHDR7IDATxڽ 0 De _PY JҤ+# {ȀCdməBIENDB`PNG  IHDRAZRIDATx^a @ao] 'ZHmDTOHP%E#^а?c(AȊ߭ _镚po¢l'IENDB`PNG  IHDRAZIDATx^A@ E{&Cx <;& ^d@b7 FAȒ(lj%9&ZV ѮID.NGG@^lJu%9Q#Tr@T+^SBWV/Ƌ{oǙN8-IENDB`PNG  IHDRAZIDATx^}A @ EsA0=Wh]h5 ]KBi!۫I,ZYg޴pb`"t"Rt.4Z:#J@Zk aoR ӦG>pn PJ{F->/n\МNޚIENDB`PNG  IHDR7IDATx^ˊ@BtHK@ x]hw4]k1ϮU{0:9eq yȒ$܄K!`-V. 2 h9T+FH/lTR#{h$Je^%JgyHM|AIENDB`PNG  IHDR7IDATx^͡BAᯜE,TLٌ,> bC\}_9,~S3=}>tBN-p$#I8d 9VVH@#Q% aL5TW;FQUdÒBQp0f,R237?dw$uIENDB`PNG  IHDR7IDATx!nagF` m8C O 8W (!Z B!̾h-7һR{=5.fV iu"d lSuuh+l+RȀaJ2FPCʷ0:VԒ0+d9Kz 'ݔRdji¯ҏxY@#[HvaIENDB`PNG  IHDRaFIDATxb:lt`_gj b #p-`k֓I;\Ok=$O\hcg'gW}/Q`t"|@<YYβvUI" Y퓟.U~'Ph >{5`v0kw7&@i24 }9+ q´ƀB(V)d_"\!( zF= N~ y'FXϘO$E۰ HobnyPr  `OTÁ4IENDB`PNG  IHDR szz IDATxb UE Dq?A:Y,Z 8%n@362wd7}LyIAL=c|d|~~wX/)Q{{v'9:{a#IVD`#:ߗ⢮(7MAlɝz6zT_>*ꅞj|ಛs/_߶6ځη4Jw/C9gy/vzb:V#j֞Qh>SbG lV*_mF!ڢ.:qFgt0 xG|j v6 >WӅ9f'7'+(-O=xdBIfm:ˣ:`gB`MzH|P x]H@l 1"g#mGd}c"CHʥm!u:;#ilCϛ86 '"9-y(;2_H+4CW2饴QHd\gO܍ҁoӿc2$f|9?IENDB`PNG  IHDR DPLTEXEtRNSX=nf֪ij .[fxFͨP\~0L?7p4ftwGIDATxڬr0D63{xfy}+ŶJ8 V;膆1MgZLt+Qϗ湝 ɲQI!i}az$ - LHj?^,~)jv@R d_vid]j:B?lSQs-;T|r=/?gǨ<;_r/Wonֈ: rHnScB 6۞J҆L IT\`QAY:t>n0"9A^To<a#13GMaewIENDB`PNG  IHDR@@wPLTE_ch`ci`ci_diiii_ch_ch_djUU_dh_cg_ci_cg_dh_dj_fg_cgajj`chaei`di`ciUUU`cjaeh_dh_cj_chchh_ch`dhffpaciajj_ch`ch_ch`di_ch`ppmmm_dh`di_dj`di_ci_dh_ch^dh`dh`ci`dlhhh`eiaehbvv`di`ci_ci_ch`diddd`ej_ci`di_dhffbeiddm_ci_ciadjccqafk`dh`ej`dhddi`eh`ci_dhbgk`hp`ci`eh_di`ciff`dhadhffmaejffsadj`dhccm`flkkkbei_di`di`ej`ch_dh`di_di_di`diadj`cj_ej_dj_ch_di`dh_dh`ci_ch h|tRNSU{ ^:Mv,ֺyǝpΤ@rL oz Dތ2e.X9 b#:T6(N0=k[c3ѷhc ~IDATxS%M ෷m۶>hMU>=}e7NAI &UWċCe pȉEc$/,=L>RIXXKk?^wb;H'-6*i~Xp4R?7DXu\賧8LH`$fNJa;E2?& sEI2 EqcMb1'X!>:MVQ_ZIV,YCU/=B!8봏4.5Y}_vMLU*[92Յ&At 2Mf"OyyAh$JuY8vͅD5C r.TwIu(RHȭy|iy!t +VrBS$Q1^$Y(`Fx#dFcҟS%s,>~;ҁ[7o?p9}w;N|#V>|IENDB`PNG  IHDR@@PLTE̚?TtRNSU^{ :Mvyֺ,p rͤ@LoX 9D2 .eb:T6(cN0=kz[#3ѷeIDATxbJKm۶m۶wS5]ut%|^`; 77Cӽ@;3d(JCK:FdsyjsYI Y:%\*R~knj*ЕXvpE&m:AوVt3(xxQ,HV5"63яk/NCInMj$席Ǩ$mX\USi&i-u@t&-mp 48mY`D?Dh m O[$k,m9QZhQ8BL@* ]% G3-}к8G+4Hn=ܘ ]\ݧt;wVm=:%1O.}_YZ| &5Ԫ$h Σƀz4@.*h=T G(& ?UOMz|HS3$C=¢ʰTX\96[A-6W6IEL+" u05#wI~nVGа1```Gܘ}PtA?ea t-'AS.?uN$Gqc>]t>cmHOoo9[6soIENDB`PNG  IHDRUIDATxc  +P>+- K 碦e=PTLćRӲPCĥ⯩f,Qn6_FCiSb5A$k)je@~+'T3|&K$딖 W `ZYgIENDB`PNG  IHDRUIDATxc  o>+W |Vj[A@*EMzb5復eJKA_S2Xᗣm 2ӦIJk H(>R]ˀV aOgz )>M Hg)-Aip 2$(- 'IENDB`PNG  IHDRUIDATxc  8+P>+- K 碦e=PTLćRӲPCĥ⯩f,Qn6_FCiSb5A$k)je@~+'T3|&K$딖 W `"{hIENDB`PNG  IHDRUIDATxc A&V ;@DCԶ ,?06T@ jP1 *KM^C Be /G%@|d! UMe@Q|@DòPR|6@.ϮSZ\!Ң+dHQ0 5@c͊IENDB`PNG  IHDRUIDATxc eV ;@DCԶ ,?06T@ jP1 *KM^C Be /G%@|d! UMe@Q|@DòPR|6@.ϮSZ\!Ң+dHQ0 P7ڃIENDB`PNG  IHDRUIDATxc .V ;@DCԶ ,?06T@ jP1 *KM^C Be /G%@|d! UMe@Q|@DòPR|6@.ϮSZ\!Ң+dHQ0 =tB;IENDB`PNG  IHDR'<IDATx^ԱKUaxa!C2)(hn 4U 5!Ys:8AC6TFf_K\9o:;>Pۨg_lౚ(VD̺Đ3 ӚU츰OS۔o.(25"ni,R=:Yӑco YN$יaG!L:c9~s{"Ӕ"4ԓc>!>j"WOZ2`A*f@4[J[ʰAKTVe#-aC[7^5,3XHKYC~Uv[YBxw iMWoRim֫%B[X۷+ZnSd~lW5rWٰEuf*\#Q U{麰_ˀE3~PyV'>-9+0! n',IENDB`PNG  IHDR'<IDATx^ԱKUQA> + AIAAscQ >( ɚpp>iM-ip"^νp eFpHjGOZ3!S[uQf)]R2m&--Zv[Kvb9Z-ƬHViϙwü$'IudU"IgsfB2oN@dMy$B_zrfU''Y͙C"\JIRT#Ȁ̂ ]𼜳$UAKL~k| *ٸu㭆+_z%v$_իem۬+!<ֻ V3'6&!.Y@]ҙb,;-?ovmq_șa ֙qG,aZ{uQ䧼`n 5 صI.ӄ6Qcpˈr@bp`IENDB`PNG  IHDR'<IDATx^MKTQ8ch9BL Z 2 @jad:ʅ}.EjS!A pN"98'4♃>x"шU3n.1pҔz+vBد.6雋Lń%Eˎ{c_ZزzuxmF-Kj˱P9I!Ig1+z grl\2gVr_dPrlEһ9ꕬXAx!r%8*#Ȑ~R13輧!ߢTb X z!mU|jl̚VwJZ)t8\W_廹ymm[TRhH,+[bT-9o;U@5y6䣁iEaMi+. vmK0"QO|[rNiXM VK?\IENDB`PNG  IHDR-|8IDATx |Se?mڤRh)tB1EiY;". 3˸ P(FWY(Be (TT(DA\\f6m{s4ҹފ9s@.(2<O$l{SFTćKyYe֥xLc_|{aa[U!ϸlr>%%eKnUTT81{tr]$rT\ ՁkɊp ;pm(sq[\uXzk^o͏ꇿñ1dQCmU\IΉҢ&."f)C1zII6`R#WtOu ̋ -AƐ 1Wl-E똴@NVG\0հ(W9l9qdXA+Tj"c,tK** FUr 芹zOg_t%/g%\y.Jdw[+2L^B5-om(KWH0?W9,)2ƕVćӊE+ _[h)7[1=FduyZx.Sc/eHqT~_6Beš\dũ/uWBl.kch̕ա ZyyyҢE^%;*(6J(hZx?maUI!@AYSlFjؗ|1UIdKyL>\|QU)RtUAFMnUUU|OCsd*}X:_\ F9F2ռ?2׼ok+spx%~T\);OJ}шo߆&\XGQ OXa5|+Hf5JR3S R8>s\  k6_\Mcm5+-yƾ[OrT%G_^1mz洪Itւ3͓FW%K6ds//\ڳ暝ѤilLWQkcvϗb1\ل~\p8ZYY’8ˋ :7oJ{>=Y2k0:ݽ/ls !+-W#XSfUWWGS?J^Foۖ+LkJLh%y-|l"8ܛGZKj{F15t Y.|? kײCV"y2XSd|#.n_.%jއeRKJJ=YY4 V)", W.QֆRsm)<(*/a|X}w?T#EV?jCy,3}Cs|m#V2RG >XG1l P9cpQ,?~',_kNQuW ψZĵf#+cՠ ڣЁ}a=*z%5ezoε~ȥZab\ଋqLC\nSWeV*׺%=/VLt2XR37zPXZcNC+ͪ^QVчa;jPn@kC㎹krH-2q\Nj~do!zUnŭtm\gw,4-s&8C6ҩ6cuL +rku)*-濕7y@2T\Wcr+ S`!gZ1ׯ,2W]"F|̕䱮_|!%aEZV+[B욪[k s=ք<_8#eCkE&T8בYwIkXtf ?k^er}7%\OڠEc#rgQ/\ё{cx!UGkD.U,-waIVͶXWD>1-smGd4%a1E`X[ֈֿ) MYz BK )HX^Mz̗z<`+Y5NX𱠗_%kt8" Ꮕߗ7T\\f\/Xgky\ȭi*oL~Z`:U}=q siՊő4r;y WoKYEVO16\V|mgX}÷Fͷ1Y痨C 5k* =GУ}Cݵy 8~g6JlUÐ0zx6(0Q6ښ׹{mU%;@xϙwy=kZވ!eќ SPfp4hXk HVHBc5ʉ@ݾEVR&+ sE(رn,ד|c)omط]#}ydXcHo'r.죹ܸϙ+d1tO+?kbgQ{%\iZ#>_t -x?c^jﰕ%gxo^޹e.gۈ9ݯ,d!D s)daY^G:9ߔtΗ6nHr3iK_аoj=s9j>[&ԹQ@Fn*={r|'׀)~9d#u;5%so^&A)Z)r)8QR* "#bY 묹u&!pA*@tt< ,q8}5}W)_X).Erss%35,Z]iղhYtmhSj:Z1I51Ba-F/CJKOw ֒sY.ڧQ#XCa)P~aYƞpmo]Z5/.b'%Ya]DT2u)퐟NMC%r}UڊkG.bWVPe~K9_>r7KԼ1䷬j(aUKEGPbQ>rizT\ NzygFtw|2i%ИKFnV4XzTTܠ +fMPR:Yј -JהVr26^.̜WV$ȵ,WC;c8'*qmԶږNyzTDai.n|kEs-_ i֒ƥX)OR٪&z_mq6Czqޯ4>"ִl>KmD z@c_n)'/DY*Zx_ЋtV Z k5i.VVD-,,C Uj=j4C?dD2\aA?X ^|&Z ctzpEd? MVX==ڃoȬQdQsguz1 ym\ZXV?em$!Zk6ѓo5B^î uqׯߜˬZmfZ=sk4H4ME7޻[}Q,c=47)C¢,‹aub-`̕ךUSSSF.FWqB nX8* y.+F #u:}Ԇ5zGbADX603E.^r…qꡲ;+Om!WO~?~~vou辱 鸫"\K- JȐpaNZ0ƛ&\dIĵ-uNi|T_X0ZVpOR"`sy8}B.e-YI5O0ZhIh ID.fZ W6Xȥ\b~=c^R/z--C|KFOm3?:=ӣ::*^ai]UXG&kFVh >”,{877EQXb6Z,*͛E@*%z@[nRGǏ-y||~N4Yv/5kD7L=hYvZUmuͬYsYx"1J\|kG#sd>_[&\ HXt-em۸FZc4!Ek=eճc`{^ F7}>ꭡKQ~(jos*ײotK^[Bݹfu OMף{Y E0vczbGY;3erS2ZΌa(\4uch]ȜYՕi.P_R/>+jk:u#zTafn'8:,Ɛ{Ewn~g_4_Q:Jg0Jkmt={2~%6c7qZ b@Ɋ]9Qw".ۄ !<ۄ_^ 90ͺDXkz{0h5>*V<";_GoboLq Q.a;rk:*Cizk˚1mZhxd1"kǪc8.Ɛ~kJ%d9T5ے/ybsʖC8:i ys:(V'ʃD*^0.?%<;WhNWIou\\nkّ:1Н+~d}TgQ~XdV#(c*AV#̝X-+JXud#!jCe5c8k-c_Y78٢ޛųٺ,(y6Z2UXo_esm1-F++/4_/Ku:;Sæ#{ Q~Ν;)8?5g<{S+uWWl_K=mb R:։ߺo.\Zݸ,#Ok|rs1YTh2:DkY܂ aEa>Svk$5 B"<iLs\3KDn1䶆hP\\=JYܹ5QniX4y1>m]sd'27ÿJɜk4ZIX sm:YYq.bQ(\:В皣aѾ0?7;/v=s.`;..v}ż2[>5ZoLC02/N+6g_p=QD7]Kb oߞBAW"xS$~@?=Đa/ u.3b`bZ8x̅uK!{4P.1Mzseg(.oA.UƞKXdi+ƐV3!cX J+h~q\˶-)_+ׇگ@uf sv )սw ׺~2:_\CsR]FK˒Wo`WVRR/(x~?@`7(F,=g#-aԿ+hBS/0M\\Vn\n%rXz>Xt4ʥk^50$=\~[s)׊4K#_޳d'\Ao6/Rj\ch6={Dm[sZCu[\~E.PJS+cp܂pnb sM*y 5a%EBTyaWBK*hP:% =a |QW"K"vkJW3]FWvXyB}u15VbUҡsi_l{Dtw`BĽ>{=KKv`gq˵>W;KglP]$+8;_ ~i)X.R[en!N˄chzC+-X.nkV$ZʹjrE5X[潹ѳC\AY~Gz7抍lҶώL\Ϭt /dys%iFF%,SJ*/ks^N:y ' }Tv0\d92\_=1oyrZ=w~\bòmr Jz͕xKu)U&k%6qeyq*jD;kz2/Z5ևkô^hhi>To ևC5oZYhhklI00sa#G49~ OeE+5En77 4\VLRcznV'\Ebի؄\tG+JfQ.aeqXhE[\470璏f8E.1Y.yV+re5)G<2Y4 Mcw>,<_:H1\7W^cH|md,MZ 䶫2D7OmR++mWq[cށz%,:_ϕFvq5-#deşo~ KEV<:>=z 4VfuF9(:ua\_G K\;n.~K^ 7::'FN? Oυk\VH %-o^%e- AK r`m z'h(υ/tׇSۊm.FR.2[_*s]ѣOg)Ɛ浸0~5';NHDmpऴ'o\h- ~؏W\(ћ <Ɓ4Ɋ\2kb)sqChj5Cq1ќ_eyeU: %k}a=jpofy1b 1Ն܊1\>!jc S(uHy~(r ,_rk}*^{St4Eהݺ7G?T^VkkM;mmoi>m:wz^XKjllL9vxxa555Y0VOSE6;gl9|+[Vj[jB^9~[{dq}bzWoX֞H1+7a.鏣sssU,֣)TϕuYeoђck ÐP.xSXoRm0Z2r:||\/rˎ~{x^E?d|qZEd1CϒKu~ڊ5Gkޞca[?øri>oȋ{JeoȘkFeOn9i4j^S"y,o/Bb!=S\ux6ÇQd/wO\cEm~*n2MG~+G|vsf?^jiiJXmmm|qY'6WO>O\ngcz4v97ϩQa%iEdyȹpgUu+z7;" );WNb^++b&w.CJQ5m2YgM}~emuoYuU#_~tDKs/qM)[~xȥ%^cAK<%-FV}]m](S\Zu|s> |͢%p ZRfټuhݮ~._5)W抈 ne\m%T\Qp[ >!+6%,<_bmeaCo,Q\ȥyțkyzȕ9t/k פq(zˣNB^+L2:sG]GYe:`;I >1@iNN/r8_?XR_bZ "MMMݙ¢gyajZ/hK ˭Qё|V]R@&8;ʚ"\a UJ6 oJN77R-V2 Tő+[9YM<NZc֥^+fY|uxr1ZBX`\2UQh.&3fpalCv{♢r(t}bH(KfR`Zj\F)ǚٚ?_3+u fR++,p* fۧKz.1CMa䲶+a}vkhͦ%Fis=Qu^nq-P/\3?˕QEΗC뿵pI;cxLF0+ 7x*Y5NXӅNk]V5V9^*X"הr+U12C p(z5k -ɶV7dqFt%:a}|V;udEn;WVT% "xr k=%]&~Mj>cZ~ZưU_FsoػBZKV36r[45=Ox5r3ƛJ_Z3XcFJʷ CHLMB ь@ac-S? |]Sp^h/'в5Eﱞ! sR`.r%Uuy;-o.U>s,2ʙPCkhMyqxؗ<=?= 7\\?oj_VAgzZ27Ѝ~@"-Qjķ'^g[଍tu+nP?k>.۔~\:7>)7}YK'slYxsM\ :c]SVY^˓k@/E.Bv]͵DԆE5X~Z:EX{ٚ(Ydh5!bĬvcڊya:c4vmztiNJQ KZ{>*v*քr:K1KÆ[OV<>VpL\¢'<Қ_qɱgK"@,W62u/IAz)Sw)׀h6tq"'2yj#H(^yMkr OGs+aXXe/!Ĉ>Or P8yKm1~mm 'i0>g>,S>A|먶ZzS l[+J.5[cF:(Em(-{"yR#Pͽ^6X}[z\L5~(QjԼGyC]4JV!wޒcǎG9nmBnE K\üW.a eXs]ҊUhe5wv4Nk9rMCx997F.QCe5ji n}"ԫy9OAk$mI֗h%dQZ1Zk1@z8EJ >B͏›G~ؖhTXv暲6/c+7m~Y_d?\lAl u] y͑][1WSz8-ښ+ ǫm Y\˃lģ\!݌Z\_ڜ]pR$Ժ67:3dQ.U_b?5o.j\X s=C(W!Z&-ՆҢ7 kxr Ju[t􊚧u.oѷź`m Zufm\Tdi>3cE\x̛AMQo~sѸ Z9__\no?^,Z eVXʖ]Ǐ VZ,@yBF%uJK+DZt\ 0 F8 * IENDB`PNG  IHDRUIDATxc  a<+W |VZX 1,T5x/^zԲtKXpR m 2ӦIJk HDC2 ?hzX*^>BF%uJK+DZt\ 0 F"(WjkIENDB`PNG  IHDRUIDATxc +W |VZX 1,T5x/^zԲtKXpR m 2ӦIJk HDC2 ?hzX*^>BF%uJK+DZt\ 0 Fj.-IENDB`PNG  IHDR77"tacTLd! PLTE2S6V9Y4TУ֮ҧ;Z˙Uqwōٵ<\ФXsQme}]wʖkڶ]wrˆp‡8Xԫ͞͝:ZHe~ȓIgFdxŎc|[u3TVqj|ǑݼgӮܻzƐ=\B`Nk>]5V@^vČөfSoCaԪZumϡDcPlɕ۸e~@_Kh_ynϡ?^ɖլ؄ʘ`yѥ~ǒzƏ4U8XA`޾ʍΟϢ}ǒ^xmխaz֯ۺ޾Eca{Ȕ˚У˯ܼMiΈ̛ѦҨزirÉuċөݽGeIfyŎȔΟb{ٴڷ۹ܺ֟֯\vΠեسh7Wױ<[sÊUp̜ѥd}MjtÊ{ƐYt˘̛DbYsʗOkJgװoխڸ޿LiTolRn:YӨ6WJgVqfpٶҩ tRNS@ffcTL77djTIDATHҫ F6ðQgv A?8}p8nqQDn 2.]{;\{fp8nkG sofcTL d CnfdATH- 0  M( ѤGJi(FH L-pq/Kù,"Mr[&Ǽ.LЉCͶH%h/s/zfcTLdE您fdATHU1KP{`CQ"-tP]B0BB[; !ERX5 ~}|˻cؐ %Wޥ̹XiU1dᱚu87=%7 !650Z0G-_xVh\NPiZ>͠p5 FRj ~%W&+xTw$q?oFc=}2UD V=}U5(^*eZ61TBfcTLdAҥ^fdATH]MKQ3GH)7RC (MBmX`DhBB- Z d\$}M;LxŹ½9E0wVI^ 0 DR!GRNiͳJ_۱cFƧ"ET CG7oBVNcduðM9t+}TchHYʨa)ӻ0-[Ti¨"o6Y:Q?f(h*EVvIHNzP4%$qgGHY*ҘOc$"<bqXAHi~W6`boMXH^Ľ/> ;_lfcTL ))d-fdAT HDžKSqOmH91D+i a7k-SBʻ&|=Y3H]aZHAATl;g.>}q~:&*C'U~ )`hM2U?Ag'Fb0-I#ces M]{'4/VDqAڙ~;¦ЁS.,doņmA!9rV ).[P=4ʥ0V]O^آ|#kB? =4),jW`Rb7Be':\60]i0%rYKl{âʦ^nEY 7w֢e1nEe<>(lX(jZ Msǰi>> L/5)=,`RWZ2>ϛ  4>xB]6hbЫ(:{B'(dMkN!q*L$_!ŠC@YDi֧%~Ks+%iHUZ꺅0YAJvM]ո#ZmB fcTL /1dvfdAT HǍKSqOi KlaY^Ĝ:dj I,Y3E!" *1#yyQRtӟ#lsξg⽝3l'o "Ϫi-JF(]};N="kg*`ᯋLn_X|~L;6;4?p,gC$Qz5}ImC +H8OXGR1+ ⛉3U̸bMbqrsx2bSp!PLv'TF!(² 6I0/Oʩoe cYex+\6gR_ey+\~FOR"[/rx^zo(lj@eLg},* BV11|'g͹ƯGD#C128@#L8ڕ\S$eﴠC^l+tVJ\ t;bQn"Q<_xf@im^C+ &>[ x .NX.R̺eJr.LoS~zY؎X_D'6G2j5H_0+XYJ q/XGʒ@EL6N9>A%̸o#,4ng+-$HqI)+maw0B0e}﷛)&(aPbmUTGQ;k'à&-`7 O(àˡ2\r~b>S=Mg.2o-,ޕE)li3Zjy '<1X zϐ:qY8"(XaV۩ uo5R4k@`+UOTS!0%4*s }`96¬,17@ ~)oXo!qm$ 5H 摒Kv*fҔ;xu{q<2M&iM'=XU"?aLb*_f;/2.^zO@R#?q(4o{+̱*v{Ab_zZ] i4g پ_?o0J#,I^ms(*kc8<{AAHWK/! 7=%9$ނ9.bl1>Wp=3E@ٽ3jB˓An vفYXDEXR-}qZD+;BkSKŴs-j]!ZbMd;퍨)X 7@Mh(d]3#?Y6+M5:un&"I2p3API?I;fcTL77d{˗9fdATHǕkusK6Mf;ZRt ;+B7YDM6G͚DM )*dt^tU! ]h %_tq=?qz^b6^V|rHyQ-7?}%|}V>{_wm:nΎ)xǭHL=rroխۢX6G1'MM tP4 a["oYwʪ H*aUJ7D3V<4,>}CGp`/B ؉ּdn7IpK$"0$)\C7L`j\.JƥΨF* :w&$rpDU I+fRW;} gքb K|`' YxE 4[V/9ܓ.y5@'^$T],\df؍vu$u5Ib8%?had"? iԜ^ݽz# 2oTIf'tC{0tU4 w(P@ kJ_0/yψ0G1_y=h.n|Rc[ `Hܱ <6sW@1E -=Or'FJyqrNn:!6dv vZu8fcTL77d]DfdATHǕkHSalLILTf)4. -pyٴA慠2 PK$EihFYeDA7PkZ*0WI7ѫ9/{q~9&M Rt2{?U;!2/Y~<8,I߶rs>1(=or*ϗAV{|޽ˣsXϊy?8g#-ѝ'ʭQP{;E^M=C4c($EEc.B0-ٞbEptHX_W8eASjd5eA|;(=,hKg\Nhl{GbcNq55%DRF%$tQC=Pe?E1C\|t{vz#T;4!;`#CВOdmMN<0g Ȫ60ZTjMx dS;XK)Ѣƹ7ڀ3xە`s8"q _U bP92QME{[.ž'CXk*LTt;X#Cv:hOkq^4 Y`aX-a<7$Nbc=4l[grs*.Ú@*iA9 a5`m=g̀rI׀y{zAM2Az&Wc~L: k9 om p.)ՀظUK_}wlQ+!u\(_X_ru2ޚoN*K/v; ^PH?xñfcTL77defdATHǝKTa[:hjf%74##II*VjbJFYrQF$FA5e AQaMT@JI̙>^fs1!=;\K_ @D,Ÿ%e 8!|-FW@7i>t[3%D?Y ]3@CG՝hR[)/ }5Y! %K/&0sxÉNYk ~+aeXQ ?dcc`$a6q; MX$]eE0e+'md'çGOqF HK9P̈TãJBs6/Qpjyt $Ϛ UNN г(FX 053aq=ftijw90#n*BppCiVsC=_w] u|ǭ@\jio*99\uS{/t?a4K%P7\@4~Uxcr1m-yRVu@i$9*lĩT9!wđk|D4mG}QcELm# e;.OKֽu~D/4&2X,漕$\YH,$~0zL'HCб:,]o@ФF@H:rz2M>L^'HSH o͠E8'J#BD^ҾUM90fcTL77d{rfdATHǕ}hq{v\6Ƒr{$q ٱMyCj!r’<9Cb5Qc!Pv;wS߾}1#O~kyK[D8>-u`%0d$՘*"v31ru߉]UE,E+ Kʑb:7&` H%d" La̫\Q%:NGӇ(C@:P&glulGFܐz ?V^F#Ĉf@m hXs4,E߀mmQWjgs @ԏ=rrP=pr@6ր$]@PH.zz@X?RO+/i)@ߩn8wĉ=:l%/:栏v.D*-%OJ/k [ $]j}HVzÉA-u aB&#Ksu᣷n5 Kb!%6#3~R-bPc+Úv>1/rx;l\fcTL77dfdAT HǕ[HTA5Ŷ](Lɶ,Z`AxAA;ۅTQE(Ĉ6 IXR>eA[D7"CDQD/ssgq=g7KPwxLɌw Q=XdfmT*IaEBw{nz][L'$̼ޔz3[ְh_j09Wy܇nڸt`m`!I1j >D 19$t(3@`0 :A:1H1-/rW9|C Pb@4U8P@u$فCk]hj&T! "}>` P?`b+nHspi!]7ZN"`o.Gx2:hCYLBYg"2z"@X lMQ"e(R6Z'ЃO*-6C > gRTe#7? j7f/: kG4 Ց\'m#ˁF*ar Ha `r8$IT:0QAO IXFG/B9OO8B'JC tNx0 ``:vCŝW`L6.t߸&0أ_X>%Y{R-]ψH+zqӞha/#SfcTL!77dx~NfdAT"HǝKHTQO'l2RƲr{1%Vca%-2b!(0H $zQŒ #$XDо;wuιݜ9pGN1=}|2 Ewo'lCxlf5z08{tT!g-1DNuc$tE&ZEt0)ġ2mܱ4uD+b*i#J24R%yDhr~XOBx8+&$}wH$V  &TNlb٨wTެXC;Y^0vh/|b~ 4tR햜) ut:*Qe\~U'Ƣ(ʖ|ElƂ)WőG+"@!$#umD DQkH<6%;;-y 1Yvg(ur|#K CD6Mc 9T;-c3b'[J4Y Uӑ-f k9&#>>c;fJ.cs%4 L\)Q[7:>8N2Y(ݲp5:_3$2`&hTK pؓ0`%,҈`08 b%hG_倣}6,ܲ1L&P}4' nTsI"I5|O9D:@ t:_֢od1:+)@f`Gultʚ|؃@* z $SPzg(CQ %ə(S%0&)#'R: 3){C\C#}DD|x[1c~!!%r:1Qź3(1R۫kۍ|8xk Xoy *b^ю vw,m?nIy> i![yfcTL%77dx\fdAT&HǝKTQo4LnLiCAPcSHmbETD/j-Pf ZBJA=Eт BhbTPQ {sgw]g朻.t_+Al= 9{ &sn+'y [ܓ\L%ڬ’ON4[˵kpLCpSQm]D PrMG+BG_ԫ ׉kCX'!q0 zHR#b&3 ZBF~eS*4|r9Z1d[| d9PLQR+Fg&!S ؘ<@CDJa'f`mG9][Yˋa & y3 g_.IQih򐦝n_9lF1P/"Dj< KZu!x\'" u[6i%B5P99Y _X|/k=2VK 61fs6K،f$9ɠSD6ւ?q"9RюL9~EC?' }F ۾&>}fGOkR^o%;07MhɭN(Dcʍ!gEd;-캒ʈBkǵU/Rk +fcTL'77dfdAT(HǕKSqLXs|,)̅9E"͜H #1*M$ EjV W4/´UXM4z ®?6|/lAꙩY]^D&Pc e?W"ӼG6!vx)NqlW ㆤSȒ"! a؇b!\$,7ۆ4`QX ,=*2˭?'4TTp3%s-̱6bEeJH'$SOr,H^(S:( ;j8@Dn\E%ݼXIU(k2 ROԮE~c)w@f! %W9&hʥJI VE|f` , Z "(h: qjښ _M[]ׅRWkjb3@[5S1 q,Z8MU Ƥ7:Va *&5b9+gZgy FDAD%-1(t'˄+쭢Xg?5o"{4ß^ _4|bs!f | :n70}}Oe+B]T']>YK~tn:3 op? 6_V (Uo (5CXۆ=5U+\fcTL+77d/,fdAT,HǝKa'7huS隹&Y&a"v((":Z,x̲DBQxU]DW*dI確* g}aC}5;c]:P2dǭoekˌ">@u˸>=h"tmf]|L@D1|DM&sϥd.u``M bNdՕ"3=QyJ`GOIڋ"Q l:˒? l)gIFt̽BS ZP+-! 3̸¥cnTmҟG: ,ڍـڽ* v so `ue/O@K9T1\6i.1;(Ӧ8D6*@%`9@%˙k4sjub?TKHj;JDd qĂ%@en5RR#IM:3mӁJЍIgb#;IcAb{88Ƭ9LD}DDL4~;'mF'  Z߃eq[A4.H{$GEh,/Re|]h8at ,c_s quE-89BgyQ6{01Yu ]5BfcTL-77dx^MfdAT.HǕOQ񏬄\,eE&$j4*hA:H1'1V{3˲;s=Π+3z(*._IH%;yѭ;k2{Ҹ ȿ04ܕeŷqQ*XML4:QKB,odbG6I˓+YOPm.#8w4Yy#)~+RsӒ fJPҏG ~eN ~I4jIξ0z'pE^IPuVĚ$:;>RrèKR Ŋv@/VwaLgbLwDbL'`LU@3aC]8f%[xRI8Q(4K${&I"$9.$MUU>{FG fKɐbbŚ?wHۘ'"CY(vbvtCZ6搽'YaFșw5ah0n ^/^ڳ.lī \qm!8Ĝ{E#D#mjWB*\o^fcTL/d3fdAT0H:PfcTL1dH29fdAT2H۔efcTL3dcfdAT4H#V.KfcTL5dHnfdAT6H8fcTL7dKfdAT8H ffcTL9dHzfdAT:H{fcTL;dEfdATHafcTL?dAfdAT@HЕfcTLAdNonfdATBH1ָfcTLCdyfdATDH9fcTLEdN3 fdATFH(WYfcTLGdfdATHH #fcTLIdNHfdATJHȎfcTLKd@:fdATLH`8fcTLMdNHfdATNHGfcTLOd2fdATPH'.yfcTLQdO,"fdATRHWIfcTLSdfdATTHbfcTLUdOAfdATVHNefcTLWd^XfdATXH~0OfcTLYdOofdATZHdfcTL[d2fdAT\HҿTfcTL]dOΗfdAT^H}{fcTL_dn~fdAT`HjfcTLadLfdATbH`fcTLcdufdATdH]fcTLedLefdATfH3!{fcTLgd@ԌfdAThH.tfcTLidL3fdATjHưVfcTLkd69fdATlH7fcTLmdLoDCfdATnHj?MfcTLodfdATpH{CVfcTLqdM fdATrH- fcTLsdnSfdATtHbٺfcTLudM)fdATvHfcTLwd2RfdATxHHHfcTLydMAcfdATzHt:fcTL{dװufdAT|HQnjfcTL}dMfdAT~H!fcTLdfdATH_ fcTLd@1>fdATH1ΫfcTLdRfdATH fcTLd@m fdATHAfcTLdDfdATH!0fcTLd@fdATHhНfcTLdfdATH8+fcTLd@cfdATH_fcTLdBbfdATHt6jfcTLdACrfdATHfcTLdԛfdATHmAqfcTLdAfdATH/}fcTLdufdATHG(\fcTLdADTfdATHfcTLdlfdATH^GfcTLdAfdATHvcfcTLd06.fdATH;rfcTLdBԍfdATH>UsfcTLdB^OfdATHƗfcTLdB,5fdATH'9hfcTLdfdATHblfcTLdBm΀fdATH EfcTLdifdATHfcTLdB1ofdATH'^fcTLdfdATHNfcTLdC fdATHXfcTLd0fdATH%fcTLdCyfdATHAKfcTLdlyfdATHPfcTLdCHfdATHk)fcTLd%fdATH|ߟfcTLdCC_fdATHr2fcTLd:fdATHSfcTLdEfdATH9ZfcTLdmKfdATHJJrfcTLdE9fdATH$AIENDB`PNG  IHDRkw3uNacTLLNuXPLTE|rS|tUja{銃s[ٗ}߳։{ܥs|Òx钋롛ĕꙓ̤ڿw쩥ӳΧ؄ʡ~vޙԶߟػƘֹܒיϪȝǚЬǜаҰޤ~vwUtRNS@ffcTLkwdm#<jIDAThޭ=0l2B*$Ҋ#P!I-@`SD{wo7ƞM|dJEOZ>rj!禋}5d\nuTڥxDB^aѠݮ_dDab=췿ZǒN)c$'IřX̢jmJ2j!3&YgasDL(Dx{kD&7β*mZNCβ"ʔrz_Ʈߋ,\/Ot[…kƲb#"y|%#˚>>)ԏ휐寲h/,4aawWV>m(Vhb U8׋2MТ%t9]w煮* K YeE7+9k>…[*$6GYViZ?d۷d&~fe3ɻa} iF =ezN$sþbѱOESw|dU#uJF'G6QE)'bdzAjw?HhfUz*h?ǓH¨ :n ΰVwc5KrS,IetHX48 @76um8$Tߗz^bzΤ{5V}WC j׏;<%3`T߾X$14ؙތ?>Yܺ/jC'mY tTru7+(zdddsx gfٱ oė>/\_}XwxgX%/qk=Ķf7b(\(~*.ygY9.O'8g.$JZ\&[d`0('z5KJkFa3SE@]$x9jT@I`n5rF0C+тarZ&oZ Xt:V5{ݓ^KTBN# soLƒ7xh+E:jϱ3PBJOeɌN8H),Y򡳘Oqϐ@6cQB;> ɖwn u,#Hi@V||>FJu.|kXY1z@nt7GXgcSNz9f=BBQ|BXpKLɷfв''Η؄0)rmD͊`1p E>r}}[OVՊa#`@Y!o)=>2[XX]=u^dv(oLݩ*P;}(wE.Oi P}JhႥ/7[( Vw* d+1 fޘs5U&j텇E |86ƜxO mr;8w`lk9+_Zk7ӬZ" \:[>a]^nV B(5"+Y zR}b 昳j|Z%tHbp{@V.wAKH sIa\ΆEFA#T>%X%@{H--Iyok0Ku/h& k G񬌈*i ۡEm4Sv& iՈ$sI! [vv:͠t £O Aƴ U7PmTϻ{$W:,@*9C@=SxB& XtެfZwch$o,u@hq@o=&R;L< o/ߙ!E!}g^ׇh˒h . 2bPZ͢(;IJW~CȭȬY< W -P%t W_Al $+X^NtRh.ȗUQT(\( *߯R𺯞< ݼ-fa9`8}tYӷ8 ̽e^|蟹 PC[9-C)pL/@Z</p@H" I02 jI_aaoVG7}blYdfcTLb^dI?VfdAThM+Q9Q4Ifƌ4(K1cb!%l&66QVle#%;aIIQ/ 8( ,wue+h~2HDh`* ;B!C<||Ċ]3G#h\h&b@O$B!ƧoAUHk7AdsO**JZ:Q K߂g:϶eS1`^@a74`ƼF{ͪghP"i )"O9>"_9n,x.U(frO.x/TBB:(`iŝ}`CLld4F+D'`)@}D=7 4 <fcTLd_d82'fdAThOKQK (CAH02q1:"W$ԢFQA ?DQ3b֮V,\&"Ҷ]-ԮѮ9K󰿷?Ȫ:T[w\_zmyE:A$@A f"ҞSguo< i8e\x,ҟ6yۀ4r z07w~U],AД\nkQGؘFҍBПRn.V9uq @F#J bz_52fqFj6~)S,@4/ 5 ʑI6;`Yzc#j#_p׏k6REDmn/02"CO4vkH(J}>gQ[uHY'>5E:`(!j2uxp"gp6K̷ kEC_|cCF"|fcTLd_d) @fdATh;kSa\0B@EW(UBZKEqP A nUt[8s869oն\Ѕﹻۏ,׷^ T&"9Fº>Gil D"H(lUyc$OxJr7IՐU=$߀=*behH &a9¨lu׈hE#w儝U. m*QBY۾:rꦾ˜Fg'p@K]gB iHDQaͽS/h[y4ThhIo&j_- h"whh e GFh׼!dC=H&[ ,`l ӑ@) ib:XMrD4fG3, A1K ochAup5$=upFl?qݽ} iHGT1颅VhY,rBJl_fcTLd_db .fdAThKSa8h !R5ˍy!XMBeQ!$ ² yFL/.bH"Y]+ooich{^tsp8~_^OYdyLX9j#U&o!ki>hh=l?Q_C޲3zUڇkYBu0t#FHEdS-[B%QGKE*daDtp#EaH$?d5Y*V#GH!j5lnw$.^ű!.\p^2vH?ci -N*v% ]G <NMD1)aSfz;| }-<kѳѧht3TBo\ms GfcTLc_de%fdAThKSa9 !pRn"Za9IF غ e`vՍI]]weFzEDAE5xGu|^/ %|Nȍ3!蕕>+;o0>vK<,)U8 S#ͻGϦ N[5<8 yI!1}#揄@1|&θqoS\kJ'Qu_lz P.e(rƨb"by.3:6*]Hk(A+!&`cʲsV ࠑ큏B,3h !o-iUHbS7bނ܂c o&,A@^n^m) z ub΋4ԇe\Ni|>4RҩN5Dҫp +Av,MK]|t vhQvGg&I uYoNEs4{ ^N8{7s @.j״v\!n.v9/h>O‘6L˾>.mI*6W\]}]:+"WeYeYV0EJľ"^ _Cb! TD-i(ph|R9Ap&0 l`o@~^ s^l/ o!w?ErfcTL!addefdAT"h?hQoʥ%A%R%HC@hAQ U%I 2UB]7W_zδ;~`-{>"Fqq;hU. hSy"S$(⅘tm#Bb@~|ڡv e9wQ.Fwg27 "eZj?׏n)OȟxgosCi7^qsݥͲH' O>=(˲G>'p@޲s5/(( =YAKnzs A@=v$*gЦXoTR[{)`qu"H9WY-g g XGö1'߲!b#[IA@6s5aa`C(c/y%0$MS(S c [[jIttI/'w1XWY x(74y&q ۶$ mPJ,"fcTL#fed64,fdAT$hKQ홠&+LC"+ +-J.R"(b mQ@*A@En'#38YN=x^wP H$DDm) +6 ei@٨RRU0Fc?CX/WaHPƴ ) as K?ckJQu:lft׽SaV6~ m !1-W{#ez̲j(ي1VO9BrўsSh"Ok% Z*[6tc:}[09Q0MVcssWXdB SlBû 4Jg({~ȩ|beIA\fZBQET&Lcdly)DIOQx㝝 p84as ^̝dI0 ~C@퓝ZYC$U(|qET#HIPp,]Q#w]HU*6YQvtVn fcTL%fgdzGfdAT&hսkSQos-&bАVҔ[Ho:Hԥ(R.+Zu*E8:(H; E\D&GǁC˂ -qd2hC"-.> $, "@Ddi=A 8IB7_B\&dgm9_KaZw"NbcDG>S=!u >?v>˞ u+HSMҪlj\Xqژ$#FyEnN$ dm&*ve0#G;dz++9w+*˄]uS׮r%ЊA'Y ͎aF׉ wwy!`fhSQ[G*v:rz${ijzfl#6~ALIfhI uQ+BVa"34D qUIUhpVG ;Nl3}IJ1ҀfcTL'fgdʛ/vfdAT(hKa;ю/KkHTJX,K-P $Qȴ c)P y(H1K̬.;<2  Pr՞8b!ED<}fc,Cj.􎟌 d|d4[,wr[Z҂l'x7"!˦|lGZ5LD@oaj'c$LpacM$X:*2 RVPE1V!G[( 3h.Q%؍10FQTk0#KXeUTMtIcnY`CnL9Q("bETyH&N TU)"?<.9 2]xI0wweq(`(5mi:8J:+@ީjƬ2}20˅c@Ht5iYYW]`<-\UgOoOf!r".$>JkkQkfcTL+eid",XfdAT,h]KQg-W !w3-PR, J.dI0JHҢ0RѤ J.B‹ ݖ;.Ξs9B '~t=>UI&Z H3F8t=:"," ?rfJj T9Z.u,9ε! ٲ "**הTUHPXr X*k+Cp eQF\֩Wl6Xն+* yt\r{Q&<"Ew19-5m.y҉<̜yQw<})!4q3enBtE^Sa!'*w=AnDD:^Xs!-F,n«5MA=bsLA9fr܉!t+yb` t 3*^[^Ǽ9f1p)rEteasJ`/Q%1QhO7F'< Yr- n6C.C3YDM4ԙFFTp5_K#rkdi^}pbAP<ߋ4C8eӭ)؋$#5LϫR %%xtbıAX=*D7ŢLFDC#8u]يdv/ln"YfcTL-didfdAT.hKTQu5 Y`-REd)(4FTIBBKZ )!Bj-ܷ9ܹssd>r;gqq$* q7SUD r<Ek 7˯`|+ f䫈@Gٴܕ@>b ,| =}Hpȇdӻ|#7!m#!`V|?1Z 7FaThA60YYYyӎJM-h7 R=Jo3 XPx]c }U[9Muր~`8q SX;6lÙjV  GQT-dI.7o5`.&Lzqѯ Ĺ3 4vqw"P‚lwj8-H[DҤ-U`ta.ε4=Ԥ1C.X=-^bM%BèXľbNd9 ~+afΈCT &4kGz925a"6Fc*d7LXxWCz6ģbO]- "AgNYVAkNj*([D7]ޒSP["-0?mEX߁\F1^g`@fcTL/bidUjfdAT0hMKTaՙ1G44aJDoPhf.JEEA/Xi+Ved ѢM->CΌ5ƙޙ# 99p<$KDv]NNb-nǒVPNbBB.Ĝ(kVWl!ׅՈ0J)4|@X6t:uQ=8bFBjQwӘh&zV2XWacf1#WvXӍzRw qHQg' 0 n i6 7:~ =2F1C`a sl,,4J^Vn62GG}ìI(%lK#ke1Aծ*²:"4n<҂2Ƙo_WO 9c#+s#+ʶ \ʷ9 %nboFE%Vk+(x ]>h$251J ܟK͆Ͷ@bĥ#=hGЯʙ… $MbdgⲧU$V3[n=)dKIǜMCM8#E B\&IIY9#^#"$S>qpABg> |!+` IfcTL1ajdddfdAT2hKTQx1llZRIIe"YP&AB_hEBU-"T hן|bwι;2幋sߗaf=$%:lJ:cj6:<L1w}@m7tn-0K:ȶ `ߘPyZ*lBڥ2)U0ЅϤV^d5 j$G8pAvA3$ej]x@BDA/7~"d)~嫑)bŬH Ӎ^bFurT!BϪn J)<ڌjaAHZ@V}35ثJ2e[S fdAT4hKqo]['P2ԊPŊ- ME4Qy :tH:]tuugfgm._~`Uk@L=.!ʝIaO^?Mv|J xX>&zұPN6VM8ɋDZF:R[a&maDw'յ!``3x9Q%U#/Œk̵aE(z&nCJg pO3Dlc*'~IշI%ԩX@_B.KR5C,sXԍ$W J?af 176|j)#㪥H'FfRşvBD#QS.b)ZY~#1j78dk I/4쪶*QkX64MAcy Xq3]аAyF_Þ$#A4͏'0^P܍5ۍ|% 0xiZ_o|[kLIOf+rnUW;.=Qnl^sn^@T]nCLu^6fcTL5Zj dʿ;fdAT6hmKQ&st9MM"xXRPjDQYi) ,*# JGEdXR("25УP76w]Α}^??γ6Jc`+XyAg1*&}bwf`lވ=DՉ;4%)66_v3oS>JL]lb9"2^OVY8Lt5p{ }Aw0"兄uAqGB ]Lls6l|#wLevUHE;Q#s ؈xh?y.H | BWqe7YSv7~Թ AȗFB¼ES*49A&6c]Atº="_ L|܋uE-mi-k*F]z: Z4 w@О EȘM){sSP!]69f'3q]Hp+P +̘FX6%Nͅᦈ-?8ǘ,6RjtoM^|T+],<ٱSyzNB?cR;U6ul$jZ\NSvt: +mA_-ɪfcTL7WkdfdAT8hKQi2Ж1H44%{Q W/`]RRVje]AuAE]D'At6Ǧ>y;ج×;4kDL"NaI`4 kF]p8npt7yQ:RNͺh`y^93$Dh-dD)7)i!>7:=G-buA&d)Ĵ#ԁ!𳈟Zt]ilY- a 7݁t2b}06miaMXAYqʬnݱJS3!<ڏ6KD;Y` o__cTqNa+13,~Ֆ]g_H?[EQY!d(q͉\浣 ъv&u0"`)=Xs9F*B$V +=M8HJX4qbJF0̍1,7^i|Q*[D;,͇Q:y3frcUĔp%S`ΨbLW I/bݱDfpTV>2y޼6a-,$a-|g "~oa8oA/}(,B rc'DO}TZ_-X=,y!:G$s J+sbPՁ*VfCnd$p+R8rH ou麱F斲.T fBfcTL9UjdI8fdAT:hKa*KYz6%|5M0 SJ04!)A2%BxH.uO/93 j>̗e,9,p T_+U#L6%ڰ%qbv)GӀ4shdDV{ 6ٗgfǧz*U"%iTՒKu"=>q4kҗ4nòg`^AB$+t;PdpY۳1#܀;.Er pbq֏y'c.G7k(wFXc9LX-G| rs(N";(Zl`jGo\z Id T{srsQiyXXfcTL;UjdC=fdAT|XFea2PVٶ.g/,?jiaE=}hu.DQbZPyjϷk#jElEHFE $|e;ʆi)G 8Jma/}֤fcTʖhKan솲YBmBbfIB%IvaK~{ Ep>Pٗ5HDq wYӾXH%E( P ny#Tܟp Q؀'qS33d+mգA^\3~gSz >jj3II&>I4 ~@nz`AI>VñQ'(Žm5}1*fHqy$뚅k„V FqlV ݥ,zA5m~M'NYnG˵Ϟ* ¸x{'PqrogMZL3jF-qQͲ0P&jPRmI[%(i'{†k-ըWaܓcx<Ӱ MPe-8DQ'q 's1HnH/D~"+9]уq؏0WyH/ |vS_Ѭ3v#NNÈ`#dѡUC+0`pdT7KfcTL?Vj dPdIfdAT@hMKTQLN#3f3%֢셄hdE9äeڋeIZPi*M }ai=s&?sSγ0B#DpEJĐϮRJteH(7< !%Zc(HerBD 5\Ρ*M\9_1b>S?@V'F4că(k_oYІ[ lPN[kixcYV%lwЧ(oG{jGw]tZ'.ײA+6Wh(nAo~LC^1&]GVcάC*<^:y7A=]C8lEόztOWW5mE0F1-|?.)}ecy7d2P@fcTLAUh d'z`fdATBhKKQgʑ̱E-RTa-Ԛ,B)LF楋i!PhDԢWЫEfF z3b>/\F ~cGCwӋ*PF2Urp4Vy\ Vx+YQ&NL2;#Ҝ*V7:@Ii3`p&iWyZE03Du1g5eEuI¤ 7#$}aˢhxmP1ο} >4t#a:!Y~4!f5gO_Y 9csu'r`YOQqc=U~*GI*`D9iY0Ќ8(f&ǂu?AxvMLb D?[HS\mX8u₳ 'َ+ƍ.(SdMw/-*eOzvcmV;:ԄO"#Äihey0] "h; n=bz!##qauIG 7 7ᐲ!nfy"#L@ڲ4aUKvZH*lMl/u4YgOܖ €H0n<{+xQqcHF;Nj1gI#pMU5hF&MVc׋WٚرiFF|F3#uDE#d <35Io$[X}fcTLETk dȒ#fdATFh]KQq_$-4W#|%0L%JQ$"/H0#42C"(4".29FήSm sq0B;AMŌKH}4tPdsD$wQ4/zoT Tmi%r>_Ĩ*iF+YBf@ Q9ए0dñ/,~'g9Wzx9ҍyH1v(!Нn ajѯr,Ƅcˮ~O5!ShJ2-L>ĞB0i<ځi">КڍGG:r&Yj|iLzG[nwHdjᎲ/u,fo4M (8(1QUVTyųJV,9֢fwU1Ht<\$-y^drѵWHF&!rw?S ~à *'@{[osU8EڢU-W -nH^ 4&hM7B-91422B*~"1--if2 ѴcN|BNpkϻͿT:tZqs)ySԄQ%;Y= $~1k%'zVi8yo㧶絖 D'!h<OhfYfcTLGSkdASfdATHhMKTQ7r1qB7:haTDPf%%$X!j/ B ZH-la" ̅-M>D;ӼGмss/ٚ xac 6"gN L)/M&yL<{n_̿]2Ҫc#;=iN?*'7#dppU&!-j-_1%YeCQ3e].A؀;bU mEDR$9F>*/FC-edmTSJE^u6,IQ%3R3gdPm/$nå=M=.%\do}$)6`Dzfy̱XBo>t?pu!z5NSA6yFɺk* au bXVZgpBAH*Mjmh%}Zc7Af>I>v S'ӤS0 /l&+ Iʼn%}t!VH)y2~դZ蚘x/QtWfcTLIRld܆_efdATJhKQκ RJnJQ>uՊ(VLZ"EHZT`Af%DzȊBDKSEN3ȮL3ge|;w2mrz"HH7ŕn\R"H2FlǤGq-Ts3>9GQJOHUXw]uGw|M;|p%[lll$w#E1*a0 A bi XOZ!v`QEk>E!wR ˁmRW gbŊJ?^I y; f}d^鄦Yŕ&r\TiU*k;nOWCAH R R#]5# Ҫ(5L±VEj^jJnXLO|>%1A@_V+wm${@0x^D/Ey#Lqе!C/[~"GbI01Ȝ1{"؈lF;17@G Ea}4p,T霜HMH J3ЮtN^ޭ)2V! fcTLKRmdIeXwfdATLhKaﳳ[ [HF&ohZFQ%bf%TۥE"CR ѡ"NԵKЭ?Sβ:6sa_yyR2vlruAΒ*uʇ0@*IJIO?)}M,Z>21o]XY'lA6..@!),dy- \_Y%4MeA"ĕ+ A h."Gf'ҜK[FT<⢲T`RÕ5/^*i%$YkJ[Yz1 b'W@DIl%o@Iz[7sQ0zK'01}v# Kƶf2gdĽBZ ΋l6BCSX"VI ~p8a_"D5֧hu]ҊE=q]Fp;ZH\fcTLMTndIbfdATNhKSaf[Rꦹʡ5e)$ M*4+1,3uPEP(?6=ip^7ݛ\CtACYdmgpg -3žNCi,.KJX(Džnj-8-,DO}v mR!@V->-=dө2VB5p̕TD;t^D'ȸv[4]~V4LWl~W:4kb-sKb3E -bRTmz?WS#mCa*YQⅧ3Y8Zׇ+mզ^m&dRJZ8wT9'>UZ`Jjv%Bҗp_-AD#B~Ym26ZRT{fI9`scz%C5ii]%8ѹmXtVoSm:$(=ZN)B ]:#VATiwx1o) -fƞ}1ú+w 9jti;o'N=+̘G{jx>oH7n`8D̰Ln{LJa/&}-?xO?q$ q6Be>zzi4 rN'~z5 #kXC/YZ-:IfcTLSbpdhTdfdATThKqq!]5-Z4\"k-"L„YKRQ qP<<@!`12֬r1Ĺp}CK> UCַդ>!,h=e䵶lDCՁEXE),F鵓^MTgWfcTLUcqd7hfdATVhKa让՚/XZƚD )&" @( PBavE:xTPι̲C4s<4Ĵ݆ϣ8襊S]qFKBm"3+o!M->'"y~Q`By];?r 'Ad D^qH򪛾#I- RH7?j\&7'8f-5`G/DqQF\/ d["nƛm^Qw0_YUvfX@DUv:E8xY}ԾLPJY~_=%bYOX 0*hlP ;tf)pi~~9t#LU!-&ԌsJtבwA)2 ,[" 9&æRHkȻ:Rb~X -R\=Z |Y~ 0S!4M^Ho_(\JNcMxJWGͯ8pMr'~ccTw#h +n~&W\1$T`)qpKQ qs5UKa`k"ڰkzM7m9nCх4wE'+nw?~tB;Z$FfcTLWcrdkw(fdATXhKqҴ0sJ)+lEjK Ҳ֡VbBTX&RQ !))o j,~F9>y_޼C^0L]`6dL)e״Q3^?i}$ߟLc"-9:Q툝nRB4> Uȅ ֡ 3UvDž4XP %5 |0ㆩxGXfPgYF#L9Quw؅P&f?zpD&^20S7:X2htC,"otGˇR{SIG0zi"td4 /.$I%ڙ8Pk 5Я6ͪM>l9@*BZ6?4CVAbO] ckD[-j(zQFX4@؊ҙby-/q w,B"Y k,`DY8Қ`ѣ_SXBMRױEr|dBzsFi 8w շ#"jJj6fcTLYdrdfdATZhjSQvMFL UKP/PR[iAkE:R:Ё" :r jE;+й::9AzNrv 6`QD&,X4RhtDScaYߓEWDIRg4HZSkJ ֙p(A:eIpSBZD)HGՑn܊ܭ2ɜnNppfFHѠ@{~ڌ3ח֤B#î\@p$ u"a\Yk(VùLVBxV0P%y/{숰j ao^Fw"lF}Q6J7l:"CRjVkHZd=m"I hyu `+FNaԛq cEWC#_Fj1"GTfџ#x5|b,!1Jl\crߕWn*q<׋߇ I\yAvprOv[ڲ8metVJ)čEdbP/RX2z԰ ;&!FUցH;Lп{( W1,F(Jy_\{.䍅\3RVwyqwR:2ڬ #$a&""s?7#F}F*A!_iPmHڪlHl Hr(DTêQvDEx}ura !5\IEtVzzчFQw<@Qʏ2@*'s&\p7k ;]d9(+?zvLTͺ:$)XV?lBeEHûJxI*6$D}49g0:'g`i?N̡e&N@kfcTL]dsdfdAT^hKq͵F#cf9$:c(cHJrBD*[ݤ ,!Fu((:DQy/. }ݾO˛ɇ9|X0{Vy4[34J$GΘ#v^(^<"Ŀn#@/Z$ҕ&BGkĨMVPU=1ƠZl~&fjdqeEc$jN#8^,8ێϭI,887‚PhOً } &?f>g!ykc6ލ bi>|>8Ͳ6"Hr JaSsRdJOA򾉡 `dʮ#™OkW0y ^TG{bƤ:w,őD pB zRi+YMk3ix/ igϕ;TFgf$QES' $czK'Bi |`.NI7c8T.H0=Ru CZ@e~<fcTL_ctd(cfdAT`hjQIc4jlRT k mvXhbA+]ۀn]QU]y./6F-I뜗Jr~pޙðEII"gǂnG9 [}O+B'i4GcAȗ'r*nL "ud4ܠy&l/HL 4ڢi;h{xb۔keBc{:2?}p:3jkP|SGPR6zk}eK qa8[zZ@7組x S&,Xt:j3v#2l⒙%_I&F/m3Qy":|袶 h^9C/GΕc[G_?"מ o9HUp*u}"`I~$:j[v_5{WŮ #;OJ(ubwP&o%"7x-LfcTLa`tdCfdATbh׿kaV"R/6UDI(CbIAw] "Pp(At(p&I=}nxa (CȘ $ԁmꀅIu-ScJ=1Glo/[,10nJcFeURɛ~7d ԍ<?so!0ÿ.X"^+E. }G[8O QhCu4mAJ]Loɚ?7flRsYe p(*R*=T&A4 lQZZW@Ec|f BқmNtVO'2[ CfI?:<Bgk;J1[ @3n؃V{E-bˣziD'I`Mh[MA+D K ^ ܭ<;Kxj>uMWMd2:y^g/ioЕB oRfcTLc[tdQǘMfdATdhKHTQiTtT|$5ND ՔhPh!AiVS#"zEfEB.-=EԶ]"a,=?ib>=ν. MMhSSW$kבViKmd k) w#:y@%7:Ln[,<_o-!18 yt&w;iΰr<.u76P(ǚ~]AeDP`FB }"H1M@'2|˪{< +VM>:^c oŨM.)ӀJk*, "׬ۑ\#e $=G$9^ -Y&HG zF4Z+ *va8ma>L؟{5 {ۯ2s`~V]Yoc~!aVj&.B6O^7I x߁}?"|8j#Y2B$L7 a'o;9'cO aIAyv<Œ( V$Ʈޟ9?RϔfcTLe[tdcZfdATfhKqfs BINiKmDMlR!K !H JI.P];]d).QD|b{O4x?GNZZn#C/Ob1bk!n= ĨW~}㟻ҍFū~C̺)E/HZ'va2X" HXO|jYmBG{jho'1BǹS8q $c83~}uyWr Uh3LNd$ÊNC,): "@FeǑ҄A\1$@ά1oJ^z 3׮D$^d+l$#2ܤiUY|umy-(ڐ}n`2Cx/ZcgE{ڸͤlFM\5 q#!(2E~BQ~ fcTLg[ud7QfdAThhKqgb9sxȦBRI ) 8U ``/u0x.BEduu?Qac[i#s{|x_{P" u|:̲@Dj0׮Df jA_`7pRĨGz>cJm{xQ!3S) 7:aw„WՀ #ڽq<ϙ|I' ˲0ۇQ;FɗKO#TAmfcTLi[td \fdATjhKagֶP3p 6,*V)SYA3*EDv %"* /EѥC];]!/_a߾GgWڳ8 kpo= 8 l÷8`bW2OwqHkCGBusaV &ͱ&0FDKK^Sɡg?zМR<ʝDz,KMLDб]D+xtjzJ}lƋC0]5w´[Taރgsiˀh)PJ7 "Q("U=(HJ b"1*"XYX 'hSjwEl'MiQaWv֑^ħ#;XOpuxpqYd 'GSϹ=<&E +ԻQkc5ܫsGR[cm?Qx7fcTLk[td(  fdATlhKQ,1ے6PEJQ`X [Ћ S"ވ.˅5*. +Yœ?׶yF<7c kQ*(؎ rA|G cP%L r^`KV#f BΌP盕RUImO\Q`]4Nw ,7qd$#= :#dBq|EF=LJbeb-ENC;&v)q yD炴aZD$V?]<-yY,'8%& *-M .;,4!}∫|@;mTĝMbYrŲ'{r[m;jWh xk zIG_}b># SKr=yW",fqa(4Ax\76v={^BY믎yjXo=,oJwK"b7̟){TËُœqͭ,A$;?ȯV JO껈U$5GCjN&5DK ~h3 D6V]4ωЋoj9Z|@fr.\a@[fcTLs]sd4fdATthKa뙠%iBspBhX15,$H@aBQ[[olѦu|CP93'xyfҳO1J 蘭pԏ$Jh2.bCiAt*K\ZfF wu7mT|{+2ٚ+|9K9pU{#Ѥ4Bjo<wDR" .l@Un<OlĞc{3YHKUu-P+F[ߣ>JG6XH1.>q4Iq47LM IQyVƐśYNmsK Y}p3* qVOU)bd"jX]o[E1!RҒvm* yKܺOM_$ޱRte Ys1%7F@=fcTLuVtdr:fdATvhAKTQq1m%Ǭ)@-P)$Mta-bjB@KEȅ+7J]H! ղ/sxgq߃{tn9Dr\?[R%( G9,2f&*)gieNH첈leVԳw\WݬM&&a%7ctb;efcTLwUsdVfdATxh+eqs%2(3~6M5,f3E2%fAiD6lMRB YLl s6Sýwogq rvEHQ, rMt7R c $"qY\\AWϛ IZ'Rׯ ^xd>a }iF_-zkq֓=:88C)~i#cXL54efxghzE{QU#ӞX!0!ba UoU8MDԤZ5=et}TQ.UUj@ȫ`IH=&ЎgU#gGI5`,f|"/]x%ӷTK D*g;lg䜄񥞻%D<_~D|Hm iX+Mti oDs S,y;fMtvuInQvpZ,N=CoSW  J3Usi4 isW{2?}pNxc NC#zWq٢OVn^c3K>F ?4mYɐb#TQbn{R>8 q)4/}Q ^ᱴ?$w!f])3y5kH}u,1G-ܠ\7zZmInސL?^UF(5HEQ2ש)II2Oey'r@fفA=߃}fcTL{OrdܷyfdAT|h=KQ`j4Hj*vh@J'tȠ`G'vuPT7ȓB Ƙ/ \pp0WȘM LzaKz =Fj1RWy\_!S1*}d ,"xMՙDλ(By_fHPzpqq?`qŽuTCyP ZFab+B$j[@*KxF N4qEUS 'd\uI>LjbFj`JEJp`z7Miݔڛ)aerV|~l҆۫C9)v]ӵgIYRw?O6@,qoeFzD8@[ ċ 30nߖ+fcTL}Srd nfdAT~hӽKBa`ѷQZF!e.5HPA[QD[95P-t!^{0[^pˍ-%lq3A&6/)R`ϛCA)U"U:7sVU3qEl+.-tU) RJ)R@4)`fՁYL~iDk1E@4"ND_YǺ}f3#mV6Gd" [OƂ@0" AXvA{(߃uA&(Ź^s'M`2^LW; [Ju[/nTLgyk_:D Niع4y*}йO@"C -D\fcTLWqd"*XfdAThO+Q1 /%L&XLɟQh,& #KJbJ,ȟQHiV3e#+ vV/az%R뜢os:u zqd ߑ+P4T0i(9Y1Ƅ5M(iz =d$LJN`UhB Mx1c1c-%/˼T}cЈ̰eRye{k3d ̟ $Uz,g][_spFyp"/p",{0'r!xo*~D8:"{vNm@h *bCDt}W D@'wyfcTLVrdw>sfdATh=KQA_PA{5-" -j!ZZ"á* "$2}vNtpx?q?u'2l)> ꂄX"@)1#UƑ@Z70xiryMAK3p?oRJ)RJ)BD~Ԫ$O=b,gKSid$,a-vnj{:8LY#@ߴ3ۆaHҌm?Q'\Ća4` 0, WCpp|&(I-?CiMAsL_:w(q!"NO.JC?i+Y6fcTLTqdNDafdAThٻKP*UDVE'| B)X nkpwQZ!Is =pѦ^Di7Qb䧈#[CB^mn:Y. U~mT&%LgvB!B!B_)7֮l >hHS%-ΉJq*5yҡ (?UFW룇I\7?Jp$:|Z~"y D~5=رɑ})'GuFL2.gO8B`N PJLQU0NՕjG)sNLfcTLWpd2٠MfdAThٽJAsHXeDbP]H(K!6o (f,5s~0s^ b#@f!+b,RJJB@.9yu[0sZ\M"0RJ)RJ)RA&!%h! fTd KtŃ-abjPf7L'^[)>y/[Etw{t>SS3NmI.[$'{Ǘu, <]fcTL]odӚfdATh1j@yf,U\ 7:*Z79IkOrIJ@(IDATxcxs?18 |2A R7 58oOx&f8=H a@- 1IENDB`PNG  IHDRasRGBIDAT8c`0=?0.NiV7KGD &A}YMO/O1!(21|zq05xi@*yW#L"ajX jIb7&KM̉'w$A3s b5$) Si^]H*;4X摔2D02i8'oͷ>tJIENDB`PNG  IHDR76IDATxc DG X )}ՀWA:02+T=9\ DWFLHd<Cmr&?IENDB`PNG  IHDR ,:IDATx^ͱ 0_A**DFP0Q+ԸAP ''p ,xIENDB`PNG  IHDR ,:IDATx^ͱ 0_HA**DFP0Q+ԸAP ''p LIENDB`PNG  IHDR ,:IDATx^ͱ 0_6A**DFP0Q+ԸAP ''p /߸IENDB`PNG  IHDR00*l PLTEuuuuuuuuuЬtRNS&Kn]TIDATx^DZ  0<\y/: w~!{&fGjb쑚!{&fGjb쑚!{&f ~6 %IENDB`PNG  IHDR00 1 IDATx1 A`=_ b&~gfk@yg@y7@yg@yg@yg@yg@yg@y g@y9q@yg@yg@yg@yg@yg@yg@yg@yg@y7~ *u#}IENDB`PNG  IHDR00 1 IDATx10|%bPM]ٳ=C<3<3<3<3<3<3<2(8<3<<3<3<3<3<3<3<3<3<[Ahb IENDB`PNG  IHDR00 1 IDATx10|%bPM]ٳ=C<3<3<3<(8<3<3<3<3<<3<3<3<3<3<3<3<3<[V5BIENDB`PNG  IHDR00*l PLTEuuuuuuuuuЬtRNS\TIDATx^DZ  0<\y/: w~!{&fGjb쑚!{&fGjb쑚!{&f ~6 %IENDB`PNG  IHDR00*l PLTE8;tRNS&Kn]TIDATx^DZ  0<\y/: w~!{&fGjb쑚!{&fGjb쑚!{&f ~6 %IENDB`PNG  IHDR00 1 IDATx!0ȫ_﬿nF|a@y g@yg@yg@yg@yg@yg@yg@yg@yg3G!PPPPPPPPP Ȇ!ILIENDB`PNG  IHDR00 1 IDATx1uCc2OjWy%p^ Wy%p^ WJ`(QF %0J`(QF %0J`(QF %0J`(QF D?6pIENDB`PNG  IHDR00*l PLTE8;tRNS\TIDATx^DZ  0<\y/: w~!{&fGjb쑚!{&fGjb쑚!{&f ~6 %IENDB`PNG  IHDRKIDATx^ձPaρTj"łxI#/b0x%T]T4M=/KBmH*24"p~bo8ʩh@ v2P!7(+P@B@e @ Q P$8S \)p xD{dt)P@ p"R 0"tI.;b\ʹӁG@Y} 0ײ EO