UNPKG

@optimizely/optimizely-sdk

Version:
1 lines 59.9 kB
import{ConsoleLogHandler as e,getLogger as t,setLogHandler as r,setLogLevel as i,LogLevel as n,setErrorHandler as o,getErrorHandler as a}from"@optimizely/js-sdk-logging";export{setLogLevel,setLogHandler as setLogger}from"@optimizely/js-sdk-logging";import{LogTierV1EventProcessor as s,LocalStoragePendingEventsDispatcher as u}from"@optimizely/js-sdk-event-processor";import{keyBy as l,NOTIFICATION_TYPES as E,sprintf as _,objectValues as I,generateUUID as c}from"@optimizely/js-sdk-utils";import{HttpPollingDatafileManager as g}from"@optimizely/js-sdk-datafile-manager";import f from"murmurhash";var d=Math.pow(2,53);function p(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];if(!e)return{};if("function"==typeof Object.assign)return Object.assign.apply(Object,[e].concat(t));for(var i=Object(e),n=0;n<t.length;n++){var o=t[n];if(null!=o)for(var a in o)Object.prototype.hasOwnProperty.call(o,a)&&(i[a]=o[a])}return i}function N(){return Math.round((new Date).getTime())}function R(e){return"number"==typeof e&&Math.abs(e)<=d}function O(e,t){return e?l(e,(function(e){return e[t]})):{}}function T(e){return"number"==typeof e}var h={NOTSET:0,DEBUG:1,INFO:2,WARNING:3,ERROR:4},v={CONDITION_EVALUATOR_ERROR:"%s: Error evaluating audience condition of type %s: %s",DATAFILE_AND_SDK_KEY_MISSING:"%s: You must provide at least one of sdkKey or datafile. Cannot start Optimizely",EXPERIMENT_KEY_NOT_IN_DATAFILE:"%s: Experiment key %s is not in datafile.",FEATURE_NOT_IN_DATAFILE:"%s: Feature key %s is not in datafile.",IMPROPERLY_FORMATTED_EXPERIMENT:"%s: Experiment key %s is improperly formatted.",INVALID_ATTRIBUTES:"%s: Provided attributes are in an invalid format.",INVALID_BUCKETING_ID:"%s: Unable to generate hash for bucketing ID %s: %s",INVALID_DATAFILE:"%s: Datafile is invalid - property %s: %s",INVALID_DATAFILE_MALFORMED:"%s: Datafile is invalid because it is malformed.",INVALID_CONFIG:"%s: Provided Optimizely config is in an invalid format.",INVALID_JSON:"%s: JSON object is not valid.",INVALID_ERROR_HANDLER:'%s: Provided "errorHandler" is in an invalid format.',INVALID_EVENT_DISPATCHER:'%s: Provided "eventDispatcher" is in an invalid format.',INVALID_EVENT_TAGS:"%s: Provided event tags are in an invalid format.",INVALID_EXPERIMENT_KEY:"%s: Experiment key %s is not in datafile. It is either invalid, paused, or archived.",INVALID_EXPERIMENT_ID:"%s: Experiment ID %s is not in datafile.",INVALID_GROUP_ID:"%s: Group ID %s is not in datafile.",INVALID_LOGGER:'%s: Provided "logger" is in an invalid format.',INVALID_ROLLOUT_ID:"%s: Invalid rollout ID %s attached to feature %s",INVALID_USER_ID:"%s: Provided user ID is in an invalid format.",INVALID_USER_PROFILE_SERVICE:"%s: Provided user profile service instance is in an invalid format: %s.",NO_DATAFILE_SPECIFIED:"%s: No datafile specified. Cannot start optimizely.",NO_JSON_PROVIDED:"%s: No JSON object to validate against schema.",NO_VARIATION_FOR_EXPERIMENT_KEY:"%s: No variation key %s defined in datafile for experiment %s.",UNDEFINED_ATTRIBUTE:"%s: Provided attribute: %s has an undefined value.",UNRECOGNIZED_ATTRIBUTE:"%s: Unrecognized attribute %s provided. Pruning before sending event to Optimizely.",UNABLE_TO_CAST_VALUE:"%s: Unable to cast value %s to type %s, returning null.",USER_NOT_IN_FORCED_VARIATION:"%s: User %s is not in the forced variation map. Cannot remove their forced variation.",USER_PROFILE_LOOKUP_ERROR:'%s: Error while looking up user profile for user ID "%s": %s.',USER_PROFILE_SAVE_ERROR:'%s: Error while saving user profile for user ID "%s": %s.',VARIABLE_KEY_NOT_IN_DATAFILE:'%s: Variable with key "%s" associated with feature with key "%s" is not in datafile.',VARIATION_ID_NOT_IN_DATAFILE:"%s: No variation ID %s defined in datafile for experiment %s.",VARIATION_ID_NOT_IN_DATAFILE_NO_EXPERIMENT:"%s: Variation ID %s is not in the datafile.",INVALID_INPUT_FORMAT:"%s: Provided %s is in an invalid format.",INVALID_DATAFILE_VERSION:"%s: This version of the JavaScript SDK does not support the given datafile version: %s",INVALID_VARIATION_KEY:"%s: Provided variation key is in an invalid format."},A={ACTIVATE_USER:"%s: Activating user %s in experiment %s.",DISPATCH_CONVERSION_EVENT:"%s: Dispatching conversion event to URL %s with params %s.",DISPATCH_IMPRESSION_EVENT:"%s: Dispatching impression event to URL %s with params %s.",DEPRECATED_EVENT_VALUE:"%s: Event value is deprecated in %s call.",EVENT_KEY_NOT_FOUND:"%s: Event key %s is not in datafile.",EXPERIMENT_NOT_RUNNING:"%s: Experiment %s is not running.",FEATURE_ENABLED_FOR_USER:"%s: Feature %s is enabled for user %s.",FEATURE_NOT_ENABLED_FOR_USER:"%s: Feature %s is not enabled for user %s.",FEATURE_HAS_NO_EXPERIMENTS:"%s: Feature %s is not attached to any experiments.",FAILED_TO_PARSE_VALUE:'%s: Failed to parse event value "%s" from event tags.',FAILED_TO_PARSE_REVENUE:'%s: Failed to parse revenue value "%s" from event tags.',FORCED_BUCKETING_FAILED:"%s: Variation key %s is not in datafile. Not activating user %s.",INVALID_OBJECT:"%s: Optimizely object is not valid. Failing %s.",INVALID_CLIENT_ENGINE:"%s: Invalid client engine passed: %s. Defaulting to node-sdk.",INVALID_VARIATION_ID:"%s: Bucketed into an invalid variation ID. Returning null.",NOTIFICATION_LISTENER_EXCEPTION:"%s: Notification listener for (%s) threw exception: %s",NO_ROLLOUT_EXISTS:"%s: There is no rollout of feature %s.",NOT_ACTIVATING_USER:"%s: Not activating user %s for experiment %s.",NOT_TRACKING_USER:"%s: Not tracking user %s.",PARSED_REVENUE_VALUE:'%s: Parsed revenue value "%s" from event tags.',PARSED_NUMERIC_VALUE:'%s: Parsed event value "%s" from event tags.',RETURNING_STORED_VARIATION:'%s: Returning previously activated variation "%s" of experiment "%s" for user "%s" from user profile.',ROLLOUT_HAS_NO_EXPERIMENTS:"%s: Rollout of feature %s has no experiments",SAVED_VARIATION:'%s: Saved variation "%s" of experiment "%s" for user "%s".',SAVED_VARIATION_NOT_FOUND:"%s: User %s was previously bucketed into variation with ID %s for experiment %s, but no matching variation was found.",SHOULD_NOT_DISPATCH_ACTIVATE:'%s: Experiment %s is not in "Running" state. Not activating user.',SKIPPING_JSON_VALIDATION:"%s: Skipping JSON schema validation.",TRACK_EVENT:"%s: Tracking event %s for user %s.",USER_ASSIGNED_TO_EXPERIMENT_BUCKET:"%s: Assigned bucket %s to user with bucketing ID %s.",USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP:"%s: User %s is in experiment %s of group %s.",USER_BUCKETED_INTO_TARGETING_RULE:"%s: User %s bucketed into targeting rule %s.",USER_IN_FEATURE_EXPERIMENT:"%s: User %s is in variation %s of experiment %s on the feature %s.",USER_IN_ROLLOUT:"%s: User %s is in rollout of feature %s.",USER_BUCKETED_INTO_EVERYONE_TARGETING_RULE:"%s: User %s bucketed into everyone targeting rule.",USER_NOT_BUCKETED_INTO_EVERYONE_TARGETING_RULE:"%s: User %s not bucketed into everyone targeting rule due to traffic allocation.",USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP:"%s: User %s is not in experiment %s of group %s.",USER_NOT_BUCKETED_INTO_ANY_EXPERIMENT_IN_GROUP:"%s: User %s is not in any experiment of group %s.",USER_NOT_BUCKETED_INTO_TARGETING_RULE:"%s User %s not bucketed into targeting rule %s due to traffic allocation. Trying everyone rule.",USER_NOT_IN_FEATURE_EXPERIMENT:"%s: User %s is not in any experiment on the feature %s.",USER_NOT_IN_ROLLOUT:"%s: User %s is not in rollout of feature %s.",USER_FORCED_IN_VARIATION:"%s: User %s is forced in variation %s.",USER_MAPPED_TO_FORCED_VARIATION:"%s: Set variation %s for experiment %s and user %s in the forced variation map.",USER_DOESNT_MEET_CONDITIONS_FOR_TARGETING_RULE:"%s: User %s does not meet conditions for targeting rule %s.",USER_MEETS_CONDITIONS_FOR_TARGETING_RULE:"%s: User %s meets conditions for targeting rule %s.",USER_HAS_VARIATION:"%s: User %s is in variation %s of experiment %s.",USER_HAS_FORCED_VARIATION:"%s: Variation %s is mapped to experiment %s and user %s in the forced variation map.",USER_HAS_NO_VARIATION:"%s: User %s is in no variation of experiment %s.",USER_HAS_NO_FORCED_VARIATION:"%s: User %s is not in the forced variation map.",USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT:"%s: No experiment %s mapped to user %s in the forced variation map.",USER_NOT_IN_ANY_EXPERIMENT:"%s: User %s is not in any experiment of group %s.",USER_NOT_IN_EXPERIMENT:"%s: User %s does not meet conditions to be in experiment %s.",USER_RECEIVED_DEFAULT_VARIABLE_VALUE:'%s: User "%s" is not in any variation or rollout rule. Returning default value for variable "%s" of feature flag "%s".',FEATURE_NOT_ENABLED_RETURN_DEFAULT_VARIABLE_VALUE:'%s: Feature "%s" is not enabled for user %s. Returning the default variable value "%s".',VARIABLE_NOT_USED_RETURN_DEFAULT_VARIABLE_VALUE:'%s: Variable "%s" is not used in variation "%s". Returning default value.',USER_RECEIVED_VARIABLE_VALUE:'%s: Got variable value "%s" for variable "%s" of feature flag "%s"',VALID_DATAFILE:"%s: Datafile is valid.",VALID_USER_PROFILE_SERVICE:"%s: Valid user profile service provided.",VARIATION_REMOVED_FOR_USER:"%s: Variation mapped to experiment %s has been removed for user %s.",VARIABLE_REQUESTED_WITH_WRONG_TYPE:'%s: Requested variable type "%s", but variable is of type "%s". Use correct API to retrieve value. Returning None.',VALID_BUCKETING_ID:'%s: BucketingId is valid: "%s"',BUCKETING_ID_NOT_STRING:"%s: BucketingID attribute is not a string. Defaulted to userId",EVALUATING_AUDIENCE:'%s: Starting to evaluate audience "%s" with conditions: %s.',EVALUATING_AUDIENCES_COMBINED:'%s: Evaluating audiences for %s "%s": %s.',AUDIENCE_EVALUATION_RESULT:'%s: Audience "%s" evaluated to %s.',AUDIENCE_EVALUATION_RESULT_COMBINED:"%s: Audiences for %s %s collectively evaluated to %s.",MISSING_ATTRIBUTE_VALUE:'%s: Audience condition %s evaluated to UNKNOWN because no value was passed for user attribute "%s".',UNEXPECTED_CONDITION_VALUE:"%s: Audience condition %s evaluated to UNKNOWN because the condition value is not supported.",UNEXPECTED_TYPE:'%s: Audience condition %s evaluated to UNKNOWN because a value of type "%s" was passed for user attribute "%s".',UNEXPECTED_TYPE_NULL:'%s: Audience condition %s evaluated to UNKNOWN because a null value was passed for user attribute "%s".',UNKNOWN_CONDITION_TYPE:"%s: Audience condition %s has an unknown condition type. You may need to upgrade to a newer release of the Optimizely SDK.",UNKNOWN_MATCH_TYPE:"%s: Audience condition %s uses an unknown match type. You may need to upgrade to a newer release of the Optimizely SDK.",UPDATED_OPTIMIZELY_CONFIG:"%s: Updated Optimizely config to revision %s (project id %s)",OUT_OF_BOUNDS:'%s: Audience condition %s evaluated to UNKNOWN because the number value for user attribute "%s" is not in the range [-2^53, +2^53].',UNABLE_TO_ATTACH_UNLOAD:'%s: unable to bind optimizely.close() to page unload event: "%s"'},y={REVENUE:"revenue",VALUE:"value"},U={BOT_FILTERING:"$opt_bot_filtering",BUCKETING_ID:"$opt_bucketing_id",STICKY_BUCKETING_KEY:"$opt_experiment_bucket_map",USER_AGENT:"$opt_user_agent"},m=["node-sdk","react-sdk","javascript-sdk"],L=E,V={AB_TEST:"ab-test",FEATURE:"feature",FEATURE_TEST:"feature-test",FEATURE_VARIABLE:"feature-variable",ALL_FEATURE_VARIABLES:"all-feature-variables"},D={FEATURE_TEST:"feature-test",ROLLOUT:"rollout"},S={RULE:"rule",EXPERIMENT:"experiment"},C={BOOLEAN:"boolean",DOUBLE:"double",INTEGER:"integer",STRING:"string",JSON:"json"},P={V2:"2",V3:"3",V4:"4"},F=Object.freeze({__proto__:null,LOG_LEVEL:h,ERROR_MESSAGES:v,LOG_MESSAGES:A,RESERVED_EVENT_KEYWORDS:y,CONTROL_ATTRIBUTES:U,JAVASCRIPT_CLIENT_ENGINE:"javascript-sdk",NODE_CLIENT_ENGINE:"node-sdk",REACT_CLIENT_ENGINE:"react-sdk",NODE_CLIENT_VERSION:"4.3.4",VALID_CLIENT_ENGINES:m,NOTIFICATION_TYPES:L,DECISION_NOTIFICATION_TYPES:V,DECISION_SOURCES:D,AUDIENCE_EVALUATION_TYPES:S,FEATURE_VARIABLE_TYPES:C,DATAFILE_VERSIONS:P}),M="CONFIG_VALIDATOR",b=[P.V2,P.V3,P.V4],k=function(e){if("object"==typeof e&&null!==e){if(e.errorHandler&&"function"!=typeof e.errorHandler.handleError)throw new Error(_(v.INVALID_ERROR_HANDLER,M));if(e.eventDispatcher&&"function"!=typeof e.eventDispatcher.dispatchEvent)throw new Error(_(v.INVALID_EVENT_DISPATCHER,M));if(e.logger&&"function"!=typeof e.logger.log)throw new Error(_(v.INVALID_LOGGER,M));return!0}throw new Error(_(v.INVALID_CONFIG,M))},B=function(e){if(!e)throw new Error(_(v.NO_DATAFILE_SPECIFIED,M));if("string"==typeof e)try{e=JSON.parse(e)}catch(e){throw new Error(_(v.INVALID_DATAFILE_MALFORMED,M))}if("object"==typeof e&&!Array.isArray(e)&&null!==e&&-1===b.indexOf(e.version))throw new Error(_(v.INVALID_DATAFILE_VERSION,M,e.version));return e},x={handleError:function(){}},K=function(e){return Object.keys(e).map((function(t){return encodeURIComponent(t)+"="+encodeURIComponent(e[t])})).join("&")},G={dispatchEvent:function(e,t){var r,i=e.url,n=e.params;"POST"===e.httpVerb?((r=new XMLHttpRequest).open("POST",i,!0),r.setRequestHeader("Content-Type","application/json"),r.onreadystatechange=function(){if(4===r.readyState&&t&&"function"==typeof t)try{t({statusCode:r.status})}catch(e){}},r.send(JSON.stringify(n))):(i+="?wxhr=true",n&&(i+="&"+K(n)),(r=new XMLHttpRequest).open("GET",i,!0),r.onreadystatechange=function(){if(4===r.readyState&&t&&"function"==typeof t)try{t()}catch(e){}},r.send())}};function w(){}w.prototype.log=function(){};var j={createLogger:function(t){return new e(t)},createNoOpLogger:function(){return new w}},Y="PROJECT_CONFIG";var H=function(e,t){void 0===t&&(t=null);var r,i,n=((i=p({},r=e)).audiences=(r.audiences||[]).map((function(e){return p({},e)})),i.experiments=(r.experiments||[]).map((function(e){return p({},e)})),i.featureFlags=(r.featureFlags||[]).map((function(e){return p({},e)})),i.groups=(r.groups||[]).map((function(e){var t=p({},e);return t.experiments=(e.experiments||[]).map((function(e){return p({},e)})),t})),i.rollouts=(r.rollouts||[]).map((function(e){var t=p({},e);return t.experiments=(e.experiments||[]).map((function(e){return p({},e)})),t})),i);return n.__datafileStr=null===t?JSON.stringify(e):t,(n.audiences||[]).forEach((function(e){e.conditions=JSON.parse(e.conditions)})),n.audiencesById=O(n.audiences,"id"),p(n.audiencesById,O(n.typedAudiences,"id")),n.attributeKeyMap=O(n.attributes,"key"),n.eventKeyMap=O(n.events,"key"),n.groupIdMap=O(n.groups,"id"),Object.keys(n.groupIdMap||{}).forEach((function(e){(n.groupIdMap[e].experiments||[]).forEach((function(t){n.experiments.push(p(t,{groupId:e}))}))})),n.rolloutIdMap=O(n.rollouts||[],"id"),I(n.rolloutIdMap||{}).forEach((function(e){(e.experiments||[]).forEach((function(e){n.experiments.push(e),e.variationKeyMap=O(e.variations,"key")}))})),n.experimentKeyMap=O(n.experiments,"key"),n.experimentIdMap=O(n.experiments,"id"),n.variationIdMap={},n.variationVariableUsageMap={},(n.experiments||[]).forEach((function(e){e.variationKeyMap=O(e.variations,"key"),p(n.variationIdMap,O(e.variations,"id")),I(e.variationKeyMap||{}).forEach((function(e){e.variables&&(n.variationVariableUsageMap[e.id]=O(e.variables,"id"))}))})),n.experimentFeatureMap={},n.featureKeyMap=O(n.featureFlags||[],"key"),I(n.featureKeyMap||{}).forEach((function(e){e.variables.forEach((function(e){e.type===C.STRING&&e.subType===C.JSON&&(e.type=C.JSON,delete e.subType)})),e.variableKeyMap=O(e.variables,"key"),(e.experimentIds||[]).forEach((function(t){n.experimentFeatureMap[t]?n.experimentFeatureMap[t].push(e.id):n.experimentFeatureMap[t]=[e.id];var r=n.experimentIdMap[t];r.groupId&&!e.groupId&&(e.groupId=r.groupId)}))})),n},X=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(_(v.INVALID_EXPERIMENT_KEY,Y,t));return r.id},J=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(_(v.INVALID_EXPERIMENT_KEY,Y,t));return r.status},z=function(e,t){return"Running"===J(e,t)},Z=function(e,t,r){var i=e.experimentKeyMap[t];return i.variationKeyMap.hasOwnProperty(r)?i.variationKeyMap[r].id:null},W=function(e,t,r){if(e.featureKeyMap.hasOwnProperty(t)){var i=e.featureKeyMap[t];if(i)return i}return r.log(h.ERROR,_(v.FEATURE_NOT_IN_DATAFILE,Y,t)),null},$=function(e,t,r,i){var n=e.featureKeyMap[t];if(!n)return i.log(h.ERROR,_(v.FEATURE_NOT_IN_DATAFILE,Y,t)),null;var o=n.variableKeyMap[r];return o||(i.log(h.ERROR,_(v.VARIABLE_KEY_NOT_IN_DATAFILE,Y,r,t)),null)},q=function(e,t,r,i){if(!t||!r)return null;if(!e.variationVariableUsageMap.hasOwnProperty(r.id))return i.log(h.ERROR,_(v.VARIATION_ID_NOT_IN_DATAFILE_NO_EXPERIMENT,Y,r.id)),null;var n=e.variationVariableUsageMap[r.id][t.id];return n?n.value:null},Q=function(e,t,r){var i;switch(t){case C.BOOLEAN:"true"!==e&&"false"!==e?(r.log(h.ERROR,_(v.UNABLE_TO_CAST_VALUE,Y,e,t)),i=null):i="true"===e;break;case C.INTEGER:i=parseInt(e,10),isNaN(i)&&(r.log(h.ERROR,_(v.UNABLE_TO_CAST_VALUE,Y,e,t)),i=null);break;case C.DOUBLE:i=parseFloat(e),isNaN(i)&&(r.log(h.ERROR,_(v.UNABLE_TO_CAST_VALUE,Y,e,t)),i=null);break;case C.JSON:try{i=JSON.parse(e)}catch(n){r.log(h.ERROR,_(v.UNABLE_TO_CAST_VALUE,Y,e,t)),i=null}break;default:i=e}return i},ee=function(e,t){return e.eventKeyMap.hasOwnProperty(t)},te=function(e,t){return e.experimentFeatureMap.hasOwnProperty(t)},re=X,ie=function(e,t){var r=e.experimentIdMap[t];if(!r)throw new Error(_(v.INVALID_EXPERIMENT_ID,Y,t));return r.layerId},ne=function(e,t,r){var i=e.attributeKeyMap[t],n=0===t.indexOf("$opt_");return i?(n&&r.log(h.WARN,_("Attribute %s unexpectedly has reserved prefix %s; using attribute ID instead of reserved attribute name.",t,"$opt_")),i.id):n?t:(r.log(h.DEBUG,_(v.UNRECOGNIZED_ATTRIBUTE,Y,t)),null)},oe=function(e,t){var r=e.eventKeyMap[t];return r?r.id:null},ae=function(e,t){return"Running"===J(e,t)},se=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(_(v.INVALID_EXPERIMENT_KEY,Y,t));return r.audienceConditions||r.audienceIds},ue=function(e,t){return e.variationIdMap.hasOwnProperty(t)?e.variationIdMap[t].key:null},le=Z,Ee=function(e,t){if(e.experimentKeyMap.hasOwnProperty(t)){var r=e.experimentKeyMap[t];if(r)return r}throw new Error(_(v.EXPERIMENT_KEY_NOT_IN_DATAFILE,Y,t))},_e=function(e,t){var r=e.experimentKeyMap[t];if(!r)throw new Error(_(v.INVALID_EXPERIMENT_KEY,Y,t));return r.trafficAllocation},Ie=function(e,t,r){if(e.experimentIdMap.hasOwnProperty(t)){var i=e.experimentIdMap[t];if(i)return i}return r.log(h.ERROR,_(v.INVALID_EXPERIMENT_ID,Y,t)),null},ce=function(e){return e.audiencesById},ge=function(e){return e.__datafileStr},fe=function(e){var t;try{t=B(e.datafile)}catch(e){return{configObj:null,error:e}}if(e.jsonSchemaValidator)try{e.jsonSchemaValidator.validate(t),e.logger.log(h.INFO,_(A.VALID_DATAFILE,Y))}catch(e){return{configObj:null,error:e}}else e.logger.log(h.INFO,_(A.SKIPPING_JSON_VALIDATION,Y));var r=[t];return"string"==typeof e.datafile&&r.push(e.datafile),{configObj:H.apply(void 0,r),error:null}};function de(e,t,r,i){var n=e.experimentFeatureMap[r],o={};if(n){var a=i[n],s=(t.variables||[]).reduce((function(e,t){return e[t.id]={id:t.id,value:t.value},e}),{});o=(a||[]).reduce((function(e,r){var i=s[r.id],n=t.featureEnabled&&i?i.value:r.defaultValue;return e[r.key]={id:r.id,key:r.key,type:r.type,value:n},e}),{})}return o}function pe(e,t){this.experimentsMap=function(e){var t=(e.rollouts||[]).reduce((function(e,t){return t.experiments.forEach((function(t){e[t.id]=!0})),e}),{}),r=(e.featureFlags||[]).reduce((function(e,t){return e[t.id]=t.variables,e}),{});return(e.experiments||[]).reduce((function(i,n){return t[n.id]||(i[n.key]={id:n.id,key:n.key,variationsMap:(n.variations||[]).reduce((function(t,i){return t[i.key]={id:i.id,key:i.key,variablesMap:de(e,i,n.id,r)},te(e,n.id)&&(t[i.key].featureEnabled=i.featureEnabled),t}),{})}),i}),{})}(e),this.featuresMap=function(e,t){return(e.featureFlags||[]).reduce((function(r,i){return r[i.key]={id:i.id,key:i.key,experimentsMap:(i.experimentIds||[]).reduce((function(r,i){var n=e.experimentIdMap[i].key;return r[n]=t[n],r}),{}),variablesMap:(i.variables||[]).reduce((function(e,t){return e[t.key]={id:t.id,key:t.key,type:t.type,value:t.defaultValue},e}),{})},r}),{})}(e,this.experimentsMap),this.revision=e.revision,this.__datafile=t}pe.prototype.getDatafile=function(){return this.__datafile};var Ne={OptimizelyConfig:pe},Re=t();function Oe(e,t){return e instanceof Error?e.message:t||"Unknown error"}function Te(e){try{this.__initialize(e)}catch(e){Re.error(e),this.__updateListeners=[],this.__configObj=null,this.__optimizelyConfigObj=null,this.__readyPromise=Promise.resolve({success:!1,reason:Oe(e,"Error in initialize")})}}Te.prototype.__initialize=function(e){if(this.__updateListeners=[],this.jsonSchemaValidator=e.jsonSchemaValidator,!e.datafile&&!e.sdkKey){this.__configObj=null;var t=new Error(_(v.DATAFILE_AND_SDK_KEY_MISSING,"PROJECT_CONFIG_MANAGER"));return this.__readyPromise=Promise.resolve({success:!1,reason:Oe(t)}),void Re.error(t)}var r;if(e.datafile?(r=this.__handleNewDatafile(e.datafile))&&(this.__configObj=null):this.__configObj=null,e.sdkKey){var i={sdkKey:e.sdkKey};this.__validateDatafileOptions(e.datafileOptions)&&p(i,e.datafileOptions),this.__configObj&&(i.datafile=ge(this.__configObj)),this.datafileManager=new g(i),this.datafileManager.start(),this.__readyPromise=this.datafileManager.onReady().then(this.__onDatafileManagerReadyFulfill.bind(this),this.__onDatafileManagerReadyReject.bind(this)),this.datafileManager.on("update",this.__onDatafileManagerUpdate.bind(this))}else this.__configObj?this.__readyPromise=Promise.resolve({success:!0}):this.__readyPromise=Promise.resolve({success:!1,reason:Oe(r,"Invalid datafile")})},Te.prototype.__onDatafileManagerReadyFulfill=function(){var e=this.__handleNewDatafile(this.datafileManager.get());return e?{success:!1,reason:Oe(e)}:{success:!0}},Te.prototype.__onDatafileManagerReadyReject=function(e){return{success:!1,reason:Oe(e,"Failed to become ready")}},Te.prototype.__onDatafileManagerUpdate=function(){this.__handleNewDatafile(this.datafileManager.get())},Te.prototype.__validateDatafileOptions=function(e){return void 0===e||"object"==typeof e&&null!==e},Te.prototype.__handleNewDatafile=function(e){var t=fe({datafile:e,jsonSchemaValidator:this.jsonSchemaValidator,logger:Re}),r=t.configObj,i=t.error;i?Re.error(i):(this.__configObj?this.__configObj.revision:"null")!==r.revision&&(this.__configObj=r,this.__optimizelyConfigObj=new Ne.OptimizelyConfig(this.__configObj,ge(this.__configObj)),this.__updateListeners.forEach((function(e){e(r)})));return i},Te.prototype.getConfig=function(){return this.__configObj},Te.prototype.getOptimizelyConfig=function(){return this.__optimizelyConfigObj},Te.prototype.onReady=function(){return this.__readyPromise},Te.prototype.onUpdate=function(e){return this.__updateListeners.push(e),function(){var t=this.__updateListeners.indexOf(e);t>-1&&this.__updateListeners.splice(t,1)}.bind(this)},Te.prototype.stop=function(){this.datafileManager&&this.datafileManager.stop(),this.__updateListeners=[]};function he(e){this.logger=e.logger,this.errorHandler=e.errorHandler,this.__notificationListeners={},I(L).forEach(function(e){this.__notificationListeners[e]=[]}.bind(this)),this.__listenerId=1}he.prototype.addNotificationListener=function(e,t){try{if(!(I(L).indexOf(e)>-1))return-1;this.__notificationListeners[e]||(this.__notificationListeners[e]=[]);var r=!1;if((this.__notificationListeners[e]||[]).forEach((function(e){if(e.callback===t)return r=!0,!1})),r)return-1;this.__notificationListeners[e].push({id:this.__listenerId,callback:t});var i=this.__listenerId;return this.__listenerId+=1,i}catch(e){return this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e),-1}},he.prototype.removeNotificationListener=function(e){try{var t,r;if(Object.keys(this.__notificationListeners).some(function(i){if((this.__notificationListeners[i]||[]).every((function(n,o){return n.id!==e||(t=o,r=i,!1)})),void 0!==t&&void 0!==r)return!0}.bind(this)),void 0!==t&&void 0!==r)return this.__notificationListeners[r].splice(t,1),!0}catch(e){this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e)}return!1},he.prototype.clearAllNotificationListeners=function(){try{I(L).forEach(function(e){this.__notificationListeners[e]=[]}.bind(this))}catch(e){this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e)}},he.prototype.clearNotificationListeners=function(e){try{this.__notificationListeners[e]=[]}catch(e){this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e)}},he.prototype.sendNotifications=function(e,t){try{(this.__notificationListeners[e]||[]).forEach(function(r){var i=r.callback;try{i(t)}catch(t){this.logger.log(h.ERROR,_(A.NOTIFICATION_LISTENER_EXCEPTION,"NOTIFICATION_CENTER",e,t.message))}}.bind(this))}catch(e){this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e)}};var ve=Math.pow(2,32),Ae={bucket:function(e){var t=e.experimentKeyMap[e.experimentKey].groupId;if(t){var r=e.groupIdMap[t];if(!r)throw new Error(_(v.INVALID_GROUP_ID,"BUCKETER",t));if("random"===r.policy){var i=this.bucketUserIntoExperiment(r,e.bucketingId,e.userId,e.logger);if(null===i){var n=_(A.USER_NOT_IN_ANY_EXPERIMENT,"BUCKETER",e.userId,t);return e.logger.log(h.INFO,n),null}if(i!==e.experimentId){var o=_(A.USER_NOT_BUCKETED_INTO_EXPERIMENT_IN_GROUP,"BUCKETER",e.userId,e.experimentKey,t);return e.logger.log(h.INFO,o),null}var a=_(A.USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP,"BUCKETER",e.userId,e.experimentKey,t);e.logger.log(h.INFO,a)}}var s=_("%s%s",e.bucketingId,e.experimentId),u=this._generateBucketValue(s),l=_(A.USER_ASSIGNED_TO_EXPERIMENT_BUCKET,"BUCKETER",u,e.userId);e.logger.log(h.DEBUG,l);var E=this._findBucket(u,e.trafficAllocationConfig);if(!e.variationIdMap.hasOwnProperty(E)){if(E){var I=_(A.INVALID_VARIATION_ID,"BUCKETER");e.logger.log(h.WARNING,I)}return null}return E},bucketUserIntoExperiment:function(e,t,r,i){var n=_("%s%s",t,e.id),o=this._generateBucketValue(n);i.log(h.DEBUG,_(A.USER_ASSIGNED_TO_EXPERIMENT_BUCKET,"BUCKETER",o,r));var a=e.trafficAllocation;return this._findBucket(o,a)},_findBucket:function(e,t){for(var r=0;r<t.length;r++)if(e<t[r].endOfRange)return t[r].entityId;return null},_generateBucketValue:function(e){try{var t=f.v3(e,1);return parseInt(1e4*(t/ve),10)}catch(t){throw new Error(_(v.INVALID_BUCKETING_ID,"BUCKETER",e,t.message))}}},ye=["and","or","not"];function Ue(e,t){if(Array.isArray(e)){var r=e[0],i=e.slice(1);switch("string"==typeof r&&-1===ye.indexOf(r)&&(r="or",i=e),r){case"and":return function(e,t){var r=!1;if(Array.isArray(e)){for(var i=0;i<e.length;i++){var n=Ue(e[i],t);if(!1===n)return!1;null===n&&(r=!0)}return!r||null}return null}(i,t);case"not":return function(e,t){if(Array.isArray(e)&&e.length>0){var r=Ue(e[0],t);return null===r?null:!r}return null}(i,t);default:return function(e,t){var r=!1;if(Array.isArray(e)){for(var i=0;i<e.length;i++){var n=Ue(e[i],t);if(!0===n)return!0;null===n&&(r=!0)}return!!r&&null}return null}(i,t)}}return t(e)}var me=t();function Le(e){return/^\d+$/.test(e)}function Ve(e){var t=e.indexOf("-"),r=e.indexOf("+");return!(t<0)&&(r<0||t<r)}function De(e){var t=e.indexOf("-"),r=e.indexOf("+");return!(r<0)&&(t<0||r<t)}function Se(e){var t=e,r="";if(function(e){return/\s/.test(e)}(e))return me.warn(A.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;if(Ve(e)?(t=e.substring(0,e.indexOf("-")),r=e.substring(e.indexOf("-")+1)):De(e)&&(t=e.substring(0,e.indexOf("+")),r=e.substring(e.indexOf("+")+1)),"string"!=typeof t||"string"!=typeof r)return null;var i=t.split(".").length-1;if(i>2)return me.warn(A.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;var n=t.split(".");if(n.length!=i+1)return me.warn(A.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null;for(var o=0,a=n;o<a.length;o++){if(!Le(a[o]))return me.warn(A.UNKNOWN_MATCH_TYPE,"SEMANTIC VERSION",e),null}return r&&n.push(r),n}var Ce="CUSTOM_ATTRIBUTE_CONDITION_EVALUATOR",Pe=t(),Fe=["exact","exists","gt","ge","lt","le","substring","semver_eq","semver_lt","semver_le","semver_gt","semver_ge"],Me={};function be(e){return"string"==typeof e||"boolean"==typeof e||T(e)}function ke(e,t){var r=e.value,i=typeof r,n=e.name,o=t[n],a=typeof o;return!be(r)||T(r)&&!R(r)?(Pe.warn(A.UNEXPECTED_CONDITION_VALUE,Ce,JSON.stringify(e)),null):null===o?(Pe.debug(A.UNEXPECTED_TYPE_NULL,Ce,JSON.stringify(e),n),null):be(o)&&i===a?T(o)&&!R(o)?(Pe.warn(A.OUT_OF_BOUNDS,Ce,JSON.stringify(e),n),null):r===o:(Pe.warn(A.UNEXPECTED_TYPE,Ce,JSON.stringify(e),a,n),null)}function Be(e,t){var r=e.name,i=t[r],n=typeof i,o=e.value;return null!==o&&R(o)?null===i?(Pe.debug(A.UNEXPECTED_TYPE_NULL,Ce,JSON.stringify(e),r),!1):T(i)?!!R(i)||(Pe.warn(A.OUT_OF_BOUNDS,Ce,JSON.stringify(e),r),!1):(Pe.warn(A.UNEXPECTED_TYPE,Ce,JSON.stringify(e),n,r),!1):(Pe.warn(A.UNEXPECTED_CONDITION_VALUE,Ce,JSON.stringify(e)),!1)}function xe(e,t){var r=e.name,i=t[r],n=typeof i,o=e.value;return"string"!=typeof o?(Pe.warn(A.UNEXPECTED_CONDITION_VALUE,Ce,JSON.stringify(e)),null):null===i?(Pe.debug(A.UNEXPECTED_TYPE_NULL,Ce,JSON.stringify(e),r),null):"string"!=typeof i?(Pe.warn(A.UNEXPECTED_TYPE,Ce,JSON.stringify(e),n,r),null):function(e,t){var r=Se(t),i=Se(e);if(!r||!i)return null;for(var n=r.length,o=0;o<i.length;o++){if(n<=o)return Ve(e)||De(e)?1:-1;if(Le(r[o])){var a=parseInt(r[o]),s=parseInt(i[o]);if(a>s)return 1;if(a<s)return-1}else{if(r[o]<i[o])return Ve(e)&&!Ve(t)?1:-1;if(r[o]>i[o])return!Ve(e)&&Ve(t)?-1:1}}return Ve(t)&&!Ve(e)?-1:0}(o,i)}Me.exact=ke,Me.exists=function(e,t){var r=t[e.name];return null!=r},Me.gt=function(e,t){var r=t[e.name],i=e.value;if(!Be(e,t)||null===i)return null;return r>i},Me.ge=function(e,t){var r=t[e.name],i=e.value;if(!Be(e,t)||null===i)return null;return r>=i},Me.lt=function(e,t){var r=t[e.name],i=e.value;if(!Be(e,t)||null===i)return null;return r<i},Me.le=function(e,t){var r=t[e.name],i=e.value;if(!Be(e,t)||null===i)return null;return r<=i},Me.substring=function(e,t){var r=e.name,i=t[e.name],n=typeof i,o=e.value;if("string"!=typeof o)return Pe.warn(A.UNEXPECTED_CONDITION_VALUE,Ce,JSON.stringify(e)),null;if(null===i)return Pe.debug(A.UNEXPECTED_TYPE_NULL,Ce,JSON.stringify(e),r),null;if("string"!=typeof i)return Pe.warn(A.UNEXPECTED_TYPE,Ce,JSON.stringify(e),n,r),null;return-1!==i.indexOf(o)},Me.semver_eq=function(e,t){var r=xe(e,t);if(null===r)return null;return 0===r},Me.semver_gt=function(e,t){var r=xe(e,t);if(null===r)return null;return r>0},Me.semver_ge=function(e,t){var r=xe(e,t);if(null===r)return null;return r>=0},Me.semver_lt=function(e,t){var r=xe(e,t);if(null===r)return null;return r<0},Me.semver_le=function(e,t){var r=xe(e,t);if(null===r)return null;return r<=0};var Ke=Object.freeze({__proto__:null,evaluate:function(e,t){var r=e.match;if(void 0!==r&&-1===Fe.indexOf(r))return Pe.warn(A.UNKNOWN_MATCH_TYPE,Ce,JSON.stringify(e)),null;var i=e.name;return t.hasOwnProperty(i)||"exists"==r?(r&&Me[r]||ke)(e,t):(Pe.debug(A.MISSING_ATTRIBUTE_VALUE,Ce,JSON.stringify(e),i),null)}}),Ge=t();function we(e){this.typeToEvaluatorMap=p({},e,{custom_attribute:Ke})}function je(e){return"string"==typeof e&&""!==e}we.prototype.evaluate=function(e,t,r){if(!e||0===e.length)return!0;r||(r={});var i=function(e){var i=t[e];if(i){Ge.log(h.DEBUG,_(A.EVALUATING_AUDIENCE,"AUDIENCE_EVALUATOR",e,JSON.stringify(i.conditions)));var n=Ue(i.conditions,this.evaluateConditionWithUserAttributes.bind(this,r)),o=null===n?"UNKNOWN":n.toString().toUpperCase();return Ge.log(h.DEBUG,_(A.AUDIENCE_EVALUATION_RESULT,"AUDIENCE_EVALUATOR",e,o)),n}return null}.bind(this);return Ue(e,i)||!1},we.prototype.evaluateConditionWithUserAttributes=function(e,t){var r=this.typeToEvaluatorMap[t.type];if(!r)return Ge.log(h.WARNING,_(A.UNKNOWN_CONDITION_TYPE,"AUDIENCE_EVALUATOR",JSON.stringify(t))),null;try{return r.evaluate(t,e,Ge)}catch(e){Ge.log(h.ERROR,_(v.CONDITION_EVALUATOR_ERROR,"AUDIENCE_EVALUATOR",t.type,e.message))}return null};var Ye="DECISION_SERVICE",He=v,Xe=h,Je=A,ze=D,Ze=S;function We(e){this.audienceEvaluator=new we(e.UNSTABLE_conditionEvaluators),this.forcedVariationMap={},this.logger=e.logger,this.userProfileService=e.userProfileService||null}We.prototype.getVariation=function(e,t,r,i){var n=this._getBucketingId(r,i);if(!this.__checkIfExperimentIsActive(e,t))return null;var o=e.experimentKeyMap[t],a=this.getForcedVariation(e,t,r);if(a)return a;var s=this.__getWhitelistedVariation(o,r);if(s)return s.key;var u=this.__resolveExperimentBucketMap(r,i);if(s=this.__getStoredVariation(e,o,r,u))return this.logger.log(Xe.INFO,_(Je.RETURNING_STORED_VARIATION,Ye,s.key,t,r)),s.key;if(!this.__checkIfUserIsInAudience(e,t,Ze.EXPERIMENT,r,i,"")){var l=_(Je.USER_NOT_IN_EXPERIMENT,Ye,r,t);return this.logger.log(Xe.INFO,l),null}var E=this.__buildBucketerParams(e,t,n,r),I=Ae.bucket(E);if(!(s=e.variationIdMap[I])){var c=_(Je.USER_HAS_NO_VARIATION,Ye,r,t);return this.logger.log(Xe.DEBUG,c),null}var g=_(Je.USER_HAS_VARIATION,Ye,r,s.key,t);return this.logger.log(Xe.INFO,g),this.__saveUserProfile(o,s,r,u),s.key},We.prototype.__resolveExperimentBucketMap=function(e,t){t=t||{};var r=this.__getUserProfile(e)||{},i=t[U.STICKY_BUCKETING_KEY];return p({},r.experiment_bucket_map,i)},We.prototype.__checkIfExperimentIsActive=function(e,t){if(!ae(e,t)){var r=_(Je.EXPERIMENT_NOT_RUNNING,Ye,t);return this.logger.log(Xe.INFO,r),!1}return!0},We.prototype.__getWhitelistedVariation=function(e,t){if(e.forcedVariations&&e.forcedVariations.hasOwnProperty(t)){var r=e.forcedVariations[t];if(e.variationKeyMap.hasOwnProperty(r)){var i=_(Je.USER_FORCED_IN_VARIATION,Ye,t,r);return this.logger.log(Xe.INFO,i),e.variationKeyMap[r]}var n=_(Je.FORCED_BUCKETING_FAILED,Ye,r,t);return this.logger.log(Xe.ERROR,n),null}return null},We.prototype.__checkIfUserIsInAudience=function(e,t,r,i,n,o){var a=se(e,t),s=ce(e);this.logger.log(Xe.DEBUG,_(Je.EVALUATING_AUDIENCES_COMBINED,Ye,r,o||t,JSON.stringify(a)));var u=this.audienceEvaluator.evaluate(a,s,n);return this.logger.log(Xe.INFO,_(Je.AUDIENCE_EVALUATION_RESULT_COMBINED,Ye,r,o||t,u.toString().toUpperCase())),u},We.prototype.__buildBucketerParams=function(e,t,r,i){var n={};return n.experimentKey=t,n.experimentId=re(e,t),n.userId=i,n.trafficAllocationConfig=_e(e,t),n.experimentKeyMap=e.experimentKeyMap,n.groupIdMap=e.groupIdMap,n.variationIdMap=e.variationIdMap,n.logger=this.logger,n.bucketingId=r,n},We.prototype.__getStoredVariation=function(e,t,r,i){if(i.hasOwnProperty(t.id)){var n=i[t.id],o=n.variation_id;if(e.variationIdMap.hasOwnProperty(o))return e.variationIdMap[n.variation_id];this.logger.log(Xe.INFO,_(Je.SAVED_VARIATION_NOT_FOUND,Ye,r,o,t.key))}return null},We.prototype.__getUserProfile=function(e){var t={user_id:e,experiment_bucket_map:{}};if(!this.userProfileService)return t;try{return this.userProfileService.lookup(e)}catch(t){this.logger.log(Xe.ERROR,_(He.USER_PROFILE_LOOKUP_ERROR,Ye,e,t.message))}},We.prototype.__saveUserProfile=function(e,t,r,i){if(this.userProfileService)try{i[e.id]={variation_id:t.id},this.userProfileService.save({user_id:r,experiment_bucket_map:i}),this.logger.log(Xe.INFO,_(Je.SAVED_VARIATION,Ye,t.key,e.key,r))}catch(e){this.logger.log(Xe.ERROR,_(He.USER_PROFILE_SAVE_ERROR,Ye,r,e.message))}},We.prototype.getVariationForFeature=function(e,t,r,i){var n=this._getVariationForFeatureExperiment(e,t,r,i);if(null!==n.variation)return n;var o=this._getVariationForRollout(e,t,r,i);return null!==o.variation?(this.logger.log(Xe.DEBUG,_(Je.USER_IN_ROLLOUT,Ye,r,t.key)),o):(this.logger.log(Xe.DEBUG,_(Je.USER_NOT_IN_ROLLOUT,Ye,r,t.key)),o)},We.prototype._getVariationForFeatureExperiment=function(e,t,r,i){var n=null,o=null;if(t.hasOwnProperty("groupId")){var a=e.groupIdMap[t.groupId];a&&(n=this._getExperimentInGroup(e,a,r))&&-1!==t.experimentIds.indexOf(n.id)&&(o=this.getVariation(e,n.key,r,i))}else t.experimentIds.length>0?(n=Ie(e,t.experimentIds[0],this.logger))&&(o=this.getVariation(e,n.key,r,i)):this.logger.log(Xe.DEBUG,_(Je.FEATURE_HAS_NO_EXPERIMENTS,Ye,t.key));var s=null;return null!==o&&null!==n&&(s=n.variationKeyMap[o]),{experiment:n,variation:s,decisionSource:ze.FEATURE_TEST}},We.prototype._getExperimentInGroup=function(e,t,r){var i=Ae.bucketUserIntoExperiment(t,r,r,this.logger);if(i){this.logger.log(Xe.INFO,_(Je.USER_BUCKETED_INTO_EXPERIMENT_IN_GROUP,Ye,r,i,t.id));var n=Ie(e,i,this.logger);if(n)return n}return this.logger.log(Xe.INFO,_(Je.USER_NOT_BUCKETED_INTO_ANY_EXPERIMENT_IN_GROUP,Ye,r,t.id)),null},We.prototype._getVariationForRollout=function(e,t,r,i){if(!t.rolloutId)return this.logger.log(Xe.DEBUG,_(Je.NO_ROLLOUT_EXISTS,Ye,t.key)),{experiment:null,variation:null,decisionSource:ze.ROLLOUT};var n=e.rolloutIdMap[t.rolloutId];if(!n)return this.logger.log(Xe.ERROR,_(He.INVALID_ROLLOUT_ID,Ye,t.rolloutId,t.key)),{experiment:null,variation:null,decisionSource:ze.ROLLOUT};if(0===n.experiments.length)return this.logger.log(Xe.ERROR,_(Je.ROLLOUT_HAS_NO_EXPERIMENTS,Ye,t.rolloutId)),{experiment:null,variation:null,decisionSource:ze.ROLLOUT};var o,a,s,u,l,E,I=this._getBucketingId(r,i),c=n.experiments.length-1;for(o=0;o<c;o++){if(a=e.experimentKeyMap[n.experiments[o].key],E=o+1,this.__checkIfUserIsInAudience(e,a.key,Ze.RULE,r,i,E)){if(this.logger.log(Xe.DEBUG,_(Je.USER_MEETS_CONDITIONS_FOR_TARGETING_RULE,Ye,r,E)),s=this.__buildBucketerParams(e,a.key,I,r),u=Ae.bucket(s),l=e.variationIdMap[u])return this.logger.log(Xe.DEBUG,_(Je.USER_BUCKETED_INTO_TARGETING_RULE,Ye,r,E)),{experiment:a,variation:l,decisionSource:ze.ROLLOUT};this.logger.log(Xe.DEBUG,_(Je.USER_NOT_BUCKETED_INTO_TARGETING_RULE,Ye,r,E));break}this.logger.log(Xe.DEBUG,_(Je.USER_DOESNT_MEET_CONDITIONS_FOR_TARGETING_RULE,Ye,r,E))}var g=e.experimentKeyMap[n.experiments[c].key];if(this.__checkIfUserIsInAudience(e,g.key,Ze.RULE,r,i,"Everyone Else")){if(this.logger.log(Xe.DEBUG,_(Je.USER_MEETS_CONDITIONS_FOR_TARGETING_RULE,Ye,r,"Everyone Else")),s=this.__buildBucketerParams(e,g.key,I,r),u=Ae.bucket(s),l=e.variationIdMap[u])return this.logger.log(Xe.DEBUG,_(Je.USER_BUCKETED_INTO_EVERYONE_TARGETING_RULE,Ye,r)),{experiment:g,variation:l,decisionSource:ze.ROLLOUT};this.logger.log(Xe.DEBUG,_(Je.USER_NOT_BUCKETED_INTO_EVERYONE_TARGETING_RULE,Ye,r))}return{experiment:null,variation:null,decisionSource:ze.ROLLOUT}},We.prototype._getBucketingId=function(e,t){var r=e;return null!=t&&"object"==typeof t&&t.hasOwnProperty(U.BUCKETING_ID)&&("string"==typeof t[U.BUCKETING_ID]?(r=t[U.BUCKETING_ID],this.logger.log(Xe.DEBUG,_(Je.VALID_BUCKETING_ID,Ye,r))):this.logger.log(Xe.WARNING,_(Je.BUCKETING_ID_NOT_STRING,Ye))),r},We.prototype.removeForcedVariation=function(e,t,r){if(!e)throw new Error(_(He.INVALID_USER_ID,Ye));if(!this.forcedVariationMap.hasOwnProperty(e))throw new Error(_(He.USER_NOT_IN_FORCED_VARIATION,Ye,e));delete this.forcedVariationMap[e][t],this.logger.log(Xe.DEBUG,_(Je.VARIATION_REMOVED_FOR_USER,Ye,r,e))},We.prototype.__setInForcedVariationMap=function(e,t,r){this.forcedVariationMap.hasOwnProperty(e)||(this.forcedVariationMap[e]={}),this.forcedVariationMap[e][t]=r,this.logger.log(Xe.DEBUG,_(Je.USER_MAPPED_TO_FORCED_VARIATION,Ye,r,t,e))},We.prototype.getForcedVariation=function(e,t,r){var i,n=this.forcedVariationMap[r];if(!n)return this.logger.log(Xe.DEBUG,_(Je.USER_HAS_NO_FORCED_VARIATION,Ye,r)),null;try{var o=Ee(e,t);if(!o.hasOwnProperty("id"))return this.logger.log(Xe.ERROR,_(He.IMPROPERLY_FORMATTED_EXPERIMENT,Ye,t)),null;i=o.id}catch(e){return this.logger.log(Xe.ERROR,e.message),null}var a=n[i];if(!a)return this.logger.log(Xe.DEBUG,_(Je.USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT,Ye,t,r)),null;var s=ue(e,a);return s?this.logger.log(Xe.DEBUG,_(Je.USER_HAS_FORCED_VARIATION,Ye,s,t,r)):this.logger.log(Xe.DEBUG,_(Je.USER_HAS_NO_FORCED_VARIATION_FOR_EXPERIMENT,Ye,t,r)),s},We.prototype.setForcedVariation=function(e,t,r,i){if(null!=i&&!je(i))return this.logger.log(Xe.ERROR,_(He.INVALID_VARIATION_KEY,Ye)),!1;var n;try{var o=Ee(e,t);if(!o.hasOwnProperty("id"))return this.logger.log(Xe.ERROR,_(He.IMPROPERLY_FORMATTED_EXPERIMENT,Ye,t)),!1;n=o.id}catch(e){return this.logger.log(Xe.ERROR,e.message),!1}if(null==i)try{return this.removeForcedVariation(r,n,t,this.logger),!0}catch(e){return this.logger.log(Xe.ERROR,e.message),!1}var a=le(e,t,i);if(!a)return this.logger.log(Xe.ERROR,_(He.NO_VARIATION_FOR_EXPERIMENT_KEY,Ye,i,t)),!1;try{return this.__setInForcedVariationMap(r,n,a),!0}catch(e){return this.logger.log(Xe.ERROR,e.message),!1}};var $e=y.REVENUE,qe=y.VALUE;function Qe(e,t){if(e.hasOwnProperty($e)){var r=e[$e],i=void 0;return"string"==typeof r?(i=parseInt(r),isNaN(i)?(t.log(h.INFO,_(A.FAILED_TO_PARSE_REVENUE,"EVENT_TAG_UTILS",r)),null):(t.log(h.INFO,_(A.PARSED_REVENUE_VALUE,"EVENT_TAG_UTILS",i)),i)):"number"==typeof r?(i=r,t.log(h.INFO,_(A.PARSED_REVENUE_VALUE,"EVENT_TAG_UTILS",i)),i):null}return null}function et(e,t){if(e.hasOwnProperty(qe)){var r=e[qe],i=void 0;return"string"==typeof r?(i=parseFloat(r),isNaN(i)?(t.log(h.INFO,_(A.FAILED_TO_PARSE_VALUE,"EVENT_TAG_UTILS",r)),null):(t.log(h.INFO,_(A.PARSED_NUMERIC_VALUE,"EVENT_TAG_UTILS",i)),i)):"number"==typeof r?(i=r,t.log(h.INFO,_(A.PARSED_NUMERIC_VALUE,"EVENT_TAG_UTILS",i)),i):null}return null}function tt(e,t){return"string"==typeof e&&("string"==typeof t||"boolean"==typeof t||T(t)&&R(t))}var rt="https://logx.optimizely.com/v1/events";function it(e){var t=e.attributes,r=e.configObj,i=r.anonymizeIP,n=r.botFiltering;null==i&&(i=!1);var o={snapshots:[],visitor_id:e.userId,attributes:[]},a={account_id:r.accountId,project_id:r.projectId,visitors:[o],revision:r.revision,client_name:e.clientEngine,client_version:e.clientVersion,anonymize_ip:i,enrich_decisions:!0};return Object.keys(t||{}).forEach((function(r){if(tt(r,t[r])){var i=ne(e.configObj,r,e.logger);i&&a.visitors[0].attributes.push({entity_id:i,key:r,type:"custom",value:t[r]})}})),"boolean"==typeof n&&a.visitors[0].attributes.push({entity_id:U.BOT_FILTERING,key:U.BOT_FILTERING,type:"custom",value:n}),a}var nt=function(e){var t={httpVerb:"POST"},r=it(e);t.url=rt;var i,n,o,a=(i=e.configObj,n=e.experimentId,o=e.variationId,{decisions:[{campaign_id:ie(i,n),experiment_id:n,variation_id:o}],events:[{entity_id:ie(i,n),timestamp:N(),key:"campaign_activated",uuid:c()}]});return r.visitors[0].snapshots.push(a),t.params=r,t},ot=function(e){var t={httpVerb:"POST"},r=it(e);t.url=rt;var i=function(e,t,r,i){var n={events:[]},o={entity_id:oe(e,t),timestamp:N(),uuid:c(),key:t};if(r){var a=Qe(r,i);null!==a&&(o[y.REVENUE]=a);var s=et(r,i);null!==s&&(o[y.VALUE]=s),o.tags=r}return n.events.push(o),n}(e.configObj,e.eventKey,e.eventTags,e.logger);return r.visitors[0].snapshots=[i],t.params=r,t},at=t("EVENT_BUILDER");function st(e,t){var r=[];return Object.keys(t||{}).forEach((function(i){if(tt(i,t[i])){var n=ne(e,i,at);n&&r.push({entityId:n,key:i,value:t[i]})}})),r}var ut="USER_PROFILE_SERVICE_VALIDATOR";var lt=function(){function e(e){var t=this,r=e.clientEngine;-1===m.indexOf(r)&&(e.logger.log(h.INFO,_(A.INVALID_CLIENT_ENGINE,"OPTIMIZELY",r)),r="node-sdk"),this.clientEngine=r,this.clientVersion=e.clientVersion||"4.3.4",this.errorHandler=e.errorHandler,this.eventDispatcher=e.eventDispatcher,this.isOptimizelyConfigValid=e.isValidInstance,this.logger=e.logger,this.projectConfigManager=function(e){return new Te(e)}({datafile:e.datafile,datafileOptions:e.datafileOptions,jsonSchemaValidator:e.jsonSchemaValidator,sdkKey:e.sdkKey}),this.disposeOnUpdate=this.projectConfigManager.onUpdate((function(e){t.logger.log(h.INFO,_(A.UPDATED_OPTIMIZELY_CONFIG,"OPTIMIZELY",e.revision,e.projectId)),t.notificationCenter.sendNotifications(L.OPTIMIZELY_CONFIG_UPDATE)}));var i=this.projectConfigManager.onReady(),n=null;if(e.userProfileService)try{(function(e){if("object"==typeof e&&null!==e){if("function"!=typeof e.lookup)throw new Error(_(v.INVALID_USER_PROFILE_SERVICE,ut,"Missing function 'lookup'"));if("function"!=typeof e.save)throw new Error(_(v.INVALID_USER_PROFILE_SERVICE,ut,"Missing function 'save'"));return!0}throw new Error(_(v.INVALID_USER_PROFILE_SERVICE,ut))})(e.userProfileService)&&(n=e.userProfileService,this.logger.log(h.INFO,_(A.VALID_USER_PROFILE_SERVICE,"OPTIMIZELY")))}catch(e){this.logger.log(h.WARNING,e.message)}this.decisionService=new We({userProfileService:n,logger:this.logger,UNSTABLE_conditionEvaluators:e.UNSTABLE_conditionEvaluators}),this.notificationCenter=function(e){return new he(e)}({logger:this.logger,errorHandler:this.errorHandler});var o={dispatcher:this.eventDispatcher,flushInterval:e.eventFlushInterval,batchSize:e.eventBatchSize,maxQueueSize:e.eventMaxQueueSize,notificationCenter:this.notificationCenter};this.eventProcessor=new s(o);var a=this.eventProcessor.start();this.readyPromise=Promise.all([i,a]).then((function(e){return e[0]})),this.readyTimeouts={},this.nextReadyTimeoutId=0}return e.prototype.isValidInstance=function(){return this.isOptimizelyConfigValid&&!!this.projectConfigManager.getConfig()},e.prototype.activate=function(e,t,r){try{if(!this.isValidInstance())return this.logger.log(h.ERROR,_(A.INVALID_OBJECT,"OPTIMIZELY","activate")),null;if(!this.validateInputs({experiment_key:e,user_id:t},r))return this.notActivatingExperiment(e,t);var i=this.projectConfigManager.getConfig();if(!i)return null;try{var n=this.getVariation(e,t,r);if(null===n)return this.notActivatingExperiment(e,t);if(!z(i,e)){var o=_(A.SHOULD_NOT_DISPATCH_ACTIVATE,"OPTIMIZELY",e);return this.logger.log(h.DEBUG,o),n}return this.sendImpressionEvent(e,n,t,r),n}catch(r){this.logger.log(h.ERROR,r.message);var a=_(A.NOT_ACTIVATING_USER,"OPTIMIZELY",t,e);return this.logger.log(h.INFO,a),this.errorHandler.handleError(r),null}}catch(e){return this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e),null}},e.prototype.sendImpressionEvent=function(e,t,r,i){var n=this.projectConfigManager.getConfig();if(n){var o=function(e){var t=e.configObj,r=e.experimentKey,i=e.variationKey,n=e.userId,o=e.userAttributes,a=e.clientEngine,s=e.clientVersion,u=le(t,r,i),l=re(t,r),E=ie(t,l);return{type:"impression",timestamp:N(),uuid:c(),user:{id:n,attributes:st(t,o)},context:{accountId:t.accountId,projectId:t.projectId,revision:t.revision,clientName:a,clientVersion:s,anonymizeIP:t.anonymizeIP||!1,botFiltering:t.botFiltering},layer:{id:E},experiment:{id:l,key:r},variation:{id:u,key:i}}}({experimentKey:e,variationKey:t,userId:r,userAttributes:i,clientEngine:this.clientEngine,clientVersion:this.clientVersion,configObj:n});this.eventProcessor.process(o),this.emitNotificationCenterActivate(e,t,r,i)}},e.prototype.emitNotificationCenterActivate=function(e,t,r,i){var n=this.projectConfigManager.getConfig();if(n){var o,a=Z(n,e,t),s=X(n,e),u={attributes:i,clientEngine:this.clientEngine,clientVersion:this.clientVersion,configObj:n,experimentId:s,userId:r,variationId:a,logger:this.logger},l=nt(u),E=n.experimentKeyMap[e];E&&E.variationKeyMap&&(o=E.variationKeyMap[t]),this.notificationCenter.sendNotifications(L.ACTIVATE,{experiment:E,userId:r,attributes:i,variation:o,logEvent:l})}},e.prototype.track=function(e,t,r,i){try{if(!this.isValidInstance())return void this.logger.log(h.ERROR,_(A.INVALID_OBJECT,"OPTIMIZELY","track"));if(!this.validateInputs({user_id:t,event_key:e},r,i))return;var n=this.projectConfigManager.getConfig();if(!n)return;if(!ee(n,e))return this.logger.log(h.WARNING,_(A.EVENT_KEY_NOT_FOUND,"OPTIMIZELY",e)),void this.logger.log(h.WARNING,_(A.NOT_TRACKING_USER,"OPTIMIZELY",t));var o=function(e){var t=e.configObj,r=e.userId,i=e.userAttributes,n=e.clientEngine,o=e.clientVersion,a=e.eventKey,s=e.eventTags,u=oe(t,a),l=null,E=null;return s&&(l=Qe(s,at),E=et(s,at)),{type:"conversion",timestamp:N(),uuid:c(),user:{id:r,attributes:st(t,i)},context:{accountId:t.accountId,projectId:t.projectId,revision:t.revision,clientName:n,clientVersion:o,anonymizeIP:t.anonymizeIP||!1,botFiltering:t.botFiltering},event:{id:u,key:a},revenue:l,value:E,tags:s}}({eventKey:e,eventTags:i=this.filterEmptyValues(i),userId:t,userAttributes:r,clientEngine:this.clientEngine,clientVersion:this.clientVersion,configObj:n});this.logger.log(h.INFO,_(A.TRACK_EVENT,"OPTIMIZELY",e,t)),this.eventProcessor.process(o),this.emitNotificationCenterTrack(e,t,r,i)}catch(e){this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e);var a=_(A.NOT_TRACKING_USER,"OPTIMIZELY",t);this.logger.log(h.ERROR,a)}},e.prototype.emitNotificationCenterTrack=function(e,t,r,i){try{var n=this.projectConfigManager.getConfig();if(!n)return;var o={attributes:r,clientEngine:this.clientEngine,clientVersion:this.clientVersion,configObj:n,eventKey:e,eventTags:i,logger:this.logger,userId:t},a=ot(o);this.notificationCenter.sendNotifications(L.TRACK,{eventKey:e,userId:t,attributes:r,eventTags:i,logEvent:a})}catch(e){this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e)}},e.prototype.getVariation=function(e,t,r){try{if(!this.isValidInstance())return this.logger.log(h.ERROR,_(A.INVALID_OBJECT,"OPTIMIZELY","getVariation")),null;try{if(!this.validateInputs({experiment_key:e,user_id:t},r))return null;var i=this.projectConfigManager.getConfig();if(!i)return null;var n=i.experimentKeyMap[e];if(!n)return this.logger.log(h.DEBUG,_(v.INVALID_EXPERIMENT_KEY,"OPTIMIZELY",e)),null;var o=this.decisionService.getVariation(i,e,t,r),a=te(i,n.id)?V.FEATURE_TEST:V.AB_TEST;return this.notificationCenter.sendNotifications(L.DECISION,{type:a,userId:t,attributes:r||{},decisionInfo:{experimentKey:e,variationKey:o}}),o}catch(e){return this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e),null}}catch(e){return this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e),null}},e.prototype.setForcedVariation=function(e,t,r){if(!this.validateInputs({experiment_key:e,user_id:t}))return!1;var i=this.projectConfigManager.getConfig();if(!i)return!1;try{return this.decisionService.setForcedVariation(i,e,t,r)}catch(e){return this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e),!1}},e.prototype.getForcedVariation=function(e,t){if(!this.validateInputs({experiment_key:e,user_id:t}))return null;var r=this.projectConfigManager.getConfig();if(!r)return null;try{return this.decisionService.getForcedVariation(r,e,t)}catch(e){return this.logger.log(h.ERROR,e.message),this.errorHandler.handleError(e),null}},e.prototype.validateInputs=function(e,t,r){try{if(e.hasOwnProperty("user_id")){var i=e.user_id;if("string"!=typeof i||null===i||"undefined"===i)throw new Error(_(v.INVALID_INPUT_FOR