/*ja-gadget-virtual-assistant-config@1.13.0*/ 
;require=function e(t,a,s){function n(o,r){if(!a[o]){if(!t[o]){var c="function"==typeof require&&require;if(!r&&c)return c(o,!0);if(i)return i(o,!0);var l=new Error("Cannot find module '"+o+"'");throw l.code="MODULE_NOT_FOUND",l}var p=a[o]={exports:{}};t[o][0].call(p.exports,function(e){var a=t[o][1][e];return n(a||e)},p,p.exports,e,t,a,s)}return a[o].exports}for(var i="function"==typeof require&&require,o=0;o<s.length;o++)n(s[o]);return n}({1:[function(e,t,a){t.exports={settings:{US:{default:{endpoint:"https://va.justanswer.com/chat?partner=US",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",placeholderV2:"Describe your issue...",clientName:"You",sendButtonText:"Send",sendButtonTextForStartedChat:"Send",startChatText:"Start chat",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},messageMinLength:1,popup:{sendButtonText:"Start chat"}},rememberMinimized:{endpoint:"https://va.justanswer.com/chat?partner=US",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",startChatText:"Start chat",sendButtonTextForStartedChat:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}},disableAutoRedirectToCreditCardPage:{endpoint:"https://va.justanswer.com/chat?partner=US",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",startChatText:"Start chat",sendButtonTextForStartedChat:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},popup:{sendButtonText:"Start chat"},showCta:!0},disableAutoRedirectToCreditCardPageAndRememberMinimized:{endpoint:"https://va.justanswer.com/chat?partner=US",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",startChatText:"Start chat",sendButtonTextForStartedChat:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},showCta:!0},showTeaserIn15Seconds:{endpoint:"https://va.justanswer.com/chat?partner=US",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",startChatText:"Start chat",sendButtonTextForStartedChat:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:15e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}}},UK:{default:{endpoint:"https://va.justanswer.com/chat?partner=UK",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.co.uk",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}},rememberMinimized:{endpoint:"https://va.justanswer.com/chat?partner=UK",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}},disableAutoRedirectToCreditCardPage:{endpoint:"https://va.justanswer.com/chat?partner=UK",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},showCta:!0},disableAutoRedirectToCreditCardPageAndRememberMinimized:{endpoint:"https://va.justanswer.com/chat?partner=UK",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},showCta:!0},showTeaserIn15Seconds:{endpoint:"https://va.justanswer.com/chat?partner=UK",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.com",placeholder:"Type your message...",clientName:"You",sendButtonText:"Send",moreLinkText:"more",lessLinkText:"less",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:15e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}}},DE:{default:{endpoint:"https://va.justanswer.com/chat?partner=DE",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.de",placeholder:"Ihre Nachricht eingeben...",clientName:"Sie",sendButtonText:"Senden",moreLinkText:"mehr",lessLinkText:"wenig",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}},rememberMinimized:{endpoint:"https://va.justanswer.com/chat?partner=DE",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.de",placeholder:"Ihre Nachricht eingeben...",clientName:"Sie",sendButtonText:"Senden",moreLinkText:"mehr",lessLinkText:"wenig",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}},disableAutoRedirectToCreditCardPage:{endpoint:"https://va.justanswer.com/chat?partner=DE",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.de",placeholder:"Ihre Nachricht eingeben...",clientName:"Sie",sendButtonText:"Senden",moreLinkText:"mehr",lessLinkText:"wenig",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},showCta:!0},disableAutoRedirectToCreditCardPageAndRememberMinimized:{endpoint:"https://va.justanswer.com/chat?partner=DE",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.de",placeholder:"Ihre Nachricht eingeben...",clientName:"Sie",sendButtonText:"Senden",moreLinkText:"mehr",lessLinkText:"wenig",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"},showCta:!0},showTeaserIn15Seconds:{endpoint:"https://va.justanswer.com/chat?partner=DE",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.de",placeholder:"Ihre Nachricht eingeben...",clientName:"Sie",sendButtonText:"Senden",moreLinkText:"mehr",lessLinkText:"wenig",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:15e3,iconImage:"https://www.justanswer.com/fe-lib/components/th-va-mobile-teaser/images/pearl.jpg"}}},ES:{default:{endpoint:"https://va.justanswer.com/chat?partner=ES",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.es",placeholder:"Escriba su mensaje aquí...",clientName:"Usted",sendButtonText:"Enviar",moreLinkText:"más",lessLinkText:"",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.es/fe-lib/components/li-chat-header/images/pearl-es.jpg"}},rememberMinimized:{endpoint:"https://va.justanswer.com/chat?partner=ES",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.es",placeholder:"Escriba su mensaje aquí...",clientName:"Usted",sendButtonText:"Enviar",moreLinkText:"más",lessLinkText:"",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.es/fe-lib/components/li-chat-header/images/pearl-es.jpg"}},disableAutoRedirectToCreditCardPage:{endpoint:"https://va.justanswer.com/chat?partner=ES",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.es",placeholder:"Escriba su mensaje aquí...",clientName:"Usted",sendButtonText:"Enviar",moreLinkText:"más",lessLinkText:"",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.es/fe-lib/components/li-chat-header/images/pearl-es.jpg"},showCta:!0},disableAutoRedirectToCreditCardPageAndRememberMinimized:{endpoint:"https://va.justanswer.com/chat?partner=ES",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.es",placeholder:"Escriba su mensaje aquí...",clientName:"Usted",sendButtonText:"Enviar",moreLinkText:"más",lessLinkText:"",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.es/fe-lib/components/li-chat-header/images/pearl-es.jpg"},showCta:!0},showTeaserIn15Seconds:{endpoint:"https://va.justanswer.com/chat?partner=ES",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.es",placeholder:"Escriba su mensaje aquí...",clientName:"Usted",sendButtonText:"Enviar",moreLinkText:"más",lessLinkText:"",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:15e3,iconImage:"https://www.justanswer.es/fe-lib/components/li-chat-header/images/pearl-es.jpg"}}},JP:{default:{endpoint:"https://va.justanswer.com/chat?partner=JP",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.jp",placeholder:"ここにメッセージを入力…",clientName:"自分",sendButtonText:"送信",moreLinkText:"",lessLinkText:"非表示",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.jp/fe-lib/components/li-chat-header/images/pearl-jp.jpg"}},rememberMinimized:{endpoint:"https://va.justanswer.com/chat?partner=JP",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.jp",placeholder:"ここにメッセージを入力…",clientName:"自分",sendButtonText:"送信",moreLinkText:"",lessLinkText:"非表示",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.jp/fe-lib/components/li-chat-header/images/pearl-jp.jpg"}},disableAutoRedirectToCreditCardPage:{endpoint:"https://va.justanswer.com/chat?partner=JP",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.jp",placeholder:"ここにメッセージを入力…",clientName:"自分",sendButtonText:"送信",moreLinkText:"",lessLinkText:"非表示",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.jp/fe-lib/components/li-chat-header/images/pearl-jp.jpg"},showCta:!0},disableAutoRedirectToCreditCardPageAndRememberMinimized:{endpoint:"https://va.justanswer.com/chat?partner=JP",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:864e5,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.jp",placeholder:"ここにメッセージを入力…",clientName:"自分",sendButtonText:"送信",moreLinkText:"",lessLinkText:"非表示",rememberChatMinimizedState:!0,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:2e3,iconImage:"https://www.justanswer.jp/fe-lib/components/li-chat-header/images/pearl-jp.jpg"},showCta:!0},showTeaserIn15Seconds:{endpoint:"https://va.justanswer.com/chat?partner=JP",type:"FunnelQuestion",time:15e3,disableTimer:!0,proceedToCcTime:1e4,enableOnExit:!0,animationTimeIntervals:[100,300,400,500,700,1300],showBackground:!1,minimized:!1,baseDomain:"justanswer.jp",placeholder:"ここにメッセージを入力…",clientName:"自分",sendButtonText:"送信",moreLinkText:"",lessLinkText:"非表示",rememberChatMinimizedState:!1,isNewPaymentWindow:!0,sessionExpirationHours:1,mobile:{time:15e3,iconImage:"https://www.justanswer.jp/fe-lib/components/li-chat-header/images/pearl-jp.jpg"}}}},profiles:{US:{antiques:{forumId:976,initialCategoryId:"1172a83ad4a5494db1b4b82ca6d5b842",headingText:"Ask an Appraiser Now",doubleHeadingText:["Chat with an appraiser","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Appraiser's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Appraisers are online now",expertProfile:{headingText:"Chat with a appraiser now",id:"9fd3336972994265be78e72059a6c2f4",expertAvatarUrl:"https://www.justanswer.com/uploads/BL/blueflowers1063/2013-10-10_35834_KimHolidays1.64x64.jpg",expertName:"Kim D.",expertTitle:"Antiques Appraiser",satisfiedCustomers:"5090",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Appraisers request a deposit of about $38 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask an Appraiser online now? I can connect you ...",marketingMessageText:"Connect with an appraiser",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Appraiser's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Appraiser's Assistant."},legal:{forumId:7,initialCategoryId:"1ebeaa5271ce4cd48cbb0899bf229eca",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a lawyer","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",sipLandingPage:"https://www.justanswer.com/sip/legal",expertProfile:{headingText:"Chat with a lawyer now",id:"41f2d818e6ca412fb775d1e41984778b",expertAvatarUrl:"https://ww2-secure.justanswer.com/static/JA24424/images/legal_expert.jpg",expertName:"Dimitry K., Esq.",expertTitle:"Attorney",satisfiedCustomers:"17183",experience:"",popup:{experience:"Multiple jurisdictions, specialize in business/contract disputes, estate creation and administration."},showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $36 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"employment-law":{forumId:39,initialCategoryId:"6890ce0f77404179a3346abf5b8f5bc6",headingText:"Ask a Lawyer Now",doubleHeadingText:["Chat with a lawyer","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"e82959a435564172b4986cdf69ee58c4",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/PA/PaulmoJD/2013-10-10_195858_JAImage.64x64.jpg",expertName:"Law Educator, Esq.",expertTitle:"Attorney",satisfiedCustomers:"14581",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Employment Lawyers request a deposit of about $38 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant."},"immigration-law":{forumId:38,initialCategoryId:"a0032e858c1c4688925a0ec316d9694c",headingText:"Ask a Lawyer Now",doubleHeadingText:["Chat with a lawyer","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"539f2ade3bc341948766662cc67f1c8e",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RA/ratioscripta/2012-6-13_2955_foto3.64x64.jpg",expertName:"Ely",expertTitle:"Counselor at Law",satisfiedCustomers:"3625",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Immigration Lawyers request a deposit of about $38 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"real-estate-law":{forumId:52,initialCategoryId:"cefca8f2d3724901a6961661f860fa14",headingText:"Ask a Lawyer Now",doubleHeadingText:["Chat with a lawyer","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"8139d8d824f141b6906addc3b2df177b",expertAvatarUrl:"https://www.justanswer.com/uploads/IN/insearchoftheanswer/2013-8-16_0233_attorney.64x64.jpg",expertName:"Richard",expertTitle:"Real Estate Professional",satisfiedCustomers:"",experience:"32 years of legal experience, including real estate law",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Real Estate Lawyers request a deposit of about $38 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"traffic-law":{forumId:956,initialCategoryId:"7e48d33a6c654665a3f982329ee2673e",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Traffic Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"539f2ade3bc341948766662cc67f1c8e",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RA/ratioscripta/2012-6-13_2955_foto3.64x64.jpg",expertName:"Ely",expertTitle:"Attorney",experience:"Private practice",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Traffic Lawyers request a deposit of about $28 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"family-law":{forumId:37,initialCategoryId:"9d66542212de480abec27066bfaf3f1e",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"d305064653de4309b2ff5aec50a909e0",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/lawninvest/2008-05-26_115339_wethepeople.jpg",expertName:"Attorney & Mediator",expertTitle:"Lawyer",satisfiedCustomers:"7520"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"estate-law":{forumId:73,initialCategoryId:"26ca7f607ea0405d992837facc55ed9a",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"0f4c9ac75de24589a69fac362d9e8ceb",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/MC/mclemorelawyer/2011-9-21_193631_IMGP8718Version2.64x64.jpg",expertName:"Thomas McJD",expertTitle:"Estate Lawyer",experience:"Wills, Trusts, Probate & other Estate Matters",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"personal-injury-law":{forumId:57,initialCategoryId:"4be0484881294278ab0b312d2f5ae104",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"0a9ba3fce13e40459ca26e5731aac8e7",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/NY/nyclawyer/2012-6-7_22011_photo66139201112041.64x64.jpg",expertName:"Infolawyer",expertTitle:"Personal Injury Lawyer",experience:"Licensed attorney helping individuals and businesses.",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"uk-law":{forumId:87,initialCategoryId:"cdde8daefe8b4d0f8d0d81697ebf2e48",headingText:"Ask a Solicitor Now",assistantName:"Pearl Wilson",assistantTitle:"Solicitor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Solicitors are online now",expertProfile:{headingText:"Chat with a solicitor now",id:"89da6df09d8d4f318bb2e8781ef066fb",expertAvatarUrl:"https://secure.justanswer.com/uploads/BE/benjones/2015-12-1_0437_ennew.64x64.jpg",expertName:"Ben Jones",expertTitle:"Solicitor",satisfiedCustomers:"9072",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Solicitors request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"criminal-law":{forumId:40,initialCategoryId:"972f21ffd40448c1aff213a41ebe1749",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"539f2ade3bc341948766662cc67f1c8e",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RA/ratioscripta/2012-6-13_2955_foto3.64x64.jpg",expertName:"Ely",expertTitle:"Criminal Lawyer",experience:"Private practice with focus on family, criminal, PI, consumer protection, and business consultation.",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"bankruptcy-law":{forumId:83,initialCategoryId:"544ba40df74c4004b2635dcad58c7505",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"eed64a5a2aae4447857534c80d26ec7b",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/TL/tleeders/2012-6-13_204815_TSL1.64x64.jpg",expertName:"Terry L.",expertTitle:"Bankruptcy Lawyer",satisfiedCustomers:"2587"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"spanish-law":{forumId:1141,initialCategoryId:"1e812a699d154791bb5052962e273164",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"70dc3731ccda4948a255d9d35ee21381",expertAvatarUrl:"https://www.justanswer.com/uploads/JO/JoseMagadan/2013-6-27_16279_IMG6290copia.64x64.JPG",expertName:"Jose M.",expertTitle:"Spanish Law Attorney",experience:"Over 5 years of legal experience, including Spanish law.",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Lawyers request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"business-law":{forumId:1141,initialCategoryId:"39820f77e4384932a5c9ff90d14e0b37",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Lawyer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"0a9ba3fce13e40459ca26e5731aac8e7",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/NY/nyclawyer/2018-12-7_34450_.64x64.jpg",expertName:"Infolawyer",expertTitle:"Attorney",satisfiedCustomers:"2063"},greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with a lawyer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Lawyer's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Lawyer's Assistant.",popup:{title:"Chat with a lawyer in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"2063"}},vet:{forumId:103,initialCategoryId:"e48b2d65407e46f0a41cb2181a65a3b9",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Veterinarians are online now",sipLandingPage:"https://www.justanswer.com/sip/vet",expertProfile:{headingText:"Chat with a veterinarian now",id:"0f293c593a8b4c549e05b5ba45840500",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/VE/vetforyou/2012-6-20_33122_PearlPhoto.64x64.jpg",expertName:"Dr. Andy",expertTitle:"Veterinarian",satisfiedCustomers:"",experience:"UC Davis graduate, Interests: Dermatology, Internal Medicine, Pain Management",showMoreLink:!0,popup:{satisfiedCustomers:"24026"}},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Veterinarians request a deposit of about $20 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant.",popup:{title:"Chat with a veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png"}},"dog-vet":{forumId:104,initialCategoryId:"f3bf7d0324cc4d48b62c391fe9e9cc48",headingText:"Ask a Dog Vet Now",assistantName:"Pearl Wilson",assistantTitle:"Dog Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Dog Veterinarians are online now",expertProfile:{headingText:"Chat with a dog vet now",id:"2c9d1d72cdc4408cbf6fe79388c31028",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RY/rydergar/2012-6-6_192240_IMG0328.64x64.JPG",expertName:"Dr. Gary",expertTitle:"Dog Veterinarian",satisfiedCustomers:"2893",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Dog Veterinarians request a deposit of about $19 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Dog Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a dog veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Dog Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Dog Veterinarian's Assistant.",popup:{title:"Chat with a dog veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png"}},"cat-vet":{forumId:105,initialCategoryId:"8c342ae4694d4634ab7d82f8c00ea532",headingText:"Ask a Cat Vet Now",assistantName:"Pearl Wilson",assistantTitle:"Cat Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Cat Veterinarians are online now",expertProfile:{headingText:"Chat with a cat vet now",id:"2c9d1d72cdc4408cbf6fe79388c31028",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RY/rydergar/2012-6-6_192240_IMG0328.64x64.JPG",expertName:"Dr. Gary",expertTitle:"Cat Veterinarian",satisfiedCustomers:"3742",experience:"",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Cat Veterinarians request a deposit of about $22 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Cat Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a cat veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Cat Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Cat Veterinarian's Assistant.",popup:{title:"Chat with a cat veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png"}},"horse-health":{forumId:75,initialCategoryId:"6f5c1a45c084404dba454ed64c14f67c",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Veterinarians are online now",sipLandingPage:"https://www.justanswer.com/sip/vet",expertProfile:{headingText:"Chat with a horse veterinarian now",id:"d70f6d76599640a5a10a811fe824c9b9",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/MU/Munchiemeadows74337/2013-10-14_18494_2013101413371411.64x64.jpg",expertName:"Dr. Linda",expertTitle:"Horse Veterinarian",satisfiedCustomers:"1205",experience:"",popup:{title:"Chat with a horse veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png",satisfiedCustomers:"1205"}},greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant.",popup:{title:"Chat with a veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png"}},"dog-training":{forumId:10340,initialCategoryId:"6e9e233343c34b98bd331ffbb81c6782",headingText:"Ask a Dog Trainer Now",assistantName:"Pearl Wilson",assistantTitle:"Dog Trainer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Dog Trainers are online now",expertProfile:{headingText:"Chat with a dog trainer now",id:"1256d562720c450a99b2566f41e8fb47",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/DA/DakotaSouthFive/2013-5-9_1460_1052240tdipearl25x5.64x64.jpg",expertName:"Sally G.",expertTitle:"Animal Behaviorist",satisfiedCustomers:"10,320",experience:""},greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a dog trainer",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant.",popup:{title:"Chat with a veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png",satisfiedCustomers:"10,320"}},medical:{forumId:107,initialCategoryId:"8568c4cab98247c689d90982b6d84700",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",sipLandingPage:"https://www.justanswer.com/sip/medical",expertProfile:{headingText:"Chat with a doctor now",id:"a5492ee9eff34ba3a9bc43984d5358b1",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/DO/Doctor7860/2013-4-2_3633_Picture.JA280x1873.64x64.jpg",expertName:"Dr. Amir",expertTitle:"Doctor",experience:"Master of Internal medicine & Gastroenterology with six years of experience (London). MBBS",popup:{satisfiedCustomers:"8780"},showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Doctors request a deposit of about $34 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png"}},medical2:{forumId:107,initialCategoryId:"8568c4cab98247c689d90982b6d84700",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",sipLandingPage:"https://www.justanswer.com/sip/medical",expertProfile:{headingText:"Chat with a doctor now",id:"e8cae442eaca4446a6000921c2bcc450",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/JA/jacustomerkiua/2018-7-18_4567_hoto.64x64.jpg",expertName:"Dr. Greg",expertTitle:"Board Certified MD",satisfiedCustomers:"1775"},greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png",satisfiedCustomers:"1775"}},dermatology:{forumId:117,initialCategoryId:"923a90e8c1b24b5d80d8189b620e10b2",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Dermatologist's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"387ae290d7174875b15697be2a82a71e",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/dermdoc19/2010-09-30_160749_Photo_122807_015.JPG",expertName:"dermdoc19",expertTitle:"Dermatologist",satisfiedCustomers:"",experience:"30 years practice in general and cosmetic dermatology",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Dermatologists request a deposit of about $34 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Dermatologist's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Dermatologist's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png"}},health:{forumId:5,initialCategoryId:"e0df024bb18849f3b0a44ffbd8b6b0f7",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"ab7d782e6b3e470fb3f1728e133a4523",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/FA/FamilyPhysician/2013-8-31_191624_JA550x500Photo.64x64.jpg",expertName:"Family Physician",expertTitle:"Doctor (MD)",satisfiedCustomers:"",experience:"Emergency Medicine and Family Practice for over 26 years",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Health Professionals request a deposit of about $26 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png"}},"mental-health":{forumId:93,initialCategoryId:"d870f9d2ecfe46b486cf0c85ecbe2431",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"5ce05cb4e027458aa3292021f44afae5",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/DR/Dr.Keane/2013-8-20_204325_drkeane.64x64.jpg",expertName:"Dr. Keane",expertTitle:"Therapist",satisfiedCustomers:"",experience:"Clinical Psychology PhD, Licensed Professional Counselor experienced in family psychology",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Mental Health Professionals request a deposit of about $26 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png"}},"drug-testing":{forumId:93,initialCategoryId:"b950af9d37434ac38a0d04fd6f7f2a11",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"ab7d782e6b3e470fb3f1728e133a4523",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/FA/FamilyPhysician/2013-8-31_191624_JA550x500Photo.64x64.jpg",expertName:"Family Physician",expertTitle:"Board Certified MRO",experience:"",satisfiedCustomers:"2039"},greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png",satisfiedCustomers:"2039"}},car:{forumId:11,initialCategoryId:"c7847fa20e874eaab6b9c8391d2466e7",headingText:"Ask a Mechanic Now",doubleHeadingText:["Chat with a mechanic","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Auto Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"a050340b455c4e97ac5230e54ac01b07",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.64x64.png",expertName:"Chris (aka- Moose)",expertTitle:"Technician",satisfiedCustomers:"",experience:"16 years experience",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Auto Mechanics request a deposit of about $24 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Auto Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Auto Mechanic's Assistant."},"home-improvement":{forumId:10,initialCategoryId:"262bc86475a74a25b66e370a5a86d06b",headingText:"Ask a Contractor Now",assistantName:"Pearl Wilson",assistantTitle:"Contractor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Contractors are online now",expertProfile:{headingText:"Chat with a contractor now",id:"442ef7ce30df45b4870881b0ab85e75f",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/BS/bshull17/2011-2-11_04125_japic.64x64.JPG",expertName:"Brian",expertTitle:"Contractor",satisfiedCustomers:"",experience:"Licensed Architect- 17 years, L.E.E.D. AP",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Home Improvement Experts request a deposit of about $28 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Contractor online now? I can connect you ...",marketingMessageText:"Connect with a contractor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Contractor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Contractor's Assistant."},appliance:{forumId:51,initialCategoryId:"d15d543ea7d6408b87f326ad2be52309",headingText:"Ask an Appliance Tech",assistantName:"Pearl Wilson",assistantTitle:"Appliance Tech's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Appliance Techs are online now",expertProfile:{headingText:"Chat with a appliance tech now",id:"3114fac0d37244f4b0c4d38d1a9e68cc",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/BR/bryanpaul52/2014-3-22_17133_APPLIANCELOGOS500.64x64.jpg",expertName:"Bryan",expertTitle:"Home Appliance Technician",satisfiedCustomers:"",experience:"15 yrs. experience as a certified appliance technician.",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Appliance Technicians request a deposit of about $28 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask an Appliance Tech online now? I can connect you ...",marketingMessageText:"Connect with an appliance tech",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Appliance Tech's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Appliance Tech's Assistant."},computer:{forumId:6,initialCategoryId:"dadf77a8245b490ca3faa5bad774bf5f",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Tech Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"868803e7bb55417baebbe222c242a0ba",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/EN/Engineer1010/2012-6-9_132423_jaj12a.64x64.jpg",expertName:"Andy",expertTitle:"Computer Consultant",satisfiedCustomers:"",experience:"11yr exp, Comp Engg, Internet expert, Web developer, SEO",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Tech Support Specialists request a deposit of about $36 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with a tech expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tech Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tech Expert's Assistant."},printers:{forumId:125,initialCategoryId:"bb3cc9faa2d14499a9325c5138018831",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Tech Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"868803e7bb55417baebbe222c242a0ba",expertAvatarUrl:"https://www.justanswer.com/uploads/EN/Engineer1010/2012-6-9_132423_jaj12a.64x64.jpg",expertName:"Andy",expertTitle:"Elec & Comp pro",satisfiedCustomers:"6858",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Tech Support Specialists request a deposit of about $36 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with a tech expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tech Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tech Expert's Assistant."},"math-homework":{forumId:8338,initialCategoryId:"b113195997494a58a84064b1d558063c",headingText:"Ask a Math Tutor Now",assistantName:"Pearl Wilson",assistantTitle:"Math Tutor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Math Tutors are online now",expertProfile:{headingText:"Chat with a math tutor now",id:"c0ace0e2a9a84206a559320bc35896b2",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/ED/educatortech/2012-6-7_1256_williams4.64x64.jpg",expertName:"Mr. Gregory White",expertTitle:"Master's Degree",satisfiedCustomers:"",experience:"M.A., M.S. Education / Educational Administration",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Math Tutors request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Math Tutor online now? I can connect you ...",marketingMessageText:"Connect with a math tutor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Math Tutor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Math Tutor's Assistant."},finance:{forumId:14,initialCategoryId:"c697c4ed9b9d475ca00da432b6b4bb90",headingText:"Ask a Financial Expert",assistantName:"Pearl Wilson",assistantTitle:"Financial Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Financial Experts are online now",expertProfile:{headingText:"Chat with a financial expert now",id:"2bffd3ea39f040f9883361fb71752d31",expertAvatarUrl:"https://secure.justanswer.com/uploads/RA/rakhi.v/2012-7-3_14374_RakhiVasavadaL.64x64.jpeg",expertName:"Rakhi Vasavada",expertTitle:"Financial Expert",satisfiedCustomers:"",experience:"Law degree with emphasis on finance; over 12 years in financial sector",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Financial Professionals request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Financial Expert online now? I can connect you ...",marketingMessageText:"Connect with a financial professional",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Financial Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Financial Expert's Assistant."},relationship:{forumId:8,initialCategoryId:"de5a0b934ba445a692ef484573ba0835",headingText:"Ask a Counselor Now",assistantName:"Pearl Wilson",assistantTitle:"Counselor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Counselors are online now",expertProfile:{headingText:"Chat with a counselor now",id:"1f38ee1d17ad4387a3187b28b8faf0fa",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/formybunch/2010-12-06_191055_img_0975.jpg",expertName:"Kate McCoy",expertTitle:"Counselor",satisfiedCustomers:"1664"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Counselors request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Counselor online now? I can connect you ...",marketingMessageText:"Connect with a counselor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Counselor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Counselor's Assistant."},"cell-phones":{forumId:218,initialCategoryId:"0284e93caef348f88da4ddd5b6cabdff",headingText:"Ask a Phone Tech Now",doubleHeadingText:["Chat with a phone tech","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Phone Tech's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Phone Techs are online now",expertProfile:{headingText:"Chat with a phone tech now",id:"c22f8c4c4fec4840bba7f8bddcedb525",expertAvatarUrl:"https://www.justanswer.com/uploads/RI/RichieMe/2013-10-21_9435_1891752088969658025993880564n.64x64.jpg",expertName:"Richard",expertTitle:"Phone Tech",satisfiedCustomers:"3685"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Cell Phone Technicians request a deposit of about $42 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Phone Tech online now? I can connect you ...",marketingMessageText:"Connect with a phone tech",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Phone Tech's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Phone Tech's Assistant."},"home-improvement-electrical":{forumId:64,initialCategoryId:"245821ba20514680a7c226b700f6304b",headingText:"Ask a Contractor Now",assistantName:"Pearl Wilson",assistantTitle:"Home Improvement Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Contractors are online now",expertProfile:{headingText:"Chat with a contractor now",id:"364f81cf6aac4a8eaf42db29154809d1",expertAvatarUrl:"https://www.justanswer.com/uploads/UR/urelectrician/2012-9-28_223652_JustAnswerPic.64x64.jpg",expertName:"Kevin",expertTitle:"Licensed Electrical Contractor",satisfiedCustomers:"3,862"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Electricians request a deposit of about 16$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Home Improvement Expert online now? I can connect you ...",marketingMessageText:"Connect with a home improvement expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Home Improvement Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Home Improvement Expert's Assistant."},"pet-reptile":{forumId:66,initialCategoryId:"ce81be08afcd413392d7caaa82c77856",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Veterinarians are online now",expertProfile:{headingText:"Chat with a veterinarian now",id:"25d807a8aec54c2ebd1398e99c67055c",expertAvatarUrl:"https://www.justanswer.com/uploads/MS/MsAM/2012-6-9_16426_anna.64x64.jpeg",expertName:"Anna",expertTitle:"Reptile Expert",satisfiedCustomers:"10,034"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Reptile Experts request a deposit of about 18$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant."},"pet-bird":{forumId:65,initialCategoryId:"ea8a7cd722644051b9c2389abac5f19d",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Veterinarians are online now",expertProfile:{headingText:"Chat with a veterinarian now",id:"e3845dafd03e4341b020a7dc07c0ff40",expertAvatarUrl:"https://www.justanswer.com/uploads/HE/hearetaker/2016-4-5_5519_ug.64x64.jpg",expertName:"August",expertTitle:"Certified Avian Specialist",satisfiedCustomers:"6,053"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Bird Specialists request a deposit of about 36$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant."},"home-improvement-plumbing":{forumId:77,initialCategoryId:"8eb91318df8e425db461d8cf024bf41e",headingText:"Ask a Contractor Now",assistantName:"Pearl Wilson",assistantTitle:"Home Improvement Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Contractors are online now",expertProfile:{headingText:"Chat with a contractor now",id:"ffce140c6c8b40ca96836c51de255834",expertAvatarUrl:"https://www.justanswer.com/uploads/VE/Veillplumb/2011-8-31_155028_IMG1104.64x64.JPG",expertName:"Marc",expertTitle:"Plumber",satisfiedCustomers:"1,590"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Plumbers request a deposit of about 32$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Home Improvement Expert online now? I can connect you ...",marketingMessageText:"Connect with a home improvement expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Home Improvement Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Home Improvement Expert's Assistant."},"medical-dental":{forumId:30,initialCategoryId:"8f393887064449e1aafdb74b45ed1dfc",headingText:"Ask a Dentist Now",assistantName:"Pearl Wilson",assistantTitle:"Dentist's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Dentists are online now",expertProfile:{headingText:"Chat with a dentist now",id:"92183398e46b45a287d5ec1133a393f7",expertAvatarUrl:"https://www.justanswer.com/uploads/HO/hoteego1/H.64x64.jpg",expertName:"Dr. Katz",expertTitle:"Dentist",satisfiedCustomers:"3,655"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Dentists request a deposit of about 22$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Dentist online now? I can connect you ...",marketingMessageText:"Connect with a dentist",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Dentist's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Dentist's Assistant."},"consumer-electronics-tv":{forumId:63,initialCategoryId:"c2ffcafbd939401d976106081cb8e945",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",assistantTitle:"Electronics Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Technicians are online now",expertProfile:{headingText:"Chat with a technician now",id:"c22f8c4c4fec4840bba7f8bddcedb525",expertAvatarUrl:"https://www.justanswer.com/uploads/RI/RichieMe/2013-10-21_9435_1891752088969658025993880564n.64x64.jpg",expertName:"Richard",expertTitle:"TV Specialist",satisfiedCustomers:"4,742"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. TV Technicians request a deposit of about 28$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Electronics Technician online now? I can connect you ...",marketingMessageText:"Connect with a electronics technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Electronics Technician's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Electronics Technician's Assistant."},"home-improvement-hvac":{forumId:95,initialCategoryId:"2be9c961bc474e0db06d07fcd286e233",headingText:"Ask a Contractor Now",assistantName:"Pearl Wilson",assistantTitle:"Home Improvement Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Contractors are online now",expertProfile:{headingText:"Chat with a contractor now",id:"d5b33dbf2b5b4abd97de9ac9dd714797",expertAvatarUrl:"https://www.justanswer.com/uploads/AL/alumalite/2012-5-10_234018_shutterstock506249951forJA500.64x64.jpg",expertName:"Phil",expertTitle:"HVAC Contractor",satisfiedCustomers:"8,909"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. HVAC Technicians request a deposit of about 28$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Home Improvement Expert online now? I can connect you ...",marketingMessageText:"Connect with a home improvement expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Home Improvement Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Home Improvement Expert's Assistant."},homework:{forumId:13,initialCategoryId:"2ee797016d6f463ba877ba4d7faa0f5f",headingText:"Ask a Tutor Now",assistantName:"Pearl Wilson",assistantTitle:"Tutor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tutors are online now",expertProfile:{headingText:"Chat with a tutor now",id:"07a5005969e74225a51ca326dbfe9527",expertAvatarUrl:"https://www.justanswer.com/uploads/SP/spherrod/2012-6-6_174244_1000852.64x64.JPG",expertName:"Steve Harrod",expertTitle:"Engineer",satisfiedCustomers:"685"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Tutors request a deposit of about 60$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Tutor online now? I can connect you ...",marketingMessageText:"Connect with a tutor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tutor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tutor's Assistant."},firearms:{forumId:474,initialCategoryId:"a485f80c6ea14d22b9ab345fe7c20f82",headingText:"Ask a Consultant Now",assistantName:"Pearl Wilson",assistantTitle:"Consultant's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Consultants are online now",expertProfile:{headingText:"Chat with a consultant now",id:"25126a2185ce4a1899ffbcfd17518661",expertAvatarUrl:"https://www.justanswer.com/uploads/TR/Tritac1911/2014-1-23_21121_WP20140123011.64x64.jpg",expertName:"Jon",expertTitle:"Firearms Consultant",satisfiedCustomers:"978"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Firearms Experts request a deposit of about 34$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Consultant online now? I can connect you ...",marketingMessageText:"Connect with a consultant",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Consultant's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Consultant's Assistant."},"mechanics-rv":{forumId:34,initialCategoryId:"83248ed3ffbf40dab22eab8411fdbab5",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Auto Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"285cc2e12e0b4494878a7ffe48faeddc",expertAvatarUrl:"https://www.justanswer.com/uploads/gmplus72/2008-12-9_2615_just_answer.jpg",expertName:"Robert",expertTitle:"RV Mechanic",satisfiedCustomers:"13,497"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. RV Mechanics request a deposit of about 29$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask an Auto Mechanic online now? I can connect you ...",marketingMessageText:"Connect with an auto mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Auto Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Auto Mechanic's Assistant."},"mechanics-boat":{forumId:56,initialCategoryId:"0aa858174dbc421eb784aad8230e3e38",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Marine Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"9d644b6e7fbe434a84efc704bab812f5",expertAvatarUrl:"https://www.justanswer.com/uploads/OL/oldnewenglandmarine/2012-9-8_15014_icon.64x64.jpg",expertName:"Jason",expertTitle:"Marine Mechanic",satisfiedCustomers:"16,331"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Marine Mechanics request a deposit of about 26$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Marine Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a marine mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Marine Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Marine Mechanic's Assistant."},"medical-eye":{forumId:116,initialCategoryId:"317e075594d544f297f7921b2a77f964",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"310f31ccc17c42559df7ad9784f02b83",expertAvatarUrl:"https://www.justanswer.com/uploads/WI/wieyedoc/2013-10-25_0457_new.64x64.jpg",expertName:"Dr. Rick",expertTitle:"Retina Specialist",satisfiedCustomers:"6,712"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Eye Doctors request a deposit of about 28$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant."},motorcycle:{forumId:11,initialCategoryId:"60f48c7c07374c83b4754401feb06d74",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Auto Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"b03460704f3a48cbb165105f00ea33d8",expertAvatarUrl:"https://www.justanswer.com/uploads/PE/peterpete/2017-9-6_13441_.64x64.jpg",expertName:"Pete",expertTitle:"Technician",satisfiedCustomers:"26,418"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Motorcycle Mechanics request a deposit of about 24$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask an Auto Mechanic online now? I can connect you ...",marketingMessageText:"Connect with an auto mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Auto Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Auto Mechanic's Assistant."},"medium-heavy-truck":{forumId:11,initialCategoryId:"007c9a811e1d481c89f189f369cf724e",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Auto Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"b03460704f3a48cbb165105f00ea33d8",expertAvatarUrl:"https://www.justanswer.com/uploads/PE/peterpete/2017-9-6_13441_.64x64.jpg",expertName:"Pete",expertTitle:"Technician",satisfiedCustomers:"26,418"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Technicians request a deposit of about 24$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask an Auto Mechanic online now? I can connect you ...",marketingMessageText:"Connect with an auto mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Auto Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Auto Mechanic's Assistant."},"home-improvement-landscaping":{forumId:null,initialCategoryId:"7aba0b8793654bba84bc53270b26fbe8",headingText:"Ask a Landscaper Now",assistantName:"Pearl Wilson",assistantTitle:"Landscaper's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Landscapers are online now",expertProfile:{id:"d454bd118d0e4c339c076ba951a47cab",expertAvatarUrl:"https://www.justanswer.com/uploads/QM/9qmpg2sg-/jacustomer-9qmpg2sg-_avatar.64x64.jpg",expertName:"Daniel Stover",expertTitle:"Landscaper",experience:"Golf Course Superintendent at Deering Bay Yacht and Country Club",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Landscapers request a deposit of about 48$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Home Improvement Expert online now? I can connect you ...",marketingMessageText:"Connect with a home improvement expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Home Improvement Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Home Improvement Expert's Assistant."},"medical-nutrition":{forumId:null,initialCategoryId:"d68f314183a544fea6ebd8942bca6956",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"26df5e2a9839415099e754296496123b",expertAvatarUrl:"https://www.justanswer.com/uploads/VA/VANP/2012-6-6_235535_Skye2.64x64.jpg",expertName:"A. Schuyler",expertTitle:"Nurse Practitioner",satisfiedCustomers:"16,360"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Health Professionals request a deposit of about 22$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant."},"job-career":{forumId:17,initialCategoryId:"f4b8017a3e184eedaf65cc5ac5271720",headingText:"Ask an Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Experts are online now",expertProfile:{headingText:"Chat with an expert now",id:"4634e32d52454fc281eb84d0346a4d22",expertAvatarUrl:"https://www.justanswer.com/uploads/ER/49erLBSU/2013-8-19_175446_michael.64x64.jpg",expertName:"Michael",expertTitle:"Employment Services",satisfiedCustomers:"3,373 "},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Career Counselors request a deposit of about 38$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},email:{forumId:7066,initialCategoryId:"f3503e45f39b41268e88fdda951d60e8",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",assistantTitle:"Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Technicians are online now",expertProfile:{headingText:"Chat with a technician now",id:"eac35ac9b7494fb0a3e53ca14eefe56c",expertAvatarUrl:"https://www.justanswer.com/uploads/JE/jessmagz/2012-6-6_18129_jm.64x64.jpg",expertName:"Jess M.",expertTitle:"Bachelor's Degree",satisfiedCustomers:"2,278"},greeting:"Want to ask a Technician online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},appraisals:{forumId:5950,initialCategoryId:"7c53321238d84110ad4fe3ce325ef202",headingText:"Ask an Appraiser now",doubleHeadingText:["Chat with an appraiser","Get answers in minutes"],assistantName:"Pearl Wilson",assistantTitle:"Appraiser's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Appraisers are online now",expertProfile:{headingText:"Chat with an appraiser now",id:"28eb635e87d54ddb8bce6b0ae4211128",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RA/rarewares/2017-9-22_162132_o.64x64.jpg",expertName:"Rarewares",expertTitle:"Antiques and Collectibles Researcher",satisfiedCustomers:"11,895"},greeting:"Want to ask an Appraiser online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},apple:{forumId:84,initialCategoryId:"5f4b122e375c41aea2d88ac7c5ec699f",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Mac Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"c22f8c4c4fec4840bba7f8bddcedb525",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/RI/RichieMe/2013-10-21_9435_1891752088969658025993880564n.64x64.jpg",expertName:"Richard",expertTitle:"Apple Software Engineer",satisfiedCustomers:"13,190"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"social-security":{forumId:3511,initialCategoryId:"01446bbfaff64568b35b083cbf74fd30",headingText:"Ask a Lawyer Now",assistantName:"Pearl Wilson",assistantTitle:"Retirement Accountant's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Lawyers are online now",expertProfile:{headingText:"Chat with a lawyer now",id:"b88fdf9733024056abc0f64b88777eba",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/so/sojlaw/2013-8-22_1456_ResizedEDZII.64x64.jpg",expertName:"Stephanie O Joy",expertTitle:"Esq, Soc. Sec. Attorney",satisfiedCustomers:"3,257"},greeting:"Want to ask a Lawyer online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},electronics:{forumId:50,initialCategoryId:"5b32e024df944d7bb2181ae3431b4484",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a tech expert","Get answers in minutes"],assistantTitle:"Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"ce5c54ec5cee4ffdae8b4de4d6bb8a0c",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/LO/LongTermTech/SMILE4LARGE500by500.64x64.GIF",expertName:"Russell H.",expertTitle:"Service Tech",satisfiedCustomers:"7,908"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"e-reader":{forumId:986,initialCategoryId:"e2ba626efcc44328808d8d2c076af8e3",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"E-Reader Specialist's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"5e55f616b35a4ccea924b529d1fdecd1",expertAvatarUrl:"https://www.justanswer.com/uploads/SI/simitpatel/2013-8-22_6857_simit.200x200.jpg",expertName:"Simit",expertTitle:"Engineer",satisfiedCustomers:"3,715"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"media-player":{forumId:985,initialCategoryId:"094f7ef4b9fd4ec48c1a9592ea5ce6d1",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Video Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"6a2ec8eb5ef24aeb888cc762f714993e",expertAvatarUrl:"https://www.justanswer.com/uploads/PL/pllinate/2017-4-23_64646_np.200x200.jpg",expertName:"Nathan",expertTitle:"Installer",satisfiedCustomers:"21,328"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"microsoft-office":{forumId:7067,initialCategoryId:"0b5d641beffa4173b9e7a2a5676a32ee",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Microsoft Office Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"eac35ac9b7494fb0a3e53ca14eefe56c",expertAvatarUrl:"https://www.justanswer.com/uploads/JE/jessmagz/2012-6-6_18129_jm.64x64.jpg",expertName:"Jess M.",expertTitle:"Computer Support Specialist",satisfiedCustomers:"801"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"farm-equipment":{forumId:8820,initialCategoryId:"17d96c7599ed45898fafce999ecbff49",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Heavy Equipment Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"0ebb9888cb284b818b459a0301ee9dd7",expertAvatarUrl:"https://www.justanswer.com/uploads/KO/koboma/2012-6-6_20917_DSCF1022.200x200.JPG",expertName:"Curtis B.",expertTitle:"service manager",satisfiedCustomers:"3,264"},greeting:"Want to ask a Mechanic online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},laptop:{forumId:7063,initialCategoryId:"9216a9eb8d0f44dfae49bb2bb934510b",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Laptop Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Tech Experts are online now",expertProfile:{headingText:"Chat with a tech expert now",id:"6920f06244b0492ebb3e0f76588382fd",expertAvatarUrl:"https://www.justanswer.com/uploads/SH/Shefin/2012-6-6_17328_1.200x200.jpg",expertName:"Shefin",expertTitle:"Computer Support Specialist",satisfiedCustomers:"1,495"},greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},programming:{forumId:53,initialCategoryId:"dd088b8d9579427d81d3fe05adcf24e6",headingText:"Ask a Programmer Now",assistantName:"Pearl Wilson",assistantTitle:"Programmer's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Programmers are online now",expertProfile:{headingText:"Chat with a programmer now",id:"e89a47681e0b4eba83eee8ed6ccec446",expertAvatarUrl:"https://www.justanswer.com/uploads/so/softwarepapa/2011-4-20_225131_ingo2.200x200.jpg",expertName:"Ingo U",expertTitle:"Software Engineer",satisfiedCustomers:"508"},greeting:"Want to ask a Programmer online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},"android-devices":{forumId:6746,initialCategoryId:"d4f827790dc34ac5b44322f03dd1d969",headingText:"Ask an Android Expert",assistantName:"Pearl Wilson",assistantTitle:"Android Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Android Experts are online now",expertProfile:{headingText:"Chat with an android expert now",id:"d4a20012038e41d9a65005480a5acc74",expertAvatarUrl:"https://www.justanswer.com/uploads/MM/m7mflyvc-/jacustomer-m7mflyvc-_avatar.64x64.jpg",expertName:"Harry",expertTitle:"IT",satisfiedCustomers:"2,185"},greeting:"Want to ask an Android Expert online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},homeopathy:{forumId:4121,initialCategoryId:"acca145ab4f747029ec2175155fde78c",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Doctors are online now",expertProfile:{headingText:"Chat with a doctor now",id:"0790e25d49ba4772854adc94c4feb831",expertAvatarUrl:"https://www.justanswer.com/uploads/Dr/Drzaheer/2011-6-7_122726_Dr.Zaheer.64x64.JPG",expertName:"Dr. Zaheer",expertTitle:"Doctor",satisfiedCustomers:"5,471"},greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with an expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant."},parenting:{forumId:18,initialCategoryId:"1fe0078c10fc4a5380d6e7d51e8209a4",headingText:"Ask a Counselor Now",assistantName:"Pearl Wilson",assistantTitle:"Counselor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Counselors are online now",expertProfile:{headingText:"Chat with a counselor now",id:"3075a2d4242d47ec93cd55b8da9571ad",expertAvatarUrl:"https://ww2-secure.justanswer.com//uploads/CE/Cerecita/2011-3-16_2565_JAPIC500x500.64x64.jpg",expertName:"Cher",expertTitle:"Teacher",satisfiedCustomers:"119",experience:""},greeting:"Want to ask a Counselor online now? I can connect you ...",marketingMessageText:"Connect with a counselor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Counselor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Counselor's Assistant.",popup:{title:"Chat with a counselor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png",satisfiedCustomers:"119"}},ford:{forumId:24,initialCategoryId:"3ea28da72a804df98e844834f3de3e89",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Ford Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Ford Mechanics are online now",expertProfile:{headingText:"Chat with a mechanic now",id:"5ce05cb4e027458aa3292021f44afae5",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/FO/fordguyu/2015-7-7_172556_onnieew.64x64.jpg",expertName:"Ron",expertTitle:"ASE Certified Technician",satisfiedCustomers:"25,584",experience:""},greeting:"Want to ask a Ford Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a Ford mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Ford Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Ford Mechanic's Assistant.",popup:{title:"Chat with a Ford mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"25,584"}},obgyn:{forumId:86,initialCategoryId:"055787be8c9847fdb0a70e65568d6a18",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"OB/GYN Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 OB/GYN Doctors are online now",expertProfile:{headingText:"Chat with a OB/GYN doctor now",id:"87c3534d323f425f85ad4445f7ed760f",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/drhearne/2009-11-8_74742_monika_hearne2.jpg",expertName:"Monika Hearne",expertTitle:"Board Certified OB/GYN",satisfiedCustomers:"5822",experience:""},greeting:"Want to ask a OB/GYN Doctor online now? I can connect you ...",marketingMessageText:"Connect with an OB/GYN doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the OB/GYN Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the OB/GYN Doctor's Assistant.",popup:{title:"Chat with a OB/GYN doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png",satisfiedCustomers:"5822"}},chevy:{forumId:26,initialCategoryId:"23c69c684f10441b8f0426fe41b54983",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",assistantTitle:"Chevy Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Chevy Technicians are online now",expertProfile:{headingText:"Chat with a Chevy technician now",id:"3dd9287e78d74d38889d7dcf9b75808c",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/BL/Bluegorilla/2012-6-21_16298_cam.64x64.JPG",expertName:"GM Tech (Cam)",expertTitle:"Chevy Technician",satisfiedCustomers:"15,851",experience:""},greeting:"Want to ask a Chevy Technician online now? I can connect you ...",marketingMessageText:"Connect with a Chevy technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Chevy Technician's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Chevy Technician's Assistant.",popup:{title:"Chat with a Chevy technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"15,851"}},software:{forumId:7065,initialCategoryId:"459ef4a3a76e4e4891f29383ddf3250b",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",assistantTitle:"Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Software Technicians are online now",expertProfile:{headingText:"Chat with a software technician now",id:"57c2a00b2d254363910176ac6d6b7d74",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/OM/omputerechaster/2016-10-27_224413_opyie.64x64.jpg",expertName:"Jason Jones",expertTitle:"Computer Technician",satisfiedCustomers:"11,546",experience:""},greeting:"Want to ask a Software Technician online now? I can connect you ...",marketingMessageText:"Connect with a software technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Software Technician's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Software Technician's Assistant.",popup:{title:"Chat with a software technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"11,546"}},"recorders-and-players":{forumId:985,initialCategoryId:"094f7ef4b9fd4ec48c1a9592ea5ce6d1",headingText:"Ask a Technician Now",assistantName:"Pearl Wilson",assistantTitle:"Video Technician's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Video Technicians are online now",expertProfile:{headingText:"Chat with a video technician now",id:"958e0ea8dc92408d8e7bfc7d8e10c3ea",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/benimur/2009-03-29_003401_id_2.jpg",expertName:"Louie",expertTitle:"Senior Technician",satisfiedCustomers:"10,824",experience:""},greeting:"Want to ask a Video Technician online now? I can connect you ...",marketingMessageText:"Connect with a video technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Video Technician's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Video Technician's Assistant.",popup:{title:"Chat with a video technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"10,824"}},reptiles:{forumId:66,initialCategoryId:"ce81be08afcd413392d7caaa82c77856",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Veterinarians are online now",expertProfile:{headingText:"Chat with a veterinarian now",id:"25d807a8aec54c2ebd1398e99c67055c",expertAvatarUrl:"https://www.justanswer.com/uploads/MS/MsAM/2012-6-9_16426_anna.64x64.jpeg",expertName:"Anna",expertTitle:"Reptile Expert, Biologist",satisfiedCustomers:"4105"},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Reptile Experts request a deposit of about 18$ for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant.",popup:{title:"Chat with a veterinarian in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/vet_bg.png",satisfiedCustomers:"4105"}},"dream-interpretation":{forumId:2778,initialCategoryId:"2116a37c94ec4b4c894ae9ad5b4e6ec5",headingText:"Ask an Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Dream Analyst's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Dream Analysts are online now",expertProfile:{headingText:"Chat with a dream analyst now",id:"a92a06ce9b244e849974fb368754a9de",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/LO/loucas7/2011-1-20_154741_vegasfull2.64x64.jpg",expertName:"Dream Symbolist",expertTitle:"Dream Expert",satisfiedCustomers:"669",experience:""},greeting:"Want to ask a Dream Analyst online now? I can connect you ...",marketingMessageText:"Connect with a dream analyst",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Dream Analyst's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Dream Analyst's Assistant.",popup:{title:"Chat with a dream analyst in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png",satisfiedCustomers:"669"}},general:{forumId:3,initialCategoryId:"3b34df8ec88042a5b93ce22187ad1a50",headingText:"Ask an Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Experts are online now",expertProfile:{headingText:"Chat with an expert now",id:"df1e15249e1a4ed7b65c8d80fe19a6b6",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/AN/andawyer/2015-3-18_192649_otolia.64x64.jpg",expertName:"FiveStarLaw",expertTitle:"Consultant",satisfiedCustomers:"109",experience:""},greeting:"Want to ask a Expert online now? I can connect you ...",marketingMessageText:"Connect with an Expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Expert's Assistant.",popup:{title:"Chat with an expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"109"}},"heavy-equipment":{forumId:89,initialCategoryId:"38815056e479438c8e94531beffdb72b",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",onlineNowText:"14 Heavy Equipment Mechanics are online now",expertProfile:{headingText:"Chat with a heavy equipment mechanic now",id:"a050340b455c4e97ac5230e54ac01b07",expertAvatarUrl:"https://ww2-secure.justanswer.com/uploads/MU/muddyford/2012-6-13_1204_1.200x200.png",expertName:"Chris (aka - Moose)",expertTitle:"Technician",satisfiedCustomers:"119",experience:""},greeting:"Want to ask a Heavy Equipment Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a heavy equipment mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Heavy Equipment Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Heavy Equipment Mechanic's Assistant.",popup:{title:"Chat with a heavy equipment mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png",satisfiedCustomers:"119"}}},UK:{legal:{forumId:12175,initialCategoryId:"9c8484eb212e4e5a86ea9c59071d74d1",headingText:"Ask a Solicitor Now",assistantName:"Pearl Wilson",assistantTitle:"Solicitor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"a6cddf03f40146069bc32e2bb6a5148f",expertAvatarUrl:"https://www.justanswer.com/uploads/BE/benjones/2015-12-1_0437_ennew.64x64.jpg",expertName:"Ben Jones",expertTitle:"UK Solicitor",satisfiedCustomers:"",experience:"Qualified Solicitor in UK Law with Seven Years of Experience",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Solicitors request a deposit of about £36 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor's Assistant."},medical:{forumId:12247,initialCategoryId:"eb56d576e96040069f477322a347a067",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",assistantTitle:"Doctor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"aadad43ee75649a5867c80bcbd2a09ce",expertAvatarUrl:"https://www.justanswer.com/uploads/Do/Doctor7860/2013-4-2_3633_Picture.JA280x1873.64x64.jpg",expertName:"Dr. Amir",expertTitle:"Doctor",satisfiedCustomers:"",experience:"Master of Internal Medicine & Gastroenterology with Eight Years of Experience (London) MBBS",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Doctors request a deposit of about £34 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor's Assistant."},vet:{forumId:12262,initialCategoryId:"439b9fc114914f2794815343b699be54",headingText:"Ask a Veterinarian Now",assistantName:"Pearl Wilson",assistantTitle:"Veterinarian's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"85eb7325ebdd445c98904ec1d24978e1",expertAvatarUrl:"https://www.justanswer.co.uk/uploads/VE/VetAnswers/2013-4-5_8257_prof10.64x64.jpg",expertName:"Dr. Scott Nimmo",expertTitle:"Veterinarian",satisfiedCustomers:"",experience:"Royal College of Veterinary Surgeons with Nine Years of Experience (BVMS)",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Veterinarians request a deposit of about £20 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Veterinarian online now? I can connect you ...",marketingMessageText:"Connect with a veterinarian",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Veterinarian's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Veterinarian's Assistant."},car:{forumId:12203,initialCategoryId:"d6165649139f4dfaafa3bc19007ba569",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",assistantTitle:"Auto Mechanic's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"0d62b67e42954f88ac2fd57ee6332238",expertAvatarUrl:"https://ww2.justanswer.co.uk/uploads/IN/indytech/2013-8-8_102717_SantoDomingo146598x6402.64x64.jpg",expertName:"Greg",expertTitle:"Technician",satisfiedCustomers:"",experience:"Automotive diagnostic tech",showMoreLink:!1},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Auto Mechanics request a deposit of about £24 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Auto Mechanic's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Auto Mechanic's Assistant."},"home-improvement":{forumId:12292,initialCategoryId:"ff0c1187046c41999292833be3cfc69d",headingText:"Ask a Contractor Now",assistantName:"Pearl Wilson",assistantTitle:"Contractor's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"a55bd612cb27406aa1cd605522ce2d94",expertAvatarUrl:"https://www.justanswer.co.uk/uploads/PL/Plumberpro/2014-6-23_6520_image.64x64.jpg",expertName:"Plumberpro",expertTitle:"Plumber",satisfiedCustomers:"",experience:"Fully qualified plumbing, heating and gas engineer 20 years experience",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Home Improvement Experts request a deposit of about £28 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Contractor online now? I can connect you ...",marketingMessageText:"Connect with a contractor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Contractor's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Contractor's Assistant."},computer:{forumId:12299,initialCategoryId:"ab7a6d17831b4f43861c4171ccca7077",headingText:"Ask a Tech Expert Now",assistantName:"Pearl Wilson",assistantTitle:"Tech Expert's Assistant",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Pearl Wilson is typing...",expertProfile:{id:"486beb6283ce46b297a9a873a5ab4f1f",expertAvatarUrl:"https://www.justanswer.co.uk/uploads/JA/JACUSTOMERf8udkdxk/2013-8-3_15150_323738101505074393259301621172992o.64x64.jpg",expertName:"Kamil Anwar",expertTitle:"Computer Support Specialist",satisfiedCustomers:"",experience:"8+ Years of Experience. / CCNA (S), CCNA (W), CCNA (RS), MCTS, MBCs.",showMoreLink:!0},messages:["Hi, what is your name? And what is your issue regarding?","Thanks. Can you give me any more details about your issue?","OK. Tech Support Specialists request a deposit of about £36 for your type of question (you only pay if satisfied). Now I'll take you to a page to place a secure deposit with JustAnswer, then we'll finish helping you."],greeting:"Want to ask a Tech Expert online now? I can connect you ...",marketingMessageText:"Connect with a tech expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tech Expert's Assistant. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tech Expert's Assistant."},finance:{forumId:12200,botName:"Pearl_33_12_bot",initialCategoryId:"4511d1d50dd149c692945ded45a75fef",headingText:"Ask a Financial Advisor",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Financial Advisor","Get answers in minutes"],assistantTitle:"Financial Advisor's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Financial Advisors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/finance/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/RA/rakhi.v/2012-7-3_14374_RakhiVasavadaL.64x64.jpeg",expertName:"Rakhi Vasavada",expertTitle:"Financial Advisor",satisfiedCustomers:"1,813",experience:"Attorney and Financial Expert. Have specialization in Financial Laws.Practice experience of over 13 years",showMoreLink:!0},messages:["Welcome! How can I help with your finance question?"],greeting:"Want to ask a Financial Advisor online now? I can connect you ...",marketingMessageText:"Connect with a financial professional",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Financial Advisor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Financial Advisor.",popup:{title:"Chat with a financial advisor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/tax_bg.png"}},"classic-cars":{forumId:12210,botName:"Pearl_33_12_bot",initialCategoryId:"19cd25073ba64fa9a20d7800f56ae0bb",headingText:"Ask a Mechanic Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a mechanic","Get answers in minutes"],assistantTitle:"Expert's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Classic Car Mechanics are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/classic-cars/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/TE/techmachine/0601821347169_717372168_8940977_39623330_o.64x64.jpg",expertName:"Ross",expertTitle:"Diagnostic and repair technician",satisfiedCustomers:"473",experience:"Licensed diagnostic and repair technician",showMoreLink:!0},messages:["Welcome! What's going on with your car?"],greeting:"Want to ask a Mechanic online now? I can connect you ...",marketingMessageText:"Connect with a mechanic",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Mechanic. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Mechanic.",popup:{title:"Chat with a mechanic in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/mechanic_bg.png"}},"tenant-law":{forumId:12180,botName:"Pearl_33_12_bot",initialCategoryId:"cc9ec64bca0f48f088dc91e7bbd41610",headingText:"Ask a Solicitor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Solicitor","Get answers in minutes"],assistantTitle:"Property Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Solicitors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/tenant-law/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/EM/emus/2015-7-7_192327_bigstockportraitofconfidentfemale.64x64.jpg",expertName:"Remus2004",expertTitle:"Barrister",satisfiedCustomers:"2,532",experience:"Over 5 years in practice.",showMoreLink:!0},messages:["Welcome! How can I help with your property law question?"],greeting:"Want to ask a Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor.",popup:{title:"Chat with a solicitor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},tax:{forumId:12195,botName:"Pearl_33_12_bot",initialCategoryId:"862cac22aab342e5ad847c434eb61f59",headingText:"Ask a Tax Advisor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Tax Advisor","Get answers in minutes"],assistantTitle:"Accountant's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Tax Professionals are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/tax/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/bi/bigduckontax/2013-8-12_222058_1.64x64.jpg",expertName:"bigduckontax",expertTitle:"Accountant",satisfiedCustomers:"7,383",experience:"FCCA FCMA CGMA ACIS",showMoreLink:!0},messages:["Welcome! How can I help with your tax question?"],greeting:"Want to ask a Tax Advisor online now? I can connect you ...",marketingMessageText:"Connect with a tax advisor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tax Advisor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tax Advisor.",popup:{title:"Chat with a tax advisor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/tax_bg.png"}},business:{forumId:12195,botName:"Pearl_33_12_bot",initialCategoryId:"af75ae07b5ce4ed69406866a7e6a77ed",headingText:"Ask a Business Expert Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Business Expert","Get answers in minutes"],assistantTitle:"Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Business Experts are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/business/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/EM/emus/2015-7-7_192327_bigstockportraitofconfidentfemale.64x64.jpg",expertName:"Jo C.",expertTitle:"Barrister",satisfiedCustomers:"37,311",experience:"Over 5 years in practice",showMoreLink:!0},messages:["Welcome! How can I help with your legal question?"],greeting:"Want to ask a Business Expert online now? I can connect you ...",marketingMessageText:"Connect with a business expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Business Expert. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Business Expert.",popup:{title:"Chat with a business expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},smartphone:{forumId:12290,botName:"Pearl_37_5_bot",initialCategoryId:"debf20eb44b145adb590bc90d9ca8277",headingText:"Ask a mobile phone Tech Expert Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a mobile phone tech expert","Get answers in minutes"],assistantTitle:"Smartphone Tech Expert's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Mobile Phone Tech Experts are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/smartphone/",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/RI/RichieMe/2013-10-21_9435_1891752088969658025993880564n.64x64.jpg",expertName:"Richard",expertTitle:"Hardware Engineer",satisfiedCustomers:"69",experience:"Troubleshoot issues with smartphones.",showMoreLink:!0},messages:["Welcome! What's going on with your smartphone?"],greeting:"Want to ask a Smartphone Expert online now? I can connect you ...",marketingMessageText:"Connect with a mobile phone tech expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tech Expert. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tech Expert.",popup:{title:"Chat with a mobile phone tech expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},"online-counseling":{forumId:12247,botName:"Pearl_39_5_bot",initialCategoryId:"ccb231edd8d6499785ff51df8a045866",headingText:"Ask a Doctor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a doctor","Get answers in minutes"],assistantTitle:"Doctor's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"8 Doctors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/online-counseling",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/FA/FamilyPhysician/2013-8-31_191624_JA550x500Photo.64x64.jpg",expertName:"Family Physician",expertTitle:"Doctor",satisfiedCustomers:"2,418",experience:"GP with over 27 years experience including emergency medicine",showMoreLink:!0},messages:["Hi! Thanks for using JustAnswer. You're just a couple of questions away from an expert answer from the Doctor. How can we help?"],greeting:"Want to ask a doctor online now? I can connect you ...",marketingMessageText:"Connect with a doctor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Doctor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Doctor.",popup:{title:"Chat with a doctor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/health_bg.png"}},"family-law":{forumId:12178,botName:"Pearl_33_12_bot",initialCategoryId:"a2acf328e2c14ce0b6befcf2ae30adf9",headingText:"Ask a Solicitor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Solicitor","Get answers in minutes"],assistantTitle:"Family Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Solicitors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/family-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/TO/touchwoodsden/2020-1-31_165149_itock.64x64.jpg",expertName:"Stuart J",expertTitle:"Solicitor",satisfiedCustomers:"1,435",experience:"Senior Partner at Berkson Wallace",showMoreLink:!0},messages:["Welcome! How can I help with your question?"],greeting:"Want to ask a Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor.",popup:{title:"Chat with a solicitor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"immigration-law":{forumId:12179,botName:"Pearl_33_12_bot",initialCategoryId:"3b69b0a8747841aaade49b229b2f85ef",headingText:"Ask a Immigration Solicitor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Immigration Solicitor","Get answers in minutes"],assistantTitle:"Immigration Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Immigration Solicitors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/immigration-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/TO/touchwoodsden/2020-1-31_165149_itock.64x64.jpg",expertName:"Stuart J",expertTitle:"Solicitor",satisfiedCustomers:"2",experience:"Senior Partner at Berkson Wallace",showMoreLink:!0},messages:["Welcome! How can I help with your immigration question?"],greeting:"Want to ask a Immigration Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a immigration solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor.",popup:{title:"Chat with a immigration solicitor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},"property-law":{forumId:12180,botName:"Pearl_33_12_bot",initialCategoryId:"cc9ec64bca0f48f088dc91e7bbd41610",headingText:"Ask a Solicitor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Solicitor","Get answers in minutes"],assistantTitle:"Property Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Solicitors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/property-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/EM/emus/2015-7-7_192327_bigstockportraitofconfidentfemale.64x64.jpg",expertName:"Remus2004",expertTitle:"Barrister",satisfiedCustomers:"2,532",experience:"Over 5 years in practice.",showMoreLink:!0},messages:["Welcome! How can I help with your property law question?"],greeting:"Want to ask a Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor.",popup:{title:"Chat with a solicitor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},electronics:{forumId:12269,botName:"Pearl_37_5_bot",initialCategoryId:"1db29e65f111432fa569b8c1c92e25f2",headingText:"Ask a electronics Tech Expert Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a electronics tech expert","Get answers in minutes"],assistantTitle:"Tech Expert's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Electronics Tech Experts are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/electronics",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/RA/ratonxi/2012-1-3_151146_1.64x64.png",expertName:"Eng. Andres",expertTitle:"Engineer",satisfiedCustomers:"81",experience:"Electronic Eng. Electronics Specialist. Circuit designer",showMoreLink:!0},messages:["Welcome! How can I help with your electronics question?"],greeting:"Want to ask a Electronics Expert online now? I can connect you ...",marketingMessageText:"Connect with a electronics tech expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Tech Expert. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Tech Expert.",popup:{title:"Chat with a electronics tech expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/electronics_bg.png"}},antiques:{forumId:12342,botName:"uk_appraisals.json",type:"FunnelQuestionPce",initialCategoryId:"3e244f4639d146bca6f3d05624a4ad69",headingText:"Ask a Antique Expert Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a antique expert","Get answers in minutes"],assistantTitle:"Appraiser's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Antique Experts are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/antiques",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/IN/InspiredKnowledge/Great_House.64x64.jpg",expertName:"Great House Antiques",expertTitle:"Appraiser/ Researcher/ Entrepreneur",satisfiedCustomers:"1,839",experience:"30+ years in all aspects of the Antiques and Decorative Arts Industry",showMoreLink:!0},messages:["Welcome! How can I help with your antiques question?"],greeting:"Want to ask a antique expert online now? I can connect you ...",marketingMessageText:"Connect with a antique expert",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Antique Expert. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Antique Expert.",popup:{title:"Chat with a antique expert in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/general_bg.png"}},"employment-law":{forumId:12177,botName:"Pearl_33_12_bot",initialCategoryId:"00619a0e11994aa4ae0f85ba7dfc9f0f",headingText:"Ask a Employment Solicitor Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a Employment Solicitor","Get answers in minutes"],assistantTitle:"Employment Lawyer's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Employment Solicitors are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/employment-law",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/BE/benjones/2015-12-1_0437_ennew.64x64.jpg",expertName:"Ben Jones",expertTitle:"UK Lawyer",satisfiedCustomers:"17,248",experience:"Qualified Employment Solicitor",showMoreLink:!0},messages:["Welcome! How can I help with your employment question?"],greeting:"Want to ask a Employment Solicitor online now? I can connect you ...",marketingMessageText:"Connect with a employment solicitor",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Solicitor. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Solicitor.",popup:{title:"Chat with a employment solicitor in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/legal_bg.png"}},appliance:{forumId:12293,botName:"Pearl_37_5_bot",initialCategoryId:"33ed33f70095458680839e2ad5b7aaeb",headingText:"Ask a appliance Technician Now",assistantName:"Pearl Wilson",doubleHeadingText:["Chat with a appliance technician","Get answers in minutes"],assistantTitle:"Appliance Technician's Assistant",avatar:"https://ww2.justanswer.co.uk/static/img/val/pearl@2x.png",isTypingText:"Pearl Wilson is typing...",onlineNowText:"5 Appliance Technicians are online now",sipLandingPage:"https://www.justanswer.co.uk/sip/appliance",expertProfile:{expertAvatarUrl:"https://secure.justanswer.co.uk/uploads/RO/royzee1/2012-10-11_16153_serviceengineers.64x64.jpg",expertName:"Rob",expertTitle:"Home Appliance Technician",satisfiedCustomers:"420",experience:"20 yrs. experience with a major worldwide manufacturer.",showMoreLink:!0},messages:["Welcome! How can I help with your appliance question?"],greeting:"Want to ask a appliance technician online now? I can connect you ...",marketingMessageText:"Connect with a appliance technician",connectionRetryMessageHeader:"Oops! Something went wrong.",connectionRetryMessageBody:"We are reconnecting you with the Technician. Just a moment.",connectionFailureMessageHeader:"An error has occurred.",connectionFailureMessageBody:"Please refresh the page to chat 1:1 with the Technician.",popup:{title:"Chat with a appliance technician in minutes",background:"https://ww2-secure.justanswer.com/static/fe/ja-gadget-virtual-assistant-popup-b/homeinprovements_bg.png"}}},DE:{legal:{forumId:127,initialCategoryId:"af6f8c6c2fd641c4834a001979a84e02",headingText:"Fragen Sie jetzt Anwalt",assistantName:"Petra Wilson",assistantTitle:"Assistentin des Anwaltes",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Petra Wilson tippt...",expertProfile:{id:"fc123e1adcaf42e1bb1197822f96c9d1",expertAvatarUrl:"https://ww2.justanswer.de/uploads/CH/chiessl/2015-7-17_7493_resizedimage.64x64.jpg",expertName:"RASchiessl",expertTitle:"Rechtsanwalt",satisfiedCustomers:"24211",satisfiedCustomersLabel:"Zufriedene Kunden",experience:"",showMoreLink:!1},messages:["Hallo. Danke, daß Sie bei JustAnswer nach Antworten suchen. Wie kann ich Ihnen helfen?","Vielen Dank. Können Sie mir noch ein paar weitere Informationen geben, damit ich den passenden Experten für Sie finden kann?","OK. Vielen Dank. Bitte geben sie auf der nächsten Seite Ihre Zahlungsinformationen ein, damit ich Sie mit einem Experten verbinden kann. Keine Sorge, alle Ihre Angaben werden sicher aufbewahrt."],greeting:"Möchten Sie jetzt einen Anwalt online fragen? Ich verbinde Sie ...",marketingMessageText:"Mit einem Anwalt sprechen",connectionRetryMessageHeader:"Oops! Etwas ist schiefgelaufen.",connectionRetryMessageBody:"Einen Augenblick. Wir verbinden Sie mit der Assistentin des Anwaltes.",connectionFailureMessageHeader:"Ein Fehler ist aufgetreten.",connectionFailureMessageBody:"Bitte laden Sie die Seite neu um mit der Assistentin des Anwaltes zu sprechen."},medical:{forumId:135,initialCategoryId:"ab51f0cb001c49809ceeb17cbf43274f",headingText:"Fragen Sie jetzt Arzt",assistantName:"Petra Wilson",assistantTitle:"Assistentin des Arztes",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Petra Wilson tippt...",expertProfile:{id:"2a37b3faf79d4df48ead5afa1ee5ae63",expertAvatarUrl:"https://www.justanswer.de/uploads/EX/experte123/2013-2-15_233445_Screenshot2013021109h29m07s.64x64.png",expertName:"Dr. Hamann",expertTitle:"Dr. med.",satisfiedCustomers:"",experience:"Fachärztin Allgemein und Innere Medizin",showMoreLink:!0},messages:["Hallo. Danke, daß Sie bei JustAnswer nach Antworten suchen. Wie kann ich Ihnen helfen?","Vielen Dank. Können Sie mir noch ein paar weitere Informationen geben, damit ich den passenden Experten für Sie finden kann?","OK. Vielen Dank. Bitte geben sie auf der nächsten Seite Ihre Zahlungsinformationen ein, damit ich Sie mit einem Experten verbinden kann. Keine Sorge, alle Ihre Angaben werden sicher aufbewahrt."],greeting:"Möchten Sie jetzt einen Arzt online fragen? Ich verbinde Sie ...",marketingMessageText:"Mit einem Arzt sprechen",connectionRetryMessageHeader:"Oops! Etwas ist schiefgelaufen.",connectionRetryMessageBody:"Einen Augenblick. Wir verbinden Sie mit der Assistentin des Arztes.",connectionFailureMessageHeader:"Ein Fehler ist aufgetreten.",connectionFailureMessageBody:"Bitte laden Sie die Seite neu um mit der Assistentin des Arztes zu sprechen."},vet:{forumId:136,initialCategoryId:"1a7d5ca15e5046f9822530afcc20dbf1",headingText:"Fragen Sie jetzt Tierarzt",assistantName:"Petra Wilson",assistantTitle:"Assistentin des Tierarztes",avatar:"https://www.justanswer.com/fe-lib/components/th-chat-message/images/pearl_30x30.jpg",isTypingText:"Petra Wilson tippt...",expertProfile:{id:"a149694507b74a8692c0b47efd73a517",expertAvatarUrl:"https://www.justanswer.de/uploads/SI/sierraplenty/2011-4-17_142058_iselfotos1.08013.64x64.jpg",expertName:"Dr.M.Wörner-Lange",expertTitle:"Tierärztin,Dr.",satisfiedCustomers:"",experience:"eigene Tierarztpraxis ü. 20 Jahre / Praxis f. Verhaltenstherapie",showMoreLink:!0},messages:["Hallo. Danke, daß Sie bei JustAnswer nach Antworten suchen. Wie kann ich Ihnen helfen?","Vielen Dank. Können Sie mir noch ein paar weitere Informationen geben, damit ich den passenden Experten für Sie finden kann?","OK. Vielen Dank. Bitte geben sie auf der nächsten Seite Ihre Zahlungsinformationen ein, damit ich Sie mit einem Experten verbinden kann. Keine Sorge, alle Ihre Angaben werden sicher aufbewahrt."],greeting:"Möchten Sie jetzt einen Tierarzt online fragen? Ich verbinde Sie ...",marketingMessageText:"Mit einem Tierarzt sprechen",connectionRetryMessageHeader:"Oops! Etwas ist schiefgelaufen.",connectionRetryMessageBody:"Einen Augenblick. Wir verbinden Sie mit der Assistentin des Tierarztes.",connectionFailureMessageHeader:"Ein Fehler ist aufgetreten.",connectionFailureMessageBody:"Bitte laden Sie die Seite neu um mit der Assistentin des Tierarztes zu sprechen."}},ES:{legal:{forumId:815,initialCategoryId:"5cd9760351a848fdad6a93c35a25f1d3",headingText:"Pregunte a un Abogado",assistantName:"Laura Martínez",assistantTitle:"Asistente del Abogado",avatar:"https://ww2.justanswer.com/static/gadget-editor/img/pearl-es_30x30.jpg",isTypingText:"Laura Martínez está escribiendo...",expertProfile:{id:"0b8b84dec5e748d58d9f76330d814800",expertAvatarUrl:"https://www.justanswer.es/uploads/ED/eduardolm/2011-9-12_172832_Recorte.64x64.jpg",expertName:"eduardolm",expertTitle:"Licenciatura",satisfiedCustomers:"",experience:"Licenciado en Derecho por la UDC.Diploma en Escuela de Práctica Jurídica por A Coruña.",showMoreLink:!0},messages:["Hola, Gracias por utilizar JustAnswer. ¿En qué puedo ayudarle?","Entiendo.¿Podría darme más información? Por ejemplo, ¿Qué ha intentando hasta ahora para solucionarlo?","Ok. Muchas gracias. Entiendo todo lo que me ha indicado. Si le parece bien, le voy a redirigir ahora a la siguiente página donde se le conectará con un Experto y donde podrá introducir la información de pago. No se preocupe, que todo lo que ya hemos hablado estará disponible para el Experto y así podrá responder a su pregunta de la forma más eficiente posible. Muchas gracias."],greeting:"¿Desea preguntar a un Abogado online ahora? Puedo conectarle ...",marketingMessageText:"Conectarse con un Abogado",connectionRetryMessageHeader:"¡Vaya! Se ha producido un error.",connectionRetryMessageBody:"Estamos conectándole con el Asistente del Abogado. Espere un momento.",connectionFailureMessageHeader:"Se ha producido un error.",connectionFailureMessageBody:"Actualice la página para hablar con el Asistente del Abogado."},medical:{forumId:817,initialCategoryId:"198bf86925614cc3aa85e0e289031608",headingText:"Pregunte a un Médico",assistantName:"Laura Martínez",assistantTitle:"Asistente del Médico",avatar:"https://ww2.justanswer.com/static/gadget-editor/img/pearl-es_30x30.jpg",isTypingText:"Laura Martínez está escribiendo...",expertProfile:{id:"04bc7591a97941a18b49516e5082d812",expertAvatarUrl:"https://www.justanswer.es/uploads/IS/ismaelmd/2011-4-27_175820_lafoto.64x64.JPG",expertName:"Dr. Maldonado",expertTitle:"Médico",satisfiedCustomers:"",experience:"Especialista en medicina familiar. Mas de 12 años de experiencia.",showMoreLink:!0},messages:["Hola, Gracias por utilizar JustAnswer. ¿En qué puedo ayudarle?","Entiendo.¿Podría darme más información? Por ejemplo, ¿Qué ha intentando hasta ahora para solucionarlo?","Ok. Muchas gracias. Entiendo todo lo que me ha indicado. Si le parece bien, le voy a redirigir ahora a la siguiente página donde se le conectará con un Experto y donde podrá introducir la información de pago. No se preocupe, que todo lo que ya hemos hablado estará disponible para el Experto y así podrá responder a su pregunta de la forma más eficiente posible. Muchas gracias."],greeting:"¿Desea preguntar a un Médico online ahora? Puedo conectarle ...",marketingMessageText:"Conectarse con un Médico",connectionRetryMessageHeader:"¡Vaya! Se ha producido un error.",connectionRetryMessageBody:"Estamos conectándole con el Asistente del Médico. Espere un momento.",connectionFailureMessageHeader:"Se ha producido un error.",connectionFailureMessageBody:"Actualice la página para hablar con el Asistente del Médico."},vet:{forumId:2187,initialCategoryId:"e789e01867004cdf9e4b4cbbc163f276",headingText:"Pregunte al Veterinario",assistantName:"Laura Martínez",assistantTitle:"Asistente del Veterinario",avatar:"https://ww2.justanswer.com/static/gadget-editor/img/pearl-es_30x30.jpg",isTypingText:"Laura Martínez está escribiendo...",expertProfile:{id:"8d695dabc5144b11a94e9eb543bd23f7",expertAvatarUrl:"https://www.justanswer.es/uploads/FE/felipevet/2011-6-23_1343_yop.64x64.jpg",expertName:"felipevet",expertTitle:"Licenciatura",satisfiedCustomers:"",experience:"Médico Veterinario Licenciado en Medicina Veterinaria. Bachiller en Ciencias Animales.",showMoreLink:!0},messages:["Hola, Gracias por utilizar JustAnswer. ¿En qué puedo ayudarle?","Entiendo.¿Podría darme más información? Por ejemplo, ¿Qué ha intentando hasta ahora para solucionarlo?","Ok. Muchas gracias. Entiendo todo lo que me ha indicado. Si le parece bien, le voy a redirigir ahora a la siguiente página donde se le conectará con un Experto y donde podrá introducir la información de pago. No se preocupe, que todo lo que ya hemos hablado estará disponible para el Experto y así podrá responder a su pregunta de la forma más eficiente posible. Muchas gracias."],greeting:"¿Desea preguntar a un Veterinario online ahora? Puedo conectarle ...",marketingMessageText:"Conectarse con un Veterinario",connectionRetryMessageHeader:"¡Vaya! Se ha producido un error.",connectionRetryMessageBody:"Estamos conectándole con el Asistente del Veterinario. Espere un momento.",connectionFailureMessageHeader:"Se ha producido un error.",connectionFailureMessageBody:"Actualice la página para hablar con el Asistente del Veterinario."}},JP:{legal:{forumId:5164,initialCategoryId:"0176464d699e48b5946c6c15b1d8b438",headingText:"今すぐ弁護士に質問",assistantName:"大村真珠",assistantTitle:"弁護士アシスタント",avatar:"https://ww2.justanswer.com/static/gadget-editor/img/pearl-jp_30x30.jpg",isTypingText:"大村真珠が入力中...",expertProfile:{id:"",expertAvatarUrl:"https://ww2.justanswer.jp/uploads/SU/supertonton/2011-9-7_64453_nakano.64x64.jpg",expertName:"supertonton",expertTitle:"行政書士",satisfiedCustomers:"",experience:"中央大学卒平成１４年行政書士登録離婚・相続等の法務手続の専門家.",showMoreLink:!0},messages:["弊社サイトへのご来訪ありがとうございます。どのような悩みでお困りですか？","ありがとうございます。お客様の悩みについてもう少し詳しくご説明いただけますか？","かしこまりました。最後に、サイトでは専門家と個別に一対一でやり取りをしていただけます。次のページでお支払い方法をご入力いただきましたら専門家におつなぎいたします。こちらにご入力の内容は確実に専門家に連絡をさせていただいておりますので、もう一度専門家にご説明をいただく必要はございません。"],greeting:"弁護士に今すぐオンラインで質問をご希望ですか？私がお客様をおつなぎ ...",marketingMessageText:"弁護士とやり取り",connectionRetryMessageHeader:"申し訳ございませんがエラーが発生しました。",connectionRetryMessageBody:"弁護士アシスタントにもう一度おつなぎしています。少々お待ちください。",connectionFailureMessageHeader:"エラーが発生しました。",connectionFailureMessageBody:"弁護士アシスタントと一対一でチャットしていただくには、お手数ですがこのページを更新してください。"},medical:{forumId:5204,initialCategoryId:"89f3782185e44d88a71d33831669ae3e",headingText:"今すぐ医師に相談",assistantName:"大村真珠",assistantTitle:"医師アシスタント",avatar:"https://ww2.justanswer.com/static/gadget-editor/img/pearl-jp_30x30.jpg",isTypingText:"大村真珠が入力中....",expertProfile:{id:"",expertAvatarUrl:"https://www.justanswer.jp/uploads/DR/DrGATO/2012-9-30_33757_IMG0715.64x64.JPG",expertName:"Dr_GATO",expertTitle:"医師、医学博士",satisfiedCustomers:"2642",satisfiedCustomersLabel:"満足した利用者",experience:"",showMoreLink:!1},messages:["弊社サイトへのご来訪ありがとうございます。どのような悩みでお困りですか？","ありがとうございます。お客様の悩みについてもう少し詳しくご説明いただけますか？","かしこまりました。最後に、サイトでは専門家と個別に一対一でやり取りをしていただけます。次のページでお支払い方法をご入力いただきましたら専門家におつなぎいたします。こちらにご入力の内容は確実に専門家に連絡をさせていただいておりますので、もう一度専門家にご説明をいただく必要はございません。"],greeting:"医師に今すぐオンラインで質問をご希望ですか？私がお客様をおつなぎ ...",marketingMessageText:"医師とやり取り",connectionRetryMessageHeader:"申し訳ございませんがエラーが発生しました。",connectionRetryMessageBody:"医師アシスタントにもう一度おつなぎしています。少々お待ちください。",connectionFailureMessageHeader:"エラーが発生しました。",connectionFailureMessageBody:"医師アシスタントと一対一でチャットしていただくには、お手数ですがこのページを更新してください。"},vet:{forumId:5221,initialCategoryId:"6cd20af1ad294776924c8bedb71dae0d",headingText:"今すぐ獣医に相談",assistantName:"大村真珠",assistantTitle:"ペットの獣医アシスタント",avatar:"https://ww2.justanswer.com/static/gadget-editor/img/pearl-jp_30x30.jpg",isTypingText:"大村真珠が入力中...",expertProfile:{id:"",expertAvatarUrl:"https://www.justanswer.jp/uploads/YA/yasuyuki/2011-8-27_24733_SN3A0090.64x64.JPG",expertName:"yasuyuki",expertTitle:"Licenciatura",satisfiedCustomers:"",experience:"北里大院卒獣医学修士臨床経験20年以上",showMoreLink:!0},messages:["弊社サイトへのご来訪ありがとうございます。どのような悩みでお困りですか？","ありがとうございます。お客様の悩みについてもう少し詳しくご説明いただけますか？","かしこまりました。最後に、サイトでは専門家と個別に一対一でやり取りをしていただけます。次のページでお支払い方法をご入力いただきましたら専門家におつなぎいたします。こちらにご入力の内容は確実に専門家に連絡をさせていただいておりますので、もう一度専門家にご説明をいただく必要はございません。"],greeting:"獣医に今すぐオンラインで質問をご希望ですか？私がお客様をおつなぎ ...",marketingMessageText:"獣医とやり取り",connectionRetryMessageHeader:"申し訳ございませんがエラーが発生しました。",connectionRetryMessageBody:"獣医アシスタントにもう一度おつなぎしています。少々お待ちください。",connectionFailureMessageHeader:"エラーが発生しました。",connectionFailureMessageBody:"獣医アシスタントと一対一でチャットしていただくには、お手数ですがこのページを更新してください。"}}},size:{default:"","450x400":"450x400","300x600":"300x600","250x250":"250x250",small:"small"},showCopyright:{false:!1,true:!0}}},{}],"ja-gadget-virtual-assistant-config":[function(e,t,a){function s(e){if(!(this instanceof s))return new s(e);var e=e||{},t=e.partner||"US",a=n.settings[t][e.settings]||n.settings[t].default,i=n.profiles[t][e.profile]||n.profiles[t].legal,o=n.size[e.size]||n.size.default,r=i.messages,c=i.popup||{},l=a.messageMinLength||1;return{rParameter:e.affiliateId||"affiliate",source:e.source||"affiliate",trackingPixels:e.trackingPixels||{},time:a.time,disableTimer:a.disableTimer,proceedToCcTime:a.proceedToCcTime,enableOnExit:a.enableOnExit,animationTimeIntervals:a.animationTimeIntervals,placeholder:a.placeholder,placeholderV2:a.placeholderV2,messageMinLength:l,clientName:a.clientName,sendButtonText:a.sendButtonText,sendButtonTextForStartedChat:a.sendButtonTextForStartedChat,startChatText:a.startChatText,moreLinkText:a.moreLinkText,lessLinkText:a.lessLinkText,showBackground:a.showBackground,minimized:a.minimized,baseDomain:a.baseDomain,rememberChatMinimizedState:a.rememberChatMinimizedState,mobile:a.mobile,endpoint:e.endpoint||a.endpoint,botName:i.botName||"",type:i.type||a.type,isNewPaymentWindow:a.isNewPaymentWindow,sessionExpirationHours:a.sessionExpirationHours,showCta:a.showCta,forumId:i.forumId,headingText:i.headingText,doubleHeadingText:i.doubleHeadingText,assistantName:i.assistantName,assistantTitle:i.assistantTitle,avatar:i.avatar,isTypingText:i.isTypingText,expertProfile:i.expertProfile,expertMessages:r,greeting:i.greeting,initialCategoryId:i.initialCategoryId,marketingMessageText:i.marketingMessageText,connectionRetryMessageHeader:i.connectionRetryMessageHeader,connectionRetryMessageBody:i.connectionRetryMessageBody,connectionFailureMessageHeader:i.connectionFailureMessageHeader,connectionFailureMessageBody:i.connectionFailureMessageBody,showCopyright:e.showCopyright,canCloseTeaser:e.canCloseTeaser,closeChatOnClickOutside:e.closeChatOnClickOutside,fullScreenOnMobile:e.fullScreenOnMobile,size:o,onlineNowText:i.onlineNowText,sipLandingPage:i.sipLandingPage,popup:{background:c.background,title:c.title,showOnTimeout:e.showOnTimeout,showOnMouseOut:e.showOnMouseOut,appearanceTimeout:e.appearanceTimeout}}}var n=e("./presets.json");t.exports=s},{"./presets.json":1}]},{},["ja-gadget-virtual-assistant-config"]);/*ja-gadget-virtual-assistant-subtle@2.19.0*/ 
;require=(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({1:[function(require,module,exports){var tracking = require('ja-tracking');module.exports.track = function track(chat, config, target) {    var target =        target && target.nodeType ? target : document.querySelector(target);    var config = config || {};    config.trackingPixels = config.trackingPixels || {};    config.trackingPixels.appearance = config.trackingPixels.appearance || '';    config.trackingPixels.transition =        config.trackingPixels.transition + '{clickId}' || '';    var transitionPixelQueryStringParamSeparator = /[?]/i.test(        config.trackingPixels.transition    )        ? '&aff_click_id='        : '?aff_click_id=';    var continueLinkClickTrackingParam =        transitionPixelQueryStringParamSeparator + 'continue-link';    var sendButtonClickTrackingParam =        transitionPixelQueryStringParamSeparator + 'send-btn';    var closeButtonTrackingParam =        transitionPixelQueryStringParamSeparator + 'close-btn';    if (!chat || !chat.on || !target || tracking.isBot()) return;    chat.target = chat.target || {};    var chatClassName = '.' + chat.target.className;    var useAdditionalTrackingForLightboxGadget = chatClassName.match(        /ja-chat-container/gi    );    chat.on('appear', function() {        setTimeout(function() {            tracking.fireImagePixel(config.trackingPixels.appearance, {                target: target,                once: true,                partialMatching: true            });        }, 2000);    });    chat.on('complete', function() {        tracking.fireImagePixel(            config.trackingPixels.transition.replace(                '{clickId}',                continueLinkClickTrackingParam            ),            { target: target, once: true, partialMatching: true }        );    });    if (useAdditionalTrackingForLightboxGadget) {        var chatElement = document.querySelector(chatClassName);        chat.on('submit', function() {            tracking.fireImagePixel(                config.trackingPixels.transition.replace(                    '{clickId}',                    sendButtonClickTrackingParam                ),                { target: target, once: false, partialMatching: true }            );        });        chatElement            .querySelector('.toggle-button')            .addEventListener('click', function() {                tracking.fireImagePixel(                    config.trackingPixels.transition.replace(                        '{clickId}',                        closeButtonTrackingParam                    ),                    { target: target, once: false, partialMatching: true }                );            });    }};},{"ja-tracking":3}],2:[function(require,module,exports){var events = require('ja-event');var utils = require('ja-utils');const maxHeightTreshold = window.innerHeight * 0.4;function VirtualAssistantManager(target, chatWindowClass, teaserWindowClass) {    if (!(this instanceof VirtualAssistantManager)) return new VirtualAssistantManager(target);    var virtualAssistantManager = this;    virtualAssistantManager.target = target;    virtualAssistantManager.teaserWindowClass = teaserWindowClass;     virtualAssistantManager.chatWindowClass = chatWindowClass;     virtualAssistantManager.isToggleEventSet = false;     virtualAssistantManager.isMultiGadget = true;     return virtualAssistantManager;}VirtualAssistantManager.prototype.initialize = function() {    this.applyChanges(this);    this.createObserver();    this.observe();}VirtualAssistantManager.prototype.observe = function () {     this.observer.observe(document, {        childList: true,        subtree: true    }); }VirtualAssistantManager.prototype.createObserver = function () {    var self = this;    this.observer = new MutationObserver(function (mutations, me) {        self.applyChanges(self);    });    }VirtualAssistantManager.prototype.isGadgetAppeared = function(teaserWindow, chatWindow) {    return (!this.teaserWindowClass || teaserWindow) && chatWindow;}VirtualAssistantManager.prototype.applyChanges = function(self) {    var teaserWindow = self.target.querySelector(self.teaserWindowClass);    var chatWindow = self.target.querySelector(self.chatWindowClass);    if (self.isGadgetAppeared(teaserWindow, chatWindow)) {        if (!self.isToggleEventSet && self.isMultiGadget) {            if (self.isMultiGadgetState()) {                self.isToggleEventSet = self.eventToggleChat(chatWindow);            } else {                self.isMultiGadget = false;            }            };        var resultData = self.checkGadgetOverlapped(self.teaserWindowClass ? teaserWindow.querySelector(".image").getBoundingClientRect() : chatWindow.getBoundingClientRect());        if (resultData.IsOverlapped) {            self.setStyles(teaserWindow, chatWindow, resultData.Height, resultData.ZIndex);        }    }}VirtualAssistantManager.prototype.checkGadgetOverlapped = function (visibleRect) {     var pageElements = document.body.querySelectorAll("body > div:not(." + this.target.className.split(' ')[0] + "), span:not(.badge), center");    var maxHeight = 0;    var maxZIndex = 0;    var isOverlapped = false;    for (i = 0; i< pageElements.length; ++i) {        var zindex = this.getZIndex(pageElements[i]);        if (zindex > 0) {            var elementRect = pageElements[i].getBoundingClientRect();            if (elementRect.bottom == window.innerHeight || (visibleRect && this.isOverlapped(visibleRect, elementRect))) {                isOverlapped = true;                maxHeight = Math.max(elementRect.height, maxHeight);                maxZIndex = Math.max(zindex, maxZIndex);            }         }    }    return {        IsOverlapped: isOverlapped,        Height: maxHeight,        ZIndex: maxZIndex    }}VirtualAssistantManager.prototype.setStyles = function (teaserWindow, chatWindow, height, zIndex) {    if (teaserWindow) {        var teaserRect = teaserWindow.getBoundingClientRect();        if (height + teaserRect.height > maxHeightTreshold) {            teaserWindow.style.cssText = "bottom: " + height + "px!important";        }        else {            teaserWindow.style.cssText = "z-index: " + (++zIndex) + "!important";        }    }    chatWindow.style.cssText = "z-index: " + (++zIndex) + "!important";}VirtualAssistantManager.prototype.isOverlapped = function (element1, element2) {    return !(element1.right < element2.left ||         element1.left > element2.right ||         element1.bottom < element2.top ||         element1.top > element2.bottom);}VirtualAssistantManager.prototype.getZIndex = function (element) {        if (element instanceof Element) {        var computedStyle = getComputedStyle(element);        if (computedStyle) {            var value = computedStyle.getPropertyValue('z-index');            if (isNaN(value)) return this.getZIndex(element.parentNode);            return value;        }    }    return 0;}VirtualAssistantManager.prototype.isMultiGadgetState = function () {    var headers = document.getElementsByClassName("th-chat-header");    return headers.length > 1;}VirtualAssistantManager.prototype.eventToggleChat = function (chatWindow) {    var toggleButton = chatWindow.querySelector('.toggle-button');    if (toggleButton) {        toggleButton.addEventListener('click', function(e) {            e.view.chatView.chatWindow.header.trigger('toggleChat');        });        return true;    }    return false;}module.exports = VirtualAssistantManager;utils.mixin(VirtualAssistantManager, events);},{"ja-event":49,"ja-utils":53}],3:[function(require,module,exports){module.exports = {    fireImagePixel: function (url, config) {        if (!url || typeof (url) !== 'string') return;        config = config || {};        var comparison = config.partialMatching ? '*=' : '=';        var target = config.target && config.target.nodeType ? config.target : document.querySelector(config.target || 'body')        if (config.once && document.querySelector('img[src' + comparison + '"' + url + '"]') !== null) return;        var img = document.createElement('img');        img.src = url;        img.className = 'ja-pixel';        target.appendChild(img);        return img;    },    isBot: function (userAgent) {        return /bot|slurp|crawl|spider|robot/i.test(userAgent || window.navigator.userAgent);    }}},{}],4:[function(require,module,exports){/* * Cookies.js - 1.2.3 * https://github.com/ScottHamper/Cookies * * This is free and unencumbered software released into the public domain. */(function (global, undefined) {    'use strict';    var factory = function (window) {        if (typeof window.document !== 'object') {            throw new Error('Cookies.js requires a `window` with a `document` object');        }        var Cookies = function (key, value, options) {            return arguments.length === 1 ?                Cookies.get(key) : Cookies.set(key, value, options);        };        // Allows for setter injection in unit tests        Cookies._document = window.document;        // Used to ensure cookie keys do not collide with        // built-in `Object` properties        Cookies._cacheKeyPrefix = 'cookey.'; // Hurr hurr, :)                Cookies._maxExpireDate = new Date('Fri, 31 Dec 9999 23:59:59 UTC');        Cookies.defaults = {            path: '/',            secure: false        };        Cookies.get = function (key) {            if (Cookies._cachedDocumentCookie !== Cookies._document.cookie) {                Cookies._renewCache();            }                        var value = Cookies._cache[Cookies._cacheKeyPrefix + key];            return value === undefined ? undefined : decodeURIComponent(value);        };        Cookies.set = function (key, value, options) {            options = Cookies._getExtendedOptions(options);            options.expires = Cookies._getExpiresDate(value === undefined ? -1 : options.expires);            Cookies._document.cookie = Cookies._generateCookieString(key, value, options);            return Cookies;        };        Cookies.expire = function (key, options) {            return Cookies.set(key, undefined, options);        };        Cookies._getExtendedOptions = function (options) {            return {                path: options && options.path || Cookies.defaults.path,                domain: options && options.domain || Cookies.defaults.domain,                expires: options && options.expires || Cookies.defaults.expires,                secure: options && options.secure !== undefined ?  options.secure : Cookies.defaults.secure            };        };        Cookies._isValidDate = function (date) {            return Object.prototype.toString.call(date) === '[object Date]' && !isNaN(date.getTime());        };        Cookies._getExpiresDate = function (expires, now) {            now = now || new Date();            if (typeof expires === 'number') {                expires = expires === Infinity ?                    Cookies._maxExpireDate : new Date(now.getTime() + expires * 1000);            } else if (typeof expires === 'string') {                expires = new Date(expires);            }            if (expires && !Cookies._isValidDate(expires)) {                throw new Error('`expires` parameter cannot be converted to a valid Date instance');            }            return expires;        };        Cookies._generateCookieString = function (key, value, options) {            key = key.replace(/[^#$&+\^`|]/g, encodeURIComponent);            key = key.replace(/\(/g, '%28').replace(/\)/g, '%29');            value = (value + '').replace(/[^!#$&-+\--:<-\[\]-~]/g, encodeURIComponent);            options = options || {};            var cookieString = key + '=' + value;            cookieString += options.path ? ';path=' + options.path : '';            cookieString += options.domain ? ';domain=' + options.domain : '';            cookieString += options.expires ? ';expires=' + options.expires.toUTCString() : '';            cookieString += options.secure ? ';secure' : '';            return cookieString;        };        Cookies._getCacheFromString = function (documentCookie) {            var cookieCache = {};            var cookiesArray = documentCookie ? documentCookie.split('; ') : [];            for (var i = 0; i < cookiesArray.length; i++) {                var cookieKvp = Cookies._getKeyValuePairFromCookieString(cookiesArray[i]);                if (cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] === undefined) {                    cookieCache[Cookies._cacheKeyPrefix + cookieKvp.key] = cookieKvp.value;                }            }            return cookieCache;        };        Cookies._getKeyValuePairFromCookieString = function (cookieString) {            // "=" is a valid character in a cookie value according to RFC6265, so cannot `split('=')`            var separatorIndex = cookieString.indexOf('=');            // IE omits the "=" when the cookie value is an empty string            separatorIndex = separatorIndex < 0 ? cookieString.length : separatorIndex;            var key = cookieString.substr(0, separatorIndex);            var decodedKey;            try {                decodedKey = decodeURIComponent(key);            } catch (e) {                if (console && typeof console.error === 'function') {                    console.error('Could not decode cookie with key "' + key + '"', e);                }            }                        return {                key: decodedKey,                value: cookieString.substr(separatorIndex + 1) // Defer decoding value until accessed            };        };        Cookies._renewCache = function () {            Cookies._cache = Cookies._getCacheFromString(Cookies._document.cookie);            Cookies._cachedDocumentCookie = Cookies._document.cookie;        };        Cookies._areEnabled = function () {            var testKey = 'cookies.js';            var areEnabled = Cookies.set(testKey, 1).get(testKey) === '1';            Cookies.expire(testKey);            return areEnabled;        };        Cookies.enabled = Cookies._areEnabled();        return Cookies;    };    var cookiesExport = (global && typeof global.document === 'object') ? factory(global) : factory;    // AMD support    if (typeof define === 'function' && define.amd) {        define(function () { return cookiesExport; });    // CommonJS/Node.js support    } else if (typeof exports === 'object') {        // Support Node.js specific `module.exports` (which can be a function)        if (typeof module === 'object' && typeof module.exports === 'object') {            exports = module.exports = cookiesExport;        }        // But always support CommonJS module 1.1.1 spec (`exports` cannot be a function)        exports.Cookies = cookiesExport;    } else {        global.Cookies = cookiesExport;    }})(typeof window === 'undefined' ? this : window);},{}],5:[function(require,module,exports){module.exports = function (arr) {    var e = {},        enumArr = arr;    if (!(arr instanceof Array)) {        // Use the arguments array if an array isn't passed in        enumArr = arguments    }    for (var i = enumArr.length - 1; i >= 0; i--) {        e[enumArr[i]] = enumArr[i];    };        return e;};},{}],6:[function(require,module,exports){'use strict';/* globals	Atomics,	SharedArrayBuffer,*/var undefined;var $TypeError = TypeError;var $gOPD = Object.getOwnPropertyDescriptor;if ($gOPD) {	try {		$gOPD({}, '');	} catch (e) {		$gOPD = null; // this is IE 8, which has a broken gOPD	}}var throwTypeError = function () { throw new $TypeError(); };var ThrowTypeError = $gOPD	? (function () {		try {			// eslint-disable-next-line no-unused-expressions, no-caller, no-restricted-properties			arguments.callee; // IE 8 does not throw here			return throwTypeError;		} catch (calleeThrows) {			try {				// IE 8 throws on Object.getOwnPropertyDescriptor(arguments, '')				return $gOPD(arguments, 'callee').get;			} catch (gOPDthrows) {				return throwTypeError;			}		}	}())	: throwTypeError;var hasSymbols = require('has-symbols')();var getProto = Object.getPrototypeOf || function (x) { return x.__proto__; }; // eslint-disable-line no-protovar generator; // = function * () {};var generatorFunction = generator ? getProto(generator) : undefined;var asyncFn; // async function() {};var asyncFunction = asyncFn ? asyncFn.constructor : undefined;var asyncGen; // async function * () {};var asyncGenFunction = asyncGen ? getProto(asyncGen) : undefined;var asyncGenIterator = asyncGen ? asyncGen() : undefined;var TypedArray = typeof Uint8Array === 'undefined' ? undefined : getProto(Uint8Array);var INTRINSICS = {	'%Array%': Array,	'%ArrayBuffer%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer,	'%ArrayBufferPrototype%': typeof ArrayBuffer === 'undefined' ? undefined : ArrayBuffer.prototype,	'%ArrayIteratorPrototype%': hasSymbols ? getProto([][Symbol.iterator]()) : undefined,	'%ArrayPrototype%': Array.prototype,	'%ArrayProto_entries%': Array.prototype.entries,	'%ArrayProto_forEach%': Array.prototype.forEach,	'%ArrayProto_keys%': Array.prototype.keys,	'%ArrayProto_values%': Array.prototype.values,	'%AsyncFromSyncIteratorPrototype%': undefined,	'%AsyncFunction%': asyncFunction,	'%AsyncFunctionPrototype%': asyncFunction ? asyncFunction.prototype : undefined,	'%AsyncGenerator%': asyncGen ? getProto(asyncGenIterator) : undefined,	'%AsyncGeneratorFunction%': asyncGenFunction,	'%AsyncGeneratorPrototype%': asyncGenFunction ? asyncGenFunction.prototype : undefined,	'%AsyncIteratorPrototype%': asyncGenIterator && hasSymbols && Symbol.asyncIterator ? asyncGenIterator[Symbol.asyncIterator]() : undefined,	'%Atomics%': typeof Atomics === 'undefined' ? undefined : Atomics,	'%Boolean%': Boolean,	'%BooleanPrototype%': Boolean.prototype,	'%DataView%': typeof DataView === 'undefined' ? undefined : DataView,	'%DataViewPrototype%': typeof DataView === 'undefined' ? undefined : DataView.prototype,	'%Date%': Date,	'%DatePrototype%': Date.prototype,	'%decodeURI%': decodeURI,	'%decodeURIComponent%': decodeURIComponent,	'%encodeURI%': encodeURI,	'%encodeURIComponent%': encodeURIComponent,	'%Error%': Error,	'%ErrorPrototype%': Error.prototype,	'%eval%': eval, // eslint-disable-line no-eval	'%EvalError%': EvalError,	'%EvalErrorPrototype%': EvalError.prototype,	'%Float32Array%': typeof Float32Array === 'undefined' ? undefined : Float32Array,	'%Float32ArrayPrototype%': typeof Float32Array === 'undefined' ? undefined : Float32Array.prototype,	'%Float64Array%': typeof Float64Array === 'undefined' ? undefined : Float64Array,	'%Float64ArrayPrototype%': typeof Float64Array === 'undefined' ? undefined : Float64Array.prototype,	'%Function%': Function,	'%FunctionPrototype%': Function.prototype,	'%Generator%': generator ? getProto(generator()) : undefined,	'%GeneratorFunction%': generatorFunction,	'%GeneratorPrototype%': generatorFunction ? generatorFunction.prototype : undefined,	'%Int8Array%': typeof Int8Array === 'undefined' ? undefined : Int8Array,	'%Int8ArrayPrototype%': typeof Int8Array === 'undefined' ? undefined : Int8Array.prototype,	'%Int16Array%': typeof Int16Array === 'undefined' ? undefined : Int16Array,	'%Int16ArrayPrototype%': typeof Int16Array === 'undefined' ? undefined : Int8Array.prototype,	'%Int32Array%': typeof Int32Array === 'undefined' ? undefined : Int32Array,	'%Int32ArrayPrototype%': typeof Int32Array === 'undefined' ? undefined : Int32Array.prototype,	'%isFinite%': isFinite,	'%isNaN%': isNaN,	'%IteratorPrototype%': hasSymbols ? getProto(getProto([][Symbol.iterator]())) : undefined,	'%JSON%': typeof JSON === 'object' ? JSON : undefined,	'%JSONParse%': typeof JSON === 'object' ? JSON.parse : undefined,	'%Map%': typeof Map === 'undefined' ? undefined : Map,	'%MapIteratorPrototype%': typeof Map === 'undefined' || !hasSymbols ? undefined : getProto(new Map()[Symbol.iterator]()),	'%MapPrototype%': typeof Map === 'undefined' ? undefined : Map.prototype,	'%Math%': Math,	'%Number%': Number,	'%NumberPrototype%': Number.prototype,	'%Object%': Object,	'%ObjectPrototype%': Object.prototype,	'%ObjProto_toString%': Object.prototype.toString,	'%ObjProto_valueOf%': Object.prototype.valueOf,	'%parseFloat%': parseFloat,	'%parseInt%': parseInt,	'%Promise%': typeof Promise === 'undefined' ? undefined : Promise,	'%PromisePrototype%': typeof Promise === 'undefined' ? undefined : Promise.prototype,	'%PromiseProto_then%': typeof Promise === 'undefined' ? undefined : Promise.prototype.then,	'%Promise_all%': typeof Promise === 'undefined' ? undefined : Promise.all,	'%Promise_reject%': typeof Promise === 'undefined' ? undefined : Promise.reject,	'%Promise_resolve%': typeof Promise === 'undefined' ? undefined : Promise.resolve,	'%Proxy%': typeof Proxy === 'undefined' ? undefined : Proxy,	'%RangeError%': RangeError,	'%RangeErrorPrototype%': RangeError.prototype,	'%ReferenceError%': ReferenceError,	'%ReferenceErrorPrototype%': ReferenceError.prototype,	'%Reflect%': typeof Reflect === 'undefined' ? undefined : Reflect,	'%RegExp%': RegExp,	'%RegExpPrototype%': RegExp.prototype,	'%Set%': typeof Set === 'undefined' ? undefined : Set,	'%SetIteratorPrototype%': typeof Set === 'undefined' || !hasSymbols ? undefined : getProto(new Set()[Symbol.iterator]()),	'%SetPrototype%': typeof Set === 'undefined' ? undefined : Set.prototype,	'%SharedArrayBuffer%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer,	'%SharedArrayBufferPrototype%': typeof SharedArrayBuffer === 'undefined' ? undefined : SharedArrayBuffer.prototype,	'%String%': String,	'%StringIteratorPrototype%': hasSymbols ? getProto(''[Symbol.iterator]()) : undefined,	'%StringPrototype%': String.prototype,	'%Symbol%': hasSymbols ? Symbol : undefined,	'%SymbolPrototype%': hasSymbols ? Symbol.prototype : undefined,	'%SyntaxError%': SyntaxError,	'%SyntaxErrorPrototype%': SyntaxError.prototype,	'%ThrowTypeError%': ThrowTypeError,	'%TypedArray%': TypedArray,	'%TypedArrayPrototype%': TypedArray ? TypedArray.prototype : undefined,	'%TypeError%': $TypeError,	'%TypeErrorPrototype%': $TypeError.prototype,	'%Uint8Array%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array,	'%Uint8ArrayPrototype%': typeof Uint8Array === 'undefined' ? undefined : Uint8Array.prototype,	'%Uint8ClampedArray%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray,	'%Uint8ClampedArrayPrototype%': typeof Uint8ClampedArray === 'undefined' ? undefined : Uint8ClampedArray.prototype,	'%Uint16Array%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array,	'%Uint16ArrayPrototype%': typeof Uint16Array === 'undefined' ? undefined : Uint16Array.prototype,	'%Uint32Array%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array,	'%Uint32ArrayPrototype%': typeof Uint32Array === 'undefined' ? undefined : Uint32Array.prototype,	'%URIError%': URIError,	'%URIErrorPrototype%': URIError.prototype,	'%WeakMap%': typeof WeakMap === 'undefined' ? undefined : WeakMap,	'%WeakMapPrototype%': typeof WeakMap === 'undefined' ? undefined : WeakMap.prototype,	'%WeakSet%': typeof WeakSet === 'undefined' ? undefined : WeakSet,	'%WeakSetPrototype%': typeof WeakSet === 'undefined' ? undefined : WeakSet.prototype};var bind = require('function-bind');var $replace = bind.call(Function.call, String.prototype.replace);/* adapted from https://github.com/lodash/lodash/blob/4.17.15/dist/lodash.js#L6735-L6744 */var rePropName = /[^%.[\]]+|\[(?:(-?\d+(?:\.\d+)?)|(["'])((?:(?!\2)[^\\]|\\.)*?)\2)\]|(?=(?:\.|\[\])(?:\.|\[\]|%$))/g;var reEscapeChar = /\\(\\)?/g; /** Used to match backslashes in property paths. */var stringToPath = function stringToPath(string) {	var result = [];	$replace(string, rePropName, function (match, number, quote, subString) {		result[result.length] = quote ? $replace(subString, reEscapeChar, '$1') : (number || match);	});	return result;};/* end adaptation */var getBaseIntrinsic = function getBaseIntrinsic(name, allowMissing) {	if (!(name in INTRINSICS)) {		throw new SyntaxError('intrinsic ' + name + ' does not exist!');	}	// istanbul ignore if // hopefully this is impossible to test :-)	if (typeof INTRINSICS[name] === 'undefined' && !allowMissing) {		throw new $TypeError('intrinsic ' + name + ' exists, but is not available. Please file an issue!');	}	return INTRINSICS[name];};module.exports = function GetIntrinsic(name, allowMissing) {	if (typeof name !== 'string' || name.length === 0) {		throw new TypeError('intrinsic name must be a non-empty string');	}	if (arguments.length > 1 && typeof allowMissing !== 'boolean') {		throw new TypeError('"allowMissing" argument must be a boolean');	}	var parts = stringToPath(name);	var value = getBaseIntrinsic('%' + (parts.length > 0 ? parts[0] : '') + '%', allowMissing);	for (var i = 1; i < parts.length; i += 1) {		if (value != null) {			if ($gOPD && (i + 1) >= parts.length) {				var desc = $gOPD(value, parts[i]);				if (!allowMissing && !(parts[i] in value)) {					throw new $TypeError('base intrinsic for ' + name + ' exists, but the property is not available.');				}				value = desc ? (desc.get || desc.value) : value[parts[i]];			} else {				value = value[parts[i]];			}		}	}	return value;};},{"function-bind":11,"has-symbols":14}],7:[function(require,module,exports){'use strict';var bind = require('function-bind');var GetIntrinsic = require('../GetIntrinsic');var $Function = GetIntrinsic('%Function%');var $apply = $Function.apply;var $call = $Function.call;module.exports = function callBind() {	return bind.apply($call, arguments);};module.exports.apply = function applyBind() {	return bind.apply($apply, arguments);};},{"../GetIntrinsic":6,"function-bind":11}],8:[function(require,module,exports){'use strict';var GetIntrinsic = require('../GetIntrinsic');var callBind = require('./callBind');var $indexOf = callBind(GetIntrinsic('String.prototype.indexOf'));module.exports = function callBoundIntrinsic(name, allowMissing) {	var intrinsic = GetIntrinsic(name, !!allowMissing);	if (typeof intrinsic === 'function' && $indexOf(name, '.prototype.')) {		return callBind(intrinsic);	}	return intrinsic;};},{"../GetIntrinsic":6,"./callBind":7}],9:[function(require,module,exports){(function (process){'use strict';/* eslint global-require: 0 */// the code is structured this way so that bundlers can// alias out `has-symbols` to `() => true` or `() => false` if your target// environments' Symbol capabilities are known, and then use// dead code elimination on the rest of this module.//// Similarly, `isarray` can be aliased to `Array.isArray` if// available in all target environments.var isArguments = require('is-arguments');if (require('has-symbols')() || require('has-symbols/shams')()) {	var $iterator = Symbol.iterator;	// Symbol is available natively or shammed	// natively:	//  - Chrome >= 38	//  - Edge 12-14?, Edge >= 15 for sure	//  - FF >= 36	//  - Safari >= 9	//  - node >= 0.12	module.exports = function getIterator(iterable) {		// alternatively, `iterable[$iterator]?.()`		if (iterable != null && typeof iterable[$iterator] !== 'undefined') {			return iterable[$iterator]();		}		if (isArguments(iterable)) {			// arguments objects lack Symbol.iterator			// - node 0.12			return Array.prototype[$iterator].call(iterable);		}	};} else {	// Symbol is not available, native or shammed	var isArray = require('isarray');	var isString = require('is-string');	var GetIntrinsic = require('es-abstract/GetIntrinsic');	var $Map = GetIntrinsic('%Map%', true);	var $Set = GetIntrinsic('%Set%', true);	var callBound = require('es-abstract/helpers/callBound');	var $arrayPush = callBound('Array.prototype.push');	var $charCodeAt = callBound('String.prototype.charCodeAt');	var $stringSlice = callBound('String.prototype.slice');	var advanceStringIndex = function advanceStringIndex(S, index) {		var length = S.length;		if ((index + 1) >= length) {			return index + 1;		}		var first = $charCodeAt(S, index);		if (first < 0xD800 || first > 0xDBFF) {			return index + 1;		}		var second = $charCodeAt(S, index + 1);		if (second < 0xDC00 || second > 0xDFFF) {			return index + 1;		}		return index + 2;	};	var getArrayIterator = function getArrayIterator(arraylike) {		var i = 0;		return {			next: function next() {				var done = i >= arraylike.length;				var value;				if (!done) {					value = arraylike[i];					i += 1;				}				return {					done: done,					value: value				};			}		};	};	var getNonCollectionIterator = function getNonCollectionIterator(iterable) {		if (isArray(iterable) || isArguments(iterable)) {			return getArrayIterator(iterable);		}		if (isString(iterable)) {			var i = 0;			return {				next: function next() {					var nextIndex = advanceStringIndex(iterable, i);					var value = $stringSlice(iterable, i, nextIndex);					i = nextIndex;					return {						done: nextIndex > iterable.length,						value: value					};				}			};		}	};	if (!$Map && !$Set) {		// the only language iterables are Array, String, arguments		// - Safari <= 6.0		// - Chrome < 38		// - node < 0.12		// - FF < 13		// - IE < 11		// - Edge < 11		module.exports = getNonCollectionIterator;	} else {		// either Map or Set are available, but Symbol is not		// - es6-shim on an ES5 browser		// - Safari 6.2 (maybe 6.1?)		// - FF v[13, 36)		// - IE 11		// - Edge 11		// - Safari v[6, 9)		var isMap = require('is-map');		var isSet = require('is-set');		// Firefox >= 27, IE 11, Safari 6.2 - 9, Edge 11, es6-shim in older envs, all have forEach		var $mapForEach = callBound('Map.prototype.forEach', true);		var $setForEach = callBound('Set.prototype.forEach', true);		if (typeof process === 'undefined' || !process.versions || !process.versions.node) { // "if is not node"			// Firefox 17 - 26 has `.iterator()`, whose iterator `.next()` either			// returns a value, or throws a StopIteration object. These browsers			// do not have any other mechanism for iteration.			var $mapIterator = callBound('Map.prototype.iterator', true);			var $setIterator = callBound('Set.prototype.iterator', true);			var getStopIterationIterator = function (iterator) {				var done = false;				return {					next: function next() {						try {							return {								done: done,								value: done ? undefined : iterator.next()							};						} catch (e) {							done = true;							return {								done: true,								value: undefined							};						}					}				};			};		}		// Firefox 27-35, and some older es6-shim versions, use a string "@@iterator" property		// this returns a proper iterator object, so we should use it instead of forEach.		// newer es6-shim versions use a string "_es6-shim iterator_" property.		var $mapAtAtIterator = callBound('Map.prototype.@@iterator', true) || callBound('Map.prototype._es6-shim iterator_', true);		var $setAtAtIterator = callBound('Set.prototype.@@iterator', true) || callBound('Set.prototype._es6-shim iterator_', true);		var getCollectionIterator = function getCollectionIterator(iterable) {			if (isMap(iterable)) {				if ($mapIterator) {					return getStopIterationIterator($mapIterator(iterable));				}				if ($mapAtAtIterator) {					return $mapAtAtIterator(iterable);				}				if ($mapForEach) {					var entries = [];					$mapForEach(iterable, function (v, k) {						$arrayPush(entries, [k, v]);					});					return getArrayIterator(entries);				}			}			if (isSet(iterable)) {				if ($setIterator) {					return getStopIterationIterator($setIterator(iterable));				}				if ($setAtAtIterator) {					return $setAtAtIterator(iterable);				}				if ($setForEach) {					var values = [];					$setForEach(iterable, function (v) {						$arrayPush(values, v);					});					return getArrayIterator(values);				}			}		};		module.exports = function getIterator(iterable) {			return getCollectionIterator(iterable) || getNonCollectionIterator(iterable);		};	}}}).call(this,require('_process'))},{"_process":66,"es-abstract/GetIntrinsic":6,"es-abstract/helpers/callBound":8,"has-symbols":14,"has-symbols/shams":15,"is-arguments":17,"is-map":26,"is-set":29,"is-string":30,"isarray":34}],10:[function(require,module,exports){'use strict';/* eslint no-invalid-this: 1 */var ERROR_MESSAGE = 'Function.prototype.bind called on incompatible ';var slice = Array.prototype.slice;var toStr = Object.prototype.toString;var funcType = '[object Function]';module.exports = function bind(that) {    var target = this;    if (typeof target !== 'function' || toStr.call(target) !== funcType) {        throw new TypeError(ERROR_MESSAGE + target);    }    var args = slice.call(arguments, 1);    var bound;    var binder = function () {        if (this instanceof bound) {            var result = target.apply(                this,                args.concat(slice.call(arguments))            );            if (Object(result) === result) {                return result;            }            return this;        } else {            return target.apply(                that,                args.concat(slice.call(arguments))            );        }    };    var boundLength = Math.max(0, target.length - args.length);    var boundArgs = [];    for (var i = 0; i < boundLength; i++) {        boundArgs.push('$' + i);    }    bound = Function('binder', 'return function (' + boundArgs.join(',') + '){ return binder.apply(this,arguments); }')(binder);    if (target.prototype) {        var Empty = function Empty() {};        Empty.prototype = target.prototype;        bound.prototype = new Empty();        Empty.prototype = null;    }    return bound;};},{}],11:[function(require,module,exports){'use strict';var implementation = require('./implementation');module.exports = Function.prototype.bind || implementation;},{"./implementation":10}],12:[function(require,module,exports){'use strict';var functionsHaveNames = function functionsHaveNames() {	return typeof function f() {}.name === 'string';};var gOPD = Object.getOwnPropertyDescriptor;if (gOPD) {	try {		gOPD([], 'length');	} catch (e) {		// IE 8 has a broken gOPD		gOPD = null;	}}functionsHaveNames.functionsHaveConfigurableNames = function functionsHaveConfigurableNames() {	return functionsHaveNames() && gOPD && !!gOPD(function () {}, 'name').configurable;};var $bind = Function.prototype.bind;functionsHaveNames.boundFunctionsHaveNames = function boundFunctionsHaveNames() {	return functionsHaveNames() && typeof $bind === 'function' && function f() {}.bind().name !== '';};module.exports = functionsHaveNames;},{}],13:[function(require,module,exports){(function (global){var win;if (typeof window !== "undefined") {    win = window;} else if (typeof global !== "undefined") {    win = global;} else if (typeof self !== "undefined"){    win = self;} else {    win = {};}module.exports = win;}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})},{}],14:[function(require,module,exports){(function (global){'use strict';var origSymbol = global.Symbol;var hasSymbolSham = require('./shams');module.exports = function hasNativeSymbols() {	if (typeof origSymbol !== 'function') { return false; }	if (typeof Symbol !== 'function') { return false; }	if (typeof origSymbol('foo') !== 'symbol') { return false; }	if (typeof Symbol('bar') !== 'symbol') { return false; }	return hasSymbolSham();};}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})},{"./shams":15}],15:[function(require,module,exports){'use strict';/* eslint complexity: [2, 18], max-statements: [2, 33] */module.exports = function hasSymbols() {	if (typeof Symbol !== 'function' || typeof Object.getOwnPropertySymbols !== 'function') { return false; }	if (typeof Symbol.iterator === 'symbol') { return true; }	var obj = {};	var sym = Symbol('test');	var symObj = Object(sym);	if (typeof sym === 'string') { return false; }	if (Object.prototype.toString.call(sym) !== '[object Symbol]') { return false; }	if (Object.prototype.toString.call(symObj) !== '[object Symbol]') { return false; }	// temp disabled per https://github.com/ljharb/object.assign/issues/17	// if (sym instanceof Symbol) { return false; }	// temp disabled per https://github.com/WebReflection/get-own-property-symbols/issues/4	// if (!(symObj instanceof Symbol)) { return false; }	// if (typeof Symbol.prototype.toString !== 'function') { return false; }	// if (String(sym) !== Symbol.prototype.toString.call(sym)) { return false; }	var symVal = 42;	obj[sym] = symVal;	for (sym in obj) { return false; } // eslint-disable-line no-restricted-syntax	if (typeof Object.keys === 'function' && Object.keys(obj).length !== 0) { return false; }	if (typeof Object.getOwnPropertyNames === 'function' && Object.getOwnPropertyNames(obj).length !== 0) { return false; }	var syms = Object.getOwnPropertySymbols(obj);	if (syms.length !== 1 || syms[0] !== sym) { return false; }	if (!Object.prototype.propertyIsEnumerable.call(obj, sym)) { return false; }	if (typeof Object.getOwnPropertyDescriptor === 'function') {		var descriptor = Object.getOwnPropertyDescriptor(obj, sym);		if (descriptor.value !== symVal || descriptor.enumerable !== true) { return false; }	}	return true;};},{}],16:[function(require,module,exports){'use strict';var bind = require('function-bind');module.exports = bind.call(Function.call, Object.prototype.hasOwnProperty);},{"function-bind":11}],17:[function(require,module,exports){'use strict';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';var toStr = Object.prototype.toString;var isStandardArguments = function isArguments(value) {	if (hasToStringTag && value && typeof value === 'object' && Symbol.toStringTag in value) {		return false;	}	return toStr.call(value) === '[object Arguments]';};var isLegacyArguments = function isArguments(value) {	if (isStandardArguments(value)) {		return true;	}	return value !== null &&		typeof value === 'object' &&		typeof value.length === 'number' &&		value.length >= 0 &&		toStr.call(value) !== '[object Array]' &&		toStr.call(value.callee) === '[object Function]';};var supportsStandardArguments = (function () {	return isStandardArguments(arguments);}());isStandardArguments.isLegacyArguments = isLegacyArguments; // for testsmodule.exports = supportsStandardArguments ? isStandardArguments : isLegacyArguments;},{}],18:[function(require,module,exports){'use strict';var isCallable = require('is-callable');var fnToStr = Function.prototype.toString;var isNonArrowFnRegex = /^\s*function/;var isArrowFnWithParensRegex = /^\([^\)]*\) *=>/;var isArrowFnWithoutParensRegex = /^[^=]*=>/;module.exports = function isArrowFunction(fn) {	if (!isCallable(fn)) { return false; }	var fnStr = fnToStr.call(fn);	return fnStr.length > 0 &&		!isNonArrowFnRegex.test(fnStr) &&		(isArrowFnWithParensRegex.test(fnStr) || isArrowFnWithoutParensRegex.test(fnStr));};},{"is-callable":21}],19:[function(require,module,exports){'use strict';if (typeof BigInt === 'function') {	var bigIntValueOf = BigInt.prototype.valueOf;	var tryBigInt = function tryBigIntObject(value) {		try {			bigIntValueOf.call(value);			return true;		} catch (e) {		}		return false;	};	module.exports = function isBigInt(value) {		if (			value === null			|| typeof value === 'undefined'			|| typeof value === 'boolean'			|| typeof value === 'string'			|| typeof value === 'number'			|| typeof value === 'symbol'			|| typeof value === 'function'		) {			return false;		}		if (typeof value === 'bigint') { // eslint-disable-line valid-typeof			return true;		}		return tryBigInt(value);	};} else {	module.exports = function isBigInt(value) {		return false && value;	};}},{}],20:[function(require,module,exports){'use strict';var boolToStr = Boolean.prototype.toString;var tryBooleanObject = function booleanBrandCheck(value) {	try {		boolToStr.call(value);		return true;	} catch (e) {		return false;	}};var toStr = Object.prototype.toString;var boolClass = '[object Boolean]';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';module.exports = function isBoolean(value) {	if (typeof value === 'boolean') {		return true;	}	if (value === null || typeof value !== 'object') {		return false;	}	return hasToStringTag && Symbol.toStringTag in value ? tryBooleanObject(value) : toStr.call(value) === boolClass;};},{}],21:[function(require,module,exports){'use strict';var fnToStr = Function.prototype.toString;var reflectApply = typeof Reflect === 'object' && Reflect !== null && Reflect.apply;var badArrayLike;var isCallableMarker;if (typeof reflectApply === 'function' && typeof Object.defineProperty === 'function') {	try {		badArrayLike = Object.defineProperty({}, 'length', {			get: function () {				throw isCallableMarker;			}		});		isCallableMarker = {};	} catch (_) {		reflectApply = null;	}} else {	reflectApply = null;}var constructorRegex = /^\s*class\b/;var isES6ClassFn = function isES6ClassFunction(value) {	try {		var fnStr = fnToStr.call(value);		return constructorRegex.test(fnStr);	} catch (e) {		return false; // not a function	}};var tryFunctionObject = function tryFunctionToStr(value) {	try {		if (isES6ClassFn(value)) { return false; }		fnToStr.call(value);		return true;	} catch (e) {		return false;	}};var toStr = Object.prototype.toString;var fnClass = '[object Function]';var genClass = '[object GeneratorFunction]';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';module.exports = reflectApply	? function isCallable(value) {		if (!value) { return false; }		if (typeof value !== 'function' && typeof value !== 'object') { return false; }		if (typeof value === 'function' && !value.prototype) { return true; }		try {			reflectApply(value, null, badArrayLike);		} catch (e) {			if (e !== isCallableMarker) { return false; }		}		return !isES6ClassFn(value);	}	: function isCallable(value) {		if (!value) { return false; }		if (typeof value !== 'function' && typeof value !== 'object') { return false; }		if (typeof value === 'function' && !value.prototype) { return true; }		if (hasToStringTag) { return tryFunctionObject(value); }		if (isES6ClassFn(value)) { return false; }		var strClass = toStr.call(value);		return strClass === fnClass || strClass === genClass;	};},{}],22:[function(require,module,exports){'use strict';var getDay = Date.prototype.getDay;var tryDateObject = function tryDateGetDayCall(value) {	try {		getDay.call(value);		return true;	} catch (e) {		return false;	}};var toStr = Object.prototype.toString;var dateClass = '[object Date]';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';module.exports = function isDateObject(value) {	if (typeof value !== 'object' || value === null) {		return false;	}	return hasToStringTag ? tryDateObject(value) : toStr.call(value) === dateClass;};},{}],23:[function(require,module,exports){'use strict';var whyNotEqual = require('./why');module.exports = function isEqual(value, other) {	return whyNotEqual(value, other) === '';};},{"./why":24}],24:[function(require,module,exports){'use strict';var ObjectPrototype = Object.prototype;var toStr = ObjectPrototype.toString;var booleanValue = Boolean.prototype.valueOf;var has = require('has');var isArray = require('isarray');var isArrowFunction = require('is-arrow-function');var isBoolean = require('is-boolean-object');var isDate = require('is-date-object');var isGenerator = require('is-generator-function');var isNumber = require('is-number-object');var isRegex = require('is-regex');var isString = require('is-string');var isSymbol = require('is-symbol');var isCallable = require('is-callable');var isBigInt = require('is-bigint');var getIterator = require('es-get-iterator');var whichCollection = require('which-collection');var whichBoxedPrimitive = require('which-boxed-primitive');var objectType = function (v) { return whichCollection(v) || whichBoxedPrimitive(v) || typeof v; };var isProto = Object.prototype.isPrototypeOf;var functionsHaveNames = require('functions-have-names')();var symbolValue = typeof Symbol === 'function' ? Symbol.prototype.valueOf : null;var bigIntValue = typeof BigInt === 'function' ? BigInt.prototype.valueOf : null;var getPrototypeOf = Object.getPrototypeOf;if (!getPrototypeOf) {	/* eslint-disable no-proto */	if (typeof 'test'.__proto__ === 'object') {		getPrototypeOf = function (obj) {			return obj.__proto__;		};	} else {		getPrototypeOf = function (obj) {			var constructor = obj.constructor,				oldConstructor;			if (has(obj, 'constructor')) {				oldConstructor = constructor;				// eslint-disable-next-line no-param-reassign				if (!(delete obj.constructor)) { // reset constructor					return null; // can't delete obj.constructor, return null				}				constructor = obj.constructor; // get real constructor				// eslint-disable-next-line no-param-reassign				obj.constructor = oldConstructor; // restore constructor			}			return constructor ? constructor.prototype : ObjectPrototype; // needed for IE		};	}	/* eslint-enable no-proto */}var normalizeFnWhitespace = function normalizeWhitespace(fnStr) {	// this is needed in IE 9, at least, which has inconsistencies here.	return fnStr.replace(/^function ?\(/, 'function (').replace('){', ') {');};module.exports = function whyNotEqual(value, other) {	if (value === other) { return ''; }	if (value == null || other == null) {		return value === other ? '' : String(value) + ' !== ' + String(other);	}	var valToStr = toStr.call(value);	var otherToStr = toStr.call(other);	if (valToStr !== otherToStr) {		return 'toStringTag is not the same: ' + valToStr + ' !== ' + otherToStr;	}	var valIsBool = isBoolean(value);	var otherIsBool = isBoolean(other);	if (valIsBool || otherIsBool) {		if (!valIsBool) { return 'first argument is not a boolean; second argument is'; }		if (!otherIsBool) { return 'second argument is not a boolean; first argument is'; }		var valBoolVal = booleanValue.call(value);		var otherBoolVal = booleanValue.call(other);		if (valBoolVal === otherBoolVal) { return ''; }		return 'primitive value of boolean arguments do not match: ' + valBoolVal + ' !== ' + otherBoolVal;	}	var valIsNumber = isNumber(value);	var otherIsNumber = isNumber(value);	if (valIsNumber || otherIsNumber) {		if (!valIsNumber) { return 'first argument is not a number; second argument is'; }		if (!otherIsNumber) { return 'second argument is not a number; first argument is'; }		var valNum = Number(value);		var otherNum = Number(other);		if (valNum === otherNum) { return ''; }		var valIsNaN = isNaN(value);		var otherIsNaN = isNaN(other);		if (valIsNaN && !otherIsNaN) {			return 'first argument is NaN; second is not';		} else if (!valIsNaN && otherIsNaN) {			return 'second argument is NaN; first is not';		} else if (valIsNaN && otherIsNaN) {			return '';		}		return 'numbers are different: ' + value + ' !== ' + other;	}	var valIsString = isString(value);	var otherIsString = isString(other);	if (valIsString || otherIsString) {		if (!valIsString) { return 'second argument is string; first is not'; }		if (!otherIsString) { return 'first argument is string; second is not'; }		var stringVal = String(value);		var otherVal = String(other);		if (stringVal === otherVal) { return ''; }		return 'string values are different: "' + stringVal + '" !== "' + otherVal + '"';	}	var valIsDate = isDate(value);	var otherIsDate = isDate(other);	if (valIsDate || otherIsDate) {		if (!valIsDate) { return 'second argument is Date, first is not'; }		if (!otherIsDate) { return 'first argument is Date, second is not'; }		var valTime = +value;		var otherTime = +other;		if (valTime === otherTime) { return ''; }		return 'Dates have different time values: ' + valTime + ' !== ' + otherTime;	}	var valIsRegex = isRegex(value);	var otherIsRegex = isRegex(other);	if (valIsRegex || otherIsRegex) {		if (!valIsRegex) { return 'second argument is RegExp, first is not'; }		if (!otherIsRegex) { return 'first argument is RegExp, second is not'; }		var regexStringVal = String(value);		var regexStringOther = String(other);		if (regexStringVal === regexStringOther) { return ''; }		return 'regular expressions differ: ' + regexStringVal + ' !== ' + regexStringOther;	}	var valIsArray = isArray(value);	var otherIsArray = isArray(other);	if (valIsArray || otherIsArray) {		if (!valIsArray) { return 'second argument is an Array, first is not'; }		if (!otherIsArray) { return 'first argument is an Array, second is not'; }		if (value.length !== other.length) {			return 'arrays have different length: ' + value.length + ' !== ' + other.length;		}		var index = value.length - 1;		var equal = '';		var valHasIndex, otherHasIndex;		while (equal === '' && index >= 0) {			valHasIndex = has(value, index);			otherHasIndex = has(other, index);			if (!valHasIndex && otherHasIndex) { return 'second argument has index ' + index + '; first does not'; }			if (valHasIndex && !otherHasIndex) { return 'first argument has index ' + index + '; second does not'; }			equal = whyNotEqual(value[index], other[index]);			index -= 1;		}		return equal;	}	var valueIsSym = isSymbol(value);	var otherIsSym = isSymbol(other);	if (valueIsSym !== otherIsSym) {		if (valueIsSym) { return 'first argument is Symbol; second is not'; }		return 'second argument is Symbol; first is not';	}	if (valueIsSym && otherIsSym) {		return symbolValue.call(value) === symbolValue.call(other) ? '' : 'first Symbol value !== second Symbol value';	}	var valueIsBigInt = isBigInt(value);	var otherIsBigInt = isBigInt(other);	if (valueIsBigInt !== otherIsBigInt) {		if (valueIsBigInt) { return 'first argument is BigInt; second is not'; }		return 'second argument is BigInt; first is not';	}	if (valueIsBigInt && otherIsBigInt) {		return bigIntValue.call(value) === bigIntValue.call(other) ? '' : 'first BigInt value !== second BigInt value';	}	var valueIsGen = isGenerator(value);	var otherIsGen = isGenerator(other);	if (valueIsGen !== otherIsGen) {		if (valueIsGen) { return 'first argument is a Generator; second is not'; }		return 'second argument is a Generator; first is not';	}	var valueIsArrow = isArrowFunction(value);	var otherIsArrow = isArrowFunction(other);	if (valueIsArrow !== otherIsArrow) {		if (valueIsArrow) { return 'first argument is an Arrow function; second is not'; }		return 'second argument is an Arrow function; first is not';	}	if (isCallable(value) || isCallable(other)) {		if (functionsHaveNames && whyNotEqual(value.name, other.name) !== '') {			return 'Function names differ: "' + value.name + '" !== "' + other.name + '"';		}		if (whyNotEqual(value.length, other.length) !== '') {			return 'Function lengths differ: ' + value.length + ' !== ' + other.length;		}		var valueStr = normalizeFnWhitespace(String(value));		var otherStr = normalizeFnWhitespace(String(other));		if (whyNotEqual(valueStr, otherStr) === '') { return ''; }		if (!valueIsGen && !valueIsArrow) {			return whyNotEqual(valueStr.replace(/\)\s*\{/, '){'), otherStr.replace(/\)\s*\{/, '){')) === '' ? '' : 'Function string representations differ';		}		return whyNotEqual(valueStr, otherStr) === '' ? '' : 'Function string representations differ';	}	if (typeof value === 'object' || typeof other === 'object') {		if (typeof value !== typeof other) { return 'arguments have a different typeof: ' + typeof value + ' !== ' + typeof other; }		if (isProto.call(value, other)) { return 'first argument is the [[Prototype]] of the second'; }		if (isProto.call(other, value)) { return 'second argument is the [[Prototype]] of the first'; }		if (getPrototypeOf(value) !== getPrototypeOf(other)) { return 'arguments have a different [[Prototype]]'; }		var valueIterator = getIterator(value);		var otherIterator = getIterator(other);		if (!!valueIterator !== !!otherIterator) {			if (valueIterator) { return 'first argument is iterable; second is not'; }			return 'second argument is iterable; first is not';		}		if (valueIterator && otherIterator) { // both should be truthy or falsy at this point			var valueNext, otherNext, nextWhy;			do {				valueNext = valueIterator.next();				otherNext = otherIterator.next();				if (!valueNext.done && !otherNext.done) {					nextWhy = whyNotEqual(valueNext, otherNext);					if (nextWhy !== '') {						return 'iteration results are not equal: ' + nextWhy;					}				}			} while (!valueNext.done && !otherNext.done);			if (valueNext.done && !otherNext.done) { return 'first ' + objectType(value) + ' argument finished iterating before second ' + objectType(other); }			if (!valueNext.done && otherNext.done) { return 'second ' + objectType(other) + ' argument finished iterating before first ' + objectType(value); }			return '';		}		var key, valueKeyIsRecursive, otherKeyIsRecursive, keyWhy;		for (key in value) {			if (has(value, key)) {				if (!has(other, key)) { return 'first argument has key "' + key + '"; second does not'; }				valueKeyIsRecursive = !!value[key] && value[key][key] === value;				otherKeyIsRecursive = !!other[key] && other[key][key] === other;				if (valueKeyIsRecursive !== otherKeyIsRecursive) {					if (valueKeyIsRecursive) { return 'first argument has a circular reference at key "' + key + '"; second does not'; }					return 'second argument has a circular reference at key "' + key + '"; first does not';				}				if (!valueKeyIsRecursive && !otherKeyIsRecursive) {					keyWhy = whyNotEqual(value[key], other[key]);					if (keyWhy !== '') {						return 'value at key "' + key + '" differs: ' + keyWhy;					}				}			}		}		for (key in other) {			if (has(other, key) && !has(value, key)) {				return 'second argument has key "' + key + '"; first does not';			}		}		return '';	}	return false;};},{"es-get-iterator":9,"functions-have-names":12,"has":16,"is-arrow-function":18,"is-bigint":19,"is-boolean-object":20,"is-callable":21,"is-date-object":22,"is-generator-function":25,"is-number-object":27,"is-regex":28,"is-string":30,"is-symbol":31,"isarray":34,"which-boxed-primitive":99,"which-collection":100}],25:[function(require,module,exports){'use strict';var toStr = Object.prototype.toString;var fnToStr = Function.prototype.toString;var isFnRegex = /^\s*(?:function)?\*/;var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';var getProto = Object.getPrototypeOf;var getGeneratorFunc = function () { // eslint-disable-line consistent-return	if (!hasToStringTag) {		return false;	}	try {		return Function('return function*() {}')();	} catch (e) {	}};var generatorFunc = getGeneratorFunc();var GeneratorFunction = generatorFunc ? getProto(generatorFunc) : {};module.exports = function isGeneratorFunction(fn) {	if (typeof fn !== 'function') {		return false;	}	if (isFnRegex.test(fnToStr.call(fn))) {		return true;	}	if (!hasToStringTag) {		var str = toStr.call(fn);		return str === '[object GeneratorFunction]';	}	return getProto(fn) === GeneratorFunction;};},{}],26:[function(require,module,exports){'use strict';var $Map = typeof Map === 'function' && Map.prototype ? Map : null;var $Set = typeof Set === 'function' && Set.prototype ? Set : null;var exported;if (!$Map) {	// eslint-disable-next-line no-unused-vars	exported = function isMap(x) {		// `Map` is not present in this environment.		return false;	};}var $mapHas = $Map ? Map.prototype.has : null;var $setHas = $Set ? Set.prototype.has : null;if (!exported && !$mapHas) {	// eslint-disable-next-line no-unused-vars	exported = function isMap(x) {		// `Map` does not have a `has` method		return false;	};}module.exports = exported || function isMap(x) {	if (!x || typeof x !== 'object') {		return false;	}	try {		$mapHas.call(x);		if ($setHas) {			try {				$setHas.call(x);			} catch (e) {				return true;			}		}		return x instanceof $Map; // core-js workaround, pre-v2.5.0	} catch (e) {}	return false;};},{}],27:[function(require,module,exports){'use strict';var numToStr = Number.prototype.toString;var tryNumberObject = function tryNumberObject(value) {	try {		numToStr.call(value);		return true;	} catch (e) {		return false;	}};var toStr = Object.prototype.toString;var numClass = '[object Number]';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';module.exports = function isNumberObject(value) {	if (typeof value === 'number') {		return true;	}	if (typeof value !== 'object') {		return false;	}	return hasToStringTag ? tryNumberObject(value) : toStr.call(value) === numClass;};},{}],28:[function(require,module,exports){'use strict';var hasSymbols = require('has-symbols')();var hasToStringTag = hasSymbols && typeof Symbol.toStringTag === 'symbol';var regexExec;var isRegexMarker;var badStringifier;if (hasToStringTag) {	regexExec = Function.call.bind(RegExp.prototype.exec);	isRegexMarker = {};	var throwRegexMarker = function () {		throw isRegexMarker;	};	badStringifier = {		toString: throwRegexMarker,		valueOf: throwRegexMarker	};	if (typeof Symbol.toPrimitive === 'symbol') {		badStringifier[Symbol.toPrimitive] = throwRegexMarker;	}}var toStr = Object.prototype.toString;var regexClass = '[object RegExp]';module.exports = hasToStringTag	// eslint-disable-next-line consistent-return	? function isRegex(value) {		if (!value || typeof value !== 'object') {			return false;		}		try {			regexExec(value, badStringifier);		} catch (e) {			return e === isRegexMarker;		}	}	: function isRegex(value) {		// In older browsers, typeof regex incorrectly returns 'function'		if (!value || (typeof value !== 'object' && typeof value !== 'function')) {			return false;		}		return toStr.call(value) === regexClass;	};},{"has-symbols":14}],29:[function(require,module,exports){'use strict';var $Map = typeof Map === 'function' && Map.prototype ? Map : null;var $Set = typeof Set === 'function' && Set.prototype ? Set : null;var exported;if (!$Set) {	// eslint-disable-next-line no-unused-vars	exported = function isSet(x) {		// `Set` is not present in this environment.		return false;	};}var $mapHas = $Map ? Map.prototype.has : null;var $setHas = $Set ? Set.prototype.has : null;if (!exported && !$setHas) {	// eslint-disable-next-line no-unused-vars	exported = function isSet(x) {		// `Set` does not have a `has` method		return false;	};}module.exports = exported || function isSet(x) {	if (!x || typeof x !== 'object') {		return false;	}	try {		$setHas.call(x);		if ($mapHas) {			try {				$mapHas.call(x);			} catch (e) {				return true;			}		}		return x instanceof $Set; // core-js workaround, pre-v2.5.0	} catch (e) {}	return false;};},{}],30:[function(require,module,exports){'use strict';var strValue = String.prototype.valueOf;var tryStringObject = function tryStringObject(value) {	try {		strValue.call(value);		return true;	} catch (e) {		return false;	}};var toStr = Object.prototype.toString;var strClass = '[object String]';var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';module.exports = function isString(value) {	if (typeof value === 'string') {		return true;	}	if (typeof value !== 'object') {		return false;	}	return hasToStringTag ? tryStringObject(value) : toStr.call(value) === strClass;};},{}],31:[function(require,module,exports){'use strict';var toStr = Object.prototype.toString;var hasSymbols = require('has-symbols')();if (hasSymbols) {	var symToStr = Symbol.prototype.toString;	var symStringRegex = /^Symbol\(.*\)$/;	var isSymbolObject = function isRealSymbolObject(value) {		if (typeof value.valueOf() !== 'symbol') {			return false;		}		return symStringRegex.test(symToStr.call(value));	};	module.exports = function isSymbol(value) {		if (typeof value === 'symbol') {			return true;		}		if (toStr.call(value) !== '[object Symbol]') {			return false;		}		try {			return isSymbolObject(value);		} catch (e) {			return false;		}	};} else {	module.exports = function isSymbol(value) {		// this environment does not support Symbols.		return false && value;	};}},{"has-symbols":14}],32:[function(require,module,exports){'use strict';var $WeakMap = typeof WeakMap === 'function' && WeakMap.prototype ? WeakMap : null;var $WeakSet = typeof WeakSet === 'function' && WeakSet.prototype ? WeakSet : null;var exported;if (!$WeakMap) {	// eslint-disable-next-line no-unused-vars	exported = function isWeakMap(x) {		// `WeakMap` is not present in this environment.		return false;	};}var $mapHas = $WeakMap ? $WeakMap.prototype.has : null;var $setHas = $WeakSet ? $WeakSet.prototype.has : null;if (!exported && !$mapHas) {	// eslint-disable-next-line no-unused-vars	exported = function isWeakMap(x) {		// `WeakMap` does not have a `has` method		return false;	};}module.exports = exported || function isWeakMap(x) {	if (!x || typeof x !== 'object') {		return false;	}	try {		$mapHas.call(x, $mapHas);		if ($setHas) {			try {				$setHas.call(x, $setHas);			} catch (e) {				return true;			}		}		return x instanceof $WeakMap; // core-js workaround, pre-v3	} catch (e) {}	return false;};},{}],33:[function(require,module,exports){'use strict';var $WeakMap = typeof WeakMap === 'function' && WeakMap.prototype ? WeakMap : null;var $WeakSet = typeof WeakSet === 'function' && WeakSet.prototype ? WeakSet : null;var exported;if (!$WeakMap) {	// eslint-disable-next-line no-unused-vars	exported = function isWeakSet(x) {		// `WeakSet` is not present in this environment.		return false;	};}var $mapHas = $WeakMap ? $WeakMap.prototype.has : null;var $setHas = $WeakSet ? $WeakSet.prototype.has : null;if (!exported && !$setHas) {	// eslint-disable-next-line no-unused-vars	module.exports = function isWeakSet(x) {		// `WeakSet` does not have a `has` method		return false;	};}module.exports = exported || function isWeakSet(x) {	if (!x || typeof x !== 'object') {		return false;	}	try {		$setHas.call(x, $setHas);		if ($mapHas) {			try {				$mapHas.call(x, $mapHas);			} catch (e) {				return true;			}		}		return x instanceof $WeakSet; // core-js workaround, pre-v3	} catch (e) {}	return false;};},{}],34:[function(require,module,exports){var toString = {}.toString;module.exports = Array.isArray || function (arr) {  return toString.call(arr) == '[object Array]';};},{}],35:[function(require,module,exports){var xhr = require('xhr');module.exports = Ajax;function Ajax(config, callback) {    if (!(this instanceof Ajax)) return new Ajax(config, callback);    if (typeof config === "string")config = {        uri: config    };    return xhr(config, callback);}},{"xhr":101}],36:[function(require,module,exports){module.exports = Deferred;function Deferred() {    this.__doneCallbacks = [];    this.__failCallbacks = [];}Deferred.prototype.done = function (callback) {    if (!callback) {        return;    }    if (this.__data) {        callback(this.__data);    } else {        this.__doneCallbacks.push(callback);    }    return this;};Deferred.prototype.data = function(){    return this.__data;};Deferred.prototype.fail = function(callback){    if(!callback){        return;    }    if(this.__failure){        callback(this.__failure);    } else {        this.__failCallbacks.push(callback);    }    return this;};Deferred.prototype.resolve = function (data) {    this.__data = data;    while (this.__doneCallbacks.length > 0) {        var callback = this.__doneCallbacks.shift();        if (!callback) {            continue;        }        callback(this.__data);    }    return this;};Deferred.prototype.reject = function (failure) {    this.__failure = failure;    while (this.__failCallbacks.length > 0) {        var callback = this.__failCallbacks.shift();        if (!callback) {            continue;        }        callback(this.__failure);    }    return this;  };Deferred.prototype.pipe = function (callback, failureCallback) {    var deferred = new Deferred();    var failure = failureCallback || function(x) { return x; };    if (callback) {        this.done(function (data) {            deferred.resolve(callback(data));        }).fail(function (data) {            deferred.reject(failure(data));        });    }    return deferred;};},{}],37:[function(require,module,exports){module.exports = LegacyASMXClient;var ajax = require('ja-ajax');var Deferred = require('./Deferred.js');var events = require('ja-event');var utils = require('ja-utils');var cookie = require('ja-cookie');var RequestType = {    GetAssistantProfile: {        methodName: 'GetAssistantProfile',        methodType: 'GET',        numericId: 0    },    CreateChat: {        methodName: 'CreateChat',        numericId: 1    },    PostMessage: {        methodName: 'PostMessage',        numericId: 2    },    CompleteChat: {        methodName: 'CompleteChat',        numericId: 3    },    GetMessages: {        methodName: 'GetMessages',        numericId: 4    },    GetChat: {        methodName: 'GetChat',        numericId: 5    },    RestoreChat: {        methodName: 'GetMessages',        numericId: 6    }};function LegacyASMXClient(config) {    if (!(this instanceof LegacyASMXClient))        return new LegacyASMXClient(config);    config = config || {};    this.servicePath =        config.servicePath || '/processes/funnel/VirtualAssistantService.asmx/';    this.profileServicePath =        config.profileServicePath || '/processes/funnel/assistant-profile.ashx';    this.requestDelay = config.requestDelay || 5000;    this.requestTimeout = config.requestTimeout || 10000;    this.maxRetries = config.maxRetries || 5;    this.retryCount = config.retryCount || 0;}utils.mixin(LegacyASMXClient, events);LegacyASMXClient.prototype.getAssistantProfile = function(    categoryId,    chatTypeValue,    botName,    source,    partner) {    return this.performRequest(        RequestType.GetAssistantProfile,        (function() {            return {                categoryId: categoryId,                chatType: chatTypeValue || 'FunnelQuestion',                botName: botName || '',                source: source || ''            };        })()    ).pipe(function(data) {        data = data.Profile ? data : (data = { Profile: data }); //Profile mut be there        return data && data.Profile            ? mapProfile(data.Profile)            : {                  error:                      'Error: LegacyASMXClient.prototype.getAssistantProfile: Cannot find profile'              };    });};LegacyASMXClient.prototype.createChat = function(context, message, botName) {    cookie.set('JA_Client_LocalHour', new Date().getHours(), {        expires: 60 * 60 * 1000    });    return this.performRequest(        RequestType.CreateChat,        (function() {            return {                context: context,                message: message,                botName: botName || ''            };        })()    ).pipe(function(data) {        return data && data.Message            ? {                  text: data.Message.Text,                  chatId: data.ChatId,                  attributes: data.Message.Attributes || {}              }            : {};    });};LegacyASMXClient.prototype.getChat = function(chatId) {    return this.performRequest(RequestType.GetChat, { chatId: chatId });};LegacyASMXClient.prototype.postMessage = function(chatId, messageObj, botName) {    return this.performRequest(        RequestType.PostMessage,        (function() {            return {                chatId: chatId,                message: messageObj,                botName: botName || ''            };        })()    ).pipe(function(data) {        return data && data.Message && data.ChatId            ? {                  text: data.Message.Text,                  chatId: data.ChatId,                  attributes: data.Message.Attributes || {}              }            : {};    });};LegacyASMXClient.prototype.completeChat = function(    chatId,    reason,    messageObj,    botName) {    return this.performRequest(        RequestType.CompleteChat,        (function() {            //not really needed but saves some traffic....            return {                chatId: chatId,                completionReason: reason,                message: messageObj || {                    IsFromAssistant: false,                    Text: ''                },                botName: botName || ''            };        })()    ).pipe(function(data) {        return {            tempQuestionId: data.tempQuestionId,            redirectUrl: data.redirectUrl        };    });};LegacyASMXClient.prototype.restoreChat = function(chatId, profileParams) {    return profileParams        ? this.getProfileAndRestore(chatId, profileParams)        : this.performRequest(RequestType.RestoreChat, { chatId: chatId });};LegacyASMXClient.prototype.getProfileAndRestore = function(    chatId,    profileParams) {    var self = this;    var deferred = new Deferred();    self.getAssistantProfile(        profileParams.categoryId,        profileParams.chatType,        profileParams.botName,        profileParams.source    ).pipe(function(profile) {        self.performRequest(RequestType.RestoreChat, { chatId: chatId }).pipe(            function(data) {                deferred.resolve({                    chatId: data.ChatId,                    profile: profile,                    messages: mapMessages(data)                });            }        );    });    return deferred;};LegacyASMXClient.prototype.getMessages = LegacyASMXClient.prototype.restoreChat;LegacyASMXClient.prototype.performRequest = function(remoteMethod, data) {    var methodType = remoteMethod.methodType || 'POST';    var url =        remoteMethod.methodName === 'GetAssistantProfile'            ? this.profileServicePath            : this.servicePath + remoteMethod.methodName;    var type = remoteMethod.numericId;    return this.send(url, methodType, data, type);};LegacyASMXClient.prototype.send = function(path, method, data, type, deferred) {    var self = this;    var requestMethod = method || 'GET';    var requestBody = '';    var requestPath = path;    var requestHeaders = [];    if (requestMethod === 'POST') {        requestBody = JSON.stringify(data);        requestHeaders = { 'Content-Type': 'application/json; charset=utf-8' };    } else {        requestPath = addParametersToUrlFromKeyValue(path, data);    }    var request = {        url: requestPath,        method: requestMethod,        body: requestBody,        headers: requestHeaders,        timeout: self.requestTimeout    };    var localDeferred = deferred || new Deferred();    ajax(request, function(error, xxx, body) {        var responseData = parseASMXResponse(error, xxx, body);        if (!responseData) {            self.retryCount++;            if (self.retryCount > self.maxRetries) {                self.retryCount = 0;                self.trigger('connectionFailure', type);                localDeferred.reject(error);            } else {                self.trigger('connectionRetry', type);                setTimeout(function() {                    self.send(path, method, data, type, localDeferred);                }, self.requestDelay);            }        } else {            self.retryCount = 0;            self.trigger('connectionSucceeded');            localDeferred.resolve(responseData);        }    });    return localDeferred;};function parseASMXResponse(error, xxx, body) {    var data = null;    if (!error && body) {        var response = JSON.parse(body);        if (response.d) {            response = JSON.parse(response.d);        }        if (response.success) {            if (response.serializedData) {                data = JSON.parse(response.serializedData);            } else {                data = response;            }        }    }    return data;}function addParametersToUrlFromKeyValue(path, data) {    var params = '';    var url = path;    var key, value;    if (data) {        for (key in data) {            if (data.hasOwnProperty(key)) {                value = data[key];                params += key + '=' + value + '&';            }        }        if (params.length > 0) {            if (url.indexOf('?') > -1) {                url += '&';            } else {                url += '?';            }            url += params.substring(0, params.length - 1);        }    }    return url;}function mapProfile(data) {    return {        avatar: data.Avatar,        greeting: data.Greeting,        name: data.Name,        title: data.Title,        details: data.ProfileDetails,        connectionFailureMessageHeader: data.ConnectionFailureMessageHeader,        connectionFailureMessageBody: data.ConnectionFailureMessageBody,        connectionRetryMessageHeader: data.ConnectionRetryMessageHeader,        connectionRetryMessageBody: data.ConnectionRetryMessageBody    };}function mapMessages(data) {    var messages = [];    for (var i = 0; i < data.Messages.length; i++) {        messages.push({            messageId: data.Messages[i].MessageId,            role: data.Messages[i].IsFromAssistant ? 'Assistant' : 'Customer',            text: data.Messages[i].Text,            attributes: data.Messages[i].Attributes        });    }    return messages;}},{"./Deferred.js":36,"ja-ajax":35,"ja-cookie":42,"ja-event":50,"ja-utils":51}],38:[function(require,module,exports){module.exports = VAServerClient;var Ajax = require('ja-ajax');var Deferred = require('./Deferred.js');var events = require('ja-event');var utils = require('ja-utils');var cookie = require('ja-cookie');var RequestType = {    GetAssistantProfile: {        methodName: 'getAssistantProfile',        numericId: 0    },    CreateChat: {        methodName: 'sendFirstMessage',        numericId: 1    },    PostMessage: {        methodName: 'sendMessage',        numericId: 2    },    CompleteChat: {        methodName: 'getAndCompleteChat',        numericId: 3    },    GetMessages: {        methodName: 'getMessages',        numericId: 4    },    GetChat: {        methodName: 'getChat',        numericId: 5    },    RestoreChat: {        methodName: 'restoreChat',        numericId: 6    }};function VAServerClient(config) {    if (!(this instanceof VAServerClient)) return new VAServerClient(config);    config = config || {};    this.requestDelay = config.requestDelay || 5000;    this.requestTimeout = config.requestTimeout || 10000;    this.maxRetries = config.maxRetries || 5;    this.retryCount = config.retryCount || 0;    this.servicePath = config.endpoint;    this.partnerId = config.partnerId || 'b33305aa2f8441cebfd8bab8b3f3a3da';    this.partner = config.partner || 'US';}utils.mixin(VAServerClient, events);VAServerClient.prototype.getAssistantProfile = function(categoryId, chatTypeValue, botName, source) {    return this.performRequest(RequestType.GetAssistantProfile, (function() {        return {            CategoryId: categoryId,            ChatType: chatTypeValue || 'FunnelQuestion',            BotName: botName || '',            Source: source || ''        };    }())).pipe(function(data) {        data = data.Profile ? data : data = { Profile: data }; // Profile mut be there        return data && data.Profile ? mapProfile(data.Profile) : { error: 'Error: VAServerClient.prototype.getAssistantProfile: Cannot find profile' };    });};VAServerClient.prototype.createChat = function(context, message, botName) {    var self = this;    return this.performRequest(RequestType.CreateChat, (function() {        return {            LocationUrl: context.locationUrl,            InitialCategoryId: context.categoryId,            Type: context.type,            Visitor: {                VisitorGuid: self.getVisitorGuid() || 'a343b324-23b9-4724-b44e-875be1319d08',                PartnerId: self.partnerId,            },            BotName: botName || '',			// first message            Text: message.text,            Role: 'Customer',            Attributes: self.getAttributes(botName, null, context.attributes, context.dynamicAttributes),            PriceSelectionPolicyId: context.pricePolicy,            forcedCurrency: getForcedCurrency()        };    }())).pipe(mapMessage);};VAServerClient.prototype.getChat = function(chatId) {    return this.performRequest(RequestType.GetChat, (function() {        return {            ChatId: chatId        };    }())).pipe(mapChat);};VAServerClient.prototype.postMessage = function(chatId, messageObj, botName) {    var self = this;    return this.performRequest(RequestType.PostMessage, (function() {        return {            ChatId: chatId,            Text: messageObj.text,            Role: 'Customer',            BotName: botName || '',            Attributes: self.getAttributes(botName, messageObj.attributes ? messageObj.attributes.MessageCounter : '')        };    }())).pipe(function(data) {        if (data.PaymentUrl) redirectURL = data.PaymentUrl;        return mapMessage(data);    });};VAServerClient.prototype.completeChat = function(chatId, reason, messageObj, botName) {    var self = this;    return this.performRequest(RequestType.CompleteChat, (function() {        // not really needed but saves some traffic....        return messageObj && messageObj.text			? {                ChatId: chatId,                CompleteReason: reason,                Text: messageObj.text || '',                Role: 'Customer',                Attributes: self.getAttributes(botName, messageObj.attributes ? messageObj.attributes.MessageCounter : '')            }			: {    ChatId: chatId,    CompleteReason: reason};    }())).pipe(function(data) {        return {            paymentUrl: data.PaymentUrl,            paidTrialMembershipInfo: mapPaidTrialInfo(data)        };    });};VAServerClient.prototype.restoreChat = function(chatId, params) {    return this.performRequest(RequestType.RestoreChat, (function() {        var data = {            ChatId: chatId        };        if (params && params.botName) {            data.BotName = params.botName;        }        return data;    }())).pipe(mapChat);};VAServerClient.prototype.performRequest = function(remoteMethod, data) {    var url = this.servicePath;    data.partner = this.partner;	// wrap it up in a req object    data = {        jsonrpc: '2.0',        method: remoteMethod.methodName,        params: data    };    var type = remoteMethod.numericId;    return this.send(url, 'POST', data, type);};VAServerClient.prototype.send = function(path, method, data, type, deferred) {    var self = this;    var requestMethod = method || 'GET';    var requestBody = '';    var requestPath = path;    var requestHeaders = [];    if (requestMethod === 'POST') {        requestBody = JSON.stringify(data);        requestHeaders = { 'Content-Type': 'application/json; charset=utf-8' };    } else {        requestPath = addParametersToUrlFromKeyValue(path, data);    }    var request = {        url: requestPath,        method: requestMethod,        body: requestBody,        headers: requestHeaders,        timeout: self.requestTimeout    };    var localDeferred = deferred || new Deferred();    var startTime = new Date().getTime();    Ajax(request, function(error, xxx, body) {        var requestTime = new Date().getTime() - startTime;        self.trigger('requestPerformed', {            name: data.method,            time: requestTime        });        var responseData = error ? null : self.parseResponse(body);        if (!responseData) {            self.retryCount++;            if (self.retryCount > self.maxRetries) {                self.retryCount = 0;                self.trigger('connectionFailure', type);                localDeferred.reject(error);            } else {                self.trigger('connectionRetry', type);                setTimeout(function() { self.send(path, method, data, type, localDeferred); }, self.requestDelay);            }        } else {            self.retryCount = 0;            self.trigger('connectionSucceeded');            localDeferred.resolve(responseData);        }    });    return localDeferred;};VAServerClient.prototype.parseResponse = function(body) {    try {        return JSON.parse(body).result;    } catch (e) {        this.trigger('responseParsingFailed', e);    }};VAServerClient.prototype.getVisitorGuid = function() {    return cookie.get('PlatformAgnostincTrackingVisitorGUID') || cookie.get('JAAnonymousGUID') || getGuidFromJaCookie();};function getForcedCurrency() {    return cookie.get('ForcedCurrencyCode');}VAServerClient.prototype.getAttributes = function(botName, messageCounter, contextAttributes, dynamicContextAttributes) {    var attributeCollection = {        Attributes: [{            Key: 'botName',            Value: botName || ''        }, {            Key: 'messageCounter',            Value: messageCounter || 0        }]    };    attributeCollection.Count = attributeCollection.Attributes.length;    for (var attribute in contextAttributes) {        var attributeValue = contextAttributes[attribute];        if (attributeValue !== undefined) {            appendAttributeToCollection(attributeCollection, attribute, attributeValue);        }    }    if (dynamicContextAttributes && dynamicContextAttributes.length) {        for (var i = 0; i < dynamicContextAttributes.length; i++) {            var attributeValue = getDynamicAttributeValue(dynamicContextAttributes[i]);            appendAttributeToCollection(attributeCollection, dynamicContextAttributes[i].name, attributeValue);        }    }    return attributeCollection;};function mapChat(data) {    return {        chatId: data.ChatId,        type: data.Type,        locationUrl: data.LocationUrl,        initialCategoryId: data.InitialCategoryId,        status: data.Status,        completionReason: data.CompleteReason,        paymentUrl: data.PaymentUrl,        order: data.Order ? {            id: data.Order.Id,            chatId: data.Order.ChatId,            product: data.Order.Product,            price: data.Order.Price,            currencyIsoNumber: data.Order.CurrencyISONumber,            currencyIso3LetterCode: data.Order.CurrencyIso3LetterCode,            questionDetails: data.Order.QuestionDetails ? {            categoryId: data.Order.QuestionDetails.CategoryId,            questionId: data.Order.QuestionDetails.QuestionId,            preferences: data.Order.QuestionDetails.Preferences && data.Order.QuestionDetails.Preferences.Preferences        } : {}        } : {},        attributes: normalizeAttributes(data.Attributes),        messages: (function() {            var messages = [];            for (var i = 0; i < data.Messages.length; i++) {            messages.push({                messageId: data.Messages[i].MessageId,                relatedMessageId: data.Messages[i].RelatedMessageId,                role: data.Messages[i].Role,                text: data.Messages[i].Text,                attributes: normalizeAttributes(data.Messages[i].Attributes)            });        }            return messages;        }()),        count: data.Count || data.Messages.length,        profile: mapProfile(data.Profile || data)    };}function mapProfile(data) {    return {        avatar: data.AvatarUrl,        greeting: data.Greeting,        name: data.Name,        title: data.Title,        details: data.ProfileDetails,        connectionFailureMessageHeader: data.ConnectionFailureMessageHeader,        connectionFailureMessageBody: data.ConnectionFailureMessageBody,        connectionRetryMessageHeader: data.ConnectionRetryMessageHeader,        connectionRetryMessageBody: data.ConnectionRetryMessageBody    };}function mapMessage(data) {    return {        text: data.Text,        chatId: data.ChatId,        attributes: normalizeAttributes(data.Attributes),        paymentUrl: data.PaymentUrl    };}function mapPaidTrialInfo(data) {    try {        if (data && data.Attributes && data.Attributes.Attributes) {            for (var index = 0; index < data.Attributes.Attributes.length; index++) {                var element = data.Attributes.Attributes[index];                if (element.Key === 'paidTrialMembershipInfo') {                    return JSON.parse(element.Value);                }            }        }    } catch (ex)     { }    return null;}function normalizeAttributes(attributes) {    var res = {};    var attrs = attributes || { Attributes: [] };    for (var i = 0; i < attrs.Attributes.length; i++) {        res[attrs.Attributes[i].Key] = attrs.Attributes[i].Value;    }    return res;}function addParametersToUrlFromKeyValue(path, data) {    var params = '';    var url = path;    var key,        value;    if (data) {        for (key in data) {            if (data.hasOwnProperty(key)) {                value = data[key];                params += key + '=' + value + '&';            }        }        if (params.length > 0) {            if (url.indexOf('?') > -1) {                url += '&';            } else {                url += '?';            }            url += params.substring(0, params.length - 1);        }    }    return url;}function getGuidFromJaCookie(){    var jaCookieValue = cookie.get('JA');    if(jaCookieValue){        var regExp = /guid=([\w-]+)/;        var match = regExp.exec(jaCookieValue);        if(match) return match[1];    }    return '';}function getUrlReplacementAttributeValue(attribute) {    if (!window || !window.location) {        return undefined;    }    var regex = new RegExp(attribute.expression, 'g');    var replacedValue = window.location.pathname.replace(regex, attribute.replacementValue);    var result = replacedValue.trim();    return result;}function getUrlParameterAttributeValue(attribute) {    if (!window || !window.location) {        return undefined;    }    var regex = new RegExp('[?&]' + attribute.parameterName + '=([^&#]*)');    var matched = window.location.search.match(regex);    var matchedResult = matched && matched[1] && window.decodeURI(matched[1]);    if (matchedResult) {        return matchedResult;    }    return attribute.defaultValue || '';}function getDynamicAttributeValue(attribute) {    switch (attribute.type) {        case 'pathnameReplacement':            return getUrlReplacementAttributeValue(attribute);        case 'urlParameter':            return getUrlParameterAttributeValue(attribute);        default:            throw new Error('Unknown dynamic attribute type: "' + attribute.type + '"');    }}function appendAttributeToCollection(collection, attributeName, attributeValue) {    collection.Attributes.push({        Key: attributeName,        Value: attributeValue    });    collection.Count++;}},{"./Deferred.js":36,"ja-ajax":35,"ja-cookie":42,"ja-event":50,"ja-utils":51}],39:[function(require,module,exports){module.exports = ChatClient;var ajax = require('ja-ajax');var events = require('ja-event');var utils = require('ja-utils');var LegacyASMXClient = require('./LegacyASMXClient');var VAServerClient = require('./VAServerClient');var Deferred = require('./Deferred.js');function ChatClient(config) {    if (!(this instanceof ChatClient)) return new ChatClient(config);    config = config || {};        var Client = getClientType(config.endpoint || '/processes/funnel/VirtualAssistantService.asmx/');    var client = new Client(config);    utils.mixin(this, client);}ChatClient.prototype.askQuestion = function (questionText) {    var self = this;    var request = {        url: '/processes/qa/QuestionWebService.asmx/CreateTempQuestionByText',        method: 'POST',        body: JSON.stringify({questionText: questionText}),        headers: { "Content-Type": "application/json; charset=utf-8" },        timeout: self.requestTimeout    };    var localDeferred = new Deferred();        ajax(request, function (error, xxx, body) {        var responseData = JSON.parse(body);        if (responseData && responseData.d) {            responseData = JSON.parse(responseData.d);        }        localDeferred.resolve(responseData);    });    return localDeferred;};function getClientType (endpoint) {    return endpoint === '/processes/funnel/VirtualAssistantService.asmx/' ? LegacyASMXClient : VAServerClient;}utils.mixin(ChatClient, events); },{"./Deferred.js":36,"./LegacyASMXClient":37,"./VAServerClient":38,"ja-ajax":35,"ja-event":50,"ja-utils":51}],40:[function(require,module,exports){var cookie = require('cookies-js')module.exports = cookie;},{"cookies-js":4}],41:[function(require,module,exports){module.exports = require('cookies-js');},{"cookies-js":4}],42:[function(require,module,exports){arguments[4][41][0].apply(exports,arguments)},{"cookies-js":4,"dup":41}],43:[function(require,module,exports){/* THIS COMPONENT MUST BE OPTIMIZED FOR SPEED */module.exports = html;function html(type, attr, content) {    var type = type || 'div';    var attr = attr || {};    var content = content || [];    var fragment = document.createDocumentFragment();    var el = document.createElement(type);    // add atrributes    for (var i in attr) {        if (i === 'className') {            el.setAttribute('class', attr[i]);        } else if (i === 'style' && typeof(attr[i]) === 'object') {            var styles = attr[i];            for (var property in styles) {                if (!styles.hasOwnProperty(property)) {                    continue;                }                if (typeof(styles[property]) === 'number') {                    styles[property] = styles[property] + 'px';                }                el.style[property] = styles[property];            }        } else if (i === 'dangerouslySetInnerHTML' && typeof(attr[i]) === 'string') {            el.innerHTML = attr[i];        } else {            el.setAttribute(i, attr[i]);        }    }    //add content    for (var j = 0; j < content.length; j++) {        var cont = content[j];        if (cont) {            addEl(el, cont);        }    }    return el;}function addEl(el, cont) {    //if array, add all elements one by one    if (cont.constructor === Array) {        for (var k = 0; k < cont.length; k++) {            addEl(el, cont[k]);        }        return;    }    if (typeof cont === 'string' || typeof cont === 'number') {        el.appendChild(document.createTextNode(cont));        return;    }    el.appendChild(cont);}},{}],44:[function(require,module,exports){arguments[4][43][0].apply(exports,arguments)},{"dup":43}],45:[function(require,module,exports){/* THIS COMPONENT MUST BE OPTIMIZED FOR SPEED */module.exports = html;function html(type, attr, content) {    type = type || 'div';    attr = attr || {};    content = content || [];    var el = document.createElement(type);    // add atrributes    for (var i in attr) {        if (i === 'className') {            el.setAttribute('class', attr[i]);        } else if (i === 'style' && typeof(attr[i]) === 'object') {            var styles = attr[i];            for (var property in styles) {                if (!styles.hasOwnProperty(property)) {                    continue;                }                if (typeof(styles[property]) === 'number') {                    styles[property] = styles[property] + 'px';                }                el.style[property] = styles[property];            }        } else if (i === 'dangerouslySetInnerHTML' && (typeof attr[i] === 'string' || attr[i] && typeof attr[i].__html === 'string')) {            el.innerHTML = typeof attr[i] === 'string' ? attr[i] : attr[i].__html;        } else {            el.setAttribute(i, attr[i]);        }    }    //add content    for (var j = 0; j < content.length; j++) {        var cont = content[j];        if (cont) {            addEl(el, cont);        }    }    return el;}function addEl(el, cont) {    //if array, add all elements one by one    if (cont.constructor === Array) {        for (var k = 0; k < cont.length; k++) {            addEl(el, cont[k]);        }        return;    }    if (typeof cont === 'string' || typeof cont === 'number') {        el.appendChild(document.createTextNode(cont));        return;    }    el.appendChild(cont);}},{}],46:[function(require,module,exports){var utils = require('ja-utils');exports.append = function(to, el) {    var tempNode;    if (!to) {        return null;    }    if (utils.isString(to)) {        to = document.querySelector(to);    }    if (exports.isNodeList(to)) {        to = to[0];    }    if (utils.isString(el)) {        if (exports.isElement(to)) {            el = to.insertAdjacentHTML('beforeend', el);        } else {            tempNode = document.createElement('div');            tempNode.innerHTML = el;            while (tempNode.firstChild) {                to.appendChild(tempNode.firstChild);            }            el = to;        }    } else {        if (utils.isArray(el) || exports.isNodeList(el)) {            var elAr = [];            for (var i = 0; i < el.length; i++) {                elAr.push(exports.append(to, el[i]));            }            el = elAr;        } else {            el = to.appendChild(el);        }    }    return el;};exports.createEl = function(el, options /*, content*/) {    var el = document.createElement(el),        text = options.text,        html = options.html;    if (text || text === '') {        el.textContent = text;        delete options.text;    }    if (html || html === '') {        el.innerHTML = html;        delete options.html;    }    for (var i in options) {        i === 'className' ? el.setAttribute('class', options[i]) : el.setAttribute(i, options[i]);    }    return el;};exports.h = exports.createEl;exports.html = exports.createEl;exports.createElement = exports.createEl;exports.addCls = function(el, cls) {    if (!(el && cls)) return false;    if (!exports.hasClass(el, cls)) {        el.className += ' ' + cls;    }    return el;}exports.addClass = exports.addCls;exports.removeCls = function(el, cls) {    if (!(el && cls)) return false    if (el.classList) {        el.classList.remove(cls);    } else {        el.className = el.className.replace(new RegExp('(^|\\b)' + cls.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');    }    return el;}exports.removeClass = exports.removeCls;exports.hasCls = function(el, cls) {    if (!(el && cls)) {        return false;    }    if (el.classList) {        return el.classList.contains(cls);    } else if (el.className) {        var res = el.className.split(' ').filter(function(clss) {            return cls === clss        })        return !!res.length === 0;    }};exports.hasClass = exports.hasCls;exports.isElement = function(o) {    return (typeof HTMLElement === 'object' ? o instanceof HTMLElement :        o && typeof o === 'object' && o !== null && o.nodeType === 1 && typeof o.nodeName === 'string');};exports.isEl = exports.isElement;exports.isNode = function(o) {    return (typeof Node === 'object' ? o instanceof Node :        o && typeof o === 'object' && typeof o.nodeType === 'number' && typeof o.nodeName === 'string');};exports.isNodeList = function(o) {    //var result = Object.prototype.toString.call(o);    if ((typeof (o) === 'object' || typeof (o) === 'function' /*Phantom hack*/) && o.length !== undefined) {        return true;    } else {        return false;    }};exports.swapToggle = function(o) {    // var result = ''//Object.prototype.toString.call(o);    if ((typeof (o) === 'object' && o.length !== undefined)) {        return true;    }};exports.toggleCls = function(element, className, condition) {    if (condition !== false || condition === undefined) {        if (element.classList) {            element.classList.toggle(className);        } else {            var classes = element.className.split(' ');            var existingIndex = classes.indexOf(className);            if (existingIndex >= 0) {                classes.splice(existingIndex, 1);            } else {                classes.push(className);            }            element.className = classes.join(' ');        }    }}exports.toggleClass = exports.toggleCls;},{"ja-utils":51}],47:[function(require,module,exports){var utils = require('ja-utils');exports.append = function(to, el) {    var tempNode;    if (!to) {        return null;    }    if (utils.isString(to)) {        to = document.querySelector(to);    }    if (exports.isNodeList(to)) {        to = to[0];    }    if (utils.isString(el)) {        if (exports.isElement(to)) {            el = to.insertAdjacentHTML('beforeend', el);        } else {            tempNode = document.createElement('div');            tempNode.innerHTML = el;            while (tempNode.firstChild) {                to.appendChild(tempNode.firstChild);            }            el = to;        }    } else {        if (utils.isArray(el) || exports.isNodeList(el)) {            var elAr = [];            for (var i = 0; i < el.length; i++) {                elAr.push(exports.append(to, el[i]));            }            el = elAr;        } else {            el = to.appendChild(el);        }    }    return el;};exports.createEl = function(el, options /*, content*/) {    var el = document.createElement(el),        text = options.text,        html = options.html;    if (text || text === '') {        el.textContent = text;        delete options.text;    }    if (html || html === '') {        el.innerHTML = html;        delete options.html;    }    for (var i in options) {        i === 'className' ? el.setAttribute('class', options[i]) : el.setAttribute(i, options[i]);    }    return el;};exports.h = exports.createEl;exports.html = exports.createEl;exports.createElement = exports.createEl;exports.addCls = function(el, cls) {    if (!(el && cls)) return false;    if (!exports.hasClass(el, cls)) {        el.className += ' ' + cls;    }    return el;}exports.addClass = exports.addCls;exports.removeCls = function(el, cls) {    if (!(el && cls)) return false    if (el.classList) {        el.classList.remove(cls);    } else {        el.className = el.className.replace(new RegExp('(^|\\b)' + cls.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');    }    return el;}exports.removeClass = exports.removeCls;exports.hasCls = function(el, cls) {    if (!(el && cls)) {        return false;    }    if (el.classList) {        return el.classList.contains(cls);    } else if (el.className) {        var res = el.className.split(' ').filter(function(clss) {            return cls === clss        })        return !!res.length === 0;    }};exports.hasClass = exports.hasCls;exports.isElement = function(o) {    return (typeof HTMLElement === 'object' ? o instanceof HTMLElement :        o && typeof o === 'object' && o !== null && o.nodeType === 1 && typeof o.nodeName === 'string');};exports.isEl = exports.isElement;exports.isNode = function(o) {    return (typeof Node === 'object' ? o instanceof Node :        o && typeof o === 'object' && typeof o.nodeType === 'number' && typeof o.nodeName === 'string');};exports.isNodeList = function(o) {    //var result = Object.prototype.toString.call(o);    if ((typeof (o) === 'object' || typeof (o) === 'function' /*Phantom hack*/) && o.length !== undefined) {        return true;    } else {        return false;    }};exports.swapToggle = function(o) {    // var result = ''//Object.prototype.toString.call(o);    if ((typeof (o) === 'object' && o.length !== undefined)) {        return true;    }};exports.toggleCls = function(element, className, condition) {    if (condition !== false || condition === undefined) {        if (element.classList) {            element.classList.toggle(className);        } else {            var classes = element.className.split(' ');            var existingIndex = classes.indexOf(className);            if (existingIndex >= 0) {                classes.splice(existingIndex, 1);            } else {                classes.push(className);            }            element.className = classes.join(' ');        }    }}exports.toggleClass = exports.toggleCls;exports.isVisible = function(element) {    if (!element) {        return false;    }    return !!( element.offsetWidth || element.offsetHeight || element.getClientRects().length );}},{"ja-utils":51}],48:[function(require,module,exports){var utils = require('ja-utils');exports.append = function(to, el) {    var tempNode;    if (!to) {        return null;    }    if (utils.isString(to)) {        to = document.querySelector(to);    }    if (exports.isNodeList(to)) {        to = to[0];    }    if (utils.isString(el)) {        if (exports.isElement(to)) {            el = to.insertAdjacentHTML('beforeend', el);        } else {            tempNode = document.createElement('div');            tempNode.innerHTML = el;            while (tempNode.firstChild) {                to.appendChild(tempNode.firstChild);            }            el = to;        }    } else {        if (utils.isArray(el) || exports.isNodeList(el)) {            var elAr = [];            for (var i = 0; i < el.length; i++) {                elAr.push(exports.append(to, el[i]));            }            el = elAr;        } else {            el = to.appendChild(el);        }    }    return el;};exports.createEl = function(el, options /*, content*/) {    var el = document.createElement(el),        text = options.text,        html = options.html;    if (text || text === '') {        el.textContent = text;        delete options.text;    }    if (html || html === '') {        el.innerHTML = html;        delete options.html;    }    for (var i in options) {        i === 'className' ? el.setAttribute('class', options[i]) : el.setAttribute(i, options[i]);    }    return el;};exports.h = exports.createEl;exports.html = exports.createEl;exports.createElement = exports.createEl;exports.addCls = function(el, cls) {    if (!(el && cls)) return false;    if (!exports.hasClass(el, cls)) {        el.className += ' ' + cls;    }    return el;}exports.addClass = exports.addCls;exports.removeCls = function(el, cls) {    if (!(el && cls)) return false    if (el.classList) {        el.classList.remove(cls);    } else {        el.className = el.className.replace(new RegExp('(^|\\b)' + cls.split(' ').join('|') + '(\\b|$)', 'gi'), ' ');    }    return el;}exports.removeClass = exports.removeCls;exports.hasCls = function(el, cls) {    if (!(el && cls)) {        return false;    }    if (el.classList) {        return el.classList.contains(cls);    } else if (el.className) {        var res = el.className.split(' ').filter(function(clss) {            return cls === clss        })        return !!res.length === 0;    }};exports.hasClass = exports.hasCls;exports.isElement = function(o) {    return (typeof HTMLElement === 'object' ? o instanceof HTMLElement :        o && typeof o === 'object' && o !== null && o.nodeType === 1 && typeof o.nodeName === 'string');};exports.isEl = exports.isElement;exports.isNode = function(o) {    return (typeof Node === 'object' ? o instanceof Node :        o && typeof o === 'object' && typeof o.nodeType === 'number' && typeof o.nodeName === 'string');};exports.isNodeList = function(o) {    //var result = Object.prototype.toString.call(o);    if ((typeof (o) === 'object' || typeof (o) === 'function' /*Phantom hack*/) && o.length !== undefined) {        return true;    } else {        return false;    }};exports.swapToggle = function(o) {    // var result = ''//Object.prototype.toString.call(o);    if ((typeof (o) === 'object' && o.length !== undefined)) {        return true;    }};exports.toggleCls = function(element, className, condition) {    if (condition !== false || condition === undefined) {        if (element.classList) {            element.classList.toggle(className);        } else {            var classes = element.className.split(' ');            var existingIndex = classes.indexOf(className);            if (existingIndex >= 0) {                classes.splice(existingIndex, 1);            } else {                classes.push(className);            }            element.className = classes.join(' ');        }    }}exports.toggleClass = exports.toggleCls;exports.isVisible = function(element) {    if (!element) {        return false;    }    return !!( element.offsetWidth || element.offsetHeight || element.getClientRects().length );};exports.bindEvent = function (element, evt, callback) {    if (element.addEventListener) {        element.addEventListener(evt, callback, false);    } else if (element.attachEvent) {        element.attachEvent('on' + evt, callback);    }};},{"ja-utils":51}],49:[function(require,module,exports){    module.exports = Event;    function Event() {        if (!(this instanceof Event)) return new Event();        this._name_ = 'event';        //this.events = {}    }    Event.prototype.events =  {};    Event.prototype.addEventListener = Event.prototype.on = function(event, fn, scope, single) {        var me = this;        var fns;        fns = me.events[event] || undefined;        scope = scope || me;        single = single || false;        if (fns) {            fns.push({                fn: fn,                scope: scope,                single: single            });            return;        }        me.events[event] = [{            fn: fn,            scope: scope,            single: single        }];    };    Event.prototype.once = function(event, fn, scope) {        return this.on(event, fn, scope, true)    };    Event.prototype.fireEvent =  Event.prototype.trigger = function(event) {        var me = this,            args = Array.prototype.slice.call(arguments, 1),            fns;        me.events = me.events || {};        fns = me.events[event];        //console.log('fns:',fns.length, event, this);        if (fns) {            for (var j = 0; j < fns.length; j++) {                if (this !== fns[j].scope) continue;                fns[j].fn.apply(fns[j].scope, args);                if (fns[j].single) {                    fns.splice(j, 1);                    j--;                }            }        }    };    Event.prototype.removeEventListener = Event.prototype.off = function(event, fn) {        var me = this,            fns;        me.events = me.events || {};        fns = me.events[event];        fn = fn || false;        if (fns) {            if (!fn) {                return delete me.events[event];            }            for (var j = 0; j < fns.length; j++) {                if (fns[j].fn === fn) {                    fns.splice(j, 1);                    j--;                }            }        }    };    Event.prototype.removeAllEventListeners = Event.prototype.offAll = function(event, fn) {        this.events = {};        fn();    }},{}],50:[function(require,module,exports){arguments[4][49][0].apply(exports,arguments)},{"dup":49}],51:[function(require,module,exports){/** * Some base Utility functions * @module Utils */var lflatten = require('lodash.flatten');var lcompose = require('lodash.compose');var lassign = require('lodash.assign');var lcurry = require('lodash.curry');var lchunk = require('lodash.chunk');var lIsEmpty = require('lodash.isempty');var lequal = require('is-equal');var Utils = {    toString: function(el) { return typeof el},    hasOwnProperty: Object.prototype.hasOwnProperty,    //lodash functions    compose: lcompose,    curry: lcurry,    chunk: lchunk,    flatten: lflatten,    assign: lassign,    extend:lassign,    mixin:lassign,    inherit:lassign,    //isEqual:lequal,    isEmpty:lIsEmpty,    // isObject:lIsObject,    isEqual:function(a,b){      if (a === b) {        return true      } else {        return lequal(a,b)      }    },    isArray: function(obj) {        return ('isArray' in Array) ? Array.isArray(obj) : (obj instanceof Array);    },    isString: function(obj) {        return typeof obj === 'string';    },    isFunction: function(obj) {        return typeof obj === 'function';    },    isObject: function(obj) {        return typeof obj === 'object';    },    capitaliseString: function(str) {        return str.charAt(0).toUpperCase() + str.slice(1);    },    isEmpty: function(obj) {        if (!obj) {            return true;        }        if (typeof obj.length === 'number') {            return obj.length < 1;        } else {            for (var i in obj) {                return false            }            return true        }    },    has: function(obj, key) {        return obj[key] //hasOwnProperty.call(obj, key);    },    mixin: function(target, source) {        if (!(source && target)) {            return target;        }        this.extend(            this.isFunction(target) && target.prototype || target,            this.isFunction(source) && source.prototype || source        );        return target;    },    extend: function(to, from) {        for (var key in from) {            to[key] = from[key];        }        return to;    }};module.exports = Utils;},{"is-equal":23,"lodash.assign":57,"lodash.chunk":58,"lodash.compose":59,"lodash.curry":60,"lodash.flatten":61,"lodash.isempty":62}],52:[function(require,module,exports){/** * Some base Utility functions * @module Utils */var lflatten = require('lodash.flatten');var lcompose = require('lodash.compose');var lassign = require('lodash.assign');var lcurry = require('lodash.curry');var lchunk = require('lodash.chunk');var lIsEmpty = require('lodash.isempty');var lequal = require('is-equal');var Utils = {    toString: function(el) { return typeof el},    hasOwnProperty: Object.prototype.hasOwnProperty,    //lodash functions    compose: lcompose,    curry: lcurry,    chunk: lchunk,    flatten: lflatten,    assign: lassign,    extend:lassign,    mixin:lassign,    inherit:lassign,    mixin:lassign,    //isEqual:lequal,    isEmpty:lIsEmpty,    // isObject:lIsObject,    isEqual:function(a,b){      if (a === b) {        return true      } else {        return lequal(a,b)      }    },    isArray: function(obj) {        return ('isArray' in Array) ? Array.isArray(obj) : (obj instanceof Array);    },    isString: function(obj) {        return typeof obj === 'string';    },    isFunction: function(obj) {        return typeof obj === 'function';    },    isObject: function(obj) {        return typeof obj === 'object';    },    capitaliseString: function(str) {        return str.charAt(0).toUpperCase() + str.slice(1);    },    isEmpty: function(obj) {        if (!obj) {            return true;        }        if (typeof obj.length === 'number') {            return obj.length < 1;        } else {            for (var i in obj) {                return false            }            return true        }    },    has: function(obj, key) {        return obj[key] //hasOwnProperty.call(obj, key);    },    mixin: function(target, source) {        if (!(source && target)) {            return target;        }        this.extend(            this.isFunction(target) && target.prototype || target,             this.isFunction(source) && source.prototype || source        );        return target;    },    extend: function(to, from) {        for (var key in from) {            to[key] = from[key];        }        return to;    }};module.exports = Utils;},{"is-equal":23,"lodash.assign":57,"lodash.chunk":58,"lodash.compose":59,"lodash.curry":60,"lodash.flatten":61,"lodash.isempty":62}],53:[function(require,module,exports){arguments[4][52][0].apply(exports,arguments)},{"dup":52,"is-equal":23,"lodash.assign":57,"lodash.chunk":58,"lodash.compose":59,"lodash.curry":60,"lodash.flatten":61,"lodash.isempty":62}],54:[function(require,module,exports){/*! * JavaScript Cookie v2.2.1 * https://github.com/js-cookie/js-cookie * * Copyright 2006, 2015 Klaus Hartl & Fagner Brack * Released under the MIT license */;(function (factory) {	var registeredInModuleLoader;	if (typeof define === 'function' && define.amd) {		define(factory);		registeredInModuleLoader = true;	}	if (typeof exports === 'object') {		module.exports = factory();		registeredInModuleLoader = true;	}	if (!registeredInModuleLoader) {		var OldCookies = window.Cookies;		var api = window.Cookies = factory();		api.noConflict = function () {			window.Cookies = OldCookies;			return api;		};	}}(function () {	function extend () {		var i = 0;		var result = {};		for (; i < arguments.length; i++) {			var attributes = arguments[ i ];			for (var key in attributes) {				result[key] = attributes[key];			}		}		return result;	}	function decode (s) {		return s.replace(/(%[0-9A-Z]{2})+/g, decodeURIComponent);	}	function init (converter) {		function api() {}		function set (key, value, attributes) {			if (typeof document === 'undefined') {				return;			}			attributes = extend({				path: '/'			}, api.defaults, attributes);			if (typeof attributes.expires === 'number') {				attributes.expires = new Date(new Date() * 1 + attributes.expires * 864e+5);			}			// We're using "expires" because "max-age" is not supported by IE			attributes.expires = attributes.expires ? attributes.expires.toUTCString() : '';			try {				var result = JSON.stringify(value);				if (/^[\{\[]/.test(result)) {					value = result;				}			} catch (e) {}			value = converter.write ?				converter.write(value, key) :				encodeURIComponent(String(value))					.replace(/%(23|24|26|2B|3A|3C|3E|3D|2F|3F|40|5B|5D|5E|60|7B|7D|7C)/g, decodeURIComponent);			key = encodeURIComponent(String(key))				.replace(/%(23|24|26|2B|5E|60|7C)/g, decodeURIComponent)				.replace(/[\(\)]/g, escape);			var stringifiedAttributes = '';			for (var attributeName in attributes) {				if (!attributes[attributeName]) {					continue;				}				stringifiedAttributes += '; ' + attributeName;				if (attributes[attributeName] === true) {					continue;				}				// Considers RFC 6265 section 5.2:				// ...				// 3.  If the remaining unparsed-attributes contains a %x3B (";")				//     character:				// Consume the characters of the unparsed-attributes up to,				// not including, the first %x3B (";") character.				// ...				stringifiedAttributes += '=' + attributes[attributeName].split(';')[0];			}			return (document.cookie = key + '=' + value + stringifiedAttributes);		}		function get (key, json) {			if (typeof document === 'undefined') {				return;			}			var jar = {};			// To prevent the for loop in the first place assign an empty array			// in case there are no cookies at all.			var cookies = document.cookie ? document.cookie.split('; ') : [];			var i = 0;			for (; i < cookies.length; i++) {				var parts = cookies[i].split('=');				var cookie = parts.slice(1).join('=');				if (!json && cookie.charAt(0) === '"') {					cookie = cookie.slice(1, -1);				}				try {					var name = decode(parts[0]);					cookie = (converter.read || converter)(cookie, name) ||						decode(cookie);					if (json) {						try {							cookie = JSON.parse(cookie);						} catch (e) {}					}					jar[name] = cookie;					if (key === name) {						break;					}				} catch (e) {}			}			return key ? jar[key] : jar;		}		api.set = set;		api.get = function (key) {			return get(key, false /* read as raw */);		};		api.getJSON = function (key) {			return get(key, true /* read as json */);		};		api.remove = function (key, attributes) {			set(key, '', extend(attributes, {				expires: -1			}));		};		api.defaults = {};		api.withConverter = init;		return api;	}	return init(function () {});}));},{}],55:[function(require,module,exports){/** * lodash 3.2.0 (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license <https://lodash.com/license> */var root = require('lodash._root');/** Used to compose bitmasks for wrapper metadata. */var BIND_FLAG = 1,    BIND_KEY_FLAG = 2,    CURRY_BOUND_FLAG = 4,    CURRY_FLAG = 8,    CURRY_RIGHT_FLAG = 16,    PARTIAL_FLAG = 32,    PARTIAL_RIGHT_FLAG = 64,    ARY_FLAG = 128,    FLIP_FLAG = 512;/** Used as the `TypeError` message for "Functions" methods. */var FUNC_ERROR_TEXT = 'Expected a function';/** Used as references for various `Number` constants. */var INFINITY = 1 / 0,    MAX_SAFE_INTEGER = 9007199254740991,    MAX_INTEGER = 1.7976931348623157e+308,    NAN = 0 / 0;/** Used as the internal argument placeholder. */var PLACEHOLDER = '__lodash_placeholder__';/** `Object#toString` result references. */var funcTag = '[object Function]',    genTag = '[object GeneratorFunction]';/** Used to match leading and trailing whitespace. */var reTrim = /^\s+|\s+$/g;/** Used to detect bad signed hexadecimal string values. */var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;/** Used to detect binary string values. */var reIsBinary = /^0b[01]+$/i;/** Used to detect octal string values. */var reIsOctal = /^0o[0-7]+$/i;/** Used to detect unsigned integer values. */var reIsUint = /^(?:0|[1-9]\d*)$/;/** Built-in method references without a dependency on `root`. */var freeParseInt = parseInt;/** * A faster alternative to `Function#apply`, this function invokes `func` * with the `this` binding of `thisArg` and the arguments of `args`. * * @private * @param {Function} func The function to invoke. * @param {*} thisArg The `this` binding of `func`. * @param {...*} args The arguments to invoke `func` with. * @returns {*} Returns the result of `func`. */function apply(func, thisArg, args) {  var length = args.length;  switch (length) {    case 0: return func.call(thisArg);    case 1: return func.call(thisArg, args[0]);    case 2: return func.call(thisArg, args[0], args[1]);    case 3: return func.call(thisArg, args[0], args[1], args[2]);  }  return func.apply(thisArg, args);}/** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */function isIndex(value, length) {  value = (typeof value == 'number' || reIsUint.test(value)) ? +value : -1;  length = length == null ? MAX_SAFE_INTEGER : length;  return value > -1 && value % 1 == 0 && value < length;}/** * Replaces all `placeholder` elements in `array` with an internal placeholder * and returns an array of their indexes. * * @private * @param {Array} array The array to modify. * @param {*} placeholder The placeholder to replace. * @returns {Array} Returns the new array of placeholder indexes. */function replaceHolders(array, placeholder) {  var index = -1,      length = array.length,      resIndex = -1,      result = [];  while (++index < length) {    if (array[index] === placeholder) {      array[index] = PLACEHOLDER;      result[++resIndex] = index;    }  }  return result;}/** Used for built-in method references. */var objectProto = Object.prototype;/** * Used to resolve the [`toStringTag`](http://ecma-international.org/ecma-262/6.0/#sec-object.prototype.tostring) * of values. */var objectToString = objectProto.toString;/* Built-in method references for those with the same name as other `lodash` methods. */var nativeMax = Math.max,    nativeMin = Math.min;/** * The base implementation of `_.create` without support for assigning * properties to the created object. * * @private * @param {Object} prototype The object to inherit from. * @returns {Object} Returns the new object. */var baseCreate = (function() {  function object() {}  return function(prototype) {    if (isObject(prototype)) {      object.prototype = prototype;      var result = new object;      object.prototype = undefined;    }    return result || {};  };}());/** * Creates an array that is the composition of partially applied arguments, * placeholders, and provided arguments into a single array of arguments. * * @private * @param {Array|Object} args The provided arguments. * @param {Array} partials The arguments to prepend to those provided. * @param {Array} holders The `partials` placeholder indexes. * @returns {Array} Returns the new array of composed arguments. */function composeArgs(args, partials, holders) {  var holdersLength = holders.length,      argsIndex = -1,      argsLength = nativeMax(args.length - holdersLength, 0),      leftIndex = -1,      leftLength = partials.length,      result = Array(leftLength + argsLength);  while (++leftIndex < leftLength) {    result[leftIndex] = partials[leftIndex];  }  while (++argsIndex < holdersLength) {    result[holders[argsIndex]] = args[argsIndex];  }  while (argsLength--) {    result[leftIndex++] = args[argsIndex++];  }  return result;}/** * This function is like `composeArgs` except that the arguments composition * is tailored for `_.partialRight`. * * @private * @param {Array|Object} args The provided arguments. * @param {Array} partials The arguments to append to those provided. * @param {Array} holders The `partials` placeholder indexes. * @returns {Array} Returns the new array of composed arguments. */function composeArgsRight(args, partials, holders) {  var holdersIndex = -1,      holdersLength = holders.length,      argsIndex = -1,      argsLength = nativeMax(args.length - holdersLength, 0),      rightIndex = -1,      rightLength = partials.length,      result = Array(argsLength + rightLength);  while (++argsIndex < argsLength) {    result[argsIndex] = args[argsIndex];  }  var offset = argsIndex;  while (++rightIndex < rightLength) {    result[offset + rightIndex] = partials[rightIndex];  }  while (++holdersIndex < holdersLength) {    result[offset + holders[holdersIndex]] = args[argsIndex++];  }  return result;}/** * Copies the values of `source` to `array`. * * @private * @param {Array} source The array to copy values from. * @param {Array} [array=[]] The array to copy values to. * @returns {Array} Returns `array`. */function copyArray(source, array) {  var index = -1,      length = source.length;  array || (array = Array(length));  while (++index < length) {    array[index] = source[index];  }  return array;}/** * Creates a function that wraps `func` to invoke it with the optional `this` * binding of `thisArg`. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {*} [thisArg] The `this` binding of `func`. * @returns {Function} Returns the new wrapped function. */function createBaseWrapper(func, bitmask, thisArg) {  var isBind = bitmask & BIND_FLAG,      Ctor = createCtorWrapper(func);  function wrapper() {    var fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;    return fn.apply(isBind ? thisArg : this, arguments);  }  return wrapper;}/** * Creates a function that produces an instance of `Ctor` regardless of * whether it was invoked as part of a `new` expression or by `call` or `apply`. * * @private * @param {Function} Ctor The constructor to wrap. * @returns {Function} Returns the new wrapped function. */function createCtorWrapper(Ctor) {  return function() {    // Use a `switch` statement to work with class constructors.    // See http://ecma-international.org/ecma-262/6.0/#sec-ecmascript-function-objects-call-thisargument-argumentslist    // for more details.    var args = arguments;    switch (args.length) {      case 0: return new Ctor;      case 1: return new Ctor(args[0]);      case 2: return new Ctor(args[0], args[1]);      case 3: return new Ctor(args[0], args[1], args[2]);      case 4: return new Ctor(args[0], args[1], args[2], args[3]);      case 5: return new Ctor(args[0], args[1], args[2], args[3], args[4]);      case 6: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5]);      case 7: return new Ctor(args[0], args[1], args[2], args[3], args[4], args[5], args[6]);    }    var thisBinding = baseCreate(Ctor.prototype),        result = Ctor.apply(thisBinding, args);    // Mimic the constructor's `return` behavior.    // See https://es5.github.io/#x13.2.2 for more details.    return isObject(result) ? result : thisBinding;  };}/** * Creates a function that wraps `func` to enable currying. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {number} arity The arity of `func`. * @returns {Function} Returns the new wrapped function. */function createCurryWrapper(func, bitmask, arity) {  var Ctor = createCtorWrapper(func);  function wrapper() {    var length = arguments.length,        index = length,        args = Array(length),        fn = (this && this !== root && this instanceof wrapper) ? Ctor : func,        placeholder = wrapper.placeholder;    while (index--) {      args[index] = arguments[index];    }    var holders = (length < 3 && args[0] !== placeholder && args[length - 1] !== placeholder)      ? []      : replaceHolders(args, placeholder);    length -= holders.length;    return length < arity      ? createRecurryWrapper(func, bitmask, createHybridWrapper, placeholder, undefined, args, holders, undefined, undefined, arity - length)      : apply(fn, this, args);  }  return wrapper;}/** * Creates a function that wraps `func` to invoke it with optional `this` * binding of `thisArg`, partial application, and currying. * * @private * @param {Function|string} func The function or method name to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to prepend to those provided to the new function. * @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [partialsRight] The arguments to append to those provided to the new function. * @param {Array} [holdersRight] The `partialsRight` placeholder indexes. * @param {Array} [argPos] The argument positions of the new function. * @param {number} [ary] The arity cap of `func`. * @param {number} [arity] The arity of `func`. * @returns {Function} Returns the new wrapped function. */function createHybridWrapper(func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity) {  var isAry = bitmask & ARY_FLAG,      isBind = bitmask & BIND_FLAG,      isBindKey = bitmask & BIND_KEY_FLAG,      isCurry = bitmask & CURRY_FLAG,      isCurryRight = bitmask & CURRY_RIGHT_FLAG,      isFlip = bitmask & FLIP_FLAG,      Ctor = isBindKey ? undefined : createCtorWrapper(func);  function wrapper() {    var length = arguments.length,        index = length,        args = Array(length);    while (index--) {      args[index] = arguments[index];    }    if (partials) {      args = composeArgs(args, partials, holders);    }    if (partialsRight) {      args = composeArgsRight(args, partialsRight, holdersRight);    }    if (isCurry || isCurryRight) {      var placeholder = wrapper.placeholder,          argsHolders = replaceHolders(args, placeholder);      length -= argsHolders.length;      if (length < arity) {        return createRecurryWrapper(func, bitmask, createHybridWrapper, placeholder, thisArg, args, argsHolders, argPos, ary, arity - length);      }    }    var thisBinding = isBind ? thisArg : this,        fn = isBindKey ? thisBinding[func] : func;    if (argPos) {      args = reorder(args, argPos);    } else if (isFlip && args.length > 1) {      args.reverse();    }    if (isAry && ary < args.length) {      args.length = ary;    }    if (this && this !== root && this instanceof wrapper) {      fn = Ctor || createCtorWrapper(fn);    }    return fn.apply(thisBinding, args);  }  return wrapper;}/** * Creates a function that wraps `func` to invoke it with the optional `this` * binding of `thisArg` and the `partials` prepended to those provided to * the wrapper. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {*} thisArg The `this` binding of `func`. * @param {Array} partials The arguments to prepend to those provided to the new function. * @returns {Function} Returns the new wrapped function. */function createPartialWrapper(func, bitmask, thisArg, partials) {  var isBind = bitmask & BIND_FLAG,      Ctor = createCtorWrapper(func);  function wrapper() {    var argsIndex = -1,        argsLength = arguments.length,        leftIndex = -1,        leftLength = partials.length,        args = Array(leftLength + argsLength),        fn = (this && this !== root && this instanceof wrapper) ? Ctor : func;    while (++leftIndex < leftLength) {      args[leftIndex] = partials[leftIndex];    }    while (argsLength--) {      args[leftIndex++] = arguments[++argsIndex];    }    return apply(fn, isBind ? thisArg : this, args);  }  return wrapper;}/** * Creates a function that wraps `func` to continue currying. * * @private * @param {Function} func The function to wrap. * @param {number} bitmask The bitmask of wrapper flags. See `createWrapper` for more details. * @param {Function} wrapFunc The function to create the `func` wrapper. * @param {*} placeholder The placeholder to replace. * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to prepend to those provided to the new function. * @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [argPos] The argument positions of the new function. * @param {number} [ary] The arity cap of `func`. * @param {number} [arity] The arity of `func`. * @returns {Function} Returns the new wrapped function. */function createRecurryWrapper(func, bitmask, wrapFunc, placeholder, thisArg, partials, holders, argPos, ary, arity) {  var isCurry = bitmask & CURRY_FLAG,      newArgPos = argPos ? copyArray(argPos) : undefined,      newsHolders = isCurry ? holders : undefined,      newHoldersRight = isCurry ? undefined : holders,      newPartials = isCurry ? partials : undefined,      newPartialsRight = isCurry ? undefined : partials;  bitmask |= (isCurry ? PARTIAL_FLAG : PARTIAL_RIGHT_FLAG);  bitmask &= ~(isCurry ? PARTIAL_RIGHT_FLAG : PARTIAL_FLAG);  if (!(bitmask & CURRY_BOUND_FLAG)) {    bitmask &= ~(BIND_FLAG | BIND_KEY_FLAG);  }  var result = wrapFunc(func, bitmask, thisArg, newPartials, newsHolders, newPartialsRight, newHoldersRight, newArgPos, ary, arity);  result.placeholder = placeholder;  return result;}/** * Creates a function that either curries or invokes `func` with optional * `this` binding and partially applied arguments. * * @private * @param {Function|string} func The function or method name to wrap. * @param {number} bitmask The bitmask of wrapper flags. *  The bitmask may be composed of the following flags: *     1 - `_.bind` *     2 - `_.bindKey` *     4 - `_.curry` or `_.curryRight` of a bound function *     8 - `_.curry` *    16 - `_.curryRight` *    32 - `_.partial` *    64 - `_.partialRight` *   128 - `_.rearg` *   256 - `_.ary` * @param {*} [thisArg] The `this` binding of `func`. * @param {Array} [partials] The arguments to be partially applied. * @param {Array} [holders] The `partials` placeholder indexes. * @param {Array} [argPos] The argument positions of the new function. * @param {number} [ary] The arity cap of `func`. * @param {number} [arity] The arity of `func`. * @returns {Function} Returns the new wrapped function. */function createWrapper(func, bitmask, thisArg, partials, holders, argPos, ary, arity) {  var isBindKey = bitmask & BIND_KEY_FLAG;  if (!isBindKey && typeof func != 'function') {    throw new TypeError(FUNC_ERROR_TEXT);  }  var length = partials ? partials.length : 0;  if (!length) {    bitmask &= ~(PARTIAL_FLAG | PARTIAL_RIGHT_FLAG);    partials = holders = undefined;  }  ary = ary === undefined ? ary : nativeMax(toInteger(ary), 0);  arity = arity === undefined ? arity : toInteger(arity);  length -= holders ? holders.length : 0;  if (bitmask & PARTIAL_RIGHT_FLAG) {    var partialsRight = partials,        holdersRight = holders;    partials = holders = undefined;  }  var newData = [func, bitmask, thisArg, partials, holders, partialsRight, holdersRight, argPos, ary, arity];  func = newData[0];  bitmask = newData[1];  thisArg = newData[2];  partials = newData[3];  holders = newData[4];  arity = newData[9] = newData[9] == null    ? (isBindKey ? 0 : func.length)    : nativeMax(newData[9] - length, 0);  if (!arity && bitmask & (CURRY_FLAG | CURRY_RIGHT_FLAG)) {    bitmask &= ~(CURRY_FLAG | CURRY_RIGHT_FLAG);  }  if (!bitmask || bitmask == BIND_FLAG) {    var result = createBaseWrapper(func, bitmask, thisArg);  } else if (bitmask == CURRY_FLAG || bitmask == CURRY_RIGHT_FLAG) {    result = createCurryWrapper(func, bitmask, arity);  } else if ((bitmask == PARTIAL_FLAG || bitmask == (BIND_FLAG | PARTIAL_FLAG)) && !holders.length) {    result = createPartialWrapper(func, bitmask, thisArg, partials);  } else {    result = createHybridWrapper.apply(undefined, newData);  }  return result;}/** * Reorder `array` according to the specified indexes where the element at * the first index is assigned as the first element, the element at * the second index is assigned as the second element, and so on. * * @private * @param {Array} array The array to reorder. * @param {Array} indexes The arranged array indexes. * @returns {Array} Returns `array`. */function reorder(array, indexes) {  var arrLength = array.length,      length = nativeMin(indexes.length, arrLength),      oldArray = copyArray(array);  while (length--) {    var index = indexes[length];    array[length] = isIndex(index, arrLength) ? oldArray[index] : undefined;  }  return array;}/** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is correctly classified, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */function isFunction(value) {  // The use of `Object#toString` avoids issues with the `typeof` operator  // in Safari 8 which returns 'object' for typed array constructors, and  // PhantomJS 1.9 which returns 'function' for `NodeList` instances.  var tag = isObject(value) ? objectToString.call(value) : '';  return tag == funcTag || tag == genTag;}/** * Checks if `value` is the [language type](https://es5.github.io/#x8) of `Object`. * (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */function isObject(value) {  var type = typeof value;  return !!value && (type == 'object' || type == 'function');}/** * Converts `value` to an integer. * * **Note:** This function is loosely based on [`ToInteger`](http://www.ecma-international.org/ecma-262/6.0/#sec-tointeger). * * @static * @memberOf _ * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted integer. * @example * * _.toInteger(3); * // => 3 * * _.toInteger(Number.MIN_VALUE); * // => 0 * * _.toInteger(Infinity); * // => 1.7976931348623157e+308 * * _.toInteger('3'); * // => 3 */function toInteger(value) {  if (!value) {    return value === 0 ? value : 0;  }  value = toNumber(value);  if (value === INFINITY || value === -INFINITY) {    var sign = (value < 0 ? -1 : 1);    return sign * MAX_INTEGER;  }  var remainder = value % 1;  return value === value ? (remainder ? value - remainder : value) : 0;}/** * Converts `value` to a number. * * @static * @memberOf _ * @category Lang * @param {*} value The value to process. * @returns {number} Returns the number. * @example * * _.toNumber(3); * // => 3 * * _.toNumber(Number.MIN_VALUE); * // => 5e-324 * * _.toNumber(Infinity); * // => Infinity * * _.toNumber('3'); * // => 3 */function toNumber(value) {  if (isObject(value)) {    var other = isFunction(value.valueOf) ? value.valueOf() : value;    value = isObject(other) ? (other + '') : other;  }  if (typeof value != 'string') {    return value === 0 ? value : +value;  }  value = value.replace(reTrim, '');  var isBinary = reIsBinary.test(value);  return (isBinary || reIsOctal.test(value))    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)    : (reIsBadHex.test(value) ? NAN : +value);}module.exports = createWrapper;},{"lodash._root":56}],56:[function(require,module,exports){(function (global){/** * lodash 3.0.1 (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license <https://lodash.com/license> *//** Used to determine if values are of the language type `Object`. */var objectTypes = {  'function': true,  'object': true};/** Detect free variable `exports`. */var freeExports = (objectTypes[typeof exports] && exports && !exports.nodeType)  ? exports  : undefined;/** Detect free variable `module`. */var freeModule = (objectTypes[typeof module] && module && !module.nodeType)  ? module  : undefined;/** Detect free variable `global` from Node.js. */var freeGlobal = checkGlobal(freeExports && freeModule && typeof global == 'object' && global);/** Detect free variable `self`. */var freeSelf = checkGlobal(objectTypes[typeof self] && self);/** Detect free variable `window`. */var freeWindow = checkGlobal(objectTypes[typeof window] && window);/** Detect `this` as the global object. */var thisGlobal = checkGlobal(objectTypes[typeof this] && this);/** * Used as a reference to the global object. * * The `this` value is used if it's the global object to avoid Greasemonkey's * restricted `window` object, otherwise the `window` object is used. */var root = freeGlobal ||  ((freeWindow !== (thisGlobal && thisGlobal.window)) && freeWindow) ||    freeSelf || thisGlobal || Function('return this')();/** * Checks if `value` is a global object. * * @private * @param {*} value The value to check. * @returns {null|Object} Returns `value` if it's a global object, else `null`. */function checkGlobal(value) {  return (value && value.Object === Object) ? value : null;}module.exports = root;}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})},{}],57:[function(require,module,exports){/** * lodash (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors <https://jquery.org/> * Released under MIT license <https://lodash.com/license> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *//** Used as references for various `Number` constants. */var MAX_SAFE_INTEGER = 9007199254740991;/** `Object#toString` result references. */var argsTag = '[object Arguments]',    funcTag = '[object Function]',    genTag = '[object GeneratorFunction]';/** Used to detect unsigned integer values. */var reIsUint = /^(?:0|[1-9]\d*)$/;/** * A faster alternative to `Function#apply`, this function invokes `func` * with the `this` binding of `thisArg` and the arguments of `args`. * * @private * @param {Function} func The function to invoke. * @param {*} thisArg The `this` binding of `func`. * @param {Array} args The arguments to invoke `func` with. * @returns {*} Returns the result of `func`. */function apply(func, thisArg, args) {  switch (args.length) {    case 0: return func.call(thisArg);    case 1: return func.call(thisArg, args[0]);    case 2: return func.call(thisArg, args[0], args[1]);    case 3: return func.call(thisArg, args[0], args[1], args[2]);  }  return func.apply(thisArg, args);}/** * The base implementation of `_.times` without support for iteratee shorthands * or max array length checks. * * @private * @param {number} n The number of times to invoke `iteratee`. * @param {Function} iteratee The function invoked per iteration. * @returns {Array} Returns the array of results. */function baseTimes(n, iteratee) {  var index = -1,      result = Array(n);  while (++index < n) {    result[index] = iteratee(index);  }  return result;}/** * Creates a unary function that invokes `func` with its argument transformed. * * @private * @param {Function} func The function to wrap. * @param {Function} transform The argument transform. * @returns {Function} Returns the new function. */function overArg(func, transform) {  return function(arg) {    return func(transform(arg));  };}/** Used for built-in method references. */var objectProto = Object.prototype;/** Used to check objects for own properties. */var hasOwnProperty = objectProto.hasOwnProperty;/** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */var objectToString = objectProto.toString;/** Built-in value references. */var propertyIsEnumerable = objectProto.propertyIsEnumerable;/* Built-in method references for those with the same name as other `lodash` methods. */var nativeKeys = overArg(Object.keys, Object),    nativeMax = Math.max;/** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');/** * Creates an array of the enumerable property names of the array-like `value`. * * @private * @param {*} value The value to query. * @param {boolean} inherited Specify returning inherited property names. * @returns {Array} Returns the array of property names. */function arrayLikeKeys(value, inherited) {  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.  // Safari 9 makes `arguments.length` enumerable in strict mode.  var result = (isArray(value) || isArguments(value))    ? baseTimes(value.length, String)    : [];  var length = result.length,      skipIndexes = !!length;  for (var key in value) {    if ((inherited || hasOwnProperty.call(value, key)) &&        !(skipIndexes && (key == 'length' || isIndex(key, length)))) {      result.push(key);    }  }  return result;}/** * Assigns `value` to `key` of `object` if the existing value is not equivalent * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * for equality comparisons. * * @private * @param {Object} object The object to modify. * @param {string} key The key of the property to assign. * @param {*} value The value to assign. */function assignValue(object, key, value) {  var objValue = object[key];  if (!(hasOwnProperty.call(object, key) && eq(objValue, value)) ||      (value === undefined && !(key in object))) {    object[key] = value;  }}/** * The base implementation of `_.keys` which doesn't treat sparse arrays as dense. * * @private * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. */function baseKeys(object) {  if (!isPrototype(object)) {    return nativeKeys(object);  }  var result = [];  for (var key in Object(object)) {    if (hasOwnProperty.call(object, key) && key != 'constructor') {      result.push(key);    }  }  return result;}/** * The base implementation of `_.rest` which doesn't validate or coerce arguments. * * @private * @param {Function} func The function to apply a rest parameter to. * @param {number} [start=func.length-1] The start position of the rest parameter. * @returns {Function} Returns the new function. */function baseRest(func, start) {  start = nativeMax(start === undefined ? (func.length - 1) : start, 0);  return function() {    var args = arguments,        index = -1,        length = nativeMax(args.length - start, 0),        array = Array(length);    while (++index < length) {      array[index] = args[start + index];    }    index = -1;    var otherArgs = Array(start + 1);    while (++index < start) {      otherArgs[index] = args[index];    }    otherArgs[start] = array;    return apply(func, this, otherArgs);  };}/** * Copies properties of `source` to `object`. * * @private * @param {Object} source The object to copy properties from. * @param {Array} props The property identifiers to copy. * @param {Object} [object={}] The object to copy properties to. * @param {Function} [customizer] The function to customize copied values. * @returns {Object} Returns `object`. */function copyObject(source, props, object, customizer) {  object || (object = {});  var index = -1,      length = props.length;  while (++index < length) {    var key = props[index];    var newValue = customizer      ? customizer(object[key], source[key], key, object, source)      : undefined;    assignValue(object, key, newValue === undefined ? source[key] : newValue);  }  return object;}/** * Creates a function like `_.assign`. * * @private * @param {Function} assigner The function to assign values. * @returns {Function} Returns the new assigner function. */function createAssigner(assigner) {  return baseRest(function(object, sources) {    var index = -1,        length = sources.length,        customizer = length > 1 ? sources[length - 1] : undefined,        guard = length > 2 ? sources[2] : undefined;    customizer = (assigner.length > 3 && typeof customizer == 'function')      ? (length--, customizer)      : undefined;    if (guard && isIterateeCall(sources[0], sources[1], guard)) {      customizer = length < 3 ? undefined : customizer;      length = 1;    }    object = Object(object);    while (++index < length) {      var source = sources[index];      if (source) {        assigner(object, source, index, customizer);      }    }    return object;  });}/** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */function isIndex(value, length) {  length = length == null ? MAX_SAFE_INTEGER : length;  return !!length &&    (typeof value == 'number' || reIsUint.test(value)) &&    (value > -1 && value % 1 == 0 && value < length);}/** * Checks if the given arguments are from an iteratee call. * * @private * @param {*} value The potential iteratee value argument. * @param {*} index The potential iteratee index or key argument. * @param {*} object The potential iteratee object argument. * @returns {boolean} Returns `true` if the arguments are from an iteratee call, *  else `false`. */function isIterateeCall(value, index, object) {  if (!isObject(object)) {    return false;  }  var type = typeof index;  if (type == 'number'        ? (isArrayLike(object) && isIndex(index, object.length))        : (type == 'string' && index in object)      ) {    return eq(object[index], value);  }  return false;}/** * Checks if `value` is likely a prototype object. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. */function isPrototype(value) {  var Ctor = value && value.constructor,      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;  return value === proto;}/** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */function eq(value, other) {  return value === other || (value !== value && other !== other);}/** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, *  else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */function isArguments(value) {  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);}/** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */var isArray = Array.isArray;/** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */function isArrayLike(value) {  return value != null && isLength(value.length) && !isFunction(value);}/** * This method is like `_.isArrayLike` except that it also checks if `value` * is an object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array-like object, *  else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); * // => true * * _.isArrayLikeObject(document.body.children); * // => true * * _.isArrayLikeObject('abc'); * // => false * * _.isArrayLikeObject(_.noop); * // => false */function isArrayLikeObject(value) {  return isObjectLike(value) && isArrayLike(value);}/** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */function isFunction(value) {  // The use of `Object#toString` avoids issues with the `typeof` operator  // in Safari 8-9 which returns 'object' for typed array and other constructors.  var tag = isObject(value) ? objectToString.call(value) : '';  return tag == funcTag || tag == genTag;}/** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */function isLength(value) {  return typeof value == 'number' &&    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;}/** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */function isObject(value) {  var type = typeof value;  return !!value && (type == 'object' || type == 'function');}/** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */function isObjectLike(value) {  return !!value && typeof value == 'object';}/** * Assigns own enumerable string keyed properties of source objects to the * destination object. Source objects are applied from left to right. * Subsequent sources overwrite property assignments of previous sources. * * **Note:** This method mutates `object` and is loosely based on * [`Object.assign`](https://mdn.io/Object/assign). * * @static * @memberOf _ * @since 0.10.0 * @category Object * @param {Object} object The destination object. * @param {...Object} [sources] The source objects. * @returns {Object} Returns `object`. * @see _.assignIn * @example * * function Foo() { *   this.a = 1; * } * * function Bar() { *   this.c = 3; * } * * Foo.prototype.b = 2; * Bar.prototype.d = 4; * * _.assign({ 'a': 0 }, new Foo, new Bar); * // => { 'a': 1, 'c': 3 } */var assign = createAssigner(function(object, source) {  if (nonEnumShadows || isPrototype(source) || isArrayLike(source)) {    copyObject(source, keys(source), object);    return;  }  for (var key in source) {    if (hasOwnProperty.call(source, key)) {      assignValue(object, key, source[key]);    }  }});/** * Creates an array of the own enumerable property names of `object`. * * **Note:** Non-object values are coerced to objects. See the * [ES spec](http://ecma-international.org/ecma-262/7.0/#sec-object.keys) * for more details. * * @static * @since 0.1.0 * @memberOf _ * @category Object * @param {Object} object The object to query. * @returns {Array} Returns the array of property names. * @example * * function Foo() { *   this.a = 1; *   this.b = 2; * } * * Foo.prototype.c = 3; * * _.keys(new Foo); * // => ['a', 'b'] (iteration order is not guaranteed) * * _.keys('hi'); * // => ['0', '1'] */function keys(object) {  return isArrayLike(object) ? arrayLikeKeys(object) : baseKeys(object);}module.exports = assign;},{}],58:[function(require,module,exports){/** * lodash (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors <https://jquery.org/> * Released under MIT license <https://lodash.com/license> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *//** Used as references for various `Number` constants. */var INFINITY = 1 / 0,    MAX_SAFE_INTEGER = 9007199254740991,    MAX_INTEGER = 1.7976931348623157e+308,    NAN = 0 / 0;/** `Object#toString` result references. */var funcTag = '[object Function]',    genTag = '[object GeneratorFunction]',    symbolTag = '[object Symbol]';/** Used to match leading and trailing whitespace. */var reTrim = /^\s+|\s+$/g;/** Used to detect bad signed hexadecimal string values. */var reIsBadHex = /^[-+]0x[0-9a-f]+$/i;/** Used to detect binary string values. */var reIsBinary = /^0b[01]+$/i;/** Used to detect octal string values. */var reIsOctal = /^0o[0-7]+$/i;/** Used to detect unsigned integer values. */var reIsUint = /^(?:0|[1-9]\d*)$/;/** Built-in method references without a dependency on `root`. */var freeParseInt = parseInt;/** Used for built-in method references. */var objectProto = Object.prototype;/** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */var objectToString = objectProto.toString;/* Built-in method references for those with the same name as other `lodash` methods. */var nativeCeil = Math.ceil,    nativeMax = Math.max;/** * The base implementation of `_.slice` without an iteratee call guard. * * @private * @param {Array} array The array to slice. * @param {number} [start=0] The start position. * @param {number} [end=array.length] The end position. * @returns {Array} Returns the slice of `array`. */function baseSlice(array, start, end) {  var index = -1,      length = array.length;  if (start < 0) {    start = -start > length ? 0 : (length + start);  }  end = end > length ? length : end;  if (end < 0) {    end += length;  }  length = start > end ? 0 : ((end - start) >>> 0);  start >>>= 0;  var result = Array(length);  while (++index < length) {    result[index] = array[index + start];  }  return result;}/** * Checks if `value` is a valid array-like index. * * @private * @param {*} value The value to check. * @param {number} [length=MAX_SAFE_INTEGER] The upper bounds of a valid index. * @returns {boolean} Returns `true` if `value` is a valid index, else `false`. */function isIndex(value, length) {  length = length == null ? MAX_SAFE_INTEGER : length;  return !!length &&    (typeof value == 'number' || reIsUint.test(value)) &&    (value > -1 && value % 1 == 0 && value < length);}/** * Checks if the given arguments are from an iteratee call. * * @private * @param {*} value The potential iteratee value argument. * @param {*} index The potential iteratee index or key argument. * @param {*} object The potential iteratee object argument. * @returns {boolean} Returns `true` if the arguments are from an iteratee call, *  else `false`. */function isIterateeCall(value, index, object) {  if (!isObject(object)) {    return false;  }  var type = typeof index;  if (type == 'number'        ? (isArrayLike(object) && isIndex(index, object.length))        : (type == 'string' && index in object)      ) {    return eq(object[index], value);  }  return false;}/** * Creates an array of elements split into groups the length of `size`. * If `array` can't be split evenly, the final chunk will be the remaining * elements. * * @static * @memberOf _ * @since 3.0.0 * @category Array * @param {Array} array The array to process. * @param {number} [size=1] The length of each chunk * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`. * @returns {Array} Returns the new array of chunks. * @example * * _.chunk(['a', 'b', 'c', 'd'], 2); * // => [['a', 'b'], ['c', 'd']] * * _.chunk(['a', 'b', 'c', 'd'], 3); * // => [['a', 'b', 'c'], ['d']] */function chunk(array, size, guard) {  if ((guard ? isIterateeCall(array, size, guard) : size === undefined)) {    size = 1;  } else {    size = nativeMax(toInteger(size), 0);  }  var length = array ? array.length : 0;  if (!length || size < 1) {    return [];  }  var index = 0,      resIndex = 0,      result = Array(nativeCeil(length / size));  while (index < length) {    result[resIndex++] = baseSlice(array, index, (index += size));  }  return result;}/** * Performs a * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero) * comparison between two values to determine if they are equivalent. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to compare. * @param {*} other The other value to compare. * @returns {boolean} Returns `true` if the values are equivalent, else `false`. * @example * * var object = { 'a': 1 }; * var other = { 'a': 1 }; * * _.eq(object, object); * // => true * * _.eq(object, other); * // => false * * _.eq('a', 'a'); * // => true * * _.eq('a', Object('a')); * // => false * * _.eq(NaN, NaN); * // => true */function eq(value, other) {  return value === other || (value !== value && other !== other);}/** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */function isArrayLike(value) {  return value != null && isLength(value.length) && !isFunction(value);}/** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */function isFunction(value) {  // The use of `Object#toString` avoids issues with the `typeof` operator  // in Safari 8-9 which returns 'object' for typed array and other constructors.  var tag = isObject(value) ? objectToString.call(value) : '';  return tag == funcTag || tag == genTag;}/** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */function isLength(value) {  return typeof value == 'number' &&    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;}/** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */function isObject(value) {  var type = typeof value;  return !!value && (type == 'object' || type == 'function');}/** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */function isObjectLike(value) {  return !!value && typeof value == 'object';}/** * Checks if `value` is classified as a `Symbol` primitive or object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a symbol, else `false`. * @example * * _.isSymbol(Symbol.iterator); * // => true * * _.isSymbol('abc'); * // => false */function isSymbol(value) {  return typeof value == 'symbol' ||    (isObjectLike(value) && objectToString.call(value) == symbolTag);}/** * Converts `value` to a finite number. * * @static * @memberOf _ * @since 4.12.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted number. * @example * * _.toFinite(3.2); * // => 3.2 * * _.toFinite(Number.MIN_VALUE); * // => 5e-324 * * _.toFinite(Infinity); * // => 1.7976931348623157e+308 * * _.toFinite('3.2'); * // => 3.2 */function toFinite(value) {  if (!value) {    return value === 0 ? value : 0;  }  value = toNumber(value);  if (value === INFINITY || value === -INFINITY) {    var sign = (value < 0 ? -1 : 1);    return sign * MAX_INTEGER;  }  return value === value ? value : 0;}/** * Converts `value` to an integer. * * **Note:** This method is loosely based on * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to convert. * @returns {number} Returns the converted integer. * @example * * _.toInteger(3.2); * // => 3 * * _.toInteger(Number.MIN_VALUE); * // => 0 * * _.toInteger(Infinity); * // => 1.7976931348623157e+308 * * _.toInteger('3.2'); * // => 3 */function toInteger(value) {  var result = toFinite(value),      remainder = result % 1;  return result === result ? (remainder ? result - remainder : result) : 0;}/** * Converts `value` to a number. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to process. * @returns {number} Returns the number. * @example * * _.toNumber(3.2); * // => 3.2 * * _.toNumber(Number.MIN_VALUE); * // => 5e-324 * * _.toNumber(Infinity); * // => Infinity * * _.toNumber('3.2'); * // => 3.2 */function toNumber(value) {  if (typeof value == 'number') {    return value;  }  if (isSymbol(value)) {    return NAN;  }  if (isObject(value)) {    var other = typeof value.valueOf == 'function' ? value.valueOf() : value;    value = isObject(other) ? (other + '') : other;  }  if (typeof value != 'string') {    return value === 0 ? value : +value;  }  value = value.replace(reTrim, '');  var isBinary = reIsBinary.test(value);  return (isBinary || reIsOctal.test(value))    ? freeParseInt(value.slice(2), isBinary ? 2 : 8)    : (reIsBadHex.test(value) ? NAN : +value);}module.exports = chunk;},{}],59:[function(require,module,exports){/** * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/> * Build: `lodash modularize modern exports="npm" -o ./npm/` * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE> * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license <http://lodash.com/license> */var isFunction = require('lodash.isfunction');/** * Creates a function that is the composition of the provided functions, * where each function consumes the return value of the function that follows. * For example, composing the functions `f()`, `g()`, and `h()` produces `f(g(h()))`. * Each function is executed with the `this` binding of the composed function. * * @static * @memberOf _ * @category Functions * @param {...Function} [func] Functions to compose. * @returns {Function} Returns the new composed function. * @example * * var realNameMap = { *   'pebbles': 'penelope' * }; * * var format = function(name) { *   name = realNameMap[name.toLowerCase()] || name; *   return name.charAt(0).toUpperCase() + name.slice(1).toLowerCase(); * }; * * var greet = function(formatted) { *   return 'Hiya ' + formatted + '!'; * }; * * var welcome = _.compose(greet, format); * welcome('pebbles'); * // => 'Hiya Penelope!' */function compose() {  var funcs = arguments,      length = funcs.length;  while (length--) {    if (!isFunction(funcs[length])) {      throw new TypeError;    }  }  return function() {    var args = arguments,        length = funcs.length;    while (length--) {      args = [funcs[length].apply(this, args)];    }    return args[0];  };}module.exports = compose;},{"lodash.isfunction":63}],60:[function(require,module,exports){/** * lodash 3.1.1 (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright 2012-2016 The Dojo Foundation <http://dojofoundation.org/> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright 2009-2016 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license <https://lodash.com/license> */var createWrapper = require('lodash._createwrapper');/** Used to compose bitmasks for wrapper metadata. */var CURRY_FLAG = 8;/** * Creates a function that accepts arguments of `func` and either invokes * `func` returning its result, if at least `arity` number of arguments have * been provided, or returns a function that accepts the remaining `func` * arguments, and so on. The arity of `func` may be specified if `func.length` * is not sufficient. * * The `_.curry.placeholder` value, which defaults to `_` in monolithic builds, * may be used as a placeholder for provided arguments. * * **Note:** This method doesn't set the "length" property of curried functions. * * @static * @memberOf _ * @category Function * @param {Function} func The function to curry. * @param {number} [arity=func.length] The arity of `func`. * @param- {Object} [guard] Enables use as an iteratee for functions like `_.map`. * @returns {Function} Returns the new curried function. * @example * * var abc = function(a, b, c) { *   return [a, b, c]; * }; * * var curried = _.curry(abc); * * curried(1)(2)(3); * // => [1, 2, 3] * * curried(1, 2)(3); * // => [1, 2, 3] * * curried(1, 2, 3); * // => [1, 2, 3] * * // Curried with placeholders. * curried(1)(_, 3)(2); * // => [1, 2, 3] */function curry(func, arity, guard) {  arity = guard ? undefined : arity;  var result = createWrapper(func, CURRY_FLAG, undefined, undefined, undefined, undefined, undefined, arity);  result.placeholder = curry.placeholder;  return result;}// Assign default placeholders.curry.placeholder = {};module.exports = curry;},{"lodash._createwrapper":55}],61:[function(require,module,exports){(function (global){/** * lodash (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors <https://jquery.org/> * Released under MIT license <https://lodash.com/license> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *//** Used as references for various `Number` constants. */var MAX_SAFE_INTEGER = 9007199254740991;/** `Object#toString` result references. */var argsTag = '[object Arguments]',    funcTag = '[object Function]',    genTag = '[object GeneratorFunction]';/** Detect free variable `global` from Node.js. */var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;/** Detect free variable `self`. */var freeSelf = typeof self == 'object' && self && self.Object === Object && self;/** Used as a reference to the global object. */var root = freeGlobal || freeSelf || Function('return this')();/** * Appends the elements of `values` to `array`. * * @private * @param {Array} array The array to modify. * @param {Array} values The values to append. * @returns {Array} Returns `array`. */function arrayPush(array, values) {  var index = -1,      length = values.length,      offset = array.length;  while (++index < length) {    array[offset + index] = values[index];  }  return array;}/** Used for built-in method references. */var objectProto = Object.prototype;/** Used to check objects for own properties. */var hasOwnProperty = objectProto.hasOwnProperty;/** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */var objectToString = objectProto.toString;/** Built-in value references. */var Symbol = root.Symbol,    propertyIsEnumerable = objectProto.propertyIsEnumerable,    spreadableSymbol = Symbol ? Symbol.isConcatSpreadable : undefined;/** * The base implementation of `_.flatten` with support for restricting flattening. * * @private * @param {Array} array The array to flatten. * @param {number} depth The maximum recursion depth. * @param {boolean} [predicate=isFlattenable] The function invoked per iteration. * @param {boolean} [isStrict] Restrict to values that pass `predicate` checks. * @param {Array} [result=[]] The initial result value. * @returns {Array} Returns the new flattened array. */function baseFlatten(array, depth, predicate, isStrict, result) {  var index = -1,      length = array.length;  predicate || (predicate = isFlattenable);  result || (result = []);  while (++index < length) {    var value = array[index];    if (depth > 0 && predicate(value)) {      if (depth > 1) {        // Recursively flatten arrays (susceptible to call stack limits).        baseFlatten(value, depth - 1, predicate, isStrict, result);      } else {        arrayPush(result, value);      }    } else if (!isStrict) {      result[result.length] = value;    }  }  return result;}/** * Checks if `value` is a flattenable `arguments` object or array. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is flattenable, else `false`. */function isFlattenable(value) {  return isArray(value) || isArguments(value) ||    !!(spreadableSymbol && value && value[spreadableSymbol]);}/** * Flattens `array` a single level deep. * * @static * @memberOf _ * @since 0.1.0 * @category Array * @param {Array} array The array to flatten. * @returns {Array} Returns the new flattened array. * @example * * _.flatten([1, [2, [3, [4]], 5]]); * // => [1, 2, [3, [4]], 5] */function flatten(array) {  var length = array ? array.length : 0;  return length ? baseFlatten(array, 1) : [];}/** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, *  else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */function isArguments(value) {  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);}/** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */var isArray = Array.isArray;/** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */function isArrayLike(value) {  return value != null && isLength(value.length) && !isFunction(value);}/** * This method is like `_.isArrayLike` except that it also checks if `value` * is an object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array-like object, *  else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); * // => true * * _.isArrayLikeObject(document.body.children); * // => true * * _.isArrayLikeObject('abc'); * // => false * * _.isArrayLikeObject(_.noop); * // => false */function isArrayLikeObject(value) {  return isObjectLike(value) && isArrayLike(value);}/** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */function isFunction(value) {  // The use of `Object#toString` avoids issues with the `typeof` operator  // in Safari 8-9 which returns 'object' for typed array and other constructors.  var tag = isObject(value) ? objectToString.call(value) : '';  return tag == funcTag || tag == genTag;}/** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */function isLength(value) {  return typeof value == 'number' &&    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;}/** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */function isObject(value) {  var type = typeof value;  return !!value && (type == 'object' || type == 'function');}/** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */function isObjectLike(value) {  return !!value && typeof value == 'object';}module.exports = flatten;}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})},{}],62:[function(require,module,exports){(function (global){/** * lodash (Custom Build) <https://lodash.com/> * Build: `lodash modularize exports="npm" -o ./` * Copyright jQuery Foundation and other contributors <https://jquery.org/> * Released under MIT license <https://lodash.com/license> * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE> * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors *//** Used as references for various `Number` constants. */var MAX_SAFE_INTEGER = 9007199254740991;/** `Object#toString` result references. */var argsTag = '[object Arguments]',    funcTag = '[object Function]',    genTag = '[object GeneratorFunction]',    mapTag = '[object Map]',    objectTag = '[object Object]',    promiseTag = '[object Promise]',    setTag = '[object Set]',    weakMapTag = '[object WeakMap]';var dataViewTag = '[object DataView]';/** * Used to match `RegExp` * [syntax characters](http://ecma-international.org/ecma-262/7.0/#sec-patterns). */var reRegExpChar = /[\\^$.*+?()[\]{}|]/g;/** Used to detect host constructors (Safari). */var reIsHostCtor = /^\[object .+?Constructor\]$/;/** Detect free variable `global` from Node.js. */var freeGlobal = typeof global == 'object' && global && global.Object === Object && global;/** Detect free variable `self`. */var freeSelf = typeof self == 'object' && self && self.Object === Object && self;/** Used as a reference to the global object. */var root = freeGlobal || freeSelf || Function('return this')();/** Detect free variable `exports`. */var freeExports = typeof exports == 'object' && exports && !exports.nodeType && exports;/** Detect free variable `module`. */var freeModule = freeExports && typeof module == 'object' && module && !module.nodeType && module;/** Detect the popular CommonJS extension `module.exports`. */var moduleExports = freeModule && freeModule.exports === freeExports;/** * Gets the value at `key` of `object`. * * @private * @param {Object} [object] The object to query. * @param {string} key The key of the property to get. * @returns {*} Returns the property value. */function getValue(object, key) {  return object == null ? undefined : object[key];}/** * Checks if `value` is a host object in IE < 9. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a host object, else `false`. */function isHostObject(value) {  // Many host objects are `Object` objects that can coerce to strings  // despite having improperly defined `toString` methods.  var result = false;  if (value != null && typeof value.toString != 'function') {    try {      result = !!(value + '');    } catch (e) {}  }  return result;}/** * Creates a unary function that invokes `func` with its argument transformed. * * @private * @param {Function} func The function to wrap. * @param {Function} transform The argument transform. * @returns {Function} Returns the new function. */function overArg(func, transform) {  return function(arg) {    return func(transform(arg));  };}/** Used for built-in method references. */var funcProto = Function.prototype,    objectProto = Object.prototype;/** Used to detect overreaching core-js shims. */var coreJsData = root['__core-js_shared__'];/** Used to detect methods masquerading as native. */var maskSrcKey = (function() {  var uid = /[^.]+$/.exec(coreJsData && coreJsData.keys && coreJsData.keys.IE_PROTO || '');  return uid ? ('Symbol(src)_1.' + uid) : '';}());/** Used to resolve the decompiled source of functions. */var funcToString = funcProto.toString;/** Used to check objects for own properties. */var hasOwnProperty = objectProto.hasOwnProperty;/** * Used to resolve the * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring) * of values. */var objectToString = objectProto.toString;/** Used to detect if a method is native. */var reIsNative = RegExp('^' +  funcToString.call(hasOwnProperty).replace(reRegExpChar, '\\$&')  .replace(/hasOwnProperty|(function).*?(?=\\\()| for .+?(?=\\\])/g, '$1.*?') + '$');/** Built-in value references. */var Buffer = moduleExports ? root.Buffer : undefined,    propertyIsEnumerable = objectProto.propertyIsEnumerable;/* Built-in method references for those with the same name as other `lodash` methods. */var nativeIsBuffer = Buffer ? Buffer.isBuffer : undefined,    nativeKeys = overArg(Object.keys, Object);/* Built-in method references that are verified to be native. */var DataView = getNative(root, 'DataView'),    Map = getNative(root, 'Map'),    Promise = getNative(root, 'Promise'),    Set = getNative(root, 'Set'),    WeakMap = getNative(root, 'WeakMap');/** Detect if properties shadowing those on `Object.prototype` are non-enumerable. */var nonEnumShadows = !propertyIsEnumerable.call({ 'valueOf': 1 }, 'valueOf');/** Used to detect maps, sets, and weakmaps. */var dataViewCtorString = toSource(DataView),    mapCtorString = toSource(Map),    promiseCtorString = toSource(Promise),    setCtorString = toSource(Set),    weakMapCtorString = toSource(WeakMap);/** * The base implementation of `getTag`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */function baseGetTag(value) {  return objectToString.call(value);}/** * The base implementation of `_.isNative` without bad shim checks. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a native function, *  else `false`. */function baseIsNative(value) {  if (!isObject(value) || isMasked(value)) {    return false;  }  var pattern = (isFunction(value) || isHostObject(value)) ? reIsNative : reIsHostCtor;  return pattern.test(toSource(value));}/** * Gets the native function at `key` of `object`. * * @private * @param {Object} object The object to query. * @param {string} key The key of the method to get. * @returns {*} Returns the function if it's native, else `undefined`. */function getNative(object, key) {  var value = getValue(object, key);  return baseIsNative(value) ? value : undefined;}/** * Gets the `toStringTag` of `value`. * * @private * @param {*} value The value to query. * @returns {string} Returns the `toStringTag`. */var getTag = baseGetTag;// Fallback for data views, maps, sets, and weak maps in IE 11,// for data views in Edge < 14, and promises in Node.js.if ((DataView && getTag(new DataView(new ArrayBuffer(1))) != dataViewTag) ||    (Map && getTag(new Map) != mapTag) ||    (Promise && getTag(Promise.resolve()) != promiseTag) ||    (Set && getTag(new Set) != setTag) ||    (WeakMap && getTag(new WeakMap) != weakMapTag)) {  getTag = function(value) {    var result = objectToString.call(value),        Ctor = result == objectTag ? value.constructor : undefined,        ctorString = Ctor ? toSource(Ctor) : undefined;    if (ctorString) {      switch (ctorString) {        case dataViewCtorString: return dataViewTag;        case mapCtorString: return mapTag;        case promiseCtorString: return promiseTag;        case setCtorString: return setTag;        case weakMapCtorString: return weakMapTag;      }    }    return result;  };}/** * Checks if `func` has its source masked. * * @private * @param {Function} func The function to check. * @returns {boolean} Returns `true` if `func` is masked, else `false`. */function isMasked(func) {  return !!maskSrcKey && (maskSrcKey in func);}/** * Checks if `value` is likely a prototype object. * * @private * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a prototype, else `false`. */function isPrototype(value) {  var Ctor = value && value.constructor,      proto = (typeof Ctor == 'function' && Ctor.prototype) || objectProto;  return value === proto;}/** * Converts `func` to its source code. * * @private * @param {Function} func The function to process. * @returns {string} Returns the source code. */function toSource(func) {  if (func != null) {    try {      return funcToString.call(func);    } catch (e) {}    try {      return (func + '');    } catch (e) {}  }  return '';}/** * Checks if `value` is likely an `arguments` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an `arguments` object, *  else `false`. * @example * * _.isArguments(function() { return arguments; }()); * // => true * * _.isArguments([1, 2, 3]); * // => false */function isArguments(value) {  // Safari 8.1 makes `arguments.callee` enumerable in strict mode.  return isArrayLikeObject(value) && hasOwnProperty.call(value, 'callee') &&    (!propertyIsEnumerable.call(value, 'callee') || objectToString.call(value) == argsTag);}/** * Checks if `value` is classified as an `Array` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array, else `false`. * @example * * _.isArray([1, 2, 3]); * // => true * * _.isArray(document.body.children); * // => false * * _.isArray('abc'); * // => false * * _.isArray(_.noop); * // => false */var isArray = Array.isArray;/** * Checks if `value` is array-like. A value is considered array-like if it's * not a function and has a `value.length` that's an integer greater than or * equal to `0` and less than or equal to `Number.MAX_SAFE_INTEGER`. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is array-like, else `false`. * @example * * _.isArrayLike([1, 2, 3]); * // => true * * _.isArrayLike(document.body.children); * // => true * * _.isArrayLike('abc'); * // => true * * _.isArrayLike(_.noop); * // => false */function isArrayLike(value) {  return value != null && isLength(value.length) && !isFunction(value);}/** * This method is like `_.isArrayLike` except that it also checks if `value` * is an object. * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an array-like object, *  else `false`. * @example * * _.isArrayLikeObject([1, 2, 3]); * // => true * * _.isArrayLikeObject(document.body.children); * // => true * * _.isArrayLikeObject('abc'); * // => false * * _.isArrayLikeObject(_.noop); * // => false */function isArrayLikeObject(value) {  return isObjectLike(value) && isArrayLike(value);}/** * Checks if `value` is a buffer. * * @static * @memberOf _ * @since 4.3.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a buffer, else `false`. * @example * * _.isBuffer(new Buffer(2)); * // => true * * _.isBuffer(new Uint8Array(2)); * // => false */var isBuffer = nativeIsBuffer || stubFalse;/** * Checks if `value` is an empty object, collection, map, or set. * * Objects are considered empty if they have no own enumerable string keyed * properties. * * Array-like values such as `arguments` objects, arrays, buffers, strings, or * jQuery-like collections are considered empty if they have a `length` of `0`. * Similarly, maps and sets are considered empty if they have a `size` of `0`. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is empty, else `false`. * @example * * _.isEmpty(null); * // => true * * _.isEmpty(true); * // => true * * _.isEmpty(1); * // => true * * _.isEmpty([1, 2, 3]); * // => false * * _.isEmpty({ 'a': 1 }); * // => false */function isEmpty(value) {  if (isArrayLike(value) &&      (isArray(value) || typeof value == 'string' ||        typeof value.splice == 'function' || isBuffer(value) || isArguments(value))) {    return !value.length;  }  var tag = getTag(value);  if (tag == mapTag || tag == setTag) {    return !value.size;  }  if (nonEnumShadows || isPrototype(value)) {    return !nativeKeys(value).length;  }  for (var key in value) {    if (hasOwnProperty.call(value, key)) {      return false;    }  }  return true;}/** * Checks if `value` is classified as a `Function` object. * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true * * _.isFunction(/abc/); * // => false */function isFunction(value) {  // The use of `Object#toString` avoids issues with the `typeof` operator  // in Safari 8-9 which returns 'object' for typed array and other constructors.  var tag = isObject(value) ? objectToString.call(value) : '';  return tag == funcTag || tag == genTag;}/** * Checks if `value` is a valid array-like length. * * **Note:** This method is loosely based on * [`ToLength`](http://ecma-international.org/ecma-262/7.0/#sec-tolength). * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is a valid length, else `false`. * @example * * _.isLength(3); * // => true * * _.isLength(Number.MIN_VALUE); * // => false * * _.isLength(Infinity); * // => false * * _.isLength('3'); * // => false */function isLength(value) {  return typeof value == 'number' &&    value > -1 && value % 1 == 0 && value <= MAX_SAFE_INTEGER;}/** * Checks if `value` is the * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types) * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`) * * @static * @memberOf _ * @since 0.1.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is an object, else `false`. * @example * * _.isObject({}); * // => true * * _.isObject([1, 2, 3]); * // => true * * _.isObject(_.noop); * // => true * * _.isObject(null); * // => false */function isObject(value) {  var type = typeof value;  return !!value && (type == 'object' || type == 'function');}/** * Checks if `value` is object-like. A value is object-like if it's not `null` * and has a `typeof` result of "object". * * @static * @memberOf _ * @since 4.0.0 * @category Lang * @param {*} value The value to check. * @returns {boolean} Returns `true` if `value` is object-like, else `false`. * @example * * _.isObjectLike({}); * // => true * * _.isObjectLike([1, 2, 3]); * // => true * * _.isObjectLike(_.noop); * // => false * * _.isObjectLike(null); * // => false */function isObjectLike(value) {  return !!value && typeof value == 'object';}/** * This method returns `false`. * * @static * @memberOf _ * @since 4.13.0 * @category Util * @returns {boolean} Returns `false`. * @example * * _.times(2, _.stubFalse); * // => [false, false] */function stubFalse() {  return false;}module.exports = isEmpty;}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {})},{}],63:[function(require,module,exports){/** * Lo-Dash 2.4.1 (Custom Build) <http://lodash.com/> * Build: `lodash modularize modern exports="npm" -o ./npm/` * Copyright 2012-2013 The Dojo Foundation <http://dojofoundation.org/> * Based on Underscore.js 1.5.2 <http://underscorejs.org/LICENSE> * Copyright 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors * Available under MIT license <http://lodash.com/license> *//** * Checks if `value` is a function. * * @static * @memberOf _ * @category Objects * @param {*} value The value to check. * @returns {boolean} Returns `true` if the `value` is a function, else `false`. * @example * * _.isFunction(_); * // => true */function isFunction(value) {  return typeof value == 'function';}module.exports = isFunction;},{}],64:[function(require,module,exports){module.exports = onceonce.proto = once(function () {  Object.defineProperty(Function.prototype, 'once', {    value: function () {      return once(this)    },    configurable: true  })})function once (fn) {  var called = false  return function () {    if (called) return    called = true    return fn.apply(this, arguments)  }}},{}],65:[function(require,module,exports){var trim = function(string) {  return string.replace(/^\s+|\s+$/g, '');}  , isArray = function(arg) {      return Object.prototype.toString.call(arg) === '[object Array]';    }module.exports = function (headers) {  if (!headers)    return {}  var result = {}  var headersArr = trim(headers).split('\n')  for (var i = 0; i < headersArr.length; i++) {    var row = headersArr[i]    var index = row.indexOf(':')    , key = trim(row.slice(0, index)).toLowerCase()    , value = trim(row.slice(index + 1))    if (typeof(result[key]) === 'undefined') {      result[key] = value    } else if (isArray(result[key])) {      result[key].push(value)    } else {      result[key] = [ result[key], value ]    }  }  return result}},{}],66:[function(require,module,exports){// shim for using process in browservar process = module.exports = {};// cached from whatever global is present so that test runners that stub it// don't break things.  But we need to wrap it in a try catch in case it is// wrapped in strict mode code which doesn't define any globals.  It's inside a// function because try/catches deoptimize in certain engines.var cachedSetTimeout;var cachedClearTimeout;function defaultSetTimout() {    throw new Error('setTimeout has not been defined');}function defaultClearTimeout () {    throw new Error('clearTimeout has not been defined');}(function () {    try {        if (typeof setTimeout === 'function') {            cachedSetTimeout = setTimeout;        } else {            cachedSetTimeout = defaultSetTimout;        }    } catch (e) {        cachedSetTimeout = defaultSetTimout;    }    try {        if (typeof clearTimeout === 'function') {            cachedClearTimeout = clearTimeout;        } else {            cachedClearTimeout = defaultClearTimeout;        }    } catch (e) {        cachedClearTimeout = defaultClearTimeout;    }} ())function runTimeout(fun) {    if (cachedSetTimeout === setTimeout) {        //normal enviroments in sane situations        return setTimeout(fun, 0);    }    // if setTimeout wasn't available but was latter defined    if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {        cachedSetTimeout = setTimeout;        return setTimeout(fun, 0);    }    try {        // when when somebody has screwed with setTimeout but no I.E. maddness        return cachedSetTimeout(fun, 0);    } catch(e){        try {            // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally            return cachedSetTimeout.call(null, fun, 0);        } catch(e){            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error            return cachedSetTimeout.call(this, fun, 0);        }    }}function runClearTimeout(marker) {    if (cachedClearTimeout === clearTimeout) {        //normal enviroments in sane situations        return clearTimeout(marker);    }    // if clearTimeout wasn't available but was latter defined    if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {        cachedClearTimeout = clearTimeout;        return clearTimeout(marker);    }    try {        // when when somebody has screwed with setTimeout but no I.E. maddness        return cachedClearTimeout(marker);    } catch (e){        try {            // When we are in I.E. but the script has been evaled so I.E. doesn't  trust the global object when called normally            return cachedClearTimeout.call(null, marker);        } catch (e){            // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.            // Some versions of I.E. have different rules for clearTimeout vs setTimeout            return cachedClearTimeout.call(this, marker);        }    }}var queue = [];var draining = false;var currentQueue;var queueIndex = -1;function cleanUpNextTick() {    if (!draining || !currentQueue) {        return;    }    draining = false;    if (currentQueue.length) {        queue = currentQueue.concat(queue);    } else {        queueIndex = -1;    }    if (queue.length) {        drainQueue();    }}function drainQueue() {    if (draining) {        return;    }    var timeout = runTimeout(cleanUpNextTick);    draining = true;    var len = queue.length;    while(len) {        currentQueue = queue;        queue = [];        while (++queueIndex < len) {            if (currentQueue) {                currentQueue[queueIndex].run();            }        }        queueIndex = -1;        len = queue.length;    }    currentQueue = null;    draining = false;    runClearTimeout(timeout);}process.nextTick = function (fun) {    var args = new Array(arguments.length - 1);    if (arguments.length > 1) {        for (var i = 1; i < arguments.length; i++) {            args[i - 1] = arguments[i];        }    }    queue.push(new Item(fun, args));    if (queue.length === 1 && !draining) {        runTimeout(drainQueue);    }};// v8 likes predictible objectsfunction Item(fun, array) {    this.fun = fun;    this.array = array;}Item.prototype.run = function () {    this.fun.apply(null, this.array);};process.title = 'browser';process.browser = true;process.env = {};process.argv = [];process.version = ''; // empty string to avoid regexp issuesprocess.versions = {};function noop() {}process.on = noop;process.addListener = noop;process.once = noop;process.off = noop;process.removeListener = noop;process.removeAllListeners = noop;process.emit = noop;process.prependListener = noop;process.prependOnceListener = noop;process.listeners = function (name) { return [] }process.binding = function (name) {    throw new Error('process.binding is not supported');};process.cwd = function () { return '/' };process.chdir = function (dir) {    throw new Error('process.chdir is not supported');};process.umask = function() { return 0; };},{}],67:[function(require,module,exports){'use strict';module.exports = function(config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = (config.class || 'th-chat-cta') + ' hidden';    var marketingMessageText = config.marketingMessageText || '';    var ctaButtonText = config.ctaButtonText || 'Continue';    return (        html('div', {className: classString}, [            html('div', {className: "marketing-text"}, [marketingMessageText]),            html('button', {className: "cta-button ja-buttons ja-medium"}, [ctaButtonText])        ])    );}},{"ja-dom-element":45}],68:[function(require,module,exports){'use strict';var events = require('ja-event');var utils = require('ja-utils');var dom = require('ja-dom');var tmpl = require('./th-chat-cta-tmpl.js');module.exports = ChatCta;function ChatCta(el) {    if (!(this instanceof ChatCta)) return new ChatCta(el);    el = el && el.nodeType ? el : document.querySelector(el);    if (!el) return;    var self = this;    var ctaButtonElement = document.querySelector('.cta-button');    this.ctaElement = document.querySelector('.th-chat-cta');    ctaButtonElement.addEventListener('click', function() {    	self.trigger('cta_button_clicked');    });}utils.mixin(ChatCta, events);ChatCta.prototype.show = function() {	dom.removeClass(this.ctaElement, 'hidden');	this.trigger('cta_is_shown');}ChatCta.tmpl = function (config) {    return tmpl(config);};},{"./th-chat-cta-tmpl.js":67,"ja-dom":46,"ja-event":50,"ja-utils":51}],69:[function(require,module,exports){/** * Copyright (c) 2010 by Gabriel Birke *  * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the 'Software'), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: *  * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. *  * THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */(function (root, factory) {    if (typeof define === 'function' && define.amd) {        // AMD. Register as an anonymous module.        define(factory);    } else if (typeof exports === 'object') {        // Support Node.js specific `module.exports` (which can be a function)        if (typeof module === 'object' && typeof module.exports === 'object') {            exports = module.exports = factory();        }    } else {        // Browser globals        root.Sanitize = factory();    }}(this, function () {var Sanitize = function (){  var options = arguments[0] || {};  this.config = {};  this.config.elements = options.elements ? options.elements : [];  this.config.attributes = options.attributes ? options.attributes : {};  this.config.attributes[Sanitize.ALL] = this.config.attributes[Sanitize.ALL] ? this.config.attributes[Sanitize.ALL] : [];  this.config.allow_comments = options.allow_comments ? options.allow_comments : false;  this.allowed_elements = {};  this.config.protocols = options.protocols ? options.protocols : {};  this.config.add_attributes = options.add_attributes ? options.add_attributes  : {};  this.dom = options.dom ? options.dom : document;  for(var i=0;i<this.config.elements.length;i++) {    this.allowed_elements[this.config.elements[i]] = true;  }  this.config.remove_element_contents = {};  this.config.remove_all_contents = false;  if(options.remove_contents) {        if(options.remove_contents instanceof Array) {      for(var k=0;k<options.remove_contents.length;k++) {        this.config.remove_element_contents[options.remove_contents[k]] = true;      }    }    else {      this.config.remove_all_contents = true;    }  }  this.transformers = options.transformers ? options.transformers : [];};Sanitize.REGEX_PROTOCOL = /^([A-Za-z0-9\+\-\.\&\;\*\s]*?)(?:\:|&*0*58|&*x0*3a)/i;// emulate Ruby symbol with string constantSanitize.RELATIVE = '__RELATIVE__';Sanitize.ALL = '__ALL__';Sanitize.prototype.clean_node = function(container) {  var fragment = this.dom.createDocumentFragment();  this.current_element = fragment;  this.whitelist_nodes = [];    /**   * Utility function to check if an element exists in an array   */  function _array_index(needle, haystack) {    for(var i=0; i < haystack.length; i++) {      if(haystack[i] == needle)         return i;    }    return -1;  }    function _merge_arrays_uniq() {    var result = [];    var uniq_hash = {};    for(var i=0;i<arguments.length;i++) {      if(!arguments[i] || !arguments[i].length)        continue;      for(var j=0;j<arguments[i].length;j++) {        if(uniq_hash[arguments[i][j]])          continue;        uniq_hash[arguments[i][j]] = true;        result.push(arguments[i][j]);      }    }    return result;  }    /**   * Clean function that checks the different node types and cleans them up accordingly   * @param elem DOM Node to clean   */  function _clean(elem) {    var clone;    switch(elem.nodeType) {      // Element      case 1:        _clean_element.call(this, elem);        break;      // Text      case 3:        clone = elem.cloneNode(false);        this.current_element.appendChild(clone);        break;      // Entity-Reference (normally not used)      case 5:        clone = elem.cloneNode(false);        this.current_element.appendChild(clone);        break;      // Comment      case 8:        if(this.config.allow_comments) {          clone = elem.cloneNode(false);          this.current_element.appendChild(clone);        }        break;      default:        if (console && console.log) console.log("unknown node type", elem.nodeType);        break;    }   }    function _clean_element(elem) {    var attr, attr_node, protocols, del, attr_ok;    var transform = _transform_element.call(this, elem);        var elem = transform.node;    var name = elem.nodeName.toLowerCase();        // check if element itself is allowed    var parent_element = this.current_element;    if(this.allowed_elements[name] || transform.whitelist) {        this.current_element = this.dom.createElement(elem.nodeName);        parent_element.appendChild(this.current_element);              // clean attributes      var attrs = this.config.attributes;      var allowed_attributes = _merge_arrays_uniq(attrs[name], attrs[Sanitize.ALL], transform.attr_whitelist);      for(var i=0;i<allowed_attributes.length;i++) {        var attr_name = allowed_attributes[i];        attr = elem.attributes[attr_name];        if(attr) {            attr_ok = true;            // Check protocol attributes for valid protocol            if(this.config.protocols[name] && this.config.protocols[name][attr_name]) {              protocols = this.config.protocols[name][attr_name];              del = attr.value.toLowerCase().match(Sanitize.REGEX_PROTOCOL);              if(del) {                attr_ok = (_array_index(del[1], protocols) != -1);              }              else {                attr_ok = (_array_index(Sanitize.RELATIVE, protocols) != -1);              }            }            if(attr_ok) {              attr_node = document.createAttribute(attr_name);              attr_node.value = attr.value;              this.current_element.setAttributeNode(attr_node);            }        }      }            // Add attributes      if(this.config.add_attributes[name]) {        for(attr_name in this.config.add_attributes[name]) {          attr_node = document.createAttribute(attr_name);          attr_node.value = this.config.add_attributes[name][attr_name];          this.current_element.setAttributeNode(attr_node);        }      }    } // End checking if element is allowed    // If this node is in the dynamic whitelist array (built at runtime by    // transformers), let it live with all of its attributes intact.    else if(_array_index(elem, this.whitelist_nodes) != -1) {      this.current_element = elem.cloneNode(true);      // Remove child nodes, they will be sanitiazied and added by other code      while(this.current_element.childNodes.length > 0) {        this.current_element.removeChild(this.current_element.firstChild);      }      parent_element.appendChild(this.current_element);    }    // iterate over child nodes    if(!this.config.remove_all_contents && !this.config.remove_element_contents[name]) {      for(var j=0;j<elem.childNodes.length;j++) {        _clean.call(this, elem.childNodes[j]);      }    }        // some versions of IE don't support normalize.    if(this.current_element.normalize) {      this.current_element.normalize();    }    this.current_element = parent_element;  } // END clean_element function    function _transform_element(node) {    var output = {      attr_whitelist:[],      node: node,      whitelist: false    };    var transform;    for(var i=0;i<this.transformers.length;i++) {      transform = this.transformers[i]({        allowed_elements: this.allowed_elements,        config: this.config,        node: node,        node_name: node.nodeName.toLowerCase(),        whitelist_nodes: this.whitelist_nodes,        dom: this.dom      });      if (transform == null)         continue;      else if(typeof transform == 'object') {        if(transform.whitelist_nodes && transform.whitelist_nodes instanceof Array) {          for(var j=0;j<transform.whitelist_nodes.length;j++) {            if(_array_index(transform.whitelist_nodes[j], this.whitelist_nodes) == -1) {              this.whitelist_nodes.push(transform.whitelist_nodes[j]);            }          }        }        output.whitelist = transform.whitelist ? true : false;        if(transform.attr_whitelist) {          output.attr_whitelist = _merge_arrays_uniq(output.attr_whitelist, transform.attr_whitelist);        }        output.node = transform.node ? transform.node : output.node;      }      else {        throw new Error("transformer output must be an object or null");      }    }    return output;  }        for(var z=0;z<container.childNodes.length;z++) {    _clean.call(this, container.childNodes[z]);  }    if(fragment.normalize) {    fragment.normalize();  }    return fragment;  };return Sanitize;}));},{}],70:[function(require,module,exports){var ChatTypingAnimation = require('th-chat-typing-animation');var HowItWorks = require('th-how-it-works/th-how-it-works-tmpl');module.exports = function(config) {    config = config || {};    config.assistantProfile = config.assistantProfile || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.class || 'th-chat-dialog';    var showHowItWorks = config.showHowItWorks || false;    var howJaWorks = config.howJaWorks || {};    var hiwSteps = howJaWorks.items;    var typingElement;    if (config.isGoogleReengagementChat) {        typingElement = ChatTypingAnimation.modernAnimation({            avatar: config.assistantProfile.avatar,            name: config.assistantProfile.name,            title: config.assistantProfile.title,            renderer: html        });    } else {        typingElement = ChatTypingAnimation.defaultAnimation({            isTypingText: config.isTypingText || '',            renderer: html        });    }    return (        html('div', {className: classString}, [            html('div', {className: "conversation-adjuster"}, [                html('div', {className: "conversation"}, [                    showHowItWorks ? (                        HowItWorks({                            renderer: html,                            className: "th-how-it-works chat hidden",                            steps: hiwSteps}                        )                    ) : null                ]),                typingElement            ])        ])    );};},{"ja-dom-element":45,"th-chat-typing-animation":87,"th-how-it-works/th-how-it-works-tmpl":94}],71:[function(require,module,exports){'use strict';var dom = require('ja-dom');var events = require('ja-event');var utils = require('ja-utils');var chatDialogTemplate = require('./th-chat-dialog-tmpl.js');var Sanitize = require('./sanitize.js');var TypingAnimation = require('th-chat-typing-animation');var chatMessage = require('th-chat-message');var cookie = require('js-cookie');var messageTemplate = chatMessage.message;var continueLinkTemplate = chatMessage.continueLink;var hiddenClass = 'hidden';module.exports = ChatDialog;function ChatDialog(target, config) {    if (!(this instanceof ChatDialog)) return new ChatDialog(target, config);    var self = this;    this.target = target && target.nodeType ? target : document.querySelector(target);    if (!this.target) return;    var elementClassSelector = '.' + (config.class || 'th-chat-dialog');    this.element = this.target.querySelector(elementClassSelector);    this.typingAnimation = TypingAnimation(this.element, config);    this.conversation = this.element.querySelector('.conversation');    this.howItWorks = this.element.querySelector('.th-how-it-works');	this.sanitizer = new Sanitize({		elements: ['a', 'div', 'span', 'b'],		attributes: {			a: ['href', 'target', 'id'],			span: ['class'],			div: ['class']		},		protocols: {			a: { href: ['http', 'https', 'mailto'] }		}	});    // In order to not break all usages of dialog animation    this.typingAnimation.on('start_typing_animation', function(){        self.trigger('start_typing_animation');    });    this.typingAnimation.on('stop_typing_animation', function(){        self.trigger('stop_typing_animation');    });    this.typingAnimation.on('show_is_typing', function(){        self.trigger('show_is_typing');    });    return this;}utils.mixin(ChatDialog, events);ChatDialog.tmpl = function(config) {    return chatDialogTemplate(config);};ChatDialog.prototype.showHowItWorks = function(chatLocationKey) {    dom.removeClass(this.howItWorks, 'hidden');    var storedHiwPosition = cookie.get('hiw_position_in_chat_' + chatLocationKey);    if (storedHiwPosition) {        this.moveHowItWorksBeforeLastMessage(storedHiwPosition);    } else {        var lastMessage = this.element.querySelector('.th-chat-message:last-child');        lastMessage.parentNode.insertBefore(this.howItWorks, lastMessage.nextSibling);        this.scrollToBottom();        var hiwPositionInChat = this.getMessagesCount();        cookie.set('hiw_position_in_chat_' + chatLocationKey, hiwPositionInChat, { expires: 60 * 60 * 1000 });        var self = this;        setTimeout(function() {            self.moveHowItWorksBeforeLastMessage(hiwPositionInChat);        }, 5000);    }};ChatDialog.prototype.moveHowItWorksBeforeLastMessage = function(hiwPositionInChat) {    var messageElement = this.element.querySelector('.th-chat-message:nth-child(' + hiwPositionInChat + ')');    if (messageElement) {        messageElement.parentNode.insertBefore(this.howItWorks, messageElement);    }};ChatDialog.prototype.clearMessages = function() {    this.conversation.innerHTML = '';};ChatDialog.prototype.postCustomerMessage = function (msg, config) {  config = config || {};  var message = msg.text || msg;  this.conversation.appendChild(messageTemplate(message, {    class: 'customer',    name: config.clientName || 'You'  }));  this.scrollToBottom();};ChatDialog.prototype.postExpertMessage = function(message, config) {  config = config || {};  var lastMessage = this.element.querySelector('.payment');  if (!lastMessage) {    var messageEl = document.createElement('div');    messageEl.innerHTML = message;    messageEl = this.sanitizer.clean_node(messageEl);    var messageConfig = { class: 'expert' };    utils.extend(messageConfig, config);    this.conversation.appendChild(messageTemplate(messageEl, messageConfig));  }  if (config.showContinueLink) {    lastMessage = this.element.querySelector('.payment');    var continueLink = lastMessage.querySelector('.continue-link');    if (!continueLink) {        lastMessage.querySelector('.text').appendChild(continueLinkTemplate({ continueLinkText: config.continueLinkText }));    }  }  this.scrollToBottom();};ChatDialog.prototype.scrollToBottom = function() {    this.element.scrollTop = this.element.scrollHeight;};ChatDialog.prototype.getMessagesCount = function() {    return this.conversation.getElementsByClassName('th-chat-message').length;};// In order to not break all usages of dialog animationChatDialog.prototype.startTypingAnimation = function (delayArr) {    this.typingAnimation.start(delayArr);};ChatDialog.prototype.stopTypingAnimation = function () {    this.typingAnimation.stop();};ChatDialog.prototype.startTypingAnimationWithMaxDuration = function (delayArr, maxDuration) {    this.typingAnimation.startWithMaxDuration(delayArr, maxDuration);};ChatDialog.prototype.showIsTyping = function (delayArr) {    this.typingAnimation.showIsTyping(delayArr);};},{"./sanitize.js":69,"./th-chat-dialog-tmpl.js":70,"ja-dom":46,"ja-event":50,"ja-utils":51,"js-cookie":54,"th-chat-message":75,"th-chat-typing-animation":87}],72:[function(require,module,exports){module.exports = function(config) {    config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.classString || 'th-chat-header';    var expertProfile = config.expertProfile || {};    var expertName = expertProfile.expertName || 'Expert';    var avatar = expertProfile.expertAvatarUrl || 'https://secure.justanswer.com/fe-lib/components/th-chat-header/images/shirt.png';    var satisfiedCustomersText = expertProfile.satisfiedCustomers        ? [expertProfile.satisfiedCustomers, expertProfile.satisfiedCustomersLabel || 'Satisfied Customers'].join(' ') : '';    var expertTitle = expertProfile.expertTitle || '';    var experience = expertProfile.experience || '';    var moreLinkText = config.moreLinkText || '';    var lessLinkText = config.lessLinkText || '';    var showMoreLink = expertProfile.showMoreLink || false;    function renderExperience() {        return (showMoreLink) ?            html('div', {className: "experience-container"}, [                 html('div', {className: "experience short"}, [                    experience,                    html('div', {className: "less-link hidden"}, [lessLinkText])                ]),                html('div', {className: "more-link"}, [moreLinkText])            ])            : html('div', {className: "experience"}, [experience]);    }    return (        html('header', {className: classString}, [            html('div', {className: "toggle-button"}),            html('div', {className: "title"}, [                html('div', {className: "ja-logo"}),                html('div', {className: "heading"}, [config.heading])            ]),            html('div', {className: "expert-profile"}, [                html('div', {className: "expert-avatar-container"}, [                    html('img', {className: "expert-avatar", src: avatar, width: "60", height: "60"})                ]),                html('div', {className: "expert-name"}, [expertName, ", ", expertTitle]),                html('div', {className: "profile"}, [                    html('div', {className: "satisfied-customers"}, [satisfiedCustomersText]),                    renderExperience()                ])            ])        ])    );}},{"ja-dom-element":45}],73:[function(require,module,exports){var events = require('ja-event');var utils = require('ja-utils');var tmpl = require('./th-chat-header-tmpl.js');var dom = require('ja-dom');module.exports = ChatHeader;var shortClass = 'short';var longClass = 'long';var hiddenClass = 'hidden';function ChatHeader(config) {    var self = this;    config = config || {};    if (!(this instanceof ChatHeader)) return new ChatHeader(config);    this.chatHeaderElement = document.querySelector('.th-chat-header');    this.toggleButton = this.chatHeaderElement ? this.chatHeaderElement.querySelector('.toggle-button') : '';    this.experience = this.chatHeaderElement.querySelector('.experience');    this.experienceContainer = this.chatHeaderElement.querySelector('.experience-container');        if (!this.toggleButton) return;    this.toggleButton.addEventListener('click', function () {        self.trigger('toggleChat');    });    if (config.expertProfile && config.expertProfile.showMoreLink) {        this.moreLink = this.chatHeaderElement.querySelector('.more-link');        this.lessLink = this.chatHeaderElement.querySelector('.less-link');        this.moreLink.addEventListener('click', function(){            self.trigger('more-link-clicked');            self.showLongExperience();        });        this.lessLink.addEventListener('click', function(){            self.trigger('less-link-clicked');            self.showShortExperience();        });    }}ChatHeader.prototype.showLongExperience = function() {    if (!this.experience) return;    dom.toggleCls(this.experience, shortClass, dom.hasCls(this.experience, shortClass));    dom.toggleCls(this.moreLink, hiddenClass, !dom.hasCls(this.moreLink, hiddenClass));    dom.toggleCls(this.lessLink, hiddenClass, dom.hasCls(this.lessLink, hiddenClass));    this.trigger('show-experience');}ChatHeader.prototype.showShortExperience = function() {    if (!this.experience) return;    dom.toggleCls(this.experience, shortClass, !dom.hasCls(this.experience, shortClass));    dom.toggleCls(this.experienceContainer, longClass, dom.hasCls(this.experienceContainer, longClass));    dom.toggleCls(this.moreLink, hiddenClass, dom.hasCls(this.moreLink, hiddenClass));    dom.toggleCls(this.lessLink, hiddenClass, !dom.hasCls(this.lessLink, hiddenClass));    this.trigger('hide-experience');}ChatHeader.prototype.expandExperienceMinHeight = function() {    if (!this.experience) return;    dom.toggleCls(this.experienceContainer, longClass, !dom.hasCls(this.experienceContainer, longClass));}ChatHeader.tmpl = function (config) {    return tmpl(config);};utils.mixin(ChatHeader, events);},{"./th-chat-header-tmpl.js":72,"ja-dom":46,"ja-event":50,"ja-utils":51}],74:[function(require,module,exports){exports.message = function(message, config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var paymentLinkClass = config.showContinueLink ? ' payment' : '';    var classString = config.class || 'expert';    var avatar = config.avatar || 'https://secure.justanswer.com/fe-lib/components/th-chat-header/images/shirt.png';    var name = config.name || 'Pearl Wilson';    var title = config.title || 'Assistant';    var displayName = classString === 'expert' && !config.displayNameWithoutTitle ? name + ', ' + title : name;    var assistantAvatar;    if (classString === 'expert') {        assistantAvatar = html('img', {className: "va-avatar", src: avatar || '', alt: "Virtual Assistant avatar", width: "24", height: "24"})    };    return (        html('div', {className: classString + paymentLinkClass + ' th-chat-message'}, [            assistantAvatar,            html('span', {className: "name", dangerouslySetInnerHTML: displayName}),            html('div', {className: "text"}, [message])        ])    );};exports.continueLink = function(config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var continueLinkText = config.continueLinkText || ' Continue >>';    var dataQualityClassName = 'dqt-continue ';    return (        html('a', {className: dataQualityClassName + 'continue-link'}, [continueLinkText.replace(/ /g, "\u00a0")])    );};},{"ja-dom-element":45}],75:[function(require,module,exports){module.exports = ModernChatMessage;var modernChatMessageTmpl = require('./th-chat-message-tmpl.js');function ModernChatMessage() {    if (!(this instanceof ModernChatMessage)) return new ModernChatMessage();}ModernChatMessage.message = function(message, config) {	return modernChatMessageTmpl.message(message, config);}ModernChatMessage.continueLink = function(config) {	return modernChatMessageTmpl.continueLink(config);}},{"./th-chat-message-tmpl.js":74}],76:[function(require,module,exports){module.exports = function(config) {    config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.classString || 'th-chat-mobile-header';    var expertProfile = config.expertProfile || {};    var expertName = expertProfile.expertName || 'Expert';    var avatar = expertProfile.expertAvatarUrl || 'https://secure.justanswer.com/fe-lib/components/th-chat-header/images/shirt.png';    var satisfiedCustomers = expertProfile.satisfiedCustomers        ? [expertProfile.satisfiedCustomers, expertProfile.satisfiedCustomersLabel || 'Satisfied Customers'].join(' ') : '';    var expertTitle = expertProfile.expertTitle || '';    return (        html('header', {className: classString}, [            html('div', {className: "close-button"}),            html('div', {className: "expert-avatar"}, [                html('img', {className: "expert-avatar", src: avatar, width: "53", height: "53"})            ]),            html('div', {className: "profile"}, [                html('div', {className: "expert-name"}, [expertName, ", ", expertTitle]),                html('div', {className: "satisfied-customers"}, [satisfiedCustomers])            ])        ])    );}},{"ja-dom-element":43}],77:[function(require,module,exports){var events = require('ja-event');var utils = require('ja-utils');var tmpl = require('./th-chat-mobile-header-tmpl.js');module.exports = ChatMobileHeader;function ChatMobileHeader(config) {    var self = this;    config = config || {};    if (!(this instanceof ChatMobileHeader)) return new ChatMobileHeader(config);    var elementClassSelector = '.' + (config.classString || 'th-chat-mobile-header');    this.closeButton = document.querySelector(elementClassSelector + ' .close-button');    if (!this.closeButton) return;    this.closeButton.addEventListener('click', function() {        self.trigger('closeChat');    });}ChatMobileHeader.tmpl = function(config) {    return tmpl(config);};utils.mixin(ChatMobileHeader, events);},{"./th-chat-mobile-header-tmpl.js":76,"ja-event":50,"ja-utils":52}],78:[function(require,module,exports){module.exports = function(config) {    config = config || {};    var html = config.renderer || require('ja-dom-element');    var cookie = require('js-cookie');    var classString = config.class || 'th-chat-mobile-question-box';    var placeholder = config.placeholder || 'Type your message...';    var sendButtonText = config.sendButtonText || 'Send';    var showHiwLink = config.showHiwLink || false;    var howJaWorks = config.howJaWorks || {};    var hiwLinkText = howJaWorks.linkText || '';    return (        html('div', {className: classString}, [                showHiwLink?                html('div', {className: "hiw-link"}, [hiwLinkText])                : null,            html('div', {className: "text-box"}, [                html('input', {className: "text-input", placeholder: placeholder})            ]),            html('input', {type: "button", className: "send-btn disabled ja-button-orange ja-button-small", value: sendButtonText})        ])    );}},{"ja-dom-element":44,"js-cookie":54}],79:[function(require,module,exports){var events = require('ja-event');var utils = require('ja-utils');var dom = require('ja-dom');var tmpl = require('./th-chat-mobile-question-box-tmpl.js');var disabledClass = 'disabled';module.exports = ModernChatMobileQuestionBox;function ModernChatMobileQuestionBox(target, config) {	if (!(this instanceof ModernChatMobileQuestionBox)) return new ModernChatMobileQuestionBox(target, config);	    var self = this;    this.config = config || {};    this.target = target && target.nodeType ? target : document.querySelector(target);    if (!this.target) return;    var elementClassSelector = '.' + (this.config.class || 'th-chat-mobile-question-box');    this.element = this.target.querySelector(elementClassSelector);    if (!this.element) return;    this.inputField = this.element.querySelector('.text-input');    if (!this.inputField) return;    this.sendButton = this.element.querySelector('.send-btn');    if (!this.sendButton) return;    this.hiwLink = config.showHowItWorks ? this.element.querySelector('.hiw-link') : null;    if (this.hiwLink) {        this.hiwLink.addEventListener('click', function() {            self.trigger('chat_qbox_hiw_link_clicked');            self.element.removeChild(self.hiwLink);        });    }    self.sendButton.addEventListener('click', submit);    self.inputField.addEventListener('keydown', function(event) {        self.trigger('chat_qbox_key_down');        var keycode = (event.keyCode ? event.keyCode : event.which);        if (keycode == '13') {            submit();            event.preventDefault();        } else {            disableOrEnableSendButton();        }    });    function submit() {        if (self.inputField.value.trim() !== '') {            self.trigger('submit', { text: self.inputField.value.trim() });            self.inputField.value = '';            self.sendButton.classList.add(disabledClass);        }    }    function disableOrEnableSendButton() {        if (self.inputField.value.trim().length > 0 && dom.hasClass(self.sendButton, disabledClass)) {            self.sendButton.classList.remove(disabledClass);        } else if (self.inputField.value.trim().length === 0 && !dom.hasClass(self.sendButton, disabledClass)) {            self.sendButton.classList.add(disabledClass);        }    }}ModernChatMobileQuestionBox.tmpl = function(config) {    return tmpl(config);};ModernChatMobileQuestionBox.prototype.disable = function() {    var self = this;    self.sendButton = this.element.querySelector('.send-btn');    self.sendButton.classList.add(disabledClass);    self.inputField.setAttribute('disabled', 'disabled');    self.inputField.removeAttribute('placeholder');}ModernChatMobileQuestionBox.prototype.enable = function() {    var self = this;    if (self.inputField.hasAttribute('disabled')) {        self.inputField.removeAttribute('disabled');    }    if(!self.inputField.hasAttribute('placeholder')){        self.inputField.setAttribute('placeholder', self.config.placeholder);    }    self.inputField.focus();}ModernChatMobileQuestionBox.prototype.addFocus = function () {    if (!this.inputField.hasAttribute('disabled')) {        this.inputField.focus();    }}ModernChatMobileQuestionBox.prototype.getQuestionBoxLength = function () {    return this.inputField.value.length;}utils.mixin(ModernChatMobileQuestionBox, events);},{"./th-chat-mobile-question-box-tmpl.js":78,"ja-dom":48,"ja-event":50,"ja-utils":53}],80:[function(require,module,exports){module.exports = function(config) {    config = config || {};    var html = config.renderer || require('ja-dom-element');    return (            html('div', {className: "th-chat-notification"}, [                html('span', {className: "th-chat-notification-header"}),                html('span', {className: "th-chat-notification-body"})            ])    );}},{"ja-dom-element":45}],81:[function(require,module,exports){//Static build with: browserify -r ./th-chat-notification.js:th-chat-notification -o build.jsvar dom = require('ja-dom');var tmpl = require('./th-chat-notification-tmpl.js');var activeClass = 'active';var errorClass = 'error';var warningClass = 'warning';var chatNotificationMessageClass = '.th-chat-notification';var chatNotificationHeaderMessageClass = '.th-chat-notification-header';var chatNotificationBodyMessageClass = '.th-chat-notification-body';module.exports = ChatNotification;function ChatNotification(config) {    config = config || {};    if (!(this instanceof ChatNotification)) return new ChatNotification(config);    this.notificationMessageComponent = document.querySelector(chatNotificationMessageClass);    this.notificationMessageHeaderComponent = document.querySelector(chatNotificationHeaderMessageClass);    this.notificationMessageBodyComponent = document.querySelector(chatNotificationBodyMessageClass);}ChatNotification.tmpl = function (config) {    return tmpl(config);};ChatNotification.prototype.showError = function (errorHeader, errorMessage) {    this.showNotification(errorHeader, errorMessage, errorClass);}ChatNotification.prototype.showWarning = function (warningHeader, warningMessage) {    this.showNotification(warningHeader, warningMessage, warningClass);}ChatNotification.prototype.showNotification = function (header, message, withClass) {    this.notificationMessageHeaderComponent.innerHTML = header;    this.notificationMessageBodyComponent.innerHTML = message;    dom.addClass(this.notificationMessageComponent, activeClass);    if (withClass === warningClass) {        dom.addClass(this.notificationMessageComponent, warningClass);        dom.removeClass(this.notificationMessageComponent, errorClass);    } else {        dom.addClass(this.notificationMessageComponent, errorClass);        dom.removeClass(this.notificationMessageComponent, warningClass);    }}ChatNotification.prototype.hideNotification = function () {    dom.removeClass(this.notificationMessageComponent, activeClass);    dom.removeClass(this.notificationMessageComponent, warningClass);    dom.removeClass(this.notificationMessageComponent, errorClass);    this.notificationMessageHeaderComponent.innerHTML = "";    this.notificationMessageBodyComponent.innerHTML = "";}},{"./th-chat-notification-tmpl.js":80,"ja-dom":46}],82:[function(require,module,exports){module.exports = function(config) {    config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.class || 'th-chat-question-box';    var placeholder = config.placeholder || 'Type your message...';    var sendButtonText = config.sendButtonText || 'Send';    var dataQualityChatClassName = ' dqt-chat';    classString += dataQualityChatClassName;    return (        html('div', {className: classString}, [            html('div', {className: "text-box"}, [                html('textarea', {className: "text-area", placeholder: placeholder})            ]),            html('div', {className: "button-container"}, [                html('input', {type: "button", className: "send-btn dqt-send disabled ja-button-orange ja-medium", value: sendButtonText})            ]),                config.statsText                    ? html('span', {className: "online-now"}, [config.statsText]) : null        ])    );}},{"ja-dom-element":44}],83:[function(require,module,exports){var events = require('ja-event');var utils = require('ja-utils');var dom = require('ja-dom');var tmpl = require('./th-chat-question-box-tmpl.js');var disabledClass = 'disabled';module.exports = ModernChatQuestionBox;function ModernChatQuestionBox(target, config) {    if (!(this instanceof ModernChatQuestionBox)) return new ModernChatQuestionBox(target, config);    var self = this;    this.config = config || {};    this.target = target && target.nodeType ? target : document.querySelector(target);    if (!this.target) return;    var elementClassSelector = '.' + (config.class || 'th-chat-question-box');    this.element = this.target.querySelector(elementClassSelector);    this.inputField = this.element.querySelector('.text-area');    this.sendButton = this.element.querySelector('.send-btn');    self.sendButton.addEventListener('click', submit);    self.inputField.addEventListener("keydown", function (event) {        self.trigger('chat_qbox_key_down');        var keycode = (event.keyCode ? event.keyCode : event.which);        if (keycode == '13') {            submit();            event.preventDefault();        } else {            disableOrEnableSendButton();        }    });    self.inputField.addEventListener('click', function(event) {        self.trigger('chat_qbox_click');    });    function submit() {        if (self.inputField.value.trim() !== '') {            self.trigger('submit', {                text: self.inputField.value.trim()            });            self.inputField.value = '';            self.sendButton.classList.add(disabledClass);            if (self.config.sendButtonText && self.config.sendButtonText !== self.sendButton.value) {                self.sendButton.value = self.config.sendButtonText;            }        }    }    function disableOrEnableSendButton() {        if (self.inputField.value.trim().length > 0 && dom.hasClass(self.sendButton, disabledClass)) {            self.sendButton.classList.remove(disabledClass);        } else if (self.inputField.value.trim().length === 0 && !dom.hasClass(self.sendButton, disabledClass)) {            self.sendButton.classList.add(disabledClass);        }    }}ModernChatQuestionBox.tmpl = function (config) {    return tmpl(config);};ModernChatQuestionBox.prototype.disable = function () {    var self = this;    self.sendButton = this.element.querySelector('.send-btn');    self.sendButton.classList.add(disabledClass);    self.inputField.blur();    self.inputField.setAttribute('disabled', 'disabled');}ModernChatQuestionBox.prototype.enable = function (config) {    var config = config || {};    var noFocus = config.noFocus || false;    if (this.inputField.hasAttribute('disabled')) {        this.inputField.removeAttribute('disabled');    }    if (!noFocus) {        this.addFocus();    }}ModernChatQuestionBox.prototype.getQuestionBoxLength = function () {    return this.inputField.value.length;}ModernChatQuestionBox.prototype.addFocus = function () {    if (!this.inputField.hasAttribute('disabled')) {        this.inputField.focus();    }}ModernChatQuestionBox.prototype.hide = function () {    dom.addClass(this.element, 'hidden');}ModernChatQuestionBox.prototype.isEmpty = function () {    return this.inputField.value.trim() === '';}ModernChatQuestionBox.prototype.resizeQuestionBox = function () {    var textBox = this.element.querySelector('.text-box');    var outerHeight = parseInt(window.getComputedStyle(this.inputField).height, 10);    var fontSize = 14;    var lineHeight = 18;    var diff = outerHeight - this.inputField.clientHeight;    this.inputField.style.height = 0;    var newHeight = Math.max(fontSize, this.inputField.scrollHeight + diff);    if (newHeight <= lineHeight * 3) {        this.inputField.style.height = newHeight + 'px';        if (newHeight < lineHeight * 2) {            textBox.style.height = '50px';        } else if (newHeight == lineHeight * 2) {            textBox.style.height = '56px';        } else if (newHeight == lineHeight * 3) {            textBox.style.height = '70px';        }    } else {        this.inputField.style.height = '54px';    }}ModernChatQuestionBox.prototype.changePlaceholder = function(placeholder) {    this.inputField.placeholder = placeholder;};utils.mixin(ModernChatQuestionBox, events);},{"./th-chat-question-box-tmpl.js":82,"ja-dom":47,"ja-event":49,"ja-utils":53}],84:[function(require,module,exports){module.exports = ChatRevizely;function ChatRevizely(config){    if (!(this instanceof ChatRevizely)) return new ChatRevizely(config);    this.config = config || {};    this.config.experimentVariationDelimiter = this.config.experimentVariationDelimiter || ',';} ChatRevizely.prototype.getExperimentData = function(){    var revizelyTestExperience = [];    if (window && window.re && window.re.testExperience && window.re.testExperience.length) {        for (var i = 0; i < window.re.testExperience.length; i++) {            var testExperience = window.re.testExperience[i];            revizelyTestExperience.push({                experimentId: testExperience.experimentId,                variationId: testExperience.variationId            });        }    }    return revizelyTestExperience;};ChatRevizely.prototype.getExperimentDataString = function (){    var self = this;    var experimentData = this.getExperimentData();    if (experimentData && experimentData.length) {        return 'Revizely : ' + experimentData.map(function (item) { return item.variationId; })            .join(self.config.experimentVariationDelimiter);    }    return null;};},{}],85:[function(require,module,exports){'use strict';var Revizely = require('th-chat-revizely');module.exports = ChatTracking;function ChatTracking(config){    if (!(this instanceof ChatTracking)) return new ChatTracking(config);    this.config = config || {};    this.Revizely = new Revizely();}ChatTracking.prototype.getDeviceCategory = function(){    if (!window || !window.navigator || !window.navigator.userAgent) return 'not detected';    var isTablet = function () {        return /Tablet|Tab|Pad|Windows NT 6\.[23]; ARM;|Nexus (10|7|9)|GT-P[\d]{4}|GTN-N[\d]{4}|SM-P600|SM-P90[015]|SM-T[\d]{3}|SCH-I905|SCH-I(905|800|815|705|915)|SGH-I957|KF(((O|T)T)|JW(I|A)|S(O|A)W(I|A)|THW(A|I)|A(P|R|S)W(I|A))|PlayBook|Xoom|NOOK|BNTV|Dell Venue|Transformer/i.test(window.navigator.userAgent);    };    var isMobile = function () {        return (window.JA && window.JA.i && window.JA.i.isMobile) || (window.Prl && window.Prl.device && window.Prl.device.isMobile);    };    return isTablet() ? "tablet" : isMobile() ? "mobile" : "desktop";};ChatTracking.prototype.getExperimentDataString = function () {    return this.Revizely.getExperimentDataString();};},{"th-chat-revizely":84}],86:[function(require,module,exports){exports.modernAnimation = function(config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = (config.class || 'typing-box') + ' modern';    var avatar = config.avatar || '/fe-lib/components/th-chat-message/images/pearl_30x30.jpg';    var name = config.name || 'Pearl Wilson';    var title = config.title || 'Assistant';    var displayName = name + ', ' + title;    return (        html('div', {className: classString}, [            html('div', {className: "typing-text hidden"}, [                html('img', {class: "va-avatar", src: avatar}),                html('span', {class: "name"}, [displayName]),                html('span', {class: "dot-bubble"}, [                    html('span', {class: "dot"}),                    html('span', {class: "dot"}),                    html('span', {class: "dot"})                ])            ])        ])    );};exports.defaultAnimation = function(config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.class || 'typing-box';    var isTypingText = config.isTypingText || '';    return (        html('div', {className: classString}, [            html('div', {className: "typing-text hidden"}, [                isTypingText            ])        ])    );};},{"ja-dom-element":45}],87:[function(require,module,exports){var dom = require('ja-dom');var events = require('ja-event');var utils = require('ja-utils');var chatTypingAnimationTmpl = require('./th-chat-typing-animation-tmpl.js');var hiddenClass = 'hidden';module.exports = ChatTypingAnimation;function ChatTypingAnimation(target, config) {    if (!(this instanceof ChatTypingAnimation)) return new ChatTypingAnimation(target, config);    this.config = config || {};	this.target = target && target.nodeType ? target : document.querySelector(target);    if (!this.target) return;	var elementClassSelector = '.' + (this.config.class || 'typing-box');    this.element = document.querySelector(elementClassSelector);    this.typingText = this.element.querySelector('.typing-text');    this.isRunning = false;    this.typingAnimationTimeout = null;    this.stopAnimationTimeout = null;}utils.mixin(ChatTypingAnimation, events);ChatTypingAnimation.prototype.start = function (delayArr) {	var self = this;    if (self.isRunning) return;    self.isRunning = true;    self.trigger('start_typing_animation');    delayArr = delayArr || [];    var i = 0;    var animation = function (delay) {        if (!delay) {           i = 0;        }        self.typingAnimationTimeout = setTimeout(function () {            dom.toggleClass(self.typingText, hiddenClass);            i++;            return animation(delayArr[i]);        }, delay);    };    animation(delayArr[i]);}ChatTypingAnimation.prototype.stop = function () {	var self = this;    self.trigger('stop_typing_animation');    clearTimeout(self.typingAnimationTimeout);    clearTimeout(self.stopAnimationTimeout);    if (!dom.hasClass(self.typingText, hiddenClass))    {      dom.addClass(self.typingText, hiddenClass);    }    self.isRunning = false;}ChatTypingAnimation.prototype.startWithMaxDuration = function (delayArr, maxDuration) {    var self = this;    self.start(delayArr);    this.stopAnimationTimeout = setTimeout(function () {         self.stop();    }, maxDuration);}ChatTypingAnimation.prototype.showIsTyping = function (delayArr) {    var self = this;    delayArr = delayArr || [];    var i = 0;    var animation = function (delay) {        if (!delay) {            self.trigger('show_is_typing');            return;        }        setTimeout(function () {            dom.toggleClass(self.typingText, hiddenClass);            i++;            return animation(delayArr[i]);        },        delay);    };    animation(delayArr[i]);};ChatTypingAnimation.prototype.setAssistantName = function(assistantName) {    var name = this.typingText.querySelector('.name');    if(name) {        name.textContent = assistantName;    }};ChatTypingAnimation.modernAnimation = function(config) {	return chatTypingAnimationTmpl.modernAnimation(config);}ChatTypingAnimation.defaultAnimation = function(config) {	return chatTypingAnimationTmpl.defaultAnimation(config);}},{"./th-chat-typing-animation-tmpl.js":86,"ja-dom":46,"ja-event":50,"ja-utils":51}],88:[function(require,module,exports){function dummy() {};module.exports = {    chatDialog: {        showIsTyping: dummy,        clearMessages: dummy,        stopTypingAnimation: dummy,        startTypingAnimationWithMaxDuration: dummy,        postCustomerMessage: dummy,        postExpertMessage: dummy,        on: dummy    },    questionBox: {        enable: dummy,        disable: dummy,        addFocus: dummy,        on: dummy    },    render: dummy,    on: dummy};},{}],89:[function(require,module,exports){'use strict';var event = require('ja-event');var utils = require('ja-utils');var enumy = require('enumy');var defaultChatWindow = require('./lib/chat-window-mock.js');function ChatViewBase() {    if (!(this instanceof ChatViewBase)) return new ChatViewBase();    this.chatWindow = defaultChatWindow;}module.exports = ChatViewBase;utils.mixin(ChatViewBase, event);ChatViewBase.prototype.setupEvents = function () {    this.propagate(this.chatWindow, { minimize: 'pause', hide: 'pause', expand: 'resume', show: 'resume' });    this.propagate(this.chatWindow.questionBox, { chat_qbox_key_down: 'customer-typing', submit: 'customer-replied', 'chat-text-area-clicked': 'text-area-clicked' });    this.propagate(this.chatWindow.chatDialog, { show_is_typing: 'assistant-finished-typing' });    if (this.chatWindow.cta) {        this.propagate(this.chatWindow.cta, { cta_button_clicked: 'cta-button-clicked' });    }    if (this.teaser) {                this.propagate(this.teaser, enumy([            'teaser-was-clicked',            'teaser-is-shown',            'teaser-is-hidden',            'icon-is-shown',            'message-is-shown',            'message-is-changed',        ]));    }};ChatViewBase.prototype.startChat = function () { }ChatViewBase.prototype.continueChat = function () { }ChatViewBase.prototype.completeChat = function () {    this.chatWindow.questionBox.disable();}ChatViewBase.prototype.clearChat = function () {    this.chatWindow.chatDialog.clearMessages();}ChatViewBase.prototype.assistantStartTyping = function () {    this.chatWindow.chatDialog.stopTypingAnimation();    this.chatWindow.chatDialog.startTypingAnimationWithMaxDuration(this.config.animationTimeIntervals, this.config.animationMaxDuration);}ChatViewBase.prototype.assistantStopTyping = function () {    this.chatWindow.chatDialog.stopTypingAnimation();}ChatViewBase.prototype.postCustomersMessage = function (text) {    this.chatWindow.chatDialog.postCustomerMessage(text, { clientName: this.config.clientName });    this.chatWindow.questionBox.addFocus();}ChatViewBase.prototype.postAssistantsMessage = function (text, config) {    this.chatWindow.chatDialog.stopTypingAnimation();    this.chatWindow.chatDialog.postExpertMessage(text, config);    this.chatWindow.questionBox.enable({ noFocus: this.config.noFocusOnStart && config.isFirstMessage });}ChatViewBase.prototype.enableInput = function () {    this.chatWindow.questionBox.enable();}ChatViewBase.prototype.disableInput = function () {    this.chatWindow.questionBox.disable();}ChatViewBase.prototype.isInputEmpty = function () {    return this.chatWindow.questionBox.isEmpty();}ChatViewBase.prototype.showCta = function () {    this.chatWindow.cta.show();    this.chatWindow.questionBox.hide();}ChatViewBase.prototype.showError = function(header, message) {    this.chatWindow.showError(header, message);}ChatViewBase.prototype.showWarning = function(header, message) {    this.chatWindow.showWarning(header, message);}ChatViewBase.prototype.hideNotification = function() {    if (this.chatWindow) this.chatWindow.hideNotification();}ChatViewBase.prototype.propagate = function (obj, events) {    var self = this;    Object.keys(events).forEach(function (event) {        obj.on(event, function (arg) {            self.trigger(events[event], arg);        });    });}},{"./lib/chat-window-mock.js":88,"enumy":5,"ja-event":50,"ja-utils":51}],90:[function(require,module,exports){'use strict';module.exports = ChatViewRect;function ChatViewRect(settings) {    settings = settings || {};    this._offsetTop = settings.offsetTop;    this._windowHeight = settings.windowHeight;    this._windowWidth = settings.windowWidth;    this._chatHeaderHeight = settings.chatHeaderHeight;    this._chatQuestionBoxHeight = settings.chatQuestionBoxHeight;    this.smallChatHeight = settings.smallChatHeight;}ChatViewRect.prototype.isPortrait = function () {    var mediaQueryList = window.matchMedia('(orientation: portrait)');    return mediaQueryList && mediaQueryList.matches;};ChatViewRect.prototype.isLandscape = function () {    var mediaQueryList = window.matchMedia('(orientation: landscape)');    return mediaQueryList && mediaQueryList.matches;};},{}],91:[function(require,module,exports){'use strict';var dom = require('ja-dom');var utils = require('ja-utils');var BaseView = require('th-chat-view-base');var ChatWindow = require('th-chat-window');var Teaser = require('th-va-mobile-teaser');var cookie = require('ja-cookie');var ChatViewRect = require('./lib/chat-view-rect');var showMinimizedChatCookieName = 'showMinimizedChat';function ChatViewWithTeaser(target) {    if (!(this instanceof ChatViewWithTeaser)) return new ChatViewWithTeaser(target);    this.target = target && target.nodeType ? target : document.querySelector(target);}module.exports = ChatViewWithTeaser;utils.mixin(ChatViewWithTeaser, BaseView);ChatViewWithTeaser.prototype.render = function (config) {    this.config = config || {};    this.config.rememberChatMinimizedState = this.config.rememberChatMinimizedState || false;    this.config.closeChatOnClickOutside = this.config.closeChatOnClickOutside || false;    this.config.chatFullScreenMode = this.config.chatFullScreenMode || false;    this.windowHeight = window.innerHeight || window.screen.height;    var windowNode = this.target.querySelector('.th-chat-window');    var teaserNode = this.target.querySelector('.th-va-mobile-teaser');    if (windowNode) windowNode.parentNode.removeChild(windowNode);    if (teaserNode) teaserNode.parentNode.removeChild(teaserNode);    if (this.chatWindow) clearTimeout(this.chatWindow.appearanceTimeout);    clearTimeout(this.teaserShowTimeout);    this.target.appendChild(ChatWindow.tmpl(this.config));    this.chatWindow = new ChatWindow(this.target, this.config);    this.teaser = new Teaser(this.target, {        content: this.config.greeting || this.config.profile && this.config.profile.greeting,        pearlImg: this.config.mobile.iconImage,        timeouts: this.config.timeouts,        canCloseTeaser: this.config.canCloseTeaser    });    if (this.config.chatFullScreenMode) {        let chat = document.querySelector('.dqt-chat');        if (chat){            dom.addClass(chat, 'full-screen');        }        this.rect = null;    }    this.setupEvents();    this.setupHandlers();    this.disableInput();};ChatViewWithTeaser.prototype.setupHandlers = function () {    var self = this;    self.teaser.on('teaser-was-clicked', function () {       if (self.config.rememberChatMinimizedState) {            self.chatWindow.setCookieToShowExpanded();        }                self.chatWindow.show();                if (self.config.chatFullScreenMode) {                        var chatHeaderHeight = self.chatWindow.header.chatHeaderElement.offsetHeight;            var questionBoxHeight = self.chatWindow.questionBox.element.offsetHeight;                        var rectSettings = {                offsetTop: self.offsetTop(self.target),                windowHeight: window.innerHeight,                windowWidth: window.innerWidth,                chatHeaderHeight: chatHeaderHeight,                chatQuestionBoxHeight: questionBoxHeight,                smallChatHeight: self.chatWindow.getChatDialogMinHeight()            };            self.rect = new ChatViewRect(rectSettings);            self.resizeChat();            self.disableBodyScroll();        }        self.teaser.hideMessage();        self.teaser.hideTeaser();        self.chatWindow.questionBox.addFocus();        clearTimeout(self.teaserShowTimeout);    });    self.teaser.on('teaser-is-shown', function () {        self.chatWindow.trigger('appear');    });    self.teaser.on('message-is-changed', function () {        self.messageWasShown = true;    });    self.chatWindow.header.on('toggleChat', function () {       self.closeChat();    });    self.chatWindow.header.on('closeChat', function () {        self.closeChat();    });    self.on('customer-typing', function () {        var questionBoxElement = document.querySelector('.th-chat-question-box');        if (self.chatWindow.questionBox.getQuestionBoxLength() >= 85)             dom.addClass(questionBoxElement, 'expanded');        else             dom.removeClass(questionBoxElement, 'expanded');    }, self);    if (self.config.closeChatOnClickOutside) {        document.addEventListener('click', function(event) {            if (self.teaser.hidden() && self.chatWindow.expanded()) {                // close if click was not inside the chat view                if (event.target && !event.target.closest('.th-chat-window')) {                    self.closeChat();                }            }        });    }    if (self.config.chatFullScreenMode) {        window.addEventListener('scroll', () => {            document.documentElement.style.setProperty('--scroll-y', `${window.scrollY}px`);        });                self.chatWindow.questionBox.inputField.addEventListener('focus', self.alignQBoxWhenKeyboardOpened.bind(self));        self.chatWindow.questionBox.on('submit', self.alignQBoxWhenKeyboardOpened.bind(self));                window.addEventListener("resize", self.resizeChat.bind(self));        window.addEventListener("onorientationchange ", self.resizeChat.bind(self));    }}ChatViewWithTeaser.prototype.disableBodyScroll = function() {    const scrollY = document.documentElement.style.getPropertyValue('--scroll-y');    const body = document.body;    body.style.position = 'fixed';    body.style.overflow = 'hidden';    body.style.top = `-${scrollY}`;}ChatViewWithTeaser.prototype.enableBodyScroll = function() {    const body = document.body;    const scrollY = body.style.top;    body.style.position = '';    body.style.overflow = '';    body.style.top = '';    window.scrollTo(0, parseInt(scrollY || '0') * -1);}ChatViewWithTeaser.prototype.closeChat = function() {    if (this.config.chatFullScreenMode) {        this.enableBodyScroll();        this.rect = null;    }    if (this.config.rememberChatMinimizedState) {        this.chatWindow.setCookieToShowMinimized();    }    this.chatWindow.hide();    this.teaser.showTeaser();    this.teaser.showPearl();    this.teaser.hideBackground();};ChatViewWithTeaser.prototype.startChat = function () {    var self = this;    self.teaser.once('teaser-is-shown', function () {        self.chatWindow.chatDialog.showIsTyping(self.config.animationTimeIntervals);    });    if (self.config.rememberChatMinimizedState && cookie.get(showMinimizedChatCookieName) === '1') {        self.continueChat();    } else {        self.teaserShowTimeout = setTimeout(function () {            self.teaser.showTeaser();        }, self.config.mobile.time);    }}ChatViewWithTeaser.prototype.continueChat = function () {    var self = this;    self.teaser.hideMessage();    self.teaserShowTimeout = setTimeout(function () {        self.teaser.showTeaser();        setTimeout(function () {            self.teaser.showBadge();        }, self.config.mobile.time);    }, self.config.mobile.time);}ChatViewWithTeaser.prototype.resizeChat = function() {    if (dom.hasClass(this.chatWindow.chatComponent, 'hidden'))        return;    var screenHeight = window.innerHeight || window.screen.height;        var qBoxHeight = this.chatWindow.questionBox.element.offsetHeight || 150;    var headerHeight = this.chatWindow.header.chatHeaderElement.offsetHeight || 150;    var maxHeight = screenHeight - qBoxHeight - headerHeight;        var isLandscape = this.rect.isLandscape();        if (isLandscape) {        this.chatWindow.chatDialog.element.style.setProperty('max-height', `${maxHeight}px`);        this.chatWindow.chatDialog.element.style.setProperty('min-height', `${maxHeight}px`);        dom.addClass(this.chatWindow.chatDialog.element, 'chat-dialog-scroll');    }    else {        this.chatWindow.chatDialog.element.style.setProperty('max-height', `${maxHeight}px`, 'important');        this.chatWindow.chatDialog.element.style.setProperty('min-height', `${maxHeight}px`, 'important');    }}ChatViewWithTeaser.prototype.alignQBoxWhenKeyboardOpened = function() {    if (isIOS() && this.rect) {        // offset on Iphone        // on load address bar is bigger than when page is scrolled (it becomes smaller)        // so the viewport height is ~50px bigger after page was scrolled and address bar became smaller        var offset = (window.innerHeight - this.windowHeight > 50 ) ? 78 : 113;        var isPortrait = this.rect.isPortrait();        var isLandscape = this.rect.isLandscape();        // if IPhone X:        if (isPortrait && this.windowHeight <= 719) {             offset = -58;        }        // if IPhone 6:        if (isPortrait && this.windowHeight <= 553) {            offset = -16;        }        // if Iphone version <= 5        if (this.windowHeight <= 550) {            offset = 25;        }        // for landscape view. Seams this works for all iphone devices with landscape view        if (isLandscape) {            offset = 1000;        }        setTimeout(function() {                           window.scroll(0, this.windowHeight / 2 + offset);        }.bind(this), 50);    }    else {        setTimeout(function() {            window.scroll(0, this.windowHeight / 2 + 95);        }.bind(this), 50);    }}ChatViewWithTeaser.prototype.offsetTop = function(element) {    return element.getBoundingClientRect().top +        (window.pageYOffset || document.documentElement.scrollTop) -        (document.documentElement.clientTop || 0);};function isIOS() {    return navigator && navigator.userAgent.match(/(iPad|iPhone|iPod)/i);}},{"./lib/chat-view-rect":90,"ja-cookie":41,"ja-dom":46,"ja-utils":51,"th-chat-view-base":89,"th-chat-window":93,"th-va-mobile-teaser":98}],92:[function(require,module,exports){var ChatHeader = require('th-chat-header').tmpl;var ChatDialog = require('th-chat-dialog').tmpl;var ChatQuestionBox = require('th-chat-question-box').tmpl;var ChatNotification = require('th-chat-notification').tmpl;var ChatCta = require('th-chat-cta').tmpl;var ChatMobileHeader = require('th-chat-mobile-header').tmpl;var MobileQuestionBox = require('th-chat-mobile-question-box').tmpl;module.exports = function (config) {    config = config || {};    config.mobile = config.mobile || {};    config.googleReengagement = config.googleReengagement || {};    var html = config.renderer || require('ja-dom-element');    var classString = (config.class || 'th-chat-window') + ' hidden';    var modalClassName = config.modalClassName || 'modal bottom right';    var backgroundClassName = config.backgroundClassName || 'background';    var expertProfile = config.expertProfile || {};    var headingText = config.headingText || config.heading || '';    var moreLinkText = config.moreLinkText || '';    var lessLinkText = config.lessLinkText || '';    var assistantProfile = config.profile || {};    var showCopyright = config.showCopyright || false;    var showHowItWorks = config.showHowItWorks || false;    var howJaWorks = config.howJaWorks || {};    var showHiwLink = config.showHiwLink || false;    var copyright;    var dataQualityChatClassName = ' dqt-chat';    modalClassName += dataQualityChatClassName;    if (config.showBackground === false) backgroundClassName += ' hidden';    if (config.minimized) classString += ' minimized';    if (config.rightRail) classString += ' right-rail';    var SelectedChatHeader = ChatHeader;    var SelectedQuestionBox = ChatQuestionBox;    if (config.mobile && config.mobile.isMobile) {        SelectedChatHeader = ChatMobileHeader;        SelectedQuestionBox = MobileQuestionBox;    }    if (showCopyright) {        copyright = html('div', {className: "copyright"})        modalClassName += ' with-copyright';    }    return (        html('div', {className: classString}, [            html('div', {className: modalClassName}, [                html('div', {className: "th-chat-top-border"}),                SelectedChatHeader({heading: headingText, expertProfile: expertProfile, moreLinkText: moreLinkText, lessLinkText: lessLinkText}),                ChatNotification(),                ChatDialog({                    isTypingText: config.isTypingText,                    isGoogleReengagementChat: !config.mobile.isMobile && config.googleReengagement.enable,                    assistantProfile: assistantProfile,                    showHowItWorks: config.showHowItWorks,                    howJaWorks: howJaWorks}                ),                SelectedQuestionBox({                    placeholder: config.rightRail ? config.initialPlaceholder : config.placeholder,                    sendButtonText: config.sendButtonText,                    statsText: config.statsText,                    showHiwLink: showHiwLink,                    howJaWorks: howJaWorks} ),"                ", ChatCta({marketingMessageText: config.marketingMessageText, ctaButtonText: config.ctaButtonText}),                copyright            ]),            html('div', {className: backgroundClassName})        ])    );};},{"ja-dom-element":45,"th-chat-cta":68,"th-chat-dialog":71,"th-chat-header":73,"th-chat-mobile-header":77,"th-chat-mobile-question-box":79,"th-chat-notification":81,"th-chat-question-box":83}],93:[function(require,module,exports){'use strict';var dom = require('ja-dom');var events = require('ja-event');var utils = require('ja-utils');var cookie = require('ja-cookie');var ChatHeader = require('th-chat-header');var ChatDialog = require('th-chat-dialog');var ChatNotification = require('th-chat-notification');var QuestionBox = require('th-chat-question-box');var ChatMobileHeader = require('th-chat-mobile-header');var MobileQuestionBox = require('th-chat-mobile-question-box');var chatModalTemplate = require('./th-chat-window-tmpl.js');var ChatCta = require('th-chat-cta');var hiddenClass = 'hidden';var minimizedClass = 'minimized';var minimizedWithoutAnimationClass = 'minimized-no-animation';var chatClass = 'th-chat-window';var showMinimizedChatCookieName = 'showMinimizedChat';var EXPANDED_RIGHT_RAIL_CLASSNAME = 'expanded-right-rail';function Chat(target, config) {    var self = this;    this.config = config || {};    if (!(this instanceof Chat)) return new Chat(target, this.config);    var chatClassSelector = '.' + (this.config.class || chatClass);    this.config.class = ''; // clear the custom class so we do not pass it to child components    this.config.time = this.config.time || 15000;    this.config.enableOnExit = !!this.config.enableOnExit;    this.config.disableTimer = !!this.config.disableTimer;    this.config.mobile = this.config.mobile || {};    this.config.rememberChatMinimizedState = this.config.rememberChatMinimizedState || false;    this.chatComponent = document.querySelector(chatClassSelector);    if (this.config.mobile.isMobile) {        this.header = ChatMobileHeader(this.config);        this.questionBox = MobileQuestionBox(this.chatComponent, this.config);    } else {        this.header = ChatHeader(this.config);        this.questionBox = QuestionBox(this.chatComponent, this.config);    }    this.chatDialog = ChatDialog(this.chatComponent, this.config);    this.notification = ChatNotification(this.config);    this.cta = ChatCta(this.chatComponent);    if (config.rightRail) {        this.questionBox.once('chat_qbox_click', expandRightRail);        this.questionBox.once('chat_qbox_key_down', expandRightRail);        this.questionBox.on('submit', function() {            self.questionBox.changePlaceholder(self.config.placeholder);        });    }    function expandRightRail() {        self.chatComponent = document.querySelector(chatClassSelector);        self.chatComponent.classList.add(EXPANDED_RIGHT_RAIL_CLASSNAME);    }}utils.mixin(Chat, events);Chat.prototype.render = function () {    var self = this;    if (!self.config.disableTimer) {        self.appearanceTimeout = setTimeout(function () {            if (!self.config.disableTimer && !self.expanded()) {                self.show();                self.trigger('chat-shown-by-timeout');            }        }, this.config.time);    }    if (self.config.enableOnExit) {        // The usage of setTimeout() has a reason!        // There is a bug in Chrome (as of v68). When onmouseout is run synchronously        // sometimes it calls the handler righ away with incorrect parameters.        // Related defect: DE17664 [GQ&A] [Virtual Assistant] Chat expands right after page was loaded        // https://rally1.rallydev.com/#/4874452619/detail/defect/243101548624        setTimeout(function () {            document.onmouseout = function (e) {                if (e.clientY <= 0 && !self.expanded()) {                    self.show();                    self.trigger('chat-shown-on-mouseout');                }            };        }, 0);    }    if (self.config.mobile && self.config.mobile.isMobile && self.config.mobile.edgeObject) {        window.onscroll = function () {            var currentPosition = document.body.scrollTop;            var edgeObject = self.config.mobile.edgeObject;            var edgeElement = edgeObject.nodeType ? edgeObject : document.querySelector(edgeObject);            var edge = edgeElement.offsetHeight || 0;            if (currentPosition > edge) {                self.show();                self.trigger('chat-shown-on-scrolling');            }        }    }};Chat.prototype.show = function(opts) {    opts = opts || {};    if (!this.config.disabled && !this.expanded()) {        this.trigger('before-show');        dom.removeClass(this.chatComponent, hiddenClass);        this._expandRightRail(opts);        if (this.config.rememberChatMinimizedState && this.getCookieForMinimizedState() === '1') {            this.minimizeWithoutAnimation();        }        this.trigger('show');    }};Chat.prototype._expandRightRail = function(opts) {    if (this.config.rightRail && (opts && opts.triggeredByInteraction || this.chatDialog.getMessagesCount() > 1)) {        dom.addClass(this.chatComponent, EXPANDED_RIGHT_RAIL_CLASSNAME);        this.chatDialog.scrollToBottom();    }};Chat.prototype.hide = function () {    if (this.expanded()) {        dom.addClass(this.chatComponent, hiddenClass);        this.trigger('hide');    }}Chat.prototype.showError = function (errorHeader, errorMessage) {    if (this.expanded()) {        this.questionBox.disable();        this.notification.showError(errorHeader, errorMessage);    }}Chat.prototype.showWarning = function (warningHeader, warningMessage) {    if (this.expanded()) {        this.questionBox.disable();        this.notification.showWarning(warningHeader, warningMessage);    }}Chat.prototype.hideNotification = function () {    if (this.expanded()) {        this.questionBox.enable();        this.notification.hideNotification();    }}Chat.prototype.minimize = function () {    if (!this.minimized() && !this.minimizedWithoutAnimation()) {        dom.addClass(this.chatComponent, minimizedClass);        if (this.config.rememberChatMinimizedState) {            this.setCookieToShowMinimized();        }        this.trigger('minimize');    }}Chat.prototype.expand = function (opts) {    if (this.minimized() || this.minimizedWithoutAnimation()) {        this.trigger('before-expand');        if (this.config.rememberChatMinimizedState && this.getCookieForMinimizedState() === '1') {            this.setCookieToShowExpanded();        }        dom.removeClass(this.chatComponent, minimizedClass);        dom.removeClass(this.chatComponent, minimizedWithoutAnimationClass);        this._expandRightRail(opts);        this.trigger('expand');    }}Chat.prototype.minimizeWithoutAnimation = function () {    if (!this.minimized() && !this.minimizedWithoutAnimation()) {        dom.addClass(this.chatComponent, minimizedWithoutAnimationClass);    }}Chat.prototype.setCookieToShowMinimized = function () {    cookie.set(showMinimizedChatCookieName, 1, {        expires: 1 * 24 * 60 * 60    });}Chat.prototype.setCookieToShowExpanded = function () {    cookie.set(showMinimizedChatCookieName, 0, {        expires: 1 * 24 * 60 * 60    });}Chat.prototype.getCookieForMinimizedState = function () {    var minimizedCookieValue = cookie.get(showMinimizedChatCookieName);    return (minimizedCookieValue !== undefined) ? minimizedCookieValue : '0';}Chat.prototype.expanded = function () {    return !dom.hasClass(this.chatComponent, hiddenClass);}Chat.prototype.minimized = function () {    return dom.hasClass(this.chatComponent, minimizedClass);}Chat.prototype.minimizedWithoutAnimation = function () {    return dom.hasClass(this.chatComponent, minimizedWithoutAnimationClass);}Chat.prototype.getChatDialogMinHeight = function () {    var minHeight = this.chatDialog.element.style['min-height'];    return parseInt(minHeight.replace('px', ''), 10) || 0;};Chat.tmpl = function (config) {    return chatModalTemplate(config);};module.exports = Chat;},{"./th-chat-window-tmpl.js":92,"ja-cookie":40,"ja-dom":46,"ja-event":50,"ja-utils":51,"th-chat-cta":68,"th-chat-dialog":71,"th-chat-header":73,"th-chat-mobile-header":77,"th-chat-mobile-question-box":79,"th-chat-notification":81,"th-chat-question-box":83}],94:[function(require,module,exports){'use strict';module.exports = function(config) {    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var className = config.className || 'th-how-it-works';    var title = config.title || '';    var steps = config.steps || [];    function renderSteps() {        return steps.map(function(step) {            return (                html('div', {className: "step"}, [                    html('img', {                        src: step.iconUrl,                        className: "step-image",                        alt: "step-image"}                    ),                    html('div', {className: "step-text"}, [                        html('span', null, [step.title]),                        step.description                    ])                ])            );        });    }    return (        html('div', {className: className}, [            title ? html('h3', null, [title]) : null,            renderSteps()        ])    );};},{"ja-dom-element":45}],95:[function(require,module,exports){'use strict';var events = require('ja-event');var utils = require('ja-utils');module.exports = ChatMessageCollector;function ChatMessageCollector(config) {    if (!(this instanceof ChatMessageCollector)) return new ChatMessageCollector(config);    this.config = config || {};    this.config.separator = this.config.separator || ' ';    this.config.timeout = this.config.timeout || 4000;    this.messages = [];    this.timer = 0;}ChatMessageCollector.prototype.push = function (message) {    if(typeof message === 'string') {        this.messages.push({ text: message });    } else if (message && typeof message.text === 'string' ) {        this.messages.push(message);    } else {        return;    }    this.resetTimeout();}ChatMessageCollector.prototype.join = function (separator) {    return {        text: this.messages.map(function (message) {            return message.text;        }).join(separator || this.config.separator)    }}ChatMessageCollector.prototype.empty = function () {    clearTimeout(this.timer);    this.messages.length = 0;}ChatMessageCollector.prototype.length = function () {    return this.messages.length;}ChatMessageCollector.prototype.resetTimeout = function () {    var self = this;    if (self.length() > 0) {        clearTimeout(self.timer);        self.timer = setTimeout(function () {            self.trigger('timeout', { text: self.join() });        }, self.config.timeout);    }}ChatMessageCollector.prototype.clearTimeout = function () {    clearTimeout(this.timer);}utils.mixin(ChatMessageCollector, events);},{"ja-event":50,"ja-utils":51}],96:[function(require,module,exports){'use strict';var events = require('ja-event');var utils = require('ja-utils');var cookie = require('ja-cookie');var ChatClient = require('ja-chat-client');var ChatTracking = require('th-chat-tracking');var MessageCollector = require('./lib/MessageCollector');var connectionFailureMessageBody =    'Please refresh the page to continue the chat.';var connectionFailureMessageHeader = 'An error has occurred.';var connectionRetryMessageBody =    'We are reconnecting you with the Assistant. Just a moment.';var connectionRetryMessageHeader = 'Oops! Something went wrong.';var RequestType = {    GetAssistantProfile: 0,    CreateChat: 1,    PostMessage: 2,    CompleteChat: 3,    GetMessages: 4,    GetChat: 5,    RestoreChat: 6,};module.exports = VirtualAssistant;function VirtualAssistant(target, view, config) {    var self = this;    if (!(this instanceof VirtualAssistant)) {        return new VirtualAssistant(target, view, config);    }    this.target =        target && target.nodeType ? target : document.querySelector(target);    if (!this.target) {        console.log('error: there is no target');        return;    }    if (!view) {        console.log('error: View is missing');        return;    }    this.config = config || {};    this.config.proceedToCcTime = this.config.proceedToCcTime || 10000;    this.config.animationTimeIntervals = this.config.animationTimeIntervals || [        100,        300,        400,        500,        700,        1300,    ];    this.config.customerIdleInMilliseconds =        this.config.customerIdleInMilliseconds || 4000;    this.config.delayChatCompletionOnResponseAfterPaymentMessageInMilliseconds =        this.config            .delayChatCompletionOnResponseAfterPaymentMessageInMilliseconds ||        2000;    this.config.animationMaxDuration = this.config.animationMaxDuration || 4000;    this.config.messagesSeparator = this.config.messagesSeparator || ' ';    this.config.rParameter = this.config.rParameter || 'JAPPC';    this.config.addRParameterOnPayment = this.config.addRParameterOnPayment        ? this.config.addRParameterOnPayment        : false;    this.config.heading = this.config.heading || this.config.headingText;    this.config.showCta = this.config.showCta || false;    this.config.showCtaTime = this.config.showCtaTime || 5000;    this.view = view;    this.chatClient = new ChatClient({        endpoint: config.endpoint,        partnerId: config.partnerId,        partner: config.partner,    });    this.messageCollector = new MessageCollector({        separator: this.config.messagesSeparator,        timeout: this.config.customerIdleInMilliseconds,    });    this.chatTracking = new ChatTracking();    this.enablePearlCategorization = config.enablePearlCategorization || false;}utils.mixin(VirtualAssistant, events);VirtualAssistant.prototype.initialize = function () {    var self = this;    self.isFirstMessageSent = false;    // if chatID is in cookie, restoreChat    var cookieAssistantKey = self.getAssistantKeyFromCookie();    self.setupConnectionHandlers();    var virtualAssistantCookieConfigString = self.getVirtualAssistantConfigCookie(        self.config.categoryName    );    var virtualAssistantConfigObject = {        categoryId: self.config.initialCategoryId,        source: self.config.source,        botName: self.config.botName,        chatType: self.config.type,    };    if (virtualAssistantCookieConfigString) {        var cookieConfigObject = null;        try {            cookieConfigObject = JSON.parse(virtualAssistantCookieConfigString);            virtualAssistantConfigObject.categoryId =                cookieConfigObject.categoryId ||                virtualAssistantConfigObject.initialCategoryId;            virtualAssistantConfigObject.source =                cookieConfigObject.source ||                virtualAssistantConfigObject.source;            virtualAssistantConfigObject.botName =                self.getBotNameForRestoreChat(cookieConfigObject) ||                virtualAssistantConfigObject.botName;            virtualAssistantConfigObject.chatType =                cookieConfigObject.type || virtualAssistantConfigObject.type;        } catch (error) {            cookie.expire(                self.getVirtualAssistantConfigCookie(self.config.categoryName)            );            console.log(JSON.stringify(error));        }    }    var initializer = cookieAssistantKey        ? self.chatClient.restoreChat(              cookieAssistantKey,              virtualAssistantConfigObject          )        : self.chatClient.getAssistantProfile(              self.config.initialCategoryId,              self.config.type,              self.config.botName,              self.config.source,              self.config.partner          );    initializer.done(function (data) {        self.config.profile = data.profile || data;        self.setupHandlers();        if (data.messages) {            self.restoreChat(data);            self.view.continueChat();        } else {            self.view.startChat();        }        self.initialized = true;        self.trigger('appear', data);    });    initializer.fail(function (data) {        if (cookieAssistantKey) {            if (data && data.statusCode === 404) {                // cannot restore an existing chat, try to start a new one                cookie.expire(self.getChatIdCookieName());                self.initialize();            }        } else {            self.trigger(                'connectionFailure',                'Failed to get assistant profile. Status code: ' +                    (data && data.statusCode)            );        }    });    ReloadPageIfCached();};VirtualAssistant.prototype.setupConnectionHandlers = function () {    var self = this;    self.chatClient.on('connectionFailure', function (type) {        self.handleConnectionFailure(type);    });    self.chatClient.on('connectionRetry', function (type) {        self.handleConnectionRetry(type);    });    self.chatClient.on('connectionSucceeded', function () {        self.handleConnectionSucceeded();    });    self.chatClient.on('requestPerformed', function (requestInfo) {        self.trigger('requestPerformed', requestInfo);    });};VirtualAssistant.prototype.setupHandlers = function () {    var self = this;    self.config.isTypingText = (        self.config.isTypingText || '{0} is typing...'    ).replace('{0}', getAssistantName(self.config));    self.view.render(self.config);    self.view.on('customer-typing', function () {        self.messageCollector.resetTimeout();        if (self.isReadyForPayment) {            self.resetChatCompleteTimeout();        }    });    self.view.on('customer-replied', function (message) {        self.view.postCustomersMessage(message.text);        if (self.isReadyForPayment) {            if (                isChatCompleteAllowed(                    self.lastMessageTime,                    self.isReadyForPayment,                    self.config                        .delayChatCompletionOnResponseAfterPaymentMessageInMilliseconds                )            ) {                self.completeChat('Reply', message);            } else {                self.postMessage(message);            }            self.lastMessageTime = new Date();            return;        }        self.messageCollector.push(message);        self.trigger('submit');        self.view.assistantStartTyping();    });    self.messageCollector.on('timeout', function (message) {        self.postMessage(message.text);        self.messageCollector.empty();    });    self.view.once('assistant-finished-typing', function () {        if (!self.isFirstMessageSent) {            var messageConfig = getAssistantMessageConfig(self.config);            messageConfig.isFirstMessage = true;            self.view.postAssistantsMessage(                self.config.welcomeMessageText || self.config.profile.greeting,                messageConfig            );        }        self.view.allowSendQuestions && self.view.allowSendQuestions();    });    self.view.on('pause', function () {        clearTimeout(self.ccTimeout);    });    self.view.on('resume', function () {        if (self.isReadyForPayment) {            if (self.isRedirectedToPaymentPage) clearTimeout(self.ccTimeout);            else self.resetChatCompleteTimeout();        }    });    self.view.on('cta-button-clicked', function () {        self.completeChat('Direct');    });    self.view.on('teaser-continue-link-was-clicked', function (event) {        self.completeChat('Direct');    });};VirtualAssistant.prototype.resetChatCompleteTimeout = function () {    var self = this;    if (!self.isReadyForPayment) {        return;    }    clearTimeout(self.ccTimeout);    clearTimeout(self.ctaTimeout);    self.ccTimeout = setTimeout(function () {        self.completeChat('Timeout');    }, self.config.proceedToCcTime);    if (this.config.showCta) {        self.ctaTimeout = setTimeout(function () {            if (self.view.isInputEmpty()) self.view.showCta();        }, self.config.showCtaTime);    }};VirtualAssistant.prototype.handleResponse = function (response) {    var self = this;    if (!response || !response.chatId) return;    self.trigger('response-received', response);    if (self.chatId != response.chatId) {        // set cookie for persistency        var options = {            expires:                (isNaN(self.config.sessionExpirationHours)                    ? 7 * 24                    : self.config.sessionExpirationHours) *                60 *                60,            path: '/',        };        if (self.config.domain) {            options.domain = self.config.domain;        }        cookie.set(self.getChatIdCookieName(), response.chatId, options);        self.chatId = response.chatId;    }    if (response.paymentUrl) {        self.paymentUrl = response.paymentUrl;    }    if (self.isReadyForPayment) return;    var messageConfig = getAssistantMessageConfig(self.config);    if (response.attributes) {        if (response.attributes.action === 'payment') {            messageConfig.showContinueLink = true;            self.isReadyForPayment = true;            self.botVersion =                response.attributes.v || response.attributes.botName;            if (                response.attributes.paymentLanguage === 'paid_trial_membership'            ) {                if (response.chatId) {                    self.trigger(                        'paid-trial-membership-payment-message-received',                        response.chatId                    );                }            }        }        if (response.attributes.MessageCounter) {            self.messageCounter = response.attributes.MessageCounter;        }    }    self.view.postAssistantsMessage(response.text, messageConfig);    if (messageConfig.showContinueLink) {        var continueLinkInterval = setInterval(function () {            var continueLink = self.target.querySelector('.continue-link');            if (continueLink) {                continueLink.addEventListener('click', function () {                    self.completeChat('Direct');                });                clearInterval(continueLinkInterval);            }        }, 100);        self.resetChatCompleteTimeout();    }};VirtualAssistant.prototype.completeChat = function (reason, message) {    var self = this;    // prevent chat complete by Timeout if in iframe    if (        window.self !== window.top &&        !self.config.isAmp &&        reason === 'Timeout'    )        return;    // prevent simultaneous multiple of chat completion:    if (self.isCompleting) return;    self.isCompleting = true;    clearTimeout(self.ccTimeout);    var redirectUrl = [        self.paymentUrl ||            'https://my-secure.justanswer.com/va/payment/' + self.chatId,        '?r=',        self.config.rParameter,        self.config.expertProfile && self.config.expertProfile.id            ? '&selectedexpertid=' + self.config.expertProfile.id            : '',    ].join('');    if (self.config.showCta) self.view.showCta();    var paymentWindow =        reason !== 'Timeout' && self.config.isNewPaymentWindow            ? window.open(redirectUrl, '_blank')            : null;    if (isWindowOpened(paymentWindow)) {        if (paymentWindow && paymentWindow.focus) paymentWindow.focus();        self.isRedirectedToPaymentPage = true;        self.view.completeChat();        self.trigger('complete');        setTimeout(function () {            // prevent accidental double-click            self.isCompleting = false; // allow repeated chat completion in case a separate tab is closed        }, 2000);    }    var vanameParam = 'vaname=' + self.botVersion;    this.chatClient        .completeChat(self.chatId, reason, message)        .done(function (data) {            if (                (window.self === window.top || self.config.isAmp) &&                !isWindowOpened(paymentWindow)            ) {                if (data.paidTrialMembershipInfo) {                    self.trigger('paid-trial-membership-chat-completed', {                        paidTrialMembershipInfo: data.paidTrialMembershipInfo,                    });                }                var win = self.config.isAmp ? window.top : window;                win.location = data.redirectUrl                    ? data.redirectUrl +                      (/[?]/i.test(data.redirectUrl) ? '&' : '?') +                      vanameParam                    : data.paymentUrl                    ? data.paymentUrl +                      (self.config.addRParameterOnPayment                          ? (/[?]/i.test(data.paymentUrl) ? '&' : '?') +                            'r=' +                            self.config.rParameter                          : '')                    : redirectUrl;                self.isRedirectedToPaymentPage = true;                self.view.completeChat();                self.trigger('complete', reason);                self.trigger('redirect_to_payment');            }        });};VirtualAssistant.prototype.restoreChat = function (data) {    var self = this;    var isReadyForPayment = false;    self.chatId = data.chatId;    self.paymentUrl = data.paymentUrl;    self.isFirstMessageSent = true;    self.view.clearChat();    if (data.messages.length > 0 && self.config.welcomeMessageText) {        data.messages[0].text = self.config.welcomeMessageText;    }    self.messageCounter =        data.messages[data.messages.length - 1].attributes.MessageCounter;    data.messages.forEach(function (message) {        if (message.role === 'Assistant') {            var messageConfig = getAssistantMessageConfig(self.config);            if (message.attributes && message.attributes.action === 'payment') {                messageConfig.showContinueLink = true;                isReadyForPayment = true;            }            self.view.postAssistantsMessage(message.text, messageConfig);            var continueLink = self.target.querySelector('.continue-link');            if (continueLink) {                continueLink.addEventListener('click', function () {                    self.botVersion =                        message.attributes &&                        (message.attributes.v || message.attributes.botName);                    self.completeChat('Direct');                });            }        } else {            self.view.postCustomersMessage(message.text);        }    });    if (isReadyForPayment) {        self.view.disableInput();        if (this.config.showCta) {            self.view.showCta();        }    } else {        self.view.enableInput();    }    self.view.allowSendQuestions && self.view.allowSendQuestions();    self.trigger('restore');};VirtualAssistant.prototype.postMessage = function (message) {    var self = this;    var chatMessage = { text: message.text };    if (!self.config.disableAssistantTypingAfterCustomerTyping) {        self.view.assistantStartTyping();    }    if (!self.isFirstMessageSent) {        self.isFirstMessageSent = true;        message.attributes = { MessageCounter: 1 };        var chatContext = {            categoryId: self.config.initialCategoryId,            locationUrl: window.location.href,            type: self.config.type,            attributes: {                source: self.config.source,                EnablePearlCategorization: self.enablePearlCategorization,            },            pricePolicy: self.config.pricePolicy,            dynamicAttributes: self.config.dynamicChatAttributes,        };        var chatAttributes = self.config.firstChatMessageAttributes || {};        if (this.config.addExpertCountAttribute) {            var exertsOnlineCount = getOnlineNowExpertsCount(this.target);            chatAttributes.expertsOnline = exertsOnlineCount;        }        if (this.config.contentUrl) {            chatAttributes.contentUrl = this.config.contentUrl;        }        utils.mixin(chatContext.attributes, chatAttributes);        var testExperience = self.chatTracking.getExperimentDataString();        if (testExperience && testExperience.length) {            chatContext.attributes.TestExperience = testExperience;        }        var deviceCategory = self.chatTracking.getDeviceCategory();        if (deviceCategory && deviceCategory.length) {            chatContext.attributes.DeviceCategory = deviceCategory;        }        self.chatClient            .createChat(chatContext, chatMessage, self.config.botName)            .done(function (response) {                self.handleResponse(response);            });    } else {        if (self.messageCounter) {            chatMessage.attributes = {                MessageCounter: self.messageCounter,                EnablePearlCategorization: self.enablePearlCategorization,            };        }        self.chatClient            .postMessage(self.chatId, chatMessage, self.config.botName)            .done(function (response) {                self.handleResponse(response);                self.lastMessageTime = new Date();            });    }};VirtualAssistant.prototype.handleConnectionFailure = function (type) {    if (type !== RequestType.GetAssistantProfile) {        var header =            this.config.connectionFailureMessageHeader ||            connectionFailureMessageHeader;        var message =            this.config.connectionFailureMessageBody ||            connectionFailureMessageBody;        var failureMessage =            getFailureMessageByRequestType(type) || 'Connection failure';        this.view.assistantStopTyping();        this.view.disableInput();        this.view.showError(header, message);        this.isNotificationShown = true;        this.trigger('connectionFailure', failureMessage);    }};VirtualAssistant.prototype.handleConnectionSucceeded = function () {    if (!this.isNotificationShown) return;    if (this.isReadyForPayment) this.view.disableInput();    else this.view.enableInput();    this.view.hideNotification();};VirtualAssistant.prototype.handleConnectionRetry = function (type) {    var failureMessage;    var header;    var message;    if (type !== RequestType.GetAssistantProfile) {        header =            this.config.connectionRetryMessageHeader ||            connectionRetryMessageHeader;        message =            this.config.connectionRetryMessageBody ||            connectionRetryMessageBody;        this.view.assistantStopTyping();        this.view.disableInput();        this.view.showWarning(header, message);        this.isNotificationShown = true;    }    failureMessage =        getFailureMessageByRequestType(type) || 'Connection failure';    this.trigger('connectionRetry', failureMessage);};VirtualAssistant.prototype.getChatIdCookieName = function () {    return this.config.chatIdCookieName || 'JustAnswerVirtualAssistant';};VirtualAssistant.prototype.getVirtualAssistantConfigCookie = function (    categoryName) {    return cookie.get('JustAnswerVirtualAssistantConfig' + categoryName);};/** * There is a possibility to send additional params to dialog player * if you just extend botName with additional parameters. BotName is a string and * we can generate something like this botName=Pearlv2&category=MyCategory&specialty=MySpecialty */VirtualAssistant.prototype.getBotNameForRestoreChat = function (    cookieConfigObject) {    var botName = cookieConfigObject.botName;    for (var property in cookieConfigObject) {        if (            cookieConfigObject.hasOwnProperty(property) &&            property !== 'botName' &&            property !== 'type'        ) {            botName += '&' + property + '=' + cookieConfigObject[property];        }    }    return botName;};VirtualAssistant.prototype.getAssistantKeyFromCookie = function () {    return cookie.get(this.getChatIdCookieName()) || null;};function isChatCompleteAllowed(lastMessageTime, isReadyForPayment, delay) {    var timediff = new Date() - lastMessageTime;    return isReadyForPayment && timediff > delay;}function getAssistantName(config) {    return config.assistantName || config.profile.name || 'Pearl Wilson';}function getAssistantMessageConfig(config) {    return {        name: getAssistantName(config),        title:            config.assistantTitle ||            config.profile.title ||            "Expert's Assistant",        avatar: config.avatar || config.profile.avatar,        continueLinkText: config.continueLinkText,        displayNameWithoutTitle: config.displayNameWithoutTitle,    };}function getFailureMessageByRequestType(type) {    var message = '';    switch (type) {        case RequestType.GetAssistantProfile:            message = 'Failed to get assistant profile.';            break;        case RequestType.CreateChat:            message = 'Failed to create chat.';            break;        case RequestType.PostMessage:            message = 'Failed to post message.';            break;        case RequestType.CompleteChat:            message = 'Failed to complete chat.';            break;        case RequestType.GetMessages:            message = 'Failed to get messages.';            break;        case RequestType.RestoreChat:            message = 'Failed to restore messages.';            break;        default:            message = '';            break;    }    return message;}function isWindowOpened(win) {    return win && !win.closed && typeof win.closed !== 'undefined';}function ReloadPageIfCached() {    window.onpageshow = (function (original) {        return function (event) {            if (original) {                original(event);            }            if (event.persisted) {                window.location.reload();            }        };    })(window.onpageshow);}function isNumerical(str) {    var num = parseInt(str, 10);    return typeof num === 'number' && !isNaN(num);}function getOnlineNowExpertsCount(element) {    var onlineNowEl = element.querySelector('.online-now');    if (!onlineNowEl) {        return 0;    }    var onlineNowAmount = onlineNowEl.textContent.split(' ')[0];    return isNumerical(onlineNowAmount) ? parseInt(onlineNowAmount) : 0;}},{"./lib/MessageCollector":95,"ja-chat-client":39,"ja-cookie":42,"ja-event":50,"ja-utils":51,"th-chat-tracking":85}],97:[function(require,module,exports){module.exports = function(config) {    var self = this;    var config = config || {};    var html = config.renderer || require('ja-dom-element');    var classString = config.class || 'th-va-mobile-teaser';	var pearlImg = config.pearlImg || '../images/pearl.jpg';    var userInput = config.userInput || false;    var cta = config.cta || false;    var theme = config.theme || 'blue'; // blue, dark    var size = config.size || 'standard'; // standard, large    var place = config.place || 'right'; // right, left    var canCloseTeaser = config.canCloseTeaser || false;    return (        html('div', {className: classString, 'data-state-theme': theme, 'data-state-size': size, 'data-state-place': place}, [            html('div', {className: "teaser"}, [                html('div', {className: "message-cell"}, [                    html('div', {className: "welcome-message"}, [                        html('div', {className: "message ellipsis"}, [                            canCloseTeaser && html('div', {className: "close-message"}),                            html('div', {className: "message-content"}, [                                html('span', {className: "dot"}),                                html('span', {className: "dot"}),                                html('span', {className: "dot"})                            ]),                            userInput ?                                html('p', {className: "user-input"}, ["Type your reply here..."])                            : '',                            cta ?                                html('div', {className: "cta ja-buttons ja-button-tiny"}, ["Reply"])                            : ''                        ])                    ])                ]),                html('div', {className: "pearl"}, [                    html('div', {className: "image-cell"}, [                        html('div', {className: "image"}, [html('img', {className: "teaser-image", src: pearlImg, width: "62", height: "62"})])                    ]),                    html('span', {className: "badge"}, ["1"]),                    canCloseTeaser && html('span', {className: "close badge"})                ])            ]),            html('div', {className: "teaser-background"}),            html('div', {className: "trigger"}, ["Show"]),            html('div', {className: "trigger-maximize"}, ["Maximize"])        ])    );}},{"ja-dom-element":45}],98:[function(require,module,exports){var tmpl = require('./th-va-mobile-teaser-tmpl.js');var dom = require('ja-dom');var event = require('ja-event');var utils = require('ja-utils');module.exports = VaMobileTeaser;utils.mixin(VaMobileTeaser, event);var hiddenClass = 'hidden';function VaMobileTeaser(target, config) {    if (!(this instanceof VaMobileTeaser)) return new VaMobileTeaser(target, config);    var self = this;    config = config || {};    config.ignoreTmpl = config.ignoreTmpl || false;    this.userInput = config.userInput;    this.cta = config.cta;    this.content = config.content;    this.element = target.nodeType ? target : document.querySelector(target);    if (!this.element) return;    this.target = this.element; //for backward compatibility    if (!config.ignoreTmpl) this.element.appendChild(tmpl(config));    this.teaserElement = this.element.querySelector(config.class ? ('.' + config.class) : '.th-va-mobile-teaser');    if (!this.teaserElement) return;    this.timeouts = {        showTeaser: 500,        hideTeaser: 100,        showMessage: 1000,        showMessageContent: 3000,        showBadge: 1000    };    utils.extend(this.timeouts, config.timeouts);    this.pearlElement = this.teaserElement.querySelector('.pearl');    this.messageCellElement = this.teaserElement.querySelector('.message');    this.teaserBackgroundElement = this.teaserElement.querySelector('.teaser-background');    var ctaTrigger = this.teaserElement.querySelector('.cta');    if (ctaTrigger) {        ctaTrigger.addEventListener('click', function(e) {            self.hideTeaser();        });    }    this.messageCellElement.addEventListener('click', function(event) {        if (config.redirectTo) {            window.top.location = config.redirectTo();            return;        }        self.trigger('teaser-was-clicked', event);    });    this.pearlElement.addEventListener('click', function(event) {        if (config.redirectTo) {            window.top.location = config.redirectTo();            return;        }        self.trigger('teaser-was-clicked', event);    });    var closeMessage = this.teaserElement.querySelector('.close-message');    if (closeMessage) {        closeMessage.addEventListener('click', function(event) {            event.stopPropagation();            self.hideMessage();        });    }    var closeTeaser = this.teaserElement.querySelector('.close');    if (closeTeaser) {        closeTeaser.addEventListener('click', function(event) {             event.stopPropagation();            self.hideTeaser();        });    }};VaMobileTeaser.prototype.showTeaser = function() {    var self = this;    this.showBackground();    dom.removeClass(this.teaserElement, 'hidden');    setTimeout(function() {        self.showPearl();    }, self.timeouts.showTeaser);    self.trigger('teaser-is-shown');};VaMobileTeaser.prototype.hideTeaser = function() {    var self = this;    var welcomeMessageElement = this.teaserElement.querySelector('.welcome-message');    var pearlElement = this.pearlElement;    this.hideBackground();    if (!self.timeouts.hideTeaser) {        _hideTeaser();    } else {        setTimeout(_hideTeaser, self.timeouts.hideTeaser);    }    function _hideTeaser() {        dom.removeClass(welcomeMessageElement, 'zoomIn');        dom.addClass(welcomeMessageElement, 'zoomOutRight');        dom.addClass(pearlElement, 'zoomOutDown');        dom.addClass(pearlElement, hiddenClass);        dom.addClass(self.teaserElement, hiddenClass);    }    this.trigger('teaser-is-hidden');};VaMobileTeaser.prototype.showPearl = function() {    var self = this;    var imgCellElement = this.pearlElement;    dom.removeClass(imgCellElement, 'zoomOutDown');    dom.removeClass(imgCellElement, hiddenClass);    dom.addCls(imgCellElement, 'zoomInUp');    setTimeout(function() {        self.showMessage();    }, self.timeouts.showMessage);    self.trigger('icon-is-shown');};VaMobileTeaser.prototype.updateImage = function (source) {    var teaserImage = this.pearlElement.querySelector('.teaser-image');    teaserImage.setAttribute('src', source);};VaMobileTeaser.prototype.showBackground = function() {    dom.removeClass(this.teaserBackgroundElement, 'fadeOutDown');    dom.addClass(this.teaserBackgroundElement, 'fadeInUp');};VaMobileTeaser.prototype.hideBackground = function() {    dom.removeClass(this.teaserBackgroundElement, 'fadeInUp');    dom.addClass(this.teaserBackgroundElement, 'fadeOutDown');};VaMobileTeaser.prototype.showMessage = function() {    var self = this;    var welcomeMessageElement = this.teaserElement.querySelector('.welcome-message');    dom.removeClass(welcomeMessageElement, 'zoomOutRight');    dom.addClass(welcomeMessageElement, 'zoomIn');    if (this.content) {        setTimeout(function() {            self.changeMessage();            self.showInput();            self.showCta();        }, self.timeouts.showMessageContent);    }    self.trigger('message-is-shown');};VaMobileTeaser.prototype.changeMessage = function(silently) {    var self = this;    dom.removeCls(this.messageCellElement, 'ellipsis');    this.teaserElement.querySelector('.message-content').innerHTML = this.content;    self.trigger('message-is-changed');    if (!silently) {        setTimeout(function() {            self.showBadge();        }, self.timeouts.showBadge);    }};VaMobileTeaser.prototype.showInput = function() {    if (this.userInput) {        dom.addCls(this.teaserElement.querySelector('.user-input'), 'visible');    }};VaMobileTeaser.prototype.showCta = function() {    if (this.cta) {        dom.addCls(this.teaserElement.querySelector('.cta'), 'visible');    }};VaMobileTeaser.prototype.showBadge = function() {    dom.addCls(this.teaserElement.querySelector('.badge'), 'zoomIn');};VaMobileTeaser.prototype.hideMessage = function() {    dom.addCls(this.teaserElement.querySelector('.teaser .message-cell'), hiddenClass);    dom.addCls(this.teaserBackgroundElement, hiddenClass);};VaMobileTeaser.prototype.hideBadge = function() {    dom.removeCls(this.teaserElement.querySelector('.badge'), 'zoomIn');};VaMobileTeaser.prototype.hidden = function () {    return dom.hasClass(this.teaserElement, hiddenClass);}VaMobileTeaser.prototype.renderElement = function(config) {    return tmpl(config);}},{"./th-va-mobile-teaser-tmpl.js":97,"ja-dom":46,"ja-event":50,"ja-utils":51}],99:[function(require,module,exports){'use strict';var isString = require('is-string');var isNumber = require('is-number-object');var isBoolean = require('is-boolean-object');var isSymbol = require('is-symbol');var isBigInt = require('is-bigint');// eslint-disable-next-line consistent-returnmodule.exports = function whichBoxedPrimitive(value) {	// eslint-disable-next-line eqeqeq	if (value == null || (typeof value !== 'object' && typeof value !== 'function')) {		return null;	}	if (isString(value)) {		return 'String';	}	if (isNumber(value)) {		return 'Number';	}	if (isBoolean(value)) {		return 'Boolean';	}	if (isSymbol(value)) {		return 'Symbol';	}	if (isBigInt(value)) {		return 'BigInt';	}};},{"is-bigint":19,"is-boolean-object":20,"is-number-object":27,"is-string":30,"is-symbol":31}],100:[function(require,module,exports){'use strict';var isMap = require('is-map');var isSet = require('is-set');var isWeakMap = require('is-weakmap');var isWeakSet = require('is-weakset');module.exports = function whichCollection(value) {	if (value && typeof value === 'object') {		if (isMap(value)) {			return 'Map';		}		if (isSet(value)) {			return 'Set';		}		if (isWeakMap(value)) {			return 'WeakMap';		}		if (isWeakSet(value)) {			return 'WeakSet';		}	}	return false;};},{"is-map":26,"is-set":29,"is-weakmap":32,"is-weakset":33}],101:[function(require,module,exports){var window = require("global/window")var once = require("once")var parseHeaders = require('parse-headers')var messages = {    "0": "Internal XMLHttpRequest Error",    "4": "4xx Client Error",    "5": "5xx Server Error"}var XHR = window.XMLHttpRequest || noopvar XDR = "withCredentials" in (new XHR()) ? XHR : window.XDomainRequestmodule.exports = createXHRfunction createXHR(options, callback) {    if (typeof options === "string") {        options = { uri: options }    }    options = options || {}    callback = once(callback)    var xhr = options.xhr || null    if (!xhr) {        if (options.cors || options.useXDR) {            xhr = new XDR()        }else{            xhr = new XHR()        }    }    var uri = xhr.url = options.uri || options.url    var method = xhr.method = options.method || "GET"    var body = options.body || options.data    var headers = xhr.headers = options.headers || {}    var sync = !!options.sync    var isJson = false    var key    var load = options.response ? loadResponse : loadXhr    if ("json" in options) {        isJson = true        headers["Accept"] = "application/json"        if (method !== "GET" && method !== "HEAD") {            headers["Content-Type"] = "application/json"            body = JSON.stringify(options.json)        }    }    xhr.onreadystatechange = readystatechange    xhr.onload = load    xhr.onerror = error    // IE9 must have onprogress be set to a unique function.    xhr.onprogress = function () {        // IE must die    }    // hate IE    xhr.ontimeout = noop    xhr.open(method, uri, !sync)                                    //backward compatibility    if (options.withCredentials || (options.cors && options.withCredentials !== false)) {        xhr.withCredentials = true    }    // Cannot set timeout with sync request    if (!sync) {        xhr.timeout = "timeout" in options ? options.timeout : 5000    }    if (xhr.setRequestHeader) {        for(key in headers){            if(headers.hasOwnProperty(key)){                xhr.setRequestHeader(key, headers[key])            }        }    } else if (options.headers) {        throw new Error("Headers cannot be set on an XDomainRequest object")    }    if ("responseType" in options) {        xhr.responseType = options.responseType    }        if ("beforeSend" in options &&         typeof options.beforeSend === "function"    ) {        options.beforeSend(xhr)    }    xhr.send(body)    return xhr    function readystatechange() {        if (xhr.readyState === 4) {            load()        }    }    function getBody() {        // Chrome with requestType=blob throws errors arround when even testing access to responseText        var body = null        if (xhr.response) {            body = xhr.response        } else if (xhr.responseType === 'text' || !xhr.responseType) {            body = xhr.responseText || xhr.responseXML        }        if (isJson) {            try {                body = JSON.parse(body)            } catch (e) {}        }        return body    }    function getStatusCode() {        return xhr.status === 1223 ? 204 : xhr.status    }    // if we're getting a none-ok statusCode, build & return an error    function errorFromStatusCode(status, body) {        var error = null        if (status === 0 || (status >= 400 && status < 600)) {            var message = (typeof body === "string" ? body : false) ||                messages[String(status).charAt(0)]            error = new Error(message)            error.statusCode = status        }        return error    }    // will load the data & process the response in a special response object    function loadResponse() {        var status = getStatusCode()        var body = getBody()        var error = errorFromStatusCode(status, body)        var response = {            body: body,            statusCode: status,            statusText: xhr.statusText,            raw: xhr        }        if(xhr.getAllResponseHeaders){ //remember xhr can in fact be XDR for CORS in IE            response.headers = parseHeaders(xhr.getAllResponseHeaders())        } else {            response.headers = {}        }        callback(error, response, response.body)    }    // will load the data and add some response properties to the source xhr    // and then respond with that    function loadXhr() {        var status = getStatusCode()        var error = errorFromStatusCode(status)        xhr.status = xhr.statusCode = status        xhr.body = getBody()        xhr.headers = parseHeaders(xhr.getAllResponseHeaders())        callback(error, xhr, xhr.body)    }    function error(evt) {        callback(evt, xhr)    }}function noop() {}},{"global/window":13,"once":64,"parse-headers":65}],"ja-gadget-virtual-assistant-subtle":[function(require,module,exports){var tracking = require('ja-chat-affiliates-tracking');var VAChatController = require('th-va-chat-controller');var ChatView = require('th-chat-view-with-teaser');var VirtualAssistantManager = require('ja-gadget-virtual-assistant-manager');function Gadget(target, config) {    this.config = config || {};    if (!config.rParameter.match(/^(ppc)/)) {    	config.rParameter  = config.rParameter + '|va-subtle';    }    this.target = target && target.nodeType ? target : document.querySelector(target);    this.config.chatFullScreenMode = this.config.fullScreenOnMobile ? isMobileDevice() : false;    this.chatView = new ChatView(this.target);    var chat = new VAChatController(this.target, this.chatView, this.config);    tracking.track(chat, this.config, this.target);    var manager = new VirtualAssistantManager(this.target, '.dqt-chat', '.th-va-mobile-teaser');    manager.initialize();         return chat;}function isMobileDevice() {    var userAgent = getUserAgent();    var userAgentPart = userAgent.substr(0, 4);    return /(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(userAgent)        || /1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(userAgentPart);}function getUserAgent() {    var userAgent = navigator.userAgent        || navigator.vendor        || window.opera        || null;        if (!userAgent)        throw new Error('Failed to look for user agent information.');    return userAgent;}module.exports = Gadget;},{"ja-chat-affiliates-tracking":1,"ja-gadget-virtual-assistant-manager":2,"th-chat-view-with-teaser":91,"th-va-chat-controller":96}]},{},["ja-gadget-virtual-assistant-subtle"]);